В этом уроке я постараюсь показать как на практике можно создать простой плагин для отправки сообщения администратору сайта.  
 
Допустим, что наша форма содержит следующие поля:
 
  1. Имя отправителя - input
  2. Электронная почта отправителя - input
  3. Поле для текста сообщения - textarea
 
Начнем создавать файлы плагина. 
 
Для начала нужно придумать кодовое название плагина. Допустим cform. 
 
Создадим папку cform в директории где расположены плагины в Cotonti (обычно это plugins/).
 
В директории нашего плагина создадим основной установочный файл плагина cform.setup.php со следующим кодом: 
<?php
/**
 * [BEGIN_COT_EXT]
 * Code=cform
 * Name=Contact form
 * Description=Форма для связи с администрацией сайта
 * Version=1.0.0
 * Date=25.05.2015
 * Author=Bulat Yusupov (devkont)
 * Copyright=(c) CMSWorks Team 2015
 * Notes=
 * Auth_guests=R
 * Lock_guests=W12345A
 * Auth_members=RW
 * Lock_members=12345A
 * [END_COT_EXT]

 * [BEGIN_COT_EXT_CONFIG]

 * [END_COT_EXT_CONFIG]
 */

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

?>

Установочный файл необходим нам для декларирования всех основных параметров нашего плагина (Название, описание, имя и контакты автора, номер версии, и редактируемые опции плагина при их необходимости).

Параметры плагина указываются между строками: [BEGIN_COT_EXT] и [END_COT_EXT].
Редактируемые опции плагина указываются между строками: [BEGIN_COT_EXT_CONFIG] и [END_COT_EXT_CONFIG]. В нашем случае в них нет необходимости, поэтому данный блок мы оставляем пустым. 
 
Более подробную информацию о параметрах установочного файла расширений Cotonti вы можете получить в этой статье на официальном сайте фреймворка.
 
Дальше создадим в папке плагина файл плагина cform.php, который будет выводить нашу форму по адресу: http://нашсайт.ру/index.php?e=cform 
 
Пока добавим в него код:
<?php

/**
 * [BEGIN_COT_EXT]
 * Hooks=standalone
 * [END_COT_EXT]
 */

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

В параметре Hooks мы указали «standalone». Это означает, что файл будет запускаться как отдельная, автономная страница сайта.

 
Строка
defined('COT_CODE') && defined('COT_PLUG') or die('Wrong URL');

предотвращает обращение к файлу напрямую. Об этом я уже писал в статье «Как работает Cotonti Siena».

