| Senior Member 
				 
				Регистрация: 18.01.2013 Адрес: Russia , Moscow 
					Сообщений: 796
				      | 
				  
 
			
			Пример формы добавления отзыва с сайта в гостувую книгу:
---------------------------------------------------------------
tpl-ce-tt_content_guestbook_form.html - шаблон формы
tpl-ce-tt_content_guestbook_form_controller.php  - контроллер (проверка, запись в БД, отправка письма, блокировка на 1 сутки = 24 часа)
tpl-ce-tt_content_guestbook_form_mail-to-admin.txt  (шаблон письма администратору)
ext_tables.php  (описание таблицы для списков typo3)
ext_tables.sql  (описание таблицы для mysql-сервера - и он же для typo3)
 
-- 
p.s - можно бы ло бы еще добавить ajax - но не зачем, т.к. и так хорошо... 
при добавлении новый отзыв - является не активным, т.к. ожидает модерации... 
написано рукам - зато сколько возможностей...
  
---------------------------------------------------------------
tpl-ce-tt_content_guestbook_form.html ,
 
	tpl-ce-tt_content_guestbook_form_controller.phpPHP код: 
		
			
<!--
ШАБЛОН ЭЛЕМЕНТА КОНТЕНТА:
 fileadmin/template/systemdir/tpl-ce-tt_content_guestbook_form.html
 список отзывов в гостевой книге (!css стили вынесены в content.css)
 -->
 
 <!-- ###DOCUMENT_BODY_TT_CONTENT_QUESTBOOK_FORM### -->
 <!--(SMARTY :: start) tt_content_guestbook_form -->
 
 
 <!--Подключаем php-мини-контрллер для нашей формы-->
 {include_php file='fileadmin/template/tpl-ce-tt_content_guestbook_form_controller.php'}
 
 {if $statusode_form == "3/3"}
 
 <!--Если форма заблокированна-->
 <br />
 <div class="tt_content_guestbook_form">
 
 <div class="label-top"><b><font size="4">Форма добавления отзыва</font></b></div>
 <div style="clear: right;"></div>
 <table width="100%" cellspacing="0" cellpadding="10">
 <tr>
 <td colspan="2">
 
 С Вашего IP-адреса уже было произведено добавление отзыва. <br />
 Добавлять новый отзыв можно не ранее, чем через 24 часа.<br />
 Ваш IP-адрес: {$smarty.server.REMOTE_ADDR}<br />
 Текущий статус формы: {$statusode_form}
 
 </td>
 </tr>
 </table>
 
 </div>
 <br />
 
 {else}
 
 <!--Создаем форму гостевой книги-->
 <br />
 <div class="tt_content_guestbook_form">
 <form action="{url parameter='39'}" method="post">
 
 <div class="label-top"><b><font size="4">Форма добавления отзыва</font></b></div>
 <div style="clear: right;"></div>
 <table width="100%" cellspacing="0" cellpadding="10">
 <tr>
 <td colspan="2">
 
 Обращаем Ваше внимание, что для отправки отзыва необходимо заполнить все обязательные поля.
 Публикация сообщений на данном сайте осуществляется только после проверки администрацией сайта "Линия грации".
 В целях защиты от спама - Вы можете отправлять с одного IP-адреса не более 1-ого сообщения в сутки (24 часа).
 
 </td>
 </tr>
 <tr>
 <!--#f2d7c7-->
 <td colspan="2" class="sep"><b><i>Основная информация</i></b></td>
 </tr>
 <tr>
 <td width="45%">Ваше имя, псевдоним*:<br /><font color="#b6b6b6">Пример: Иванов Иван Иваныч</font></td>
 <td valign="top">
 
 <input type="text" style="width: 98%;" name="tt_content_guestbook_form[name]" value="{$smarty.post.tt_content_guestbook_form.name|strip_tags|htmlspecialchars|stripslashes}" maxlength="42">
 
 <!--Если есть ошибки-->
 <div align="left" style="color: red;">{$array_error.name}</div>
 
 </td>
 </tr>
 <tr>
 <td width="45%">Ваша домашняя страница:<br /><font color="#b6b6b6">Пример: http://your-site.ru/</font></td>
 <td valign="top">
 
 <input type="text" style="width: 98%;" name="tt_content_guestbook_form[home_page]" value="{$smarty.post.tt_content_guestbook_form.home_page|strip_tags|htmlspecialchars|stripslashes}" maxlength="42">
 
 <!--Если есть ошибки-->
 <div align="left" style="color: red;">{$array_error.home_page}</div>
 
 </td>
 </tr>
 <tr>
 <td width="45%" valign="top">Ваш email*:<br /><font color="#b6b6b6">Пример: youremail@your-site.ru</font></td>
 <td valign="top">
 
 <input type="text" style="width: 98%;" name="tt_content_guestbook_form[email]" value="{$smarty.post.tt_content_guestbook_form.email|strip_tags|htmlspecialchars|stripslashes}" maxlength="42">
 
 <!--Если есть ошибки-->
 <div align="left" style="color: red;">{$array_error.email}</div>
 
 <label for="email_hide"><input type="checkbox" id="email_hide" name="tt_content_guestbook_form[email_hide]" value="1" {if $smarty.post.tt_content_guestbook_form.email_hide == 1} checked {/if}> Не публиковать мой email на сайте</label>
 
 </td>
 </tr>
 <tr>
 <!--#f2d7c7-->
 <td colspan="2" class="sep"><i><b>Ваше сообщение</b> (не более 2500 символов)</i></td>
 </tr>
 <tr>
 <td colspan="2" align="center">
 
 <textarea type="text" style="width: 99%; height: 150px;" name="tt_content_guestbook_form[bodytext]">{$smarty.post.tt_content_guestbook_form.bodytext|strip_tags|htmlspecialchars|stripslashes}</textarea>
 
 <!--Если есть ошибки-->
 <div align="left" style="color: red;">{$array_error.bodytext}</div>
 
 </td>
 </tr>
 <tr>
 <!--#f2d7c7-->
 <td colspan="2" class="sep"><i><b>Дополнительно</b></i></td>
 </tr>
 <tr>
 <td width="45%">Проверка: чему будет равно {data source="DB:tx_web_settings:1:tt_content_guestbook_cprotected"}{*<!--(2+7)-5-->*}*<br /><font color="#b6b6b6">Защита от спама</font></td>
 <td valign="top" align="right">
 
 <font color="#b6b6b6">введите число:</font>
 <input type="text" style="width: 35%;" name="tt_content_guestbook_form[cprotected]"
 value="{$smarty.post.tt_content_guestbook_form.cprotected}" maxlength="1">
 
 <!--Если есть ошибки-->
 <div style="color: red;">{$array_error.cprotected}</div>
 
 </td>
 </tr>
 </table>
 <div class="label-bottom"><input type="submit" style="font-size: 18px; cursor: pointer;" value="Отправить отзыв"></div>
 <div style="clear: right;"></div>
 
 </form>
 </div>
 
 <br />
 <p align="center">
 
 Поля, отмеченные звездочкой, обязательны к заполнению.<br />
 Ваш IP-адрес: {$smarty.server.REMOTE_ADDR}<br />
 Текущий статус формы: {$statusode_form}
 
 </p>
 <br />
 
 {/if}
 
 <!--(SMARTY :: end) tt_content_guestbook_form -->
 <!-- ###DOCUMENT_BODY_TT_CONTENT_QUESTBOOK_FORM### -->
 
 
	tpl-ce-tt_content_guestbook_form_mail-to-admin.txtPHP код: 
		
			
