Создание страницы "ввести данные"
Вводимые данные будут записываться в инфоблок. Предположим, нам нужно добавить форму обратной связи, и в инфоблоке "Запросы с сайта" у нас есть поля "Контактное лицо" (name), "Телефон" (phone), "Текст комментария" (text), "Дата запроса" (query_date), "Дата связи" (connect_date). (Если нет - создайте такой инфоблок с этими полями).
Для того, чтобы создать страницу "ввести данные", нужно предварительно проверить, что в инфоблоке есть хотя бы один элемент. Если нет - создайте тестовый элемент.
Далее нужно зайти во вкладке "Страницы" по ссылке "Действия с элементами".
Выбираем нужный инфоблок, тип страницы "Создать элемент", вписываем название шаблона - например, "addquery" (подставьте сюда своё название).
Выбираем название для файла, например, "send.php" (подставьте сюда своё название). Выберем шаблон (например, common). Нажимаем кнопку "К следующему шагу".
Отступление для программиста
После завершения создания мы получим три файла: engine/gcomponents/news_create/addquery_controller.php и engine/gcomponents/news_create/addquery_template.php (именованные по названию шаблона) и файл send.php (именованный по названию файла).
Файл send.php имеет следующее содержание:
include_once($_SERVER["DOCUMENT_ROOT"]."/root_dir.php");
include_once($root_dir.$engine_path."engine/helper/header.php");
include_once($root_dir.$engine_path."engine/gcomponents/news_create/addquery_controller.php");
include_once($root_dir.$engine_path."engine/templates/common/common_header.php");
include_once($root_dir.$engine_path."engine/gcomponents/news_create/addquery_template.php");
include_once($root_dir.$engine_path."engine/templates/common/common_footer.php");
?>
Файлы engine/gcomponents/news_create/addquery_controller.php и engine/gcomponents/news_create/addquery_template.php создаются из стандартных образцов, при необходимости можно изменить эти стандартные образцы (но делать это не рекомендуется, поскольку эти файлы обновляемы вместе с обновлениями админки и будут перезаписаны, если в обновлении они изменены). Образцы находятся по адресу engine/components/standart/news_create_controller.php и engine/components/standart/news_create_template.php.
Конец отступления для программиста
После этого мы выбираем необходимые параметры.
Имя массива лучше изменить с имени по умолчанию. Иначе, если Вам потребуется подключить два контроллера на одной странице, а у них будет одинаковое имя массива, данные перекроются. Для каждого типа страниц имя по умолчанию своё. Для примера кода выбрано название "query_create".
Далее Вы можете выбрать, включать ли капчу при вводе. Для примера кода, который приведён ниже, выбрано включение капчи.
Далее отредактируйте сообщение об успехе (например, напишите "Ваш запрос отправлен менеджеру! Мы свяжемся с Вами в указанную дату").
Далее выберите нужные поля. В данном случае пользователь вводит самостоятельно всё, кроме даты запроса - убираем эту галочку и нажимаем "Завершить создание".
Далее Вы можете просмотреть получившуюся страницу, нажав на кнопку "Просмотреть результат". Страница откроется в новом окне.
Замечание. Страница выводится одна и та же как в случае ввода информации, так и в случае подтверждения о том, что информация добавлена.
Замечание. Если капча введена некорректно или Вы вставили в правильное место код для проверки условий, то при нажатии на кнопку "Создать" на созданной странице Вы получите сообщение об ошибке, а в полях сохранятся введённые данные, за исключением полей типа "фото" и "файл". Место, в которое вставляется код для проверки условий, будет приведено ниже.
В заключение приведём код получившихся контроллера и темплейта с комментариями.
engine/gcomponents/news_create/addquery_controller.php
<? //3.0.3
//Инициализируем номер инфоблока
$AllValues["query_create"]["block_id"]=3;
$AllValues["query_create"]["block"]=Get_Block_By_Id($AllValues["query_create"]["block_id"]);
Выше получены данные об инфоблоке из админки, а ниже идёт проверка, отправлены ли уже данные форме.
if(empty($_POST)){
$AllValues["query_create"]["data_sent"]=0;
//Инициализация значений по умолчанию "нулями"
$AllValues["query_create"]["defaults"]["name"]="";
$AllValues["query_create"]["defaults"]["phone"]="";
$AllValues["query_create"]["defaults"]["text"]="";
$AllValues["query_create"]["defaults"]["connect_date"]="";
Вы можете изменить значения для формы по умолчанию здесь.
//Получение полей для вывода
$AllValues["query_create"]["name"] = Show_Field_Html("name","string",$AllValues["query_create"]["defaults"]["name"]);
$AllValues["query_create"]["phone"] = Show_Field_Html("phone","string",$AllValues["query_create"]["defaults"]["phone"]);
$AllValues["query_create"]["text"] = Show_Field_Html("text","text","",4,50);
//Последние два параметра нужны только для полей типа text - cols=4, rows=50
$AllValues["query_create"]["connect_date"] = Show_Field_Html("connect_date","date",$AllValues["query_create"]["defaults"]["connect_date"]);
$AllValues["query_create"]["captcha_string"]=Captcha(6,0xFFFFFF);
Здесь можно изменить внешний вид полей, если он Вам не нравится. Также его нужно будет изменить ниже в случае, когда найдены ошибки проверки.
В последней строке генерируется капча. Первым параметром функции Captcha является количество букв, а вторым - цвет фона.
} else {
//Данные уже переданы. Отмечаем это в массиве и сохраняем id новой новости
$AllValues["query_create"]["data_sent"]=1;
$AllValues["query_create"]["errors"]=Array();
//Здесь можно разместить проверку выражений, набить массив ошибками. Если массив непуст, то значения сохранятся, кроме загруженных изображений и файлов.
if(!Captcha_Check($_POST["captcha"],$_POST["captcha_check"])){$AllValues["query_create"]["errors"][]="Неверно введено слово с картинки!";}
Здесь можно добавить проверку, например, на формат телефона. Данные не будут отправлены до тех пор, пока массив $AllValues["query_create"]["errors"] не будет пустым. То есть для того, чтобы не отправлять данные, достаточно инициализировать его очередной элемент, как это сделано в предыдущей строчке.
if(empty($AllValues["query_create"]["errors"])){
//Добавляем обработку вычислимых полей
Здесь нужно добавить данные для тех полей, которые пользователь не вводит сам, но которые Вам надо инициализировать особым образом. Например, если у Вас есть поле "comment", в которое надо добавить фразу "Это комментарий пользователя", то надо написать
$_POST["comment"]="Это комментарий пользователя";
В приведённом примере надо было дополнительно инициализировать поле query_date типа "дата". Для полей типа "Дата" нужно заполнять три поля - ИМЯпОЛЯ_y (год), ИМЯпОЛЯ_m (месяц), ИМЯпОЛЯ_d (день), а для полей типа "Дата и время" - шесть полей (ИМЯпОЛЯ_y (год), ИМЯпОЛЯ_m (месяц), ИМЯпОЛЯ_d (день),ИМЯпОЛЯ_h (часов), ИМЯпОЛЯ_i (минут), ИМЯпОЛЯ_s (секунд)). То есть для приведённого -
$_POST["query_date_y"]=date("Y");
$_POST["query_date_m"]=date("m");
$_POST["query_date_d"]=date("d");
Иначе соответствующие поля добавятся пустыми (смотрите код ниже)
//Добавляем значения, если пользователь вводит не всё.
$AllValues["query_create"]["fields"]=Get_Fields($AllValues["query_create"]["block_id"]);
foreach($AllValues["query_create"]["fields"] as $key => $field){
if( $field["tip"]=="idpart" ){ //тип "Элемент в любом разделе"
if(!isset($_POST[$field["name"]."_b"])){
$_POST[$field["name"]."_b"]=0;
$_POST[$field["name"]."_i"]=0;
}
} else {
if(!isset($_POST[$field["name"]])){
$_POST[$field["name"]]="";
}
}
}
$AllValues["query_create"]["new_id"]=Create_News($AllValues["query_create"]["block_id"],$_POST,$_FILES,0); //0 означает, что элемент добавляется как неактивный; измените на 1, если хотите, чтобы он добавился как активный
Эта строчка добавляет новый элемент, возвращая её id в инфоблоке.
} else {
//Инициализируем значения по умолчанию введёнными данными, кроме картинок, файлов и капчи
$AllValues["query_create"]["defaults"]["name"]=$_POST["name"];
$AllValues["query_create"]["defaults"]["phone"]=$_POST["phone"];
$AllValues["query_create"]["defaults"]["text"]=$_POST["text"];
$AllValues["query_create"]["defaults"]["connect_date"]=$_POST["connect_date_y"]."-".$_POST["connect_date_m"]."-".$_POST["connect_date_d"];
//Получение полей для вывода
$AllValues["query_create"]["name"] = Show_Field_Html("name","string",$AllValues["query_create"]["defaults"]["name"]);
$AllValues["query_create"]["phone"] = Show_Field_Html("phone","string",$AllValues["query_create"]["defaults"]["phone"]);
$AllValues["query_create"]["text"] = Show_Field_Html("text","text","",4,50);
//Последние два параметра нужны только для полей типа text - cols=4, rows=50
$AllValues["query_create"]["connect_date"] = Show_Field_Html("connect_date","date",$AllValues["query_create"]["defaults"]["connect_date"]);
$AllValues["query_create"]["captcha_string"]=Captcha(6,0xFFFFFF);
Здесь второе место, которое нужно изменить, если Вы меняете внешний вид какого-то поля.
}
}
?>
engine/gcomponents/news_create/addquery_template.php
<? //3.0.1
//Для того, чтобы вывести перечень переменных, переданных из контроллеров, раскомментируйте следующую строчку
//preprint($AllValues);
?>
<?if((empty($_POST))||(!empty($AllValues["query_create"]["errors"]))){?>
<? //Вывод ошибок
if(!empty($AllValues["query_create"]["errors"])){
foreach($AllValues["query_create"]["errors"] as $error){?>
<?=$error?><br>
<?}}?>
Далее идёт вывод самой формы. Проверьте на всякий случай, что форма направляет Вас на ту страницу, которую нужно. Особенно это актуально, когда Вы вставляете эти контроллер и темлпейт в другой файл.
<p>
<form action="send.php" method="POST" enctype="multipart/form-data">
Контактное лицо: <?=$AllValues["query_create"]["name"]?><br>
Телефон: <?=$AllValues["query_create"]["phone"]?><br>
Текст: <?=$AllValues["query_create"]["text"]?><br>
Дата связи: <?=$AllValues["query_create"]["connect_date"]?><br>
Введите код с изображения: <img src="<?=$html_root_dir?><?=$engine_path?>engine/captcha/<?=$AllValues["query_create"]["captcha_string"]?>.png"> <input type="text" name="captcha" value=""><br><input type="hidden" name="captcha_check" value="<?=md5(md5($AllValues["query_create"]["captcha_string"]."rp")."sa")?>"><br>
Вместе с капчей передаётся особым образом захешированное поле, с которым потом тем же способом в контроллере сравнивается введённый в поле "капча" набор символов.
<input name="submit" type="submit" value="Создать">
</form>
</p>
<?} else { //Элемент успешно создан
?>
Ваш запрос отправлен менеджеру! Мы свяжемся с Вами в указанную дату.
<?}?>
|