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?
В 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);
?>
Если интересно покажу как еще прикрутить ajax!:)
Ивано, спасибо за ответ! AJAX - это интересно, но скорее на перспективу, сейчас не готов туда углубляться ((
Ивано, я правильно понимаю, что для типовой Mail Form TYPO3 всё таки необходимо писать "обвязку"? Я то по наивности думал, что в эту CMS уже зашит соответствующий контроллер ((
В cms защита стандартная форма...
Ее вы можете выбрать и вставить на странице...
Но здесь приведен пример того, как можно сделать простую форму, с валидацией (В Т.Ч. капчей) на основе fluid...
И последнее что сейчас хочу попробовать . здесь представлен алгоритм работы с формами - но как-нибудь хочу все-таки попробовать заменить fluid на smarty 3... А то на сложных формах у меня код fluid читается с большим трудом...
А каким лучше способом производить JS валидацию формы?
В шаблон вставлять JSку с валидаторами и при ренеделе вставлять <script> с запуском валидаторов
Или что автоматическое есть?
Попробуйте это расширение http://typo3.org/extensions/repository/view/powermail. Там и ajax валидация имеется.
Версии 2.х написаны с использованием Extbase + Fluid, версии 1.6.х - pi1.
В выше описанном примере валидация создается функцией 
function validationForm( )
Она создает массив с набором ошибок и после чего данных массив вставляется в нужное место в шаблоне fluid.
Вы можете запустить данную форму на ajax-и тогда по клику форма перезагружается без обновления страницы, а пользователь увидит допущенные ошибки...
Пожалуй, одна из самых лучших валидаторов на jquery
http://www.webappers.com/2009/06/12/jquery-inline-form-validation-engine/
А я Formhandler использовал. Очень понравился.
Работает на vBulletin® версия 3.8.1. Copyright ©2000-2025, Jelsoft Enterprises Ltd. Перевод: zCarot