После этой строки нам нужно подключить библиотеку языковых переменных нашего плагина, чтобы наш плагин был универсальным и все тексты в нем отображались согласно выбранному языку пользователя или заданному по-умолчанию. Для этого добавим следующую строку: 
require_once cot_langfile(‘cform', 'plug');

Файлы с языковыми переменными плагина по-умолчанию должны находиться в папке lang в директории плагина (то есть в plugins/cform/lang/):

cform.ru.lang.php - тексты на русском
cform.en.lang.php - тексты на английском 
и т.д.
 
 
Так как в Cotonti оформление идет отделено от основного кода, нам необходимо также создать шаблон нашей страницы с формой. Все шаблоны плагина должны находиться в папке tpl в директории плагина. В нашем случае (plugins/cform/tpl/). Создадим в этой директории наш шаблон: cform.tpl со следующим html-кодом:
<!-- BEGIN: MAIN -->

<h1>{PHP.L.cform_form_title}</h1>

{FILE "{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/warnings.tpl"}
<form action=«{CFORM_ACTION}" method="post" id="form_orderform" class="form-horizontal">
    <div class="control-group">
        <label class="control-label">{PHP.L.cform_form_name}</label>
        <div class="controls">
            {CFORM_NAME}
        </div>
    </div>
    <div class="control-group">
        <label class="control-label">{PHP.L.cform_form_email}</label>
        <div class="controls">
            {CFORM_EMAIL}
        </div>
    </div>
    <div class="control-group">
        <label class="control-label">{PHP.L.cform_form_text}</label>
        <div class="controls">
            {CFORM_TEXT}
        </div>
    </div>
    <div class="control-group">
        <label class="control-label"></label>
        <div class="controls">
            <button class="btn btn-primary" type="submit">{PHP.L.cform_form_submit}</button>
        </div>
    </div>
</form>

<!-- END: MAIN -->

Чтобы шаблон был подключен к плагину пропишем в файле cform.php следующую строку кода:

$t = new XTemplate(cot_tplfile(‘cform', 'plug'));

Зададим тэги необходимых полей для нашей формы, предварительно подключив библиотеку функций для генерации элементов форм:

Для этого добавим следующую строку (подключим библиотеку функций для генерации элементов форм):
require_once cot_incfile('forms');

и пропишем нужные тэги:

$t->assign(array(
    ‘CFORM_ACTION' => cot_url(‘cform', 'a=send'),
    ‘CFORM_EMAIL' => cot_inputbox('text', 'remail', $remail, array('size' => 56, 'maxlength' => 255, 'class' => 'form-control')),
    ‘CFORM_NAME' => cot_inputbox('text', 'rname', $rname, array('size' => 56, 'maxlength' => 255, 'class' => 'form-control')),
    ‘CFORM_TEXT' => cot_textarea('rtext', $rtext, 10, 60, array('class' => 'form-control')),
));

Тэги {CFORM_EMAIL} и {CFORM_NAME} генерируют поля для ввода почты и имени, соответственно. Это обычные input, которые мы создаем с помощью функции cot_inputbox().

Тэг {CFORM_TEXT} генерирует текстовое поле textarea для ввода текста сообщения.
 
Тэг {CFORM_ACTION} показывает куда будут отправляться данные формы (при клике на кнопку «Отправить»). В нашем случае данные отправляются на тот же скрипт, но с параметром $a = ’send’, чтобы в коде мы могли обработать полученные данные только если сработает условие:
if($a == ’send’)
{
     // код обработки полученных даных из формы.
}

Разберем как будет происходить обработка полученных данных из формы:

1) Сначала нам нужно получить нужные данные, предварительно пропустив их через функцию-фильтр:
$remail = cot_import('remail','P', 'TXT', 64, TRUE);
$rname = cot_import('rname', 'P', 'TXT');
$rtext = cot_import('rtext', 'P', 'TXT');

Функция cot_import() проверяет соответствие значения полученной переменной, заданному типу данных. Если полученная переменная не соответствует нужному типу данных, то ей ничего не присваивается. Поговорим об этой функции более детально в следующий раз.

В нашем случае мы получаем текстовые значения, поэтому в фильтрах мы используем тип фильтрации ‘TXT’. Данные поступают из формы с помощью POST-метода, поэтому для источника переменной в фильтре мы указываем ‘P’, что означает POST.
 
Далее нам необходимо проверить полученные переменные на правильность заполнения. Если что-то не заполнено или заполнено с ошибкой, нам нужно зафиксировать ошибку и вывести соответствующее сообщение.
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');

Функция cot_check() позволяем нам проверить любое условие и если он не верное, то запомнить ошибку в массиве уведомлений для соответствующего поля. Например в строке:

cot_check(!cot_check_email($remail), ‘cform_error_email', 'remail');

мы проверяем значение переменной $remail на соответствие формату электронной почты (для этого есть функция cot_check_email()). Если значение этой переменной не является электронной почтой, то в массив ошибок запишется значение из языковой переменной для текста об ошибке:

$L[‘cform_error_email’] = ‘Электронная почта не указана или содержит ошибки’;

Другие поля мы тоже проверяем на заполненность и прописываем соотвествующие сообщения об ошибках в языковом файле плагина:

$L[‘cform_error_name’] = ‘Вы не указали ваше имя’;
$L[‘cform_error_text’] = ‘Текст сообщения не должен быть пустым’;

Если форма заполнена верно, то выполняем отправку сообщения на основную почту сайта (указанную в настройках сайта):

  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_redirect(cot_url('cform')); // Редирект после обработки данных.
    }

Все созданные по ходу выполнения скрипта уведомления выводятся с помощью функции:

cot_display_messages($t);

А чтобы уведомления были выведены в шаблоне нашего плагина нам необходимо добавить строку подключения шаблона уведомлений: 

{FILE "{PHP.cfg.themes_dir}/{PHP.cfg.defaulttheme}/warnings.tpl"} 

 

Учитывая вышеизложенные размышления, у нас должен получиться файл cform.php со следующим кодом:

<?php

/**
 * [BEGIN_COT_EXT]
 * Hooks=standalone
 * [END_COT_EXT]
 */

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

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

$out['subtitle'] = $L['cform_title'];

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_redirect(cot_url('cform'));
}


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

$t->assign(array(
	'CFORM_ACTION' => cot_url('cform', 'a=send'),
	'CFORM_EMAIL' => cot_inputbox('text', 'remail', $remail),
	'CFORM_NAME' => cot_inputbox('text', 'rname', $rname),
	'CFORM_TEXT' => cot_textarea('rtext', $rtext, 10, 60),
));

cot_display_messages($t);

 

Если вы действительно желаете освоить Cotonti, то рекомендую проделать все самостоятельно как я описал выше. А чтобы можно было проверить и сравнить ваш результат, вы можете скачать архив с готовым плагином.

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