Я очень долго собирался оформить этот рецепт, но врождённая лень работа отнимала всё время. Сегодня мне в личку напомнили, дескать, "где рецепт деньги, Лебовски?" и я понял - пора!
Пролог и он же лирическое отступление.
Интернет-магазин обязан быть удобным и должен учитывать пожелания любимого ленивого клиента.
Несомненно, одной из удобнейших фишек является автозаполнение форм для зарегистрированных пользователей: зарегистрировался, заполнил поля с ФИО и адресом, и при дальнейших покупках всё это подставляется автоматом.
Передо мной встала задача реализовать такую штуку, и несмотря на то, что в JBZoo 220 есть в настройках опция "Брать значение из профиля пользователя", я упёрся в непонимание и несправедливость со стороны стандартного профиля Joomla, в котором полей для заполнения - два с половиной. Вот как он выглядит:
Меня такой расклад совершенно не устраивал. Погуглив и полазив по форуму я нашёл решение, где подключался плагин "Профиль", который добавляет-таки поля к стандартному набору:
Однако, там начисто отсутствуют поля для ФИО, например. Конечно, можно было просто переопределить языковые константы, что я и сделал (в качестве эксперимента скорее - я точно знал, что этот способ уже меня бесит), но такая убогая костыльность не вариант, я дисциплину люблю, а любые посторонние ненужности от сайта в виде левых плагинов всегда стараюсь отрЭзать.
Перейдём к решению:
Как настоящие джедаи мы будем допиливать стандартный джумловский профиль. С преферансом и куртизанками, да.
Шаг первый
Итак, первоочередная задача - попасть в phpmyadmin, чаще всего на хостингах юзается именно он (а если нет - то вы бородатый одмин и инструкции вам не нужны). Находим таблицу t_users, щёлкаем по ней, видим примерно следующую картину:
Это не что иное, как таблица, в которой Joomla хранит профили пользователей. Имя, логин, пароль, статус, дата последнего входа и т.п. информация пишется именно сюда. Всего-то и нужно добавить свои поля.
Важно: у вас префикс t_ будет какой-то свой, не суть, ключевое слово - users
Шаг второй
Добавим в таблицу свои параметры. Точнее, не сами параметры, а места в базе данных под них, чтобы было где хранить
Я буду добавлять поля 3 поля -"Имя", "Фамилия" и "Адрес".
Под табличкой видим область для добавления новых записей. У меня их 3, поэтому я ставлю 3 (ваш Кэп), отмечаю "В конец таблицы" и щёлкаем кнопку "Вперёд":
После этого, в открывшемся поле для редактирования задаём в колонке "Имя" - названия параметров латинскими буквами, "Тип" выставляем в VARCHAR, "Длину" - по своему усмотрению: к примеру, если у вас есть будет в профиле поле "Возраст" - логично, чтобы его длина была двум символам. Для имени и фамилии я задал длину в 50 символов, а для адреса отвёл 200. Остальные поля от греха подальше можно не трогать. Вот как это выглядит у меня:
Жмём справа внизу кнопку "Сохранить", снова зайдём в таблицу users и увидим следующую картину:
Поздравляю, мы подготовили в базе места для новых полей в профиле
Шаг третий
Не будем забывать, что мы подготовили только места для данных в SQL-базе, однако, сама Joomla о ваших проделках вообще не в курсе и поля в её форме регистрации не появятся, поэтому мы ей немного поможем.
Давайте откроем конфигурационный файл, который отвечает непосредственно за вывод полей в форме - registration.xml, который лежит по адресу /components/com_users/models/forms, и найдём в нём вот такой кусок кода:
<field name="name" type="text" description="COM_USERS_REGISTER_NAME_DESC" filter="string" label="COM_USERS_REGISTER_NAME_LABEL" required="true" size="30" />
Немножко разберёмся. Эта запись отвечает за выведение поля "Имя" в форме регистрации пользователя и подсказывает джумле, в какую таблицу базы класть введённое значение. Расскажу что тут для чего:
- name - это название ячейки базы данных, в которую будут закидываться данные из формы.Помните, я делал три поля в SQL и называл их firstname, family и address? Вот, name говорит джумле, в какую ячейку класть данные.
- type - тип данных
- description - подсказка
- filter - валидация введённого значения
- label - подпись к полю формы
- required - обязательность заполнения данного поля. true - обязательно, false - нет. Если выставлено тру - около поля появится звёздочка и форма не отправится, пока не будет заполнено поле (Ваш Кэп)
- size - ширина поля формы
Итак, берём этот кусок кода и копируем его столько раз, сколько полей вы хотите получить. В моём случае - три, и правим так, как нам нужно. Вот так получилось у меня:
<field name="name" type="text" description="COM_USERS_REGISTER_NAME_DESC" filter="string" label="COM_USERS_REGISTER_NAME_LABEL" required="true" size="30" /> <field name="firstname" type="text" description="Введите имя" filter="string" label="Имя" required="true" size="30" /> <field name="family" type="text" description="Введите фамилию" filter="string" label="Фамилия" required="true" size="30" /> <field name="address" type="text" description="Введите адрес" filter="string" label="Адрес" required="true" size="30" />
Сохраним файл и перейдём на сайт туда, где у вас осуществляется регистрация пользователей. Я делаю всё это на демке JBZoo, поэтому форма входа коряво гордо висит посередине страницы, но не суть. А главное, что мы видим - в форме появились вожделенные поля!
Порядок их выведения вы можете настроить прям в xml файле. Просто расставьте поля в нужном порядке.
Примечание: я сделал не совсем корректно - у меня было стандартное поле с именем, а я прикрутил ещё одно, поторопился
Шаг четвёртый
Теперь добавим отображение этих полей в админке, в менеджере пользователей. Для этого идём в /administrator/components/com_users/models/forms и берём за жабры файл user.xml. Действуем там по старой схеме, не забываем сохранить файл с изменениями, и после манипуляций у нас получится вот так:
Шаг пятый
Но и это ещё не всё! (с)
Чтобы данные из профиля Joomla подхватывались в JBZoo, нужно зайти в /media/zoo/applications/jbuniversal/framework/helpers и файле jbfields.php добавить в массив $whiteList через запятую названия наших ячеек в SQL. В моём случае это firstname, family и address:
$whiteList = array('name', 'username', 'email', 'registerDate', 'lastvisitDate', 'firstname', 'family', 'address');
Теперь, чтобы настроить автозаполнение формы, нужно зайти в админке в настройки шаблона формы и выставить из каких полей профиля что брать, ибо поля появились у нас в списке:
Как-то так. Да, кстати - не забывайте про бэкапы и помните, что всё это вы делаете на свой страх и риск, и всё такое.
Также учтите, что при обновлении движка файлы registration.xml и user.xml могут потереться в дефолтное состояние, но поскольку они отвечают только за отображение информации и вывод полей в форме - данные в базе никак не пострадают. Достаточно будет восстановить два вышеназванных файла и всё придёт в норму.