Создание формы с помощью php шаблонов

Этот метод рассчитан на более подготовленную аудиторию, как минимум надо четко отличать 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();?>

Кнопки можно выводить несколько раз вверху формы, посредине, внизу – если форма большая то это очень удобно не надо каждый раз мотать в самый низ.