<?php
 // ДАННЫЙ ЗАКОМЕНТИРОВАННЫЙ КОД это пример, того что можно и не использовать mysql_exec
 /*
 // загружает переменные из БД MySQL и присваивает их шаблону
 require_once('MySQL.class.php');
 $sql = new MySQL;
 $sql->query('select * from site_nav_sections order by name',SQL_ALL);
 $this->assign('sections',$sql->record);
 
 */
 
 #---------------------------------------------------------------------------------------------
 # Данным небольшим котроллером описываем материал для поведения формы "Добавить отзыв"
 # Также производится отправка почты на адрес администратора
 #---------------------------------------------------------------------------------------------
 
 /*
 "statusode_form"
 Коды формы
 0 - данные не переданы
 1 - данные переданы (успех - а) отправляем письмо администратору б) заносим запись в БД в) перенаправляем на страницу "Спасибо!")
 2 - данные переданы - есть ошибки
 3 - не разрешено производить добавление отзыва (не прошло 24-часа с момента предыдущей публикации - проверка по IP)
 */
 
 // Если форма заблокированна (24-часа повтора)
 // Проверяем по IP-адресу прошло ли 24-часа (
 if ( mysql_num_rows ( mysql_query ( "
 
 SELECT * FROM tt_content_guestbook
 WHERE `ip_adress` = '".$GLOBALS['_SERVER']['REMOTE_ADDR']."' AND ((".time()." - `crdate`) < 86400 )
 ORDER BY crdate LIMIT 1;" )
 
 ) > 0 ) {
 
 // Форма заблокированна "КОД - 3"
 $this->assign('statusode_form', "3/3"); // отпраляем код
 
 // Если данные переданы
 } elseif (count($GLOBALS['_POST']) > 0){
 
 // Начинаем проверку и поиск ошибок в форме
 $allElementForm = t3lib_div::_POST('tt_content_guestbook_form');
 
 // Проходим по всем необходимым полям данных
 foreach ($allElementForm as $key => $value) {
 
 $value = trim ( $value ); $messege = null;
 switch ($key)
 {
 //"Ваше имя, псевдоним"
 case 'name':
 
 // Если ноль
 if ($value == null) $messege[] = "Значение поля не заданно";
 
 break;
 
 //"Ваша домашняя страница"
 case 'home_page':
 
 if (!preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $value) AND $value > null)
 $messege[] = "Формат адреса сайта указан не верно"; //Если адрес сайта указан не верно
 
 break;
 
 //"Ваше email"
 case 'email':
 
 if ($value == null) $messege[] = "Значение поля не заданно"; //Если ноль
 if (!preg_match("|^[-0-9a-z_\.]+@[-0-9a-z_^\.]+\.[a-z]{2,6}$|i", $value))
 $messege[] = "Формат электронного адреса указан не верно"; //Если почта указанна не верно
 
 break;
 
 //"Ваше сообщение"+
 case 'bodytext':
 
 if (strlen($value) < 50) $messege[] = "Сообщение является млоинформативным"; //Если мало символов
 if (strlen($value) > 2500) $messege[] = "Сообщение более 2500 символов"; //Если много символов
 
 break;
 
 //"Проверка: чему будет равно (2+7)-5*"+
 case 'cprotected':
 
 // Получаем из.глоб.настроек формулу...
 //tt_content_guestbook_cprotected
 $pRecordvalue = t3lib_befunc::getRecord('tx_web_settings', 1, "tt_content_guestbook_cprotected");
 
 // проверяем и вычисляем значение формулы
 if ($value != eval("return (".$pRecordvalue['tt_content_guestbook_cprotected'].");"))
 $messege[] = "Не верное значение";
 
 // Если не верно введен код защиты (матем.выражение)
 // if ($value != 4) $messege[] = "Не верное значение";
 
 break;
 
 }
 
 // Собираем ошибки
 if (count ($messege) > 0)
 $arError[$key] = implode (";<br />\n" , $messege) . ".";
 
 }
 
 // Проверяем - если есть ошибки "КОД - 2"
 if ( count($arError) > 0 ) {
 
 $this->assign('array_error', $arError); // отправляем массив с обишками
 $this->assign('statusode_form', "2/3"); // отправляем код
 
 } else {
 
 // Ошибок нет
 // б) заносим запись в БД
 // а) отправляем письмо администратору
 // в) перенаправляем на страницу "Спасибо!")
 //Получаем шаблон письма:
 tt_content_guestbook_form_controller_operationDBinsert();
 tt_content_guestbook_form_controller_operationSendmail();
 header ('Location: ' . t3lib_div::locationHeaderURL('/guestbook/add-reviews/review-was-successfully-added/'));
 
 }
 
 
 } else {
 
 // Данные не переданы "КОД - 0"
 $this->assign('statusode_form', "0/3"); // отпраляем код
 
 }
 
 //Вспомогательная функция - добавление записи в БД
 function tt_content_guestbook_form_controller_operationDBinsert(){
 
 //Получаем значение формы
 $damp_insert = t3lib_div::_POST('tt_content_guestbook_form');
 
 mysql_query ("INSERT INTO `tt_content_guestbook` (`pid`, `crdate`, `hidden`, `name`, `home_page`, `email`,  `email_hide`, `bodytext`, `ip_adress`)
 VALUES
 (
 38, ".time().", 1,
 
 '"  .stripslashes($damp_insert['name']).   " - Новый!',
 '"  .stripslashes($damp_insert['home_page']).   "',
 '"  .stripslashes($damp_insert['email']).   "',
 '"  .stripslashes($damp_insert['email_hide']).   "',
 '"  .stripslashes(strip_tags($damp_insert['bodytext'])).   "',
 
 '"  .$GLOBALS['_SERVER']['REMOTE_ADDR'].   "'
 )
 ");
 
 //Возвращяем вставленный id
 $GLOBALS['mysql_insert_id'] = mysql_insert_id();
 }
 
 //Вспомогательная функция отправки сообщения на адрес администратора
 function tt_content_guestbook_form_controller_operationSendmail(){
 
 //Получаем значение формы
 $damp_sender = t3lib_div::_POST('tt_content_guestbook_form');
 
 //Получаем шаблон письма:
 $bodymessege = file_get_contents (PATH_site . "fileadmin/template/tpl-ce-tt_content_guestbook_form_mail-to-admin.txt");
 
 //Заменяем содержимое письма
 $bodymessege = str_replace(
 
 array('[id]', '[name]', '[email]', '[bodytext]', '[ip_adress]'),
 array ($GLOBALS['mysql_insert_id'], $damp_sender['name'], $damp_sender['email'],
 $damp_sender['bodytext'], $GLOBALS['_SERVER']['REMOTE_ADDR']),
 
 $bodymessege);
 
 // Получаем из.глоб.настроек emeil-адрес
 //tt_content_guestbook_emeil_alert
 $emailTo = t3lib_befunc::getRecord('tx_web_settings', 1, "tt_content_guestbook_emeil_alert");
 
 $mail = t3lib_div::makeInstance("t3lib_mail_Message");
 $mail->setFrom('robot@лин-гр.рф'); //$damp_sender ['email']
 $mail->setTo( $emailTo['tt_content_guestbook_emeil_alert'] ); //"i-litovan@yandex.ru"
 $mail->setSubject("Линия грации: добавлен новый отзыв на сайте");
 $mail->setBody($bodymessege);
 $mail->send();
 }
 
 ?>
 
	ext_tables.phpКод HTML: Добрый день.
Один из пользователей Вашего сайта оставил новый отзыв. 
Данный отзыв требует модерации с Вашей стороны.
http://лин-гр.рф/typo3/
---------------------------- 
Информация об отзыве:
---------------------------- 
Уникальный ID-отзыва в БД: [id];
Имя пользователя: [name]; 
E-mail: [email];
IP-адрес: [ip_adress].
---------------------------- 
[bodytext]
---------------------------- 
-- 
С уважением, 
робот сайта Линия грации. 
Письмо не требует обратного ответа.
Расширение: tt_content_guestbook_form.
Путь скрипта: fileadmin/template/tpl-ce-tt_content_guestbook_form_controller.php 
	ext_tables.sqlPHP код: 
		
			
#*********************************************************************************
# IVAN-WEB-BLOG.RU :: Иван Литовченко (i-litovan@yandex.ru) 19.04.2013
 # Ё)     ДОП.ТАБЛИЦА И ПЛАГИН "ВО ВСТАВИТЬ ПЛАГИН": для хранения записей гостевой книги
 #*********************************************************************************
 
 // Добавляем плагин и в поле выбора select таблицы tt_content "Гостевая книга: список отзывов"
 // Добавляем плагин и в поле выбора select таблицы tt_content "Гостевая книга: форма добавления отзыва"
 $TCA['tt_content']['types']['list']['subtypes_excludelist']['tt_content_guestbook'] = 'layout,select_key';
 $TCA['tt_content']['types']['list']['subtypes_excludelist']['tt_content_guestbook_form'] = 'layout,select_key';
 t3lib_extMgm::addPlugin(Array("Гостевая книга: список отзывов", 'tt_content_guestbook'),'list_type');
 t3lib_extMgm::addPlugin(Array("Гостевая книга: форма добавления отзыва", 'tt_content_guestbook_form'),'list_type');
 
 // Создаем таблицу для записей гостевой книги
 $TCA['tt_content_guestbook'] = array (
 
 'ctrl' => array (
 
 'iconfile'  => t3lib_extMgm::extRelPath($_EXTKEY).'icon_record.png',
 'title'     => 'Отзывы в гостевой книге',
 'label'     => 'name',
 'tstamp'    => 'tstamp',
 'crdate'    => 'crdate',
 'cruser_id' => 'cruser_id',
 'thumbnail'    => 'image',
 'default_sortby' => 'ORDER BY crdate',
 'delete' => 'deleted',
 'dividers2tabs' => true,
 'enablecolumns' => array (
 'disabled' => 'hidden',
 ),
 
 ),
 
 'columns' => array (
 
 'name' => array (
 'label'   => 'Имя/ник автора отзыва',
 'config'  => array (
 'type'    => 'input',
 'size' => '255'
 )
 ),
 /* 'sorting' => array (
 'label'   => 'Сортировочная позиция',
 'config'  => array (
 'type'    => 'input',
 'size' => '15',
 'max' => '15'
 )
 ), */
 'crdate' => array (
 'label'   => 'Дата, когда оставлен отзыв',
 'config'  => array (
 'type' => 'input',
 'size' => 13,
 'max' => 20,
 'eval' => 'datetime',
 'checkbox' => 0,
 'default' => 0
 )
 ),
 'bodytext' => array (
 'label'   => 'Содержимое отзыва',
 'config'  => array (
 'type'    => 'text',
 'cols' => '58',
 'rows' => '5',
 )
 ),
 'email' => array (
 'label'   => 'Электронный адрес почты (email)',
 'config'  => array (
 'type'    => 'input',
 'size' => '24',
 'max' => '78'
 )
 ),
 'email_hide' => array (
 'label'   => 'Не публиковать email на сайте',
 'config'  => array (
 'type'    => 'check',
 'default' => 0,
 )
 ),
 'home_page' => array (
 'label'   => 'Домашняя страница в сети интернет',
 'config'  => array (
 'type'    => 'input',
 'size' => '32',
 'max' => '255'
 )
 ),
 'ip_adress' => array (
 'label'   => 'IP-адрес, с которого оставлен отзыв',
 'config'  => array (
 'readOnly' => true,
 'type'    => 'input',
 'size' => '18',
 'max' => '78'
 )
 ),
 'hidden' => array (
 'label'   => 'Включен/выключен',
 'config'  => array (
 'type'    => 'check',
 'default' => 0,
 )
 ),
 ),
 
 'types' => array (
 
 '0' => array('showitem' => '
 
 name;;;;2-2-2,
 sorting;;;;2-2-2,
 crdate;;;;2-2-2,
 hidden;;;;2-2-2,
 --div--;Дополнительно,
 bodytext;;;;2-2-2,
 home_page;;;;2-2-2,
 email;;;;2-2-2,
 email_hide;;;;2-2-2,
 --div--;Параметры защиты,
 ip_adress;;;;2-2-2,
 
 ')
 
 ),
 
 );
 
 
	PHP код: 
		
			
#
# Table structure for table 'tt_content_guestbook'
 #
 CREATE TABLE tt_content_guestbook (
 
 uid int(11) NOT NULL auto_increment,
 pid int(11) DEFAULT '0' NOT NULL,
 tstamp int(11) DEFAULT '0' NOT NULL,
 crdate int(11) DEFAULT '0' NOT NULL,
 cruser_id int(11) DEFAULT '0' NOT NULL,
 deleted tinyint(4) DEFAULT '0' NOT NULL,
 hidden tinyint(4) DEFAULT '0' NOT NULL,
 sorting int(11) unsigned DEFAULT '0' NOT NULL,
 
 name tinytext,
 bodytext text,
 home_page varchar(255) DEFAULT '0',
 email varchar(255) DEFAULT '0',
 email_hide varchar(5) DEFAULT '0',
 ip_adress varchar(15) DEFAULT '0',
 
 ______separator______ int(11) DEFAULT '0' NOT NULL,
 
 PRIMARY KEY (uid),
 KEY parent (pid)
 
 );
 
 
				 Последний раз редактировалось Ивано++; 01.05.2013 в 19:28
 |