PDA

Просмотр полной версии : Fluid template + Email form


Crown
24.12.2012, 11:04
TYPO3 6.0.0

Изучаю 'fluid template' по:
http://thomas.deuling.org/2011/06/create-base-html-fluid-templates-for-typo3-4-5/
http://gyrkalo.blogspot.ru/2012/10/fluid-typo3.html

Сделал одноколоночный макет, привязал к html-шаблону с помощью {content -> f:format.raw()} В TS: content < styles.content.get

Добавил контент:
* Regular Text Element
* Mail Form
* Regular Text Element

На mail form добавил поля и кнопку submit.

В FE отображается только два 'Regular Text Element', в исходном коде страницы ни намёка на попытку "срендерить" mail form.

Подскажите пожалуйста как mail form правильно добавить в случае fluid template?

Ивано
24.12.2012, 12:30
В 4.7 сделал так - но думая что подойдет и Вам к 6-ой.

<?php
//Элемент контента - медиа-проигрыватель

class user_content_fback {
var $cObj;
var $valid; //статус валидации (-1 данные не переданы 0 - ошибок ноль, >=1 ошибки есть)
var $formselectvalue; //список значений для поля select

function main($content, $conf) {
$this->formselectvalue = "..,Заявка на выполнение работ,Сотрудничество,Пожелание,Другие вопросы";

//Запускаем валидацию формы
$this->valid = $this->validationForm();

//Если ошибок нет будет выполненна операция
//Производим добавление пользователя в БД
if ($this->valid == 0)
{
$this->operationSendmail(); //Отправка почты
setcookie ("tx_ibl_feedback_capcha_value", null, -1, "/"); //сбрасываем cookie

//Два сценацрия (для ajax и без ajax)
if ($GLOBALS['_GET']['type'] == 300) header("Location-for-ajax: /591/"); //здесь вводим №страницы для js-перенеправления
else t3lib_utility_http::redirect("/591/"); //перенаправление пользвателя на страницу с сообщение ок

return false; //$content = "OK!";
}
//Выводим форму на страницу
else
$content = $this->displayForm( );

return $content; // ."<pre>". print_r($GLOBALS['_SERVER'], true); //"<pre>".print_r($GLOBALS['_GET']['type'], true);

}

//Функция вывода формы
function displayForm ( ) {

/* Fluid */
$template = PATH_site . 'fileadmin/def-/systemdir/content/feedback.tpl.html';
$view = t3lib_div::makeInstance('Tx_Fluid_View_StandaloneV iew');
$view->setTemplatePathAndFilename( $template );

//Заполняем поле select
$view->assign( 'objectvalueselect', explode(',' , $this->formselectvalue) );
$view->assign( 'objectvalue', t3lib_div::_POST('tx_ibl_feedback') );

//Заполняем имеющиеся ошибки формы в шаблон FLUID
$view->assign( 'objecterror', $this->valid );

//Вывод данных
$content=$view->render();
return $content;
}

//Функция проверки формы
function validationForm( ) {

//Если POST-данные еще не переданны
if (t3lib_div::_POST('tx_ibl_feedback') == null)
return -1;

//Назначаем события для валидации
$allElementForm = t3lib_div::_POST('tx_ibl_feedback');

//Переборка полей формы
foreach ($allElementForm as $key => $value) {

$value = trim ( $value ); $messege = null;
switch ($key)
{
//Проверка: Имя
case 'name':

if ($value == null) $messege[] = "Значение поля не заданно"; //Если ноль
if (strlen($value) < 2 and $value != null) $messege[] = "Значение поля менее двух символов"; //Если мало символов
if (strlen($value) > 50) $messege[] = "Значение поля более 50 символов"; //Если много символов
if (preg_match('/[\w]+/i',$value)) $messege[] = "Поле содержит недопустимые символы"; //Если цифры в имени

break;

//Проверка: Почтоый ящик
case 'email':

if ($value == null) $messege[] = "Значение поля не заданно"; //Если ноль
if (!preg_match("|^[-0-9a-z_\.]+@[-0-9a-z_^\.]+\.[a-z]{2,6}$|i", $value))
$messege[] = "Формат электронного адреса указан не верно"; //Если почта указанна не верно

break;

//Проверка: Тема сообщения
case 'subject':

if ($value == 0) $messege[] = "Необходимо выбрать тему сообщения"; //Если не выбрана тема

break;

//Проверка: Сообщение
case 'messege':

if (strlen($value) < 180) $messege[] = "Данное сообщение является малоинформативным"; //Если мало символов
if (strlen($value) > 1280) $messege[] = "Сообщение слишком большое (более 1280 символов)"; //Если много символов

break;

//Проверка: Капча - цифры с картинки
case 'capcha':

//Если не включены cookies
if ( !isset($GLOBALS['_COOKIE']['tx_ibl_feedback_capcha_value']) ) $messege[] = "Необходимо включить поддержку cookie";
if ( $GLOBALS['_COOKIE']['tx_ibl_feedback_capcha_value'] != $value )
$messege[] = "Не правильно введены цифры с картинки"; //Если цифры не совпадают

break;
}

if (count ($messege) > 0)
$arError[$key] = implode (";\n" , $messege) . ".";


}

return $arError;

}

//Функция отправки сообщения
function operationSendmail(){
$damp_sender = t3lib_div::_POST('tx_ibl_feedback');

//Получаем шаблон письма:
$bodymessege = file_get_contents (PATH_site . "fileadmin/def-/systemdir/content/feedback.tpl-mail.txt");

//Разбираем переменную с значениями тем
$arsubject = explode(',' , $this->formselectvalue);

//Заменяем содержимое письма
$bodymessege = str_replace(array('[name]', '[email]', '[subject]', '[messege]'),
array ($damp_sender['name'], $damp_sender['email'], $arsubject[$damp_sender['subject']], $damp_sender['messege']),
$bodymessege);

$mail = t3lib_div::makeInstance("t3lib_mail_Message");
$mail->setFrom( $damp_sender ['email'] );
$mail->setTo( "info@aaa.ru" );
$mail->setSubject("АААА - форма обратной связи: сообщение от " . $damp_sender['name'] . " (".$arsubject[$damp_sender['subject']].")");
$mail->setBody($bodymessege);
$mail->send();
}
}


