Virtuemart BMPE 1.0.15

Статус
В этой теме нельзя размещать новые ответы.

smallghost

Создатель
Регистрация
19 Мар 2009
Сообщения
40
Реакции
4
Подскажите в каком файле меняется форма оформления заказа?

Менял и admin.user_address_form и store.user_address_form и другие, а форма не меняется? (хотял для начала убрать строку запроса Компании) :nezn:
 
Ты имел ввиду форму регистрации?
 
Ты имел ввиду форму регистрации?

Да, именно её, хочу убрать лишние строки запроса информации

Вообще регистрацию я хочу переделать, т.е. в верхней части оставить форму логина, и добавить ссылку на регистрацию, а в нижней части (где сейчас регистрация) переделать форму под быстрый заказ без регистрации.
 

Вложения

  • form.jpg
    form.jpg
    22,1 KB · Просмотры: 29
Вот что я использовал для хаканья регистрации под Вирт 1,0,*
В статье я попытался раскрыть все основные вопросы, заданные когда-либо на форуме ру-мамбо по поводу регистрации и авторизации так, чтобы даже человеку не особо знакомому с php было возможно что-то изменить там "под себя".

Рассмотрены вопросы "тихой" и "невидимой регистрации", рассказано как устроена регистрационная форма в virtuemart, как вызвать её отдельно, как правильно добавлять новые и убирать ненужные поля в этой форме, как изменить визуальное оформление полей этой формы и ещё всякое разное =).

Содержание:

Что такое "тихая" регистрация.
Что такое "невидимая" регистрация.
Какие файлы понадобятся.
Какие имена полей можно использовать.
Как проходит регистрация.
Как изменять/удалять/добавлять поля в форму регистрации.
Изменение внешнего вида формы регистрации и её полей.
Что происходит после регистрации: Куда мы попадём и что увидим.
Авторизация и вопросы с ней связанные.
Извините за невнятное форматирование текста в некоторых местах, мы работаем над этим.


Для затравки.
Использовались оригинальные файлы из дистрибутива Virtuemart 1.0.2.
Посему строки и вообще содержание может нихера не совпадать с содержаниемваших файлов и работать совсем не так.

Если у Вас работает совсем не так, то я в этом не виноват, ищите свои ошибки самостоятельно.



Что такое "тихая" регистрация.
"тихая" или "бесшумная" регистрация - silent registration, включена в VirtueMart по умолчанию. Что это такое? Это когда человеку не нужно придумывать себе имя пользователя и пароль, чтобы что-то купить. Эти действия за него сделает VirtueMart. После регистрации магазин пришлёт пользователю его имя пользователя(оно будет создано из e-mail'а пользователя, где знак "-" (тире) заменится на "_" (нижнее подчеркивание)) и пароль(беспорядочный набор цифр и символов).


Что такое "невидимая" регистрация.
"невидимая" регистрация, это я её так назвал, на самом деле представляет собой не что иное как оформление заказа без регистрации. "невидимой" я её назвал потому, что регистрация всё-таки происходит, происходит она также как и при "тихой" регистрации. При этом никому никаких писем по поводу регистрации не отсылается, а после успешного оформления заказа все её следы в системе подчищаются.

Код хака для реализации "невидимой" регистрации я тут приводить не буду по многим причинам. Тот, кому необходимо реализовать этот вид регистрации без особого труда смогут это сделать сами.


Какие файлы понадобятся.

/administrator/components/com_virtuemart/html/checkout_register_form.php (далее checkout_register_form.php)
/administrator/components/com_virtuemart/classes/ps_shopper.php (далее ps_shopper.php)
/administrator/components/com_virtuemart/classes/htmlTools.class.php (далее htmlTools.class.php)


Какие имена полей можно использовать.
"company_name" - Наименование компании
"title" - Обращение (Мистер, Товарищ, Джедай)

"last_name" - Фамилия

"first_name" - Имя

"middle_name" - Отчество

"phone_1" - Телефон

"phone_2" - Ещё один телефон

"fax" - Факс

"address_1" - Адрес

"address_2" - Другой адрес

"city" - Город

"state" - Штат/Область/Регион

"country" - Город

"zip" - Почтовый индекс

"email" - Адрес электронной почты (при "тихой" регистрации из него будет сгенерирован логин, причём в логине все тире ("-") будут заменены на подчёркивание("_"))

5 полей произвольного назначения от "extra_field_1" до "extra_field_5"


Как проходит регистрация.
1. Из файла checkout_register_form.php
2. При нажатии на кнопку "Зарегестрироваться" JavaScript проверяет поля на верность заполнения.
Скрипт находится в файле htmlTools.class.php
функция "printJS_formvalidation", строка 458.

Помечает пропущеные обязательные поля красным цветом.
Проверяет поле "email" на соответствие шаблону "буква(буква или точка или тире)*сколько угодно раз@буква(буква или точка или тире)*сколько угодно раз.(буква)*2-4раза", потом Joomla! ещё раз проверит =)

