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
|