?>

<!--шаблон для формы обратной связи-->
<f:form id="tx_ibl_feedback_form" controller="Form" actionUri="" class="tx-ibl-form-feedback" method="post" enctype="multipart/form-data">
<table width="100%" border="1">
<tr>

<td width="30%">Ваше имя:</td>
<td>
<f:form.textfield name="tx_ibl_feedback[name]" value="{objectvalue.name}" />
<f:if condition="{objecterror.name}"><br /><f:format.nl2br>{objecterror.name}</f:format.nl2br></f:if>
</td>

</tr>
<tr>

<td width="30%">Ваше Email:</td>
<td>
<f:form.textfield name="tx_ibl_feedback[email]" value="{objectvalue.email}" />
<f:if condition="{objecterror.email}"><br /><f:format.nl2br>{objecterror.email}</f:format.nl2br></f:if>
</td>

</tr>
<tr>

<td width="30%">Тема:</td>
<td>
<f:form.select name="tx_ibl_feedback[subject]" options="{objectvalueselect}" value="{objectvalue.subject}" size="1"/>
<f:if condition="{objecterror.subject}"><br /><f:format.nl2br>{objecterror.subject}</f:format.nl2br></f:if>
</td>

</tr>
<tr>

<td width="30%">Ваше сообщение:</td>
<td>
<f:form.textarea cols="20" rows="5" name="tx_ibl_feedback[messege]" value="{objectvalue.messege}"/>
<f:if condition="{objecterror.messege}"><br /><f:format.nl2br>{objecterror.messege}</f:format.nl2br></f:if>
</td>

</tr>
<tr>

<td width="30%">Введите цифры:</td>
<td>
<img id="capcha" src="/fileadmin/def-/systemdir/content/feedback.capcha.php" width="180" height="40"><br />
<f:form.textfield name="tx_ibl_feedback[capcha]" />
<f:if condition="{objecterror.capcha}"><br /><f:format.nl2br>{objecterror.capcha}</f:format.nl2br></f:if>
</td>

</tr>
</table>

<p align="center"><f:form.submit id="tx_ibl_feedback_submit" value="Отправить письмо!" /></p>

</f:form>

Добрый день, один из пользователей воспользовался формой обратной связи на Вашем сайте.

----------------------------
Сообщение от: [name]
Email: [email]
Тема: [subject]
----------------------------

[messege]

----------------------------

--
Создано роботом сайта.


<?php
// Тип содержимого – картинка формата PNG
header("Content-type: image/png");

// создаем картинку размером 130X40
$img=imagecreatetruecolor(180, 40) or die('Cannot create image');

// заполняем фон картинки белым цветом
imagefill($img, 0, 0, 0xFFFFFF);

$x=0;
$i = 1;
$sum = "";
$fonts = array(
'./BIRCH_C.TTF',
'./CHAMPGNE.TTF',
'./EASTSIDE.TTF',
'./GISMONDA.TTF',
'./OLGA_C.TTF',
'./RIVERSDE.TTF',
'./SSR56__C.TTF',
'./STAC222N.TTF',
'./STEVE.TTF',
'./VICTORIA.TTF'
);


//$font = $fonts[rand(0, sizeof($fonts)-1)];
$font = './feedback.JOKERMAN.TTF';

// выводим одну цифру за один проход цикла (всего 5 цифр)
while ($i++ <= 5)
{
// выводим текст поверх картинки
imagettftext(
$img, // идентификатор ресурса
rand(12,25), // размер шрифта в пикселях
rand(-35,35), // угол поворота текста
$x=$x+30, 25+rand(0,10), // координаты (x,y), соответствующие левому нижнему
// углу первого символа
imagecolorallocate($img, rand(0,128), rand(0,128), rand(0,128)), // цвет шрифта
$font, // имя файла со шрифтом
$rnd=rand(0,9)); // случайная цифра от 0 до 9
// Собираем в одну строку все символы на картинке
$sum = $sum.(string)$rnd;
}


//Сохраняем coookie для формы
setcookie ("tx_ibl_feedback_capcha_value", $sum, time()+3600, "/");/* период действия - 1 час */


//Не забудьте $sum записать в таблицу как STR1

// выводим готовую картинку в формате PNG
imagepng($img);
// освобождаем память, выделенную для картинки
imagedestroy($img);
?>

Ивано
24.12.2012, 12:48
Если интересно покажу как еще прикрутить ajax!:)

Crown
24.12.2012, 13:27
Ивано, спасибо за ответ! AJAX - это интересно, но скорее на перспективу, сейчас не готов туда углубляться ((

Ивано, я правильно понимаю, что для типовой Mail Form TYPO3 всё таки необходимо писать "обвязку"? Я то по наивности думал, что в эту CMS уже зашит соответствующий контроллер ((

Ивано
24.12.2012, 13:57
В cms защита стандартная форма...
Ее вы можете выбрать и вставить на странице...

Но здесь приведен пример того, как можно сделать простую форму, с валидацией (В Т.Ч. капчей) на основе fluid...

Ивано
24.12.2012, 16:54
И последнее что сейчас хочу попробовать . здесь представлен алгоритм работы с формами - но как-нибудь хочу все-таки попробовать заменить fluid на smarty 3... А то на сложных формах у меня код fluid читается с большим трудом...

Falcon
26.12.2012, 03:21
А каким лучше способом производить JS валидацию формы?
В шаблон вставлять JSку с валидаторами и при ренеделе вставлять <script> с запуском валидаторов

Или что автоматическое есть?

Manas
26.12.2012, 09:00
Попробуйте это расширение http://typo3.org/extensions/repository/view/powermail. Там и ajax валидация имеется.
Версии 2.х написаны с использованием Extbase + Fluid, версии 1.6.х - pi1.

Ивано
26.12.2012, 14:26
В выше описанном примере валидация создается функцией
function validationForm( )

Она создает массив с набором ошибок и после чего данных массив вставляется в нужное место в шаблоне fluid.

Вы можете запустить данную форму на ajax-и тогда по клику форма перезагружается без обновления страницы, а пользователь увидит допущенные ошибки...

Ивано
26.12.2012, 18:09
Пожалуй, одна из самых лучших валидаторов на jquery
http://www.webappers.com/2009/06/12/jquery-inline-form-validation-engine/

Falcon
27.12.2012, 23:22
А я Formhandler использовал. Очень понравился.