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

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

1. Все функции плагина должны располагаться в файле plugins/cform/inc/cform.functions.php Создадим такой файл и добавим в его начало следующий код:

<?php

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

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

Как обычно первая строка необходима, чтобы к этому файлу нельзя было обратиться напрямую. Вторая строка подключает языковые файлы.

2. Теперь создадим функцию, которая выводит форму, назовем ее cform_show():

function cform_show(){

	require_once cot_incfile('forms');

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

	$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')),
	));

	cot_display_messages($t);

	$t->parse('MAIN');

	return $t->text('MAIN');
}

3. Чтобы функция была доступна по всему сайту, нам нужно ее объявить до того как происходит вывод в шаблоны. Для этого можно воспользоваться хуком global. Создадим файл cform.global.php с таким кодом:

<?php

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

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

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

После создания нового файла не забудьте обновить плагин через админку. 

Таким образом мы подключаем библиотеку функций нашего плагина для всего сайта. И теперь мы можем вызвать нашу форму в любом месте, просто добавив в любой шаблон такой тэг: {PHP|cform_show()}.

Обратите внимание, отправка формы как и раньше происходит на отдельную страницу. Но мы можем сделать так, чтобы отправка происходила без перезагрузки страницы, то есть с использованием ajax. Вспомним, код шаблона нашей формы: 

<!-- 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 -->

Чтобы форма отправлялась через ajax нам нужно прописать в тэг <form> класс ajax, указать метод отправки данных формы (post или get) и указать id блока в который нам нужно будет вывести результат. Изменим форму таким образом:

<!-- BEGIN: MAIN -->

<div id="FormBlock">
	<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 ajax post-FormBlock">
		<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>
</div>
		
<!-- END: MAIN -->

Как вы видите, мы обрамили форму в блок 

<div id="FormBlock">...</div>

и изменили тэг form: 

<form action="{CFORM_ACTION}" method="post" id="form_orderform" class="form-horizontal ajax post-FormBlock">

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

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