Проверяет, чтобы значение в поле "username" было не меньше 3-х символов.
Проверяет, чтобы значение в поле "password" было не меньше 6-и символов и совпадало со значением в поле "password2"
Проверяет наличие галочки "Согласен с условиями работы магазина", если в конфиге выставлена соответствующая опция.
3. Данные передаются на обработку файлу ps_shopper.php, где данные проверяются во второй раз.

Далее всё это рассмотрено подробнее.


Как изменять/удалять/добавлять поля в форму регистрации.
В Virtuemart формирование регистрационной формы было координально переделано. На мой взгляд текущая реализация очень неплоха, я бы примерно также делал.

Форма составляется из блоков (несколько полей в рамочке).

Начало блока:
PHP:
<?php $shopper_fields[uniqid('fieldset_begin')] = $title; ?>
, где $title - это текстовая переменная или просто текст, оглавляющий блок. Например: "Даные плательщика" и т.п.

Конец блока:
PHP:
<?php $shopper_fields[uniqid('fieldset_end')] = ''; ?>

Между началом и концом блока располагается объявление полей блока: $shopper_fields['имя поля'] = 'заголовок поля';
В каком порядке поля объявлены в таком порядке они и появятся в форме.

Начиная с комментария: "This is the most important part of this file Here we print the field & its contents!"
Происходит определение типа поля и соответствующая обработка.
Например: кусок

PHP:
<?php1  case 'state':2    echo $ps_html->dynamic_state_lists( "country", "state", $country, $state );3    echo "<noscript>\n";4    $ps_html->list_states("state", $state, "", "id=\"state\"");5    echo "</noscript>\n";6  break;?>
означает, что (по строкам)
1. если в данный момент обрабатывается поле с именем "state", то
2. вызывается функция, которая формирует список штатов и этот список печатается,
3,4,5. делают тоже самое для броузеров, в которых отключен JavaScript,
6. обработка закончена, переходим к следующему полю.

По умолчанию отдельно обрабатываются поля: "title", "country", "state", "bank_account_type", "agreed", "password", "password2", "extra_field_4", "extra_field_5"

Остальные поля обрабатываются по сценарию "default", т.е. из них получаются обычные поля для ввода текста.
Например: из записи

PHP:
<?php $shopper_fields['first_name'] = $VM_LANG->_PHPSHOP_SHOPPER_FORM_FIRST_NAME; ?>
будет сгенерирован html код:

<input type="text" id="first_name" name="first_name" size="30" value="" class="inputbox" /> Таким образом Вы можете выводить и обрабатывать любые поля так, как Вам хочется.

Обязательные поля задаются в переменной $required_fields в строке 35. По умолчанию обязательными являются поля: "first_name", "last_name", "address_1", "city", "zip", "country", "phone_1".
!!!Очень важно!!! (Добавлено 12 марта, в субботу) - Не убирайте поле "city" полностью. Иначе при авторизации пользователю предложат дополнить недостающую информацию. О причинах этого явления и способах борьбы с ним в конце статьи.

Но это не единственное место. Если Вы например уберёте из списка поле "zip", то при регистрации Вас всё равно выкинет назад с сообщением "Заполните все поля полностью и правильно" и поле zip будет обозначено "стилем пропущеного поля".

Открываем файл ps_shopper.php и исправляем эту ерунду. Находим функцию "function validate_add"
Что мы видим:

Если включена "тихая" регистрация, то обязательными полями будут: "username", "password", "password2", "email".
В любом случае обязательными будут: "first_name", "last_name", "address_1", "city", "zip", "country".

Если в конфигурации Virtuemart выставлена возможность выбирать штат, то обязательным будет поле "state".
Если в конфигурации Virtuemart выставлена необходимость соглашаться с правилами работы магазина обязательным будет поле "agreed".
Поля: "company", "phone_1" обязательными не будут так, как соответствующие строки закомментированы.
Таким образом Вы можете закомментировать ненужные поля и/или добавить нужные.


Изменение внешнего вида формы регистрации и её полей.
Чуть выше я говорил о "стиле пропущенного поля", это css код для обязательного поля, которое заполнили неправильно или вообще не заполнили и это выяснилось, после нажатия кнопки "Зарегестрироваться".
По умолчанию этот стиль прописан в 25 строке файла checkout_register_form.php и представляет собой строку <?php $missing_style = 'color:red; font-weight:bold;'; ?> , что означает, что заголовок пропущеного поля просто выделяется красным цветом и становится жирным.

В 29 и 30 строках определяется стиль для всех полей:
стиль для заголовка поля:

PHP:
<?php  $label_div_style = '    float: left;    width: 30%;    text-align: right;    vertical-align: bottom;    font-weight: bold;    padding-right: 5px;  ';?>
Стиль для div элемента, в котором содержится само поле:

PHP:
<?php $field_div_style = 'float: left; width: 60%;'; ?>

Что происходит после регистрации: Куда мы попадём и что увидим.
Когда пользователь добавлен происходит следующее:

PHP:
<?php  if( !$my->id && $mosConfig_useractivation == '0') {    $mainframe->login($d['username'], md5( $d['password'] ));    mosRedirect( "index.php?option=$option&page=checkout.index" );  }  else {    mosRedirect( "index.php?option=$option&page=shop.index", _REG_COMPLETE_ACTIVATE );  }?>
если пользователь не вошёл (войти можно функцией
PHP:
<?php $mainframe->login($d['username'], md5( $d['password'] ));) ?>
, и активация аккаунтов в Joomla! отключена, пользователь входит и направляется на страницу checkout.index, которая соответствует файлу
/administrator/components/com_virtuemart/html/checkout.index.php
это страница с корзиной и двумя кнопками: "Продолжить покупки" и "Оформить заказ".

иначе пользователь перенаправляется на страницу shop.index, которая соответствует файлу
/administrator/components/com_virtuemart/html/shop.index.php
это страница с категориями и описанием магазина.

Хочу обратить Ваше внимание на строку 222 оригинального файла checkout_register_form.php, вот она: <input type="hidden" name="page" value="checkout.index" /> .
В ней говорится, что после выполнения функции регистрации пользователью покажут страницу checkout.index. Это перенаправление будет осуществлено парсером Virtuemart после выполнения кода выше. Но на самом деле это перенаправление не проризойдёт, так как к этому времени код выше пользователя уже куда-нибудь перенаправит =))))

Как видите пользователь нагло перенаправляется черт знает куда и причём не единожды. На практике
в 1.0.2 всё происходит, так как я написал двумя абзацами выше.
в 1.0.1 при включенной активации пользователю выводится идиотская ошибка.


Авторизация и вопросы с ней связанные.
После того, как пользователь проходит оригинальную Joomla!-регистрацию на сайте, ему снова нужно вводить логин и пароль для авторизациии ещё дополнительные данные. Для того, чтобы этого избежать необходимо регистрировать всех пользователей через форму Virtuemart, эта форма, как мы уже знаем генерируется в файле checkout_register_form.php (обратите внимание, что в имени файла между названием модуля "checkout" и названием страницы "register_form" стоит нижнее подчеркивание"_", а не точка!!! Вызвать эту форму через переменную page невозможно.

Эта форма появляется только при оформлении заказа, но это не красиво и не правильно. Поэтому мы создадим фиктивную страницу для Virtuemart и будем вызывать её. Создайте в administrator/components/com_virtuemart/html/ файл checkout.register_form.php с точкой между названием модуля "checkout" и названием страницы "register_form"!!!
вот его примерное содержание:

PHP:
<?php  defined( '_VALID_MOS' ) or die( 'Direct Access to this location is not allowed.' );  mm_showMyFileName( __FILE__ );  include("checkout_register_form.php");?>
Заголовок и комментарии пропущены. Вместо include может быть require, тогда, если файла checkout_register_form.php не будет на сервере вы увидите ошибку, при include нет... но если файл есть, то на функциональность это тоже не влияет.

Осталось только дать ссылку вида "...option=com_virtuemart&page=checkout.register_form...". Очевидно сделать это надо либо в меню, либо в модуле modules/mod_login.php, либо и там и там, либо, вообще там, где Вам удобно.

Есть ещё один метод, но его я рассказывать здесь не буду, т.к. он "грязный", т.е. для его реализации потребуется изменение кода компонента com_login, но мне он больше всего нравится, так как ни каким умникам не даст зарегестрироваться через стандартную форму.

Недавно всплыл вот такой момент. Если Вы изменили форму регистрации, пользователь регистрируется, но не может войти, а магазин сообщает, что заполнены не все поля и просит внести дополнительную информацию значит вы порешили либо поле "city", либо поля "last name" или "first name". Но последние два сложно убрать =), а вот "city" запросто.
Решение тривиально. Либо изменить в файле /administrator/components/com_virtuemart/classes/ps_perm.php запрос так, чтобы не проверялось наличие значения в поле "city", либо, что намного более предпочтительно, не убивать поле "city" полностью, а сделать его в checkout_register_form.php скрытым, т.е. <input type="hidden" name="city" value="ваш город по умолчанию" />
 
Вот такой ещё косяк:
Форма корзины налажит на правую панель и только в этом случае, если продолжить оформление покупки - всё нормально.
 

Вложения

  • trash.jpg
    trash.jpg
    14,1 KB · Просмотры: 22
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху