Внимание — эта статья не об интернет магазине, а о разработке технического задания. В комментариях я не буду обсуждать детали описываемого интернет-магазина — он взят лишь для примера, но постараюсь добросовестно отвечать на вопросы о методике разработки рабочей версии документации и переходу к кодированию.
Под катом кода нет.
UPD. Букв действительно много, и смысл кроется не только в заголовках, но и между ними.
Сколько времени?
«Под ключ» от 1 до 8 недель, если есть опыт в базовой части, и выполнены все требования, описанные ниже: по базовым средствам, пониманию целей и методологии работы. Без опыта, без фреймворка, и «галопом по европам» — процесс легко может затянуться на полгода и более.
Пожалуйста, обязательно обратите внимание на тот факт, что продукт и его пользователь будут нуждаться в сопровождении и в поддержке. Если вы позиционируетесь как фрилансер, и получили этот заказ вчера, подумайте — возможно стоит объединить усилия с более опытными коллегами, для того, чтобы все-же выполнить заказ в срок, обеспечить достойное сопровождение и не краснеть в будущем из-за примерно десятка серьезных факторов.
С чего начинать? Прежде всего давайте поговорим о поиске верной концепции, той, которая позволит прийти к результату наиболее быстро, и с наименьшими потерями.
Цели и средства
Для начала следует определить цель. Очень частой ошибкой, популярной даже среди опытных разработчиков, является немедленное сосредоточение на средствах. Сразу бросаются писать код. Последствия:
полученное не соответствует поставленным задачам
большая часть внимания рассеяна на очевидное, и таким образом критичные аспекты этого внимания недополучают
решение не отличается достаточной структурностью, поэтому возникают проблемы в сопровождении
Лечение на самом деле очень доступно — добросовестно уделить внимание документированию до начала работы над программой. Не писать код до тех пор, пока не будет полностью ясны цели, сформулированы методики и подробности реализации задачи.
Цель
Наш магазин должен:
- позволять пользователям легко совершать покупки онлайн
- позволять менеджерам фиксировать покупки пользователей, даже если они оформлены по телефону
- содействовать применяемым маркетинговым методикам, в том числе:
- всесторонний анализ
- накопительные скидки
- функции CRM — для более комфортного обслуживания клиентов магазина
Цели сформулированы? Обязательно запишите все подробности, которые придут на ум. Хороший подход — отложить принятие выводов на следующий день, и повторно вернуться к рассмотрению, свежим взглядом. Расставьте оценки по пунктам, вместе с заказчиком — какие метафункциональности более важны, какие менее приоритетны? Отсортируйте список и приступайте к детальному рассмотрению.
«Позволяет пользователям легко совершать покупки онлайн»
Очевидно, что ключевое слово — «легко». Для этого мы обращаем внимание на следующие аспекты:
- регистрация
- вид списков товаров
- вид страницы товара
- сопутствующие и аналогичные товары
- способ заказа
Базовые средства
- ваш любимый язык программирования (ЯП)
- ваш любимый фреймворк. Если таковой отсутствует — немедленно подружитесь с каким-нибудь. Если у вас нет опыта в этой части, не слушайте тех, кто говорит о вреде фреймворков. Для того, чтобы хорошо понять и прочувствовать этот момент — необходим личный опыт
- выделенное время
Секреты
1. Не начинайте программировать в течении первых трех суток с момента начала работы над проектом. Собирайте, коллекционируйте идеи, расставляйте приоритеты. Действуем по принципу, как в одном из моих любимых мультиков: «Лучше день потерять, потом за пять минут долететь».
2. Обязательно нужен собеседник. Коллега, друг или родственник — рассказывайте ему все. В процессе обсуждения будут возникать новые интересные идеи, будут осенять вдохновения и озарения.
3. Выслушивайте всех советчиков, в том числе многочисленных авторов статей и заметок в интернетах, в том числе и вашего покорного слугу. Но ни в коем случае ничего не принимайте на веру — будьте себе на уме! В подавляющем большинстве случаев обсуждения, споры и полемики не стоят затраченной на них энергии. Куда больше пользы будет, если вы будете аккумулировать ци в чакрах, и сбрасывать эту энергию в нужное вам русло. Управляйте своей кармой, это несложно — достаточно просто стараться больше слушать и задавать вопросы, не тратя времени на обоснование и доказывание своей позиции там, где это не необходимо.
Регистрация
Многие регистрироваться не любят. Многие, напротив, предпочитают зарегистрироваться, и пользоваться привычными функциями «Личного кабинета». Цель, в данном случае — не урезать потенциальную аудиторию, а постараться с возможно минимальными затратами угодить всем. Для этого мы сделаем:
- традиционную регистрацию
- вход и выход
- возможность пост-регистрации в виде ненавязчивой формы, где требуется указать контактную информацию при оформлении заказа
- редактирование профиля
- сброс или напоминание пароля
Вид списков товаров
Это один из наиболее важных вопросов. Зачастую на практике приходится делать ликбез даже для заказчиков. Основным, и едва-ли не единственным фактором, который влияет на этот аспект, является целевая аудитория магазина и ее практические интересы.
Например, если мы делаем магазин метизов — имеет смысл предусмотреть вид по-умолчанию в виде таблицы — прайс-листа. По-умолчанию делаем сортировку по алфавиту, даже в подкатегориях. Фотографии изделий могут быть доступны на странице товара, но они будут лишними на страницах-списках.
Другой, не менее яркий пример — магазин одежды, или модных гаджетов. Здесь внешний вид товаров принципиально важен для покупателей, поэтому имеет смысл выставлять их на витрину — отображение по умолчанию должно включать фотографии изделий. Здесь-же удобно выводить товары в списках блоками. В каждом блоке показываем название и фотографию товара, его краткие характеристики, и кнопку «купить».
В обоих примерах выше, прежде чем принять решение, мы обдумали ЦА и ее цели. В первом случае покупателями будут снабженцы. В этом случае человек, посетивший сайт, нуждается в возможно быстром формировании списка товаров в заказе — ему проще найти нужные позиции в списке, отсортированном по алфавиту, и отметить количество — в соответствии с реальным списком, который человек наиболее вероятно держит в руке, и сверяется с ним. Возможно, пользователь захочет получить дополнительную информацию по какому-либо товару, но этот механизм не будет приоритетным — поэтому мы показываем детальное описание, документацию и фотографии товаров только на странице товара.
Во втором случае речь скорее будет идти о штучных приобретениях. Обычно при этом для выбора важно визуальное впечатление.
Итак, в общем случае нам необходимо предусмотреть режимы вывода:
- прайс-лист, вывод списка товаров в режиме таблицы
- список товаров в виде «блоков»
- страница товара
В любом случае нужно предоставлять возможность купить товар, помещая кнопку «Заказать» и на страницы-списки, и на страницы товаров.
Каталогизатор
Товар может быть в какой-то категории, а может и не быть. Категории показываем в один уровень, т. к. дальше второго уровня посетители заходят редко.
В свойстве категории мы будем указывать, как отображать список ее товаров — в виде таблицы, или блоками. Это удобно, если мы, к примеру, на одном сайте продаем изделия и аксессуары к ним.
Иллюстрации
В общем случае у каждого товара может быть одна или несколько фотографий. В случае, если фотография отсутствует — верстка не должна пострадать. Это категорически необходимо предусмотреть веб-дизайнеру, напомните ему в брифе, до начала его работы.
В режиме просмотра «блоками» мы обычно показываем одну из имеющихся фотографий товара. Здесь есть два способа указания, какую именно фотографию показывать.
Первый способ. Загруженные на страницу товара фотографии сортируются. При этом, первая фотография — отображается и в общем каталоге.
Второй способ. Администратор или редактор ИМ (в зависимости от применяемой системы привилегий) выбирает фотографию, которая будет отображаться в списке. Это менее удобно, так как возможно случайно скрыть иллюстрацию на странице товара, которая должна отображаться в списке.
При «удалении» фотографии вывод не должен ломаться. Для этого возможно предусмотреть в модели (если вы используете MVC) соответствующие условия для выборок.
Цена
Стоит-ли говорить о том, что в ИМ всегда должно указывать цены? К сожалению, большое количество даже «опытных» продавцов не делают этого.
Аксиома: товар без цены покупают плохо.
Обычно продавцы из 90-х приводят аргумент о том, что покупатели ищут, где дешевле. На самом деле это не так. В подавляющем большинстве случаев покупатели ищут, где надежнее. Решающими факторами могут оказаться соответствие товара ожиданиям, его доступность, качество, как таковое, гарантия и так далее.
Лечение:
1. Привести контраргументы.
2. Если не помогло — сделайте два магазина. Затраты на создание второго вебсайта будут минимальными — новый домен, редизайн, копирайтинг. Укажите на нем цены, увеличенные на 5-10% относительно рабочего прайса продавца, и просто другой телефон. Спустя некоторое время исследуйте статистику по заказам — она будет очень и очень показательной.
Сделайте кнопку в админке «Показывать цены».
Импорт
Обязательно имеет смысл предусмотреть добавление и редактирование параметров товаров вручную. Дело в том, что обычно названия и описания товаров в прайсах имеют большое количество опечаток и ошибок. По вопросу влияния ошибок на маркетинг написано многое — легко прогуглить этот вопрос, для того, чтобы убедиться в его важности.
Также имеет смысл предусмотреть режимы:
- обновления остатков
- обновления цен
- автоматизированной загрузки новых товаров. При этом загруженным позициям автоматически давать флаг «Скрыто», для того, чтобы иметь возможность вручную корректировать описание и детали добавленных товаров. Разумным решением будет вынести управление этой опцией отдельной кнопкой в админке.
Персонал
Магазин может обслуживаться одним специалистом, но следует учесть, что в любой момент может стать популярным, и возможно потребует большего количества персонала для работы.
Также делегирование легко может быть востребовано в следующих случаях:
- работа копирайтера. В этом случае требуется предоставлять возможность редактировать описания товаров
- работа корректора. Полностью аналогично пункту выше
- работа менеджера. Доступ к заказам, к профилям пользователей, к описаниям товаров — для оперативного редактирования в случае обнаружения ошибок.
Отсюда приходим к выводу о возможности применения следующей модели ролей пользователей:
— администратор. Может все, в том числе давать привилегии другим пользователям и осуществлять настройку магазина
— редактор. Может редактировать описания товаров, добавлять новые товары
— менеджер. Может редактировать описания товаров, добавлять новые товары, пользоваться функциями импорта и обновлений, работает с заказами
Учетная запись администратора создается инсталлятором при установке программы.
Процессинг
Заказы могут находится в различных стадиях обработки. При этом механизм обработки заказов может изменяться в процессе развития магазина, это нормальное явление. Другой вопрос, что для классических решений изменение алгоритма процессинга обычно влечет необходимость внесения существенных изменений в код. Предлагается не создавать эту «бомбу» для владельца ИМ, но предусмотреть удобный универсальный механизм, за который вам скажут «Спасибо».
Итак, мы знаем, что заказы могут находится в различных стадиях обработки — статусах. Изменять статус заказа по-умолчанию может Менеджер. Задавать и редактировать статусы может администратор.
Механизм изменения статуса заказа возможно интегрировать с автоматизированным функциями оплаты и логиcтики.
Для удобства инсталлятор магазина может создавать «типовые» статусы:
- принято в обработку
- принята оплата
- выполнена отправка
- выполненные
- удаленные
Заказы без статуса считаются ожидающими поступления в обработку.
Информация о магазине
Как показывает опыт, на продажи ИМ благотворно влияют:
1.Публикация фотографий ключевых товаров
2.Публикация фотографий со складов и выставок. Реальным магазинам доверяют, в отличие от полностью виртуальных. Публикация фотографий и отчеты с мероприятий заставляют поверить в то, что магазин реальный. К сожалению, даже многие солидные компании не используют этот простой, но эффективный прием на своих вебсайтах. Зачем только кормят маркетологов?
3.Публикация общей информации об организации, обязательно включая контактные данные. Фотографии сотрудников за работой будут безусловным плюсом
4.Публикация информации о способах оплаты и доставки
5.Форма обратной связи
6.Номер телефона на большинстве страниц
Какой сделать систему публикаций? В зависимости от требований заказчика.
Я обычно поступаю следующим образом — делаю функциональность «Блоки». В админке возможно создавать, редактировать, скрывать и актуализировать блоки с HTML, привязываемые к относительному пути URI. Также добавляю полупустой контроллер Info или Articles. При загрузке шапки страниц некий метод проверяет — есть-ли блок с дополнительным контентом для этой страницы. Если есть — он отображается.
Таким образом возможно создавать текстовые описания и заметки везде, где будет угодно — как самостоятельные статьи, системы справки, более детальные описания категорий и так далее. Если добавить в привязки регулярку — получается еще более эффективный инструмент.
Структура программы
Теперь мы пришли к определенному видению методов классов контроллеров. Для того, чтобы сделать задачу решаемой — имеет смысл не перегружать мозг излишними деталями. Ввиду того, что эти детали, как таковые, необходимы, для решения задачи о предотвращении перегрузки мозга мы применим классический джедайский прием — запишем информацию. Когда информация записана — она доступна, но отсутствие необходимости хранить ее в памяти, собственно, и позволяет комфортно работать с информацией практически любой степени сложности.
Сначала пишем список классов, затем — детализируем их списками методов. В третий заход детализируем алгоритмы методов. Таким образом, от основы программы мы постепенно приходим к ее реализации — сперва сделали «оглавление» будущего романа, который в дальнейшем наполнили деталями.
Сперва список выглядит так:
1 Аккаунтинг
2 Товары. Администраторские функции для управления товарами
3 Иллюстрации. Управление иллюстрациями к товарам
4 Категории. Управление каталогом
5 Заказы. Управление заказами, рабочий режим для менеджеров
6 Статусы. Управление процессингом
7 Магазин. Основной режим шоппинга
8 Текущий заказ. Корзинка, и все что с ней связано
Потом вот так:
1 Аккаунтинг
1.1 Вход [Неавторизованные]
1.2 Выход
1.3 Регистрация [Неавторизованные]
1.4 Добавление пользователя [Администратор, Менеджер]
1.5 Редактирование профиля [Администратор, Менеджер, Автор]
1.6 Запрос на сброс пароля
1.7 Выполнение сброса пароля
1.8 Поиск пользователя [Администратор, Менеджер]
1.9 Просмотр списка пользователей [Администратор, Менеджер]
1.10 Рейтинг пользователей по статистическим показателям [Администратор, Менеджер]
1.11 Назначение и снятие привилегий редактора [Администратор]
1.12 Назначение и снятие привилегий Менеджера [Администратор]
1.13 Блокирование и разблокирование аккаунта [Администратор, Менеджер]
1.14 Просмотр профиля пользователя [Администратор, Менеджер, Автор]
2 Товары
2.1 Просмотр списка товаров, сортированного по алфавиту «Режим прайс-лист»
2.2 Поиск товара
2.3 Добавление [Администратор, Менеджер, Редактор]
2.4 Редактирование [Администратор, Менеджер, Редактор]
2.5 Скрытие [Администратор, Менеджер, Редактор]
2.6 Актуализация [Администратор, Менеджер, Редактор]
2.7 Просмотр товаров в категории [Администратор, Менеджер, Редактор]
2.8 Перемещение (сортировка) в категории [Администратор, Менеджер, Редактор]
3 Иллюстрации
3.1 На странице товара — загрузчик файлов изображений [Администратор, Менеджер, Редактор]
3.2 Скрытие [Администратор, Менеджер, Редактор]
3.3 Актуализация [Администратор, Менеджер, Редактор]
3.4 Перемещение (сортировка) [Администратор, Менеджер, Редактор]
4 Категории
4.1 Просмотр списка категорий [Администратор, Менеджер, Редактор]
4.2 Добавление [Администратор, Менеджер, Редактор]
4.3 Редактирование [Администратор, Менеджер, Редактор]
4.4 Скрытие [Администратор, Менеджер, Редактор]
4.5 Актуализация [Администратор, Менеджер, Редактор]
4.6 Перемещение [Администратор, Менеджер, Редактор]
5 Заказы
5.1 Просмотр заказов пользователя [Администратор, Менеджер, Автор]
5.2 Просмотр списка заказов по статусам [Администратор, Менеджер]
5.3 Просмотр списка заказов на дату [Администратор, Менеджер]
5.4 Просмотр деталей заказа [Администратор, Менеджер, Автор]
5.5 Экспорт заказа в XLS в виде накладной [Администратор, Менеджер]
5.6 Изменение статуса товара [Администратор, Менеджер]
6 Статусы
6.1 Просмотр списка статусов [Администратор]
6.2 Добавление [Администратор]
6.3 Редактирование [Администратор]
6.4 Скрытие [Администратор]
6.5 Актуализация [Администратор]
6.6 Перемещение [Администратор]
7 Магазин
На этих страницах будет присутствовать изобилие дополнительных блоков. Сейчас мы обозначим только основное — чтобы не распыляться
7.1 Главная страница — список категорий и список товаров, обозначенных для вынесения на главную страницу
7.2 Просмотр категории — список категорий слева и список товаров в выбранной категории справа
7.3 Страница товара. Подробное описание и детали товара, а также иллюстрации
8 Текущий заказ
8.1 Просмотр списка позиций в текущем заказе
8.2 Краткое отображение корзины. Подгружается асинхронно на страницы магазина (п. 7)
8.3 Добавление позиции в заказ
8.4 Изменение количества заказанной позиции
8.5 Очистка корзины
8.6 Сохранение заказа
А потом так:
Конечно, как ранее замечено, вид этого весьма далек от литературного, но тем не менее следует признать, что этот текст вовсе не предназначен для беглого чтения. Цели совершенно другие.
1 Аккаунтинг
1.1 Вход [Неавторизованные]
1.1.1 Эта фунция доступна только для неавторизованных пользователей
1.1.2 Если пришли данные POST
1.1.2.1 Если форма была заполнена корректно
1.1.2.1.1 Проверяем, есть-ли пользователь с указанными данными (получаем запись из базы)
1.1.2.1.1.1 Если да
1.1.2.1.1.1.1 Если пользователь не заблокирован
1.1.2.1.1.1.1.1 Авторизуем пользователя
1.1.2.1.1.1.1.2 Редирект на личный кабинет
1.1.2.1.1.1.1.3 Конец работы метода
1.1.2.1.1.1.2 Иначе
1.1.2.1.1.1.2.1 Показываем уведомление
1.1.2.1.1.1.2.2 Конец работы метода
1.1.2.1.1.2 Иначе
1.1.2.1.1.2.1 Показываем уведомление
1.1.3 Показываем форму для авторизации
1.2 Выход
1.2.1 Если есть пользовательская сессия
1.2.1.1 Прерываем ее
1.2.2 Редирект на главную страницу
1.3 Регистрация [Неавторизованные]
1.3.1 Эта фунция доступна только неавторизованным пользователям
1.3.2 Если пришли данные POST
1.3.2.1 Если форма была заполнена корректно
1.3.2.1.1 Проверяем, есть-ли аналогичная запись
1.3.2.1.1.1 Если да
1.3.2.1.1.1.1 Показываем уведомление
1.3.2.1.1.1.2 Переходим к форме авторизации
1.3.2.1.1.1.3 Конец работы метода
1.3.2.1.1.2 Иначе
1.3.2.1.1.2.1 Добавляем запись в таблицу пользователей
1.3.2.1.1.2.2 Показываем уведомление
1.3.2.1.1.2.3 Переходим к авторизации. В зависимости от принятой политики безопасности — возможно, делаем авторизацию автоматически и переходим в личный кабинет
1.3.2.1.1.2.4 Конец работы метода
1.3.3 Показываем форму для регистрации
1.4 Добавление пользователя [Администратор, Менеджер]
1.4.1 Эта функция доступна только администратору и менеджерам
1.4.2 Если пришли данные POST
1.4.2.1 Если форма была заполнена корректно
1.4.2.1.1 Проверяем, есть-ли аналогичная запись
1.4.2.1.1.1 Если да
1.4.2.1.1.1.1 Показываем уведомление
1.4.2.1.1.1.2 Переходим к просмотру профиля пользователя
1.4.2.1.1.1.3 Конец работы метода
1.4.2.1.1.2 Иначе
1.4.2.1.1.2.1 Добавляем новую учетную запись
1.4.2.1.1.2.2 Переходим (куда?)
1.4.2.1.1.2.3 Конец работы метода
1.4.3 Показываем форму для регистрации
1.5 Редактирование профиля [Администратор, Менеджер, Автор]
1.5.1 Эта функция доступна только зарегистрированным пользователям
1.5.2 Получаем из URI идентификатор пользователя, которому принадлежит профиль
1.5.3 Если идентификатора нет
1.5.3.1 Показываем сообщение об ошибке
1.5.3.2 Конец работы метода
1.5.4 Если запрашиваемый идентификатор не равен идентификатору текущего пользователя, и текущий пользователь не является администратором или модератором
1.5.4.1 Показываем уведомление «Доступ запрещен»
1.5.4.2 Конец работы метода
1.5.5 Получаем запись данного пользователя
1.5.6 Если записи нет
1.5.6.1 Показываем сообщение об ошибке
1.5.6.2 Конец работы метода
1.5.7 Если пришли данные POST
1.5.7.1 Если форма была заполнена корректно
1.5.7.1.1 Если ключевые (контактные) данные изменились
1.5.7.1.1.1 Если ключевые данные не коррелируют с другими учетными записями
1.5.7.1.1.1.1 Сохраняем изменения
1.5.7.1.1.1.2 Показываем уведомление об успешном сохранении
1.5.7.1.1.1.3 Редирект на измененный профиль пользователя
1.5.7.1.1.1.4 Конец работы метода
1.5.7.1.1.2 Иначе
1.5.7.1.1.2.1 Показываем сообщение об ошибке
1.5.8 Показываем форму с данными
1.6 Запрос на сброс пароля
1.6.1 Если пришли данные POST
1.6.1.1 Ищем запись
1.6.1.1.1 Если запись есть
1.6.1.1.1.1 Если письмо (или СМС) было выслано менее N часов назад
1.6.1.1.1.1.1 Показываем уведомление
1.6.1.1.1.1.2 Конец работы метода
1.6.1.1.1.2 Иначе
1.6.1.1.1.2.1 Генерируем ключ для сброса пароля для этого пользователя
1.6.1.1.1.2.2 Вносим правку в запись
1.6.1.1.1.2.3 Высылаем письмо (или СМС) с ключом и идентификатором
1.6.1.1.1.2.4 Показываем уведомление
1.6.1.1.1.2.5 Конец работы метода
1.6.1.1.2 Иначе
1.6.1.1.2.1 Показываем уведомление об ошибке
1.6.1.1.2.2 Конец работы метода
1.6.2 Показываем форму для запроса на сброс пароля
1.7 Выполнение сброса пароля
1.7.1 Получаем идентификатор и ключ из URI
1.7.2 Если идентификатора или ключа нет
1.7.2.1 Показываем сообщение об ошибке
1.7.2.2 Конец работы метода
1.7.3 Получаем запись по идентификатору
1.7.4 Если записи нет
1.7.4.1 Показываем уведомление об ошибке
1.7.4.2 Конец работы метода
1.7.5 Если в записи нет ключа
1.7.5.1 Показываем уведомление «Пароль уже обновлен»
1.7.5.2 Конец работы метода
1.7.6 Если ключ в записи не совпадает с полученным ключом
1.7.6.1 Показываем уведомление об ошибке
1.7.6.2 Конец работы метода
1.7.7 Удаляем ключ из записи
1.7.8 Генерируем новый пароль
1.7.9 Сохраняем новый пароль в базу
1.7.10 Высылаем его на почту или СМС
1.8 Поиск пользователя [Администратор, Менеджер]
1.8.1 Эта функция доступна только администратору и менеджерам
1.8.2 Если пришли данные POST
1.8.2.1 Если форма заполнена
1.8.2.1.1 Если данные из поля похожи на идентификатор (целое число)
1.8.2.1.1.1 Ищем запись пользователя по идентификатору
1.8.2.1.1.2 Если найдена
1.8.2.1.1.2.1 Если найдена одна запись
1.8.2.1.1.2.1.1 Переходим в найденный профиль
1.8.2.1.1.2.2 Иначе
1.8.2.1.1.2.2.1 Показываем список найденных записей
1.8.2.1.1.2.3 Конец работы метода
1.8.2.1.2 Если данные из поля похожи на адрес электронной почты
1.8.2.1.2.1 Ищем запись пользователя по адресу электронной почты
1.8.2.1.2.2 Если найдена
1.8.2.1.2.2.1 Если найдена одна запись
1.8.2.1.2.2.1.1 Переходим в найденный профиль
1.8.2.1.2.2.2 Иначе
1.8.2.1.2.2.2.1 Показываем список найденных записей
1.8.2.1.2.2.3 Конец работы метода
1.8.2.1.3 Если данные из поля похожи на номер телефона
1.8.2.1.3.1 Ищем запись по полю «Номер телефона»
1.8.2.1.3.2 Если найдена
1.8.2.1.3.2.1 Если найдена одна запись
1.8.2.1.3.2.1.1 Переходим в найденный профиль
1.8.2.1.3.2.2 Иначе
1.8.2.1.3.2.2.1 Показываем список найденных записей
1.8.2.1.3.2.3 Конец работы метода
1.8.2.1.4 Если данные похожи на ФИО
1.8.2.1.4.1 Ищем по полю «ФИО»
1.8.2.1.4.2 Если найдена
1.8.2.1.4.2.1 Если найдена одна запись
1.8.2.1.4.2.1.1 Переходим в найденный профиль
1.8.2.1.4.2.2 Иначе
1.8.2.1.4.2.2.1 Показываем список найденных записей
1.8.2.1.4.2.3 Конец работы метода
1.8.2.1.5 Если ничего не найдено
1.8.2.1.5.1 Показываем уведомление
1.8.3 Показываем форму с полем «Искать по идентификатору, номеру телефона, адресу электронной почты или ФИО»
1.9 Просмотр списка пользователей [Администратор, Менеджер]
1.9.1 Эта фунция доступна только администратору и менеджерам
1.9.2 Получаем из URI режим просмотра
1.9.3 Получаем из URI номер страницы
1.9.4 Делаем выборку из базы по режиму просмотра и номеру страницы
1.9.5 Если есть данные
1.9.5.1 Показываем список и пагинацию со стрелками
1.9.6 Иначе
1.9.6.1 Показываем уведомление «Пусто»
1.9.7 Показываем список ссылок на доступные режимы просмотра
1.10 Рейтинг пользователей по статистическим показателям [Администратор, Менеджер]
1.10.1 Эта функция доступна только менеджеру или администраторам
1.10.2 Получаем из URI режим просмотра
1.10.3 Получаем из URI номер страницы
1.10.4 Делаем выборку из базы по режиму просмотра и номеру страницы
1.10.5 Если есть данные
1.10.5.1 Показываем список и пагинацию со стрелками
1.10.6 Иначе
1.10.6.1 Показываем уведомление «Пусто»
1.10.7 Показываем список ссылок на режимы просмотра по доступным статистическим показателям
1.11 Назначение и снятие привилегий редактора [Администратор]
1.11.1 Эта функция доступна только администратору
1.11.2 Получаем из URI идентификатор пользователя
1.11.3 Если идентификатора пользователя нет
1.11.3.1 Показываем уведомление об ошибке
1.11.3.2 Конец работы метода
1.11.4 Получаем учетную запись пользователя
1.11.5 Если учетной записи нет
1.11.5.1 Показываем уведомление об ошибке
1.11.5.2 Конец работы метода
1.11.6 Получаем из URI статус действия (снять или назначить)
1.11.7 Если статус есть
1.11.7.1 Вносим изменения в запись
1.11.7.2 Показываем уведомление
1.11.7.3 Редирект на профиль пользователя
1.11.7.4 Конец работы метода
1.11.8 В зависимости от текущего статуса (является ли редактором или нет), показываем ссылку на этот-же метод, но со статусом в конце URI
1.12 Назначение и снятие привилегий Менеджера [Администратор]
1.12.1 Эта функция доступна только администратору
1.12.2 Получаем из URI идентификатор пользователя
1.12.3 Если идентификатора пользователя нет
1.12.3.1 Показываем уведомление об ошибке
1.12.3.2 Конец работы метода
1.12.4 Получаем учетную запись пользователя
1.12.5 Если учетной записи нет
1.12.5.1 Показываем уведомление об ошибке
1.12.5.2 Конец работы метода
1.12.6 Получаем из URI статус действия (снять или назначить)
1.12.7 Если статус есть
1.12.7.1 Вносим изменения в запись
1.12.7.2 Показываем уведомление
1.12.7.3 Редирект на профиль пользователя
1.12.7.4 Конец работы метода
1.12.8 В зависимости от текущего статуса (является ли менеджером или нет), показываем ссылку на этот-же метод, но со статусом в конце URI
1.13 Блокирование и разблокирование аккаунта [Администратор, Менеджер]
1.13.1 Эта функция доступна только администратору и менеджерам
1.13.2 Получаем из URI идентификатор пользователя
1.13.3 Если идентификатора пользователя нет
1.13.3.1 Показываем уведомление об ошибке
1.13.3.2 Конец работы метода
1.13.4 Получаем учетную запись пользователя
1.13.5 Если учетной записи нет
1.13.5.1 Показываем уведомление об ошибке
1.13.5.2 Конец работы метода
1.13.6 Получаем из URI статус действия (снять или назначить)
1.13.7 Если статус есть
1.13.7.1 Вносим изменения в запись
1.13.7.2 Показываем уведомление
1.13.7.3 Редирект на профиль пользователя
1.13.7.4 Конец работы метода
1.13.8 В зависимости от текущего статуса (заблокирован или нет), показываем ссылку на этот-же метод, но со статусом в конце URI
1.14 Просмотр профиля пользователя [Администратор, Менеджер, Автор]
1.14.1 Эта функция доступна только зарегистрированным пользователям
1.14.2 Получаем из URI идентификатор пользователя
1.14.3 Если идентификатора нет
1.14.3.1 Присваиваем идентификатору значение идентификатора текущего пользователя
1.14.4 Если идентификатор пользователя не равен идентификатору текущего пользователя
1.14.4.1 Если текущий пользователь не имеет статуса администратора или менеджера
1.14.4.1.1 Показываем уведомление «Доступ запрещен»
1.14.4.1.2 Конец работы метода
1.14.5 Получаем запись пользователя
1.14.6 Если записи нет
1.14.6.1 Показываем сообщение об ошибке
1.14.6.2 Конец работы метода
1.14.7 Показываем детали пользователя
1.14.8 Показываем ссылки-кнопки на доступные действия, исходя из статуса текущего пользователя и деталей просматриваемого профиля
2 Товары
2.1 Просмотр списка товаров, сортированного по алфавиту «Режим прайс-лист»
2.1.1 Если для этого метода установлен режим постраничного вывода
2.1.1.1 Получаем из URI номер страницы
2.1.2 Делаем выборку активных товаров из базы
2.1.3 Если пусто
2.1.3.1 Показываем уведомление «Пусто»
2.1.3.2 Конец работы метода
2.1.4 Показываем список товаров. Если текущий пользователь имеет статус администратора, менеджера или редактора — показываем кнопки для действий с записями — редактировать, скрыть/активировать.
2.1.5 Показываем нумерацию страниц, при необходимости
2.2 Поиск товара
2.2.1 Показываем форму
2.2.2 Если пришли данные POST
2.2.2.1 Если поле формы заполнено
2.2.2.1.1 Ищем товары по имеющимся данным
2.2.2.1.2 Если найдено
2.2.2.1.2.1 Если найден один товар
2.2.2.1.2.1.1 Редирект на его страницу
2.2.2.1.2.1.2 Конец работы метода
2.2.2.1.2.2 Если найдено много товаров
2.2.2.1.2.2.1 Показываем список товаров
2.2.2.1.3 Если не найдено
2.2.2.1.3.1 Показываем уведомление
2.3 Добавление [Администратор, Менеджер, Редактор]
2.3.1 Эта фунция доступна только администратору, менеджерам и редакторам
2.3.2 Если пришли данные POST
2.3.2.1 Если поля формы были заполнены корректно
2.3.2.1.1 Добавляем новый элемент
2.3.2.1.2 Показываем уведомление об успешном добавлении
2.3.2.1.3 Редирект на этот-же URL (режим непрерывного забивания данных)
2.3.2.1.4 Конец работы метода
2.3.3 Показываем форму
2.4 Редактирование [Администратор, Менеджер, Редактор]
2.4.1 Эта функция доступна только администратору, менеджерам и редакторам
2.4.2 Получаем идентификатор записи из URI
2.4.3 Если идентификатора нет
2.4.3.1 Показываем сообщение об ошибке
2.4.3.2 Конец работы метода
2.4.4 Получаем запись по идентификатору
2.4.5 Если записи нет
2.4.5.1 Показываем сообщение об ошибке
2.4.5.2 Конец работы метода
2.4.6 Если пришли данные POST
2.4.6.1 Если поля формы были заполнены корректно
2.4.6.1.1 Обновляем запись
2.4.6.1.2 Показываем уведомление об успешном сохранении
2.4.6.1.3 Редирект на страницу товара
2.4.6.1.4 Конец работы метода
2.4.7 Показываем данные в форме
2.5 Скрытие [Администратор, Менеджер, Редактор]
2.5.1 Эта функция доступна только администратору, менеджерам и редакторам
2.5.2 Получаем идентификатор записи из URI
2.5.3 Если идентификатора нет
2.5.3.1 Показываем сообщение об ошибке
2.5.3.2 Конец работы метода
2.5.4 Получаем запись по идентификатору
2.5.5 Если записи нет
2.5.5.1 Показываем сообщение об ошибке
2.5.5.2 Конец работы метода
2.5.6 Присваиваем товару признак «Скрытый»
2.6 Актуализация [Администратор, Менеджер, Редактор]
2.6.1 Эта функция доступна только администратору, менеджерам и редакторам
2.6.2 Получаем идентификатор записи из URI
2.6.3 Если идентификатора нет
2.6.3.1 Показываем сообщение об ошибке
2.6.3.2 Конец работы метода
2.6.4 Получаем запись по идентификатору
2.6.5 Если записи нет
2.6.5.1 Показываем сообщение об ошибке
2.6.5.2 Конец работы метода
2.6.6 Присваиваем товару признак «Активный»
2.7 Просмотр товаров в категории [Администратор, Менеджер, Редактор]
2.7.1 Эта функция доступна только администратору, менеджерам и редакторам
2.7.2 Получаем идентификатор категории из URI
2.7.3 Если идентификатора нет
2.7.3.1 Выбираем все товары без категории
2.7.4 Иначе
2.7.4.1 Получаем запись категории
2.7.4.2 Если записи нет
2.7.4.2.1 Показываем сообщение об ошибке
2.7.4.2.2 Конец работы метода
2.7.4.3 Выбираем товары в категории, сортированные по полю sortorder
2.7.5 Показываем список товаров, с кнопками для доступных действий, включая сортировку, если активен режим просмотра в категории
2.8 Перемещение (сортировка) в категории [Администратор, Менеджер, Редактор]
2.8.1 Эта функция доступна только администратору, менеджерам и редактору
2.8.2 Получаем идентификатор товара из URI
2.8.3 Если идентификатора нет
2.8.3.1 Показываем сообщение об ошибке
2.8.3.2 Конец работы метода
2.8.4 Получаем запись товара по идентификатору
2.8.5 Если записи нет
2.8.5.1 Показываем сообщение об ошибке
2.8.5.2 Конец работы метода
2.8.6 Если товар вне категории
2.8.6.1
2.8.7 Получаем направление перемещения (вверх или вниз) из URI
2.8.8 Если направление не указано
2.8.8.1 Показываем сообщение об ошибке
2.8.8.2 Конец работы метода
2.8.9 Если направление вверх, получаем запись товара в аналогичной категории, но со значением поля sortorder меньше, чем у текущего, сортируем по убыванию sortorder, ограничение размера выборки на 1 элемент.
2.8.10 Если направление вниз, получаем запись товара в аналогичной категории, но со значением поля sortorder больше, чем у текущего, сортируем по возрастанию sortorder, ограничение размера выборки на 1 элемент.
2.8.11 Если элемент найден
2.8.11.1 Найденному элементу записываем значение поля sortorder текущего
2.8.11.2 Текущему элементу записываем значение поля sortorder найденного
2.8.12 Редирект на просмотр категории (если категории не было — тогда на просмотр списка товаров без категории)
3 Иллюстрации
3.1 На странице товара — загрузчик файлов изображений [Администратор, Менеджер, Редактор]
3.1.1 Эта функция доступна только администратору, менеджерам и редакторам
3.1.2 Поле action формы для загрузки файлов содержит идентификатор товара. Таким образом, загруженные изображения ассоциируются с конкретным товаром
3.2 Скрытие [Администратор, Менеджер, Редактор]
3.3 Актуализация [Администратор, Менеджер, Редактор]
3.4 Перемещение (сортировка) [Администратор, Менеджер, Редактор]
4 Категории
4.1 Просмотр списка категорий [Администратор, Менеджер, Редактор]
4.2 Добавление [Администратор, Менеджер, Редактор]
4.3 Редактирование [Администратор, Менеджер, Редактор]
4.4 Скрытие [Администратор, Менеджер, Редактор]
4.5 Актуализация [Администратор, Менеджер, Редактор]
4.6 Перемещение [Администратор, Менеджер, Редактор]
5 Заказы
5.1 Просмотр заказов пользователя [Администратор, Менеджер, Автор]
5.2 Просмотр списка заказов по статусам [Администратор, Менеджер]
5.3 Просмотр списка заказов на дату [Администратор, Менеджер]
5.4 Просмотр деталей заказа [Администратор, Менеджер, Автор]
5.5 Экспорт заказа в XLS в виде накладной [Администратор, Менеджер]
5.6 Изменение статуса товара [Администратор, Менеджер]
6 Статусы
6.1 Просмотр списка статусов [Администратор]
6.1.1 Эта функция доступна только администратору
6.1.2 Выбираем из базы все статусы
6.1.3 Если список статусов не пуст
6.1.3.1 Выводим список статусов, у каждого пункта — кнопки с доступными действиями
6.2 Добавление [Администратор]
6.2.1 Эта функция доступна только администратору
6.2.2 Если пришли данные POST
6.2.2.1 Если форма была заполнена корректно
6.2.2.1.1 Добавляем новый статус
6.2.2.1.2 Редирект на список статусов
6.2.2.1.3 Конец работы метода
6.2.3 Показываем форму для добавления статуса
6.3 Редактирование [Администратор]
6.3.1 Эта функция доступна только администратору
6.3.2 Получаем из URI идентификатор записи
6.3.3 Если идентификатора нет
6.3.3.1 Показываем уведомление об ошибке
6.3.3.2 Конец работы метода
6.3.4 Получаем запись статуса по идентификатору
6.3.5 Если записи нет
6.3.5.1 Показываем уведомление об ошибке
6.3.5.2 Конец работы метода
6.3.6 Если поступили данные POST
6.3.6.1 Если форма заполнена корректно
6.3.6.1.1 Обновляем запись
6.3.6.1.2 Редирект на список статусов
6.3.6.1.3 Конец работы метода
6.3.7 Показываем данные в форме
6.4 Скрытие [Администратор]
6.5 Актуализация [Администратор]
6.6 Перемещение [Администратор]
7 Магазин
7.1 Главная страница — список категорий и список товаров, обозначенных для вынесения на главную страницу
7.2 Просмотр категории — список категорий слева и список товаров в выбранной категории справа
7.3 Страница товара. Подробное описание и детали товара, а также иллюстрации
8 Текущий заказ
8.1 Просмотр списка позиций в текущем заказе
8.2 Краткое отображение корзины. Подгружается асинхронно на страницы магазина (п. 7)
8.3 Добавление позиции в заказ
8.4 Изменение количества заказанной позиции
8.5 Очистка корзины
8.6 Сохранение заказа
Наверняка вы уже заметили, что перевести программу с родного языка на любимый язык программирования — дело плёвое? Так и делайте — сперва определяйтесь с целями, начиная от общего, двигайтесь к деталям. Напомню принцип, упомянутый в начале — не приступать к работе с деталями, пока не решены и досконально не определены глобальные вопросы. Мозг в данном случае выступает как основной инструмент в этой работе, поэтому имеет смысл беречь его, не перегружать амбициями, мелочами и другой излишней информацией.
Здесь приведены не все необходимые классы. Мы с вами поступаем так нарочно, так как очевидно, что опущенные задачи не приоритетны. Сперва сделаем прототип — версию пре-альфа. Затем отладим ее, и дополним необходимыми функциями по избыточному принципу, но уже в следующей итерации. Так мы постепенно придем к альфа-версии — которую уже можно показывать заказчику, коллегам, дизайнеру.
Я раскрыл не все методы классов, ввиду следующего:
- уже и так много текста в одном месте
- чтобы не насаждать свою точку зрения на методику программирования
- чтобы избежать глупых споров, которые обычно бывают в таких случаях (см. комментарии)
- чтобы не лишать вас удовольствия. Вы можете дополнить описания методов по аналогии с уже детализированными, искать решения в литературе по алгоритмизации, на форумах, подсматривать, как это сделано в свободных CMS, придумывать что-то самостоятельно.
Ведь это так увлекательно, правда?
Спасибу можно сказать в профиле. Вопросы в комментарии, пожелания в ЛС.
Благодарю за внимание, удачи!