Продолжим улучшать наш плагин. На этот раз сделаем так, чтобы отправленное посетителем письмо сохранилось в таблице базы данных. После чего сделаем просмотр сообщений в админке. 

1. Через нашу форму пользователь может отправить всего три параметра: Имя, Электронный адрес и Текст сообщения. Для хранения этих данных в базе данных создадим таблицу cot_cform:

CREATE TABLE IF NOT EXISTS `cot_cform` (
  `item_id` int(10) unsigned NOT NULL,
  `item_date` int(11) NOT NULL,
  `item_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `item_email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `item_text` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

Как видно в таблицу добавлено еще два поля. Это индекс записи и дата создания. Они нам понадобятся для более удобного обращения к таблице.

Чтобы Cotonti знал, что у нас есть такая таблица, нужно предварительно сообщить системе о ее существовании. Для этого откроем файл с функциями плагина cform.functions.php и добавим в него следующую строчку:

cot::$db->registerTable('cform');

2. Вспомним часть кода, которая отправляет письмо после отправки формы (cform.php):

if($a == 'send'){
	
	$remail = cot_import('remail','P', 'TXT', 64, TRUE);
	$rname = cot_import('rname', 'P', 'TXT');
	$rtext = cot_import('rtext', 'P', 'TXT');
	
	cot_check(!cot_check_email($remail), 'cform_error_email', 'remail');
	cot_check(empty($rname), 'cform_error_name', 'rname');
	cot_check(empty($rtext), 'cform_error_text', 'rtext');
	
	if(!cot_error_found()){
		
		$context = array(
			'name' => $rname,
			'email' => $remail,
			'text' => $rtext,
		);
		
		$rsubject = $L['cform_mail_subject'];
		$rbody = cot_rc($L['cform_mail_body'], $context);
		cot_mail($cfg['adminemail'], $rsubject, $rbody);
		
		cot_message('cform_sent');
	}
}

Теперь мы должны добавить дополнительные строки для записи полученных данных в нашу таблицу. Вставим после строки:

cot_mail($cfg['adminemail'], $rsubject, $rbody);

Следующий код:

$rform['item_name'] = $rname;
$rform['item_email'] = $remail;
$rform['item_text'] = $rtext;
$rform['item_date'] = $sys['now'];

$db->insert($db_cform, $rform);

Сначала мы формируем массив значений, а потом записываем их в таблицу $db_cform в базе данных.

3. Осталось отобразить записанные данные в нашей админке. Для этого создадим отдельную страницу в админке для нашего плагина. Назовём файл cform.admin.php и добавим в него следующий код:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=tools
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

require_once cot_incfile('cform', 'plug');

Как видно из кода, для создания страницы админки для плагина мы используем хук tools.

Выводить список писем мы будем в шаблон для админки, который назовем cform.admin.tpl и сохраним в директорию tpl нашего плагина. В файле админки пропишем наш наблон:

$t = new XTemplate(cot_tplfile('cform.admin', 'plug', true));

4. Теперь нам нужно написать запрос в БД, чтобы получить список писем и вывести их с пагинацией, если этих писем больше 10, для удобства просмотра.

Предварительно пропишем в установочном файле опцию для указания количества записей отображаемых на страницу (для пагинации). Откроем файл cform.setup.php и добавим после строки [BEGIN_COT_EXT_CONFIG] следующий код:

maxrowsperpage=01:string::10:Количество записей на страницу

Таким образом, после обновления плагина через админку мы получим опцию в настройках нашего плагина.

Вернемся к файлу админки cform.admin.php и создадим соответствующий запрос в базу данных для вывода всех сохраненных писем:

$totalitems = $db->query("SELECT COUNT(*) FROM $db_cform WHERE 1 ORDER BY item_date DESC")->fetchColumn();
$sql = $db->query("SELECT * FROM $db_cform WHERE 1 
	ORDER BY item_date DESC 
	LIMIT $d, ".$cfg['plugin']['cform']['maxrowsperpage']);

Первая строка - это запрос для вычисления общего количества писем в базе данных. Второй - основной запрос.

Остается добавить навигацию по страницам. Для этого используем стандартную функцию генерации пагинации в Cotonti:

$pagenav = cot_pagenav('admin', 'm=other&p=cform', $d, $totalitems, $cfg['plugin']['cform']['maxrowsperpage']);

$t->assign(array(
	'PAGINATION' => $pagenav['main'],
	'PAGEPREV' => $pagenav['prev'],
	'PAGENEXT' => $pagenav['next'],
	'CURRENTPAGE' => $pagenav['current'],
));

И в начало кода нужно добавить строку для получения текущей страницы (значение переменной $d):

list($pg, $d, $durl) = cot_import_pagenav('d', $cfg['plugin']['cform']['maxrowsperpage']);

Чтобы вывести полученные записи из основного запроса, выполним цикл while:

while($item = $sql->fetch()){
	$t->assign(array(
		'ITEM_ROW_NAME' => $item['item_name'],
		'ITEM_ROW_EMAIL' => $item['item_email'],
		'ITEM_ROW_TEXT' => $item['item_text'],
		'ITEM_ROW_DATE' => $item['item_date'],
	));
	$t->parse('MAIN.ITEM_ROW');
}

$t->parse('MAIN');
$adminmain = $t->text('MAIN');

5. На этом работа с основным кодом завершена. Для того, чтобы вывести полученные данные для просмотра в админке нам остается прописать всё в шаблон cform.admin.tpl:

<!-- BEGIN: MAIN -->

<table class="table table-pills cells">
<!-- BEGIN: ITEM_ROW -->
<tr>
	<td>{ITEM_ROW_DATE|cot_date('d.m.Y H:i', $this)}</td>
    <td>{ITEM_ROW_NAME}</td>
	<td>{ITEM_ROW_EMAIL}</td>
	<td>{ITEM_ROW_TEXT}</td>
</tr>
<!-- END: ITEM_ROW -->
</table>

<div class="pagination">
	{PAGEPREV}{PAGINATION}{PAGENEXT}
</div>

<!-- END: MAIN -->

 

Чтобы скачать исходники и видеть комментарии, пожалуйста, авторизуйтесь или зарегистрируйтесь на сайте.