| 
			
			 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,
 
	PHP код: 
	
		
			
<!--
     ШАБЛОН ЭЛЕМЕНТА КОНТЕНТА:
     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_controller.php
	PHP код: 
	
		
			
<?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();
     }
 
 ?>
		
	 
 tpl-ce-tt_content_guestbook_form_mail-to-admin.txt
	Код 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.php
	PHP код: 
	
		
			
#*********************************************************************************
 # 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,
         
         ')
     
     ),
     
 ); 
 
		
	 
 ext_tables.sql
	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
					
					
				
			
		
		
	 |