Этот метод рассчитан на более подготовленную аудиторию, как минимум надо четко отличать PHP код от HTML, знать простейшие логические конструкции на PHP (if, for …) и как они работают.
1) Все шаблоны расположены в папке /template.
Не рекомендую трогать родные файлы плагина! Хотите что-то изменить создайте новый шаблон на основе дефолтных примеров, подключите его и работайте, в этом случае проблем обновлением плагина не возникнет. Дефольные шаблоны подключаются в ads_init.php, чтобы переключить на свои нужно прописать их в файле ads_config.php например для почты:
$ads_config[’email_new_post’] = ‘/my_new_mail.php’; $ads_config[’email_edit_post’] = ‘/my_edit_mail.php’; $ads_config[‘form_templates’][‘default’] = ‘/my_default_template.php’; // шаблон по умолчанию для формы ввода
123 | $ads_config[’email_new_post’] = ‘/my_new_mail.php’;$ads_config[’email_edit_post’] = ‘/my_edit_mail.php’;$ads_config[‘form_templates’][‘default’] = ‘/my_default_template.php’; // шаблон по умолчанию для формы ввода |
2) Какие есть шаблоны:
- шаблоны формы ввода – form_default_template.php,
в шаблонах формы можно подключать другие шаблоны (include) : form_uploads.inc.php – загрузка файлов, form_uploads2.inc.php загрузка файлов – вариант можно указать url файла для скачивания напрямую, form_google_map.inc.php – карта google - шаблоны отображения post_default_template.php
- ads_form_login.php – это шаблон закладки редактировать где надо ввести логин и пароль
- choice_category_template.php – этап выбора категории объявления, шаблон выводит дерево рубрик
- email_new_post.php и email_edit_post.php – шаблоны писем, первое приходит когда пользователь добавил объявление, второе когда он его отредактировал
Шаблоны формы ввода
Запомните!, шаблон формы подключается(include) дважды. Первый раз для того, чтобы подключить фильтр проверки данных и пропарсить html текст, выловив из него имена поле с префиксами ads_ и adp_. Второй раз – уже непосредственно для печати формы.
В связи с этим все функции в шаблоне должны быть обернуты в конструкцию !function_exists
if( !function_exists(‘ads_this_form_filter’) ){ function ads_this_form_filter($_post){ if(!sanitize_email( $_post[‘ads_email’])) $_post[‘error’][‘ads_email’][] = «Error in email!»; return $_post; } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’); function myfunc(){ ……… } }
1234567891011 | if( !function_exists(‘ads_this_form_filter’) ){ function ads_this_form_filter($_post){ if(!sanitize_email( $_post[‘ads_email’])) $_post[‘error’][‘ads_email’][] = «Error in email!»; return $_post; } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’); function myfunc(){ ......... }} |
В последней версии плагина я добавил новое свойство в класс обработчик формы print_form_template
если истина – это значит, что форма печатается, если нет – значит мы просто подключаем фильтр и другие функции.
if($this->print_form_template){ // хлебные крошки Категория / категория 2 / категория 3 $ads_path_category = ads_get_category_parents($_REQUEST[‘ads_basecat’]); } else { function ads_this_form_filter($_post){ …… } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’); /// еще какие-то функции function myfunc(){ ……… } }
1234567891011121314 | if($this->print_form_template){ // хлебные крошки Категория / категория 2 / категория 3 $ads_path_category = ads_get_category_parents($_REQUEST[‘ads_basecat’]); } else { function ads_this_form_filter($_post){ ...... } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’); /// еще какие-то функции function myfunc(){ ......... }} |
Парсинг имен
Хочу заострить внимание на этом моменте. Плагин будет обрабатывать только те поля, которые присутствуют в html коде формы. Для этого, при первом подключении мы запускаем регулярное выражение и ищем конструкцию типа:
name=»ads_varname»
1 | name=«ads_varname» |
все найденные имена попадают в свойство $this->ads_fields_form. В старой версии плагина 3.1 это надо было делать вручную
$ads_config[‘ads_fields_form’] = array(‘post_content’, ‘ads_myvar’, …..);
1 | $ads_config[‘ads_fields_form’] = array(‘post_content’, ‘ads_myvar’, .....); |
Этот способ также работает.
Автозаполнение полей формы
Автозаполнение работает на библиотеке HTML_FormPersister. Есть одна особенность если вы установите свойство
value=»»
1 | value=«» |
, то каждый раз при отправке формы это значение будет сбрасываться в
«»
1 | «» |
. Чтобы этого избежать атрибут value должен отсутствовать вообще.
<input name=»ads_phone» maxlength=»15″ value=»» type=»text» > // заполнение работать не будет <input name=»ads_phone» maxlength=»15″ type=»text» > // будет работать
12 | <input name=«ads_phone» maxlength=«15» value=«» type=«text» > // заполнение работать не будет <input name=«ads_phone» maxlength=«15» type=«text» > // будет работать |
Проверка данных, вывод ошибок
Правильность заполнения формы проверяем фильтром, который подключается, как я уже говорил, через проверку function_exists:
if( !function_exists(‘ads_this_form_filter’) ){ function ads_this_form_filter($_post){ // проверка email if(!sanitize_email( $_post[‘ads_email’])) $_post[‘error’][‘ads_email’][] = «Некорректный email!»;// добавляем текст ошибки if (($_post[‘post_title’]!=»)&&!preg_match(‘/[А-Яа-яs]+/usi’,$_post[‘post_title’])) $_post[‘error’][‘post_title’][] = «Допустимы только русские буквы!»;// проверка имени и фамилии if (!$_post[‘post_content’]) $_post[‘error’][‘post_content’][] = «Напишите текст!»;// if ((strlen($_post[‘post_content’])<100)&&$_post[‘post_content’]) $_post[‘error’][‘post_content’][] = «Введите как минимум 100 символов!»;// if (!$_post[‘post_title’]) $_post[‘error’][‘post_title’][] = «Введите имя и фамилию!»;// if (!$_post[‘ads_phone’]) $_post[‘error’][‘ads_phone’][] = «Введите номер телефона!»;// if (!$_post[‘tags_input’]) $_post[‘error’][‘tags_input’][] = «Введите от 1-го до 3-х жанров!»;// if ((substr_count($_post[‘tags_input’],’,’)>2)&&substr($_post[‘tags_input’], -1)!=’,’) $_post[‘error’][‘tags_input’][] = «Количество стилей должно быть не больше трех!»;// if (!$_post[‘adp_old’]) $_post[‘error’][‘adp_old’][] = «Введите дату рождения!»;// if (date(‘Y’, strtotime($_post[‘adp_old’]))<1940) $_post[‘error’][‘adp_old’][] = «Слишком много лет!»;// if (date(‘Y’, strtotime($_post[‘adp_old’]))>2013) $_post[‘error’][‘adp_old’][] = «Вы слишком молоды)»;// if(!$_post[‘ads_main’]) $_post[‘error’][‘ads_main’][] = ‘Выберите основной инструмент!’; if(sizeof($_post[‘ads_additionally’]) >3) $_post[‘error’][‘ads_additionally’][] = ‘Не более 3-х инструментов!’; return $_post; } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’); }
12345678910111213141516171819202122232425262728293031323334353637383940 | if( !function_exists(‘ads_this_form_filter’) ){ function ads_this_form_filter($_post){ // проверка email if(!sanitize_email( $_post[‘ads_email’])) $_post[‘error’][‘ads_email’][] = «Некорректный email!»;// добавляем текст ошибки if (($_post[‘post_title’]!=»)&&!preg_match(‘/[А-Яа-яs]+/usi’,$_post[‘post_title’])) $_post[‘error’][‘post_title’][] = «Допустимы только русские буквы!»;// проверка имени и фамилии if (!$_post[‘post_content’]) $_post[‘error’][‘post_content’][] = «Напишите текст!»;// if ((strlen($_post[‘post_content’])<100)&&$_post[‘post_content’]) $_post[‘error’][‘post_content’][] = «Введите как минимум 100 символов!»;// if (!$_post[‘post_title’]) $_post[‘error’][‘post_title’][] = «Введите имя и фамилию!»;// if (!$_post[‘ads_phone’]) $_post[‘error’][‘ads_phone’][] = «Введите номер телефона!»;// if (!$_post[‘tags_input’]) $_post[‘error’][‘tags_input’][] = «Введите от 1-го до 3-х жанров!»;// if ((substr_count($_post[‘tags_input’],‘,’)>2)&&substr($_post[‘tags_input’], —1)!=‘,’) $_post[‘error’][‘tags_input’][] = «Количество стилей должно быть не больше трех!»;// if (!$_post[‘adp_old’]) $_post[‘error’][‘adp_old’][] = «Введите дату рождения!»;// if (date(‘Y’, strtotime($_post[‘adp_old’]))<1940) $_post[‘error’][‘adp_old’][] = «Слишком много лет!»;// if (date(‘Y’, strtotime($_post[‘adp_old’]))>2013) $_post[‘error’][‘adp_old’][] = «Вы слишком молоды)»;// if(!$_post[‘ads_main’]) $_post[‘error’][‘ads_main’][] = ‘Выберите основной инструмент!’; if(sizeof($_post[‘ads_additionally’]) >3) $_post[‘error’][‘ads_additionally’][] = ‘Не более 3-х инструментов!’; return $_post; } add_filter(‘ads_check_fields’, ‘ads_this_form_filter’);} |
Полностью все ошибки хранятся в переменной $msg – настоятельно советую не удалять вывод этой переменной, иначе потом будете долго искать почему не публикуется форма.
Вывод ошибок в шаблоне отдельно для каждого поля :
<?$this->error_msg(‘ads_field_name’)?>
1 | <?$this->error_msg(‘ads_field_name’)?> |
Кнопки
Вывод управляющих кнопок
<?$this->print_buttons();?>
1 | <?$this->print_buttons();?> |
Кнопки можно выводить несколько раз вверху формы, посредине, внизу – если форма большая то это очень удобно не надо каждый раз мотать в самый низ.