PDA

Просмотр полной версии : помогите подобрать расширение


semender
30.04.2013, 09:23
здравствуйте, нужно реализовать такой функционал: чтоб пользователь мог зайти на сайт, заполнить форму, которая предварительно задана(вид формы, вроде анкеты) и отослать в базу. Ну чтоб она потом была доступна из backend. Подскажите пожалуйста кто нибудь делал такое? Какое расширение для этих целей использовали?

Manas
30.04.2013, 11:32
Powermail все это умеет
http://typo3.org/extensions/repository/view/powermail

-=UncleByte=-
30.04.2013, 13:23
И formhandler умеет.

semender
01.05.2013, 16:50
с powermail пока не работал ,он умеет просматривать записи из бэкэнда? а в formhandler не возможно же их просматривать? там видно только ip человека воспользовавшегося формой и дата? я имею ввиду через log entry.

Ивано++
01.05.2013, 18:42
Пример формы добавления отзыва с сайта в гостувую книгу:
---------------------------------------------------------------
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,
<!--
ШАБЛОН ЭЛЕМЕНТА КОНТЕНТА:
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|stri p_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|s trip_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_cprotect ed"}{*<!--(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

// ДАННЫЙ ЗАКОМЕНТИРОВАННЫЙ КОД это пример, того что можно и не использовать 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_operationDBin sert();
tt_content_guestbook_form_controller_operationSend mail();
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_operationDBin sert(){

//Получаем значение формы
$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_operationSend mail(){

//Получаем значение формы
$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

Добрый день.

Один из пользователей Вашего сайта оставил новый отзыв.
Данный отзыв требует модерации с Вашей стороны.
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
#************************************************* ********************************
# 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.pn g',
'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

#
# 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)

);

-=UncleByte=-
01.05.2013, 22:41
с powermail пока не работал ,он умеет просматривать записи из бэкэнда? а в formhandler не возможно же их просматривать? там видно только ip человека воспользовавшегося формой и дата? я имею ввиду через log entry.
В formhandler можно сохранять в базу что угодно - есть даже специальный finisher для сохранения в базу не шаблонного. http://www.typo3-formhandler.com/documentation/finisher/finisher-db/

semender
03.05.2013, 02:33
уже все перепробывал, поставил powermail, к нему
powermailpdf
powermail2document
ods_pm_pdf
Но нигде не отображаются их настройки, как будто и не ставил.
Вот есть какая та форма в doc или pdf а заполнить ее своими введенными данными не могу.
Я уже не говорю о доступности ее из backenda(хотябы так сделать).
Может кто нибудь посмотрит пароль и логин дам?

semender
03.05.2013, 15:37
поставил formhandler+tcpdf, но не отображаются русские символы в генерируемой pdf,отображаются ???????, как исправить кодировкуу?

-=UncleByte=-
03.05.2013, 18:42
Надо поискать решения именно для pdf библиотек, раньше они традиционно с русским работали плохо, сейчас должны быть варианты.

semender
03.05.2013, 23:24
Надо поискать решения именно для pdf библиотек, раньше они традиционно с русским работали плохо, сейчас должны быть варианты.

Да,исправил, шрифты кирилицы не входили в состав. Теперь русские символы видны. Вот выкладываю шрифты.
Закидывать :typo3conf/ext/formhandler/Resources/PHP/tcpdf/fonts

вопрос с парсингом и заменой по pdf остается открытым все же.

-=UncleByte=-
04.05.2013, 00:01
C парсингом чего? И заменой в pdf чего?

semender
04.05.2013, 16:15
C парсингом чего? И заменой в pdf чего?

ну вот чтоб я указал pdfку, ввел данные в форму и эти данные вставились в определенные места в пдфке после отправки

-=UncleByte=-
04.05.2013, 21:03
Так вроде же formhandler умеет делать pdf из значений в базе? Разве это не то? Или что должно быть? Постоянно обновляемый pdf один и тот же?

semender
04.05.2013, 22:36
с этим вроде разобрался,спасибо, теперь как сделать чтоб ссылка на созданный пдф тоже сохранялась в базе вместе с параметрами? И дописывать к названию файла пдф имя(то есть параметр из формы)?

-=UncleByte=-
05.05.2013, 02:16
Вот это не знаю совершенно, наверное еще один какой-то финишер + что-то для переименования файла.

semender
06.05.2013, 11:12
ща попробую через GP. Никто случайно не русифицировал formhandler? не охото как то все вручную)

-=UncleByte=-
06.05.2013, 15:03
А нет для него русского в репозитории? Я-то обычно на английском админку привык видеть, потому не знаю.