Последний урок из цикла создания статей MVC компонента

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

Итак для начала мы отредактируем заголовки и ключевые слова!

За это отвечает функция formHelper::setDocument( 'view title', $this->baseurl ); которая находится в каждом методе display(); наших видов

Эта строка вызываем метод setDocument который находится в файле components/com_form/helpers/form.php и который всего лишь устанавливает заголовки, ключевые слова и описания тоесть мы должны написать так:

formHelper::setDocument( 'Форма обратной связи', $this->baseurl, 'Описание страницы', 'Ключевые слова страницы' );

На этом установка ключевых слов, описаний и заголовков завершена!

Теперь займемся созданием поля для защиты от спам бота.

Для этого нам нужно создать файл с названием mycaptcha.php в папке components/com_form/models/fields/

И добавляем в него следующий код:

<?php

/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   Copyright (C) 2005 - 2012 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined( 'JPATH_BASE' ) or die;
/**
 * Class JFormFieldMyCaptcha
 */
class JFormFieldMyCaptcha extends JFormFieldText
{

	/**
	 * @var string
	 */
	protected $type = 'MyCaptcha';

	/**
	 * Метод для создания поля
	 * @return string
	 */
	public function getInput()
	{
		//Устанавливаем атрибуты сессии
		$size = $this->element['size'] ? ' size="' . (int)$this->element['size'] . '"' : '';
		$maxLength = $this->element['maxlength'] ? ' maxlength="' . (int)$this->element['maxlength'] . '"' : '';
		$class = $this->element['class'] ? ' class="' . (string)$this->element['class'] . '"' : '';
		$readonly = ( (string)$this->element['readonly'] == 'true' ) ? ' readonly="readonly"' : '';
		$disabled = ( (string)$this->element['disabled'] == 'true' ) ? ' disabled="disabled"' : '';
		$onchange = $this->element['onchange'] ? ' onchange="' . (string)$this->element['onchange'] . '"' : '';
		//Генерируем два случайных числа
		$number1 = mt_rand( 1, 9 );
		$number2 = mt_rand( 1, 9 );
		//Получаем сессию
		$session = JFactory::getSession();
		//Устанавливаем в сессию значение суммы наших сгенерированных чисел
		$session->set( 'mycaptcha', $number1 + $number2 );
		//Формируем поле
		$html = 'Сколько будет ' . $number1 . ' + ' . $number2 . ' ?: ';
		$html .= '<input type="text" name="' . $this->name . '" id="' . $this->id . '"' . ' value="'
			. htmlspecialchars( $this->value, ENT_COMPAT, 'UTF-8' ) . '"' . $class . $size . $disabled . $readonly . $onchange . $maxLength . '/>';
		return $html;
	}
}

Теперь мы добавляем в файл с нашей формой (components/com_form/models/forms/form.xml) наше поле в секцию fields:

<field name="mycaptcha" type="mycaptcha" label="" class="span1" required="true" />

Далее в шаблоне нашего вида нужно вывести наше поле:

<div class="control-group form-inline">
	<div class="controls"><?php echo $this->form->getInput( 'mycaptcha' ); ?></div>
</div>
После того как мы выполнили этот код Форма после создания поля для защиты от ботов

Теперь нам нужно внести в контроллер проверку нашего поля на корректность ввода.
открываем файл components/com_form/controllers/form.php, и добавляем в него следующий метод:

public function save( $key = null, $urlVar = null )
{
	//Получаем наше приложение
	$app = JFactory::getApplication();
	//Данные коотрые пришли из формы
	$data = $this->input->post->get( 'jform', array(), 'array' );
	//Получаем нашу модель
	$model = $this->getModel();
	//получаем нашу форму
	$form = $model->getForm( $data, false );
	//Проводим валидацию данных формы
	$validData = $model->validate( $form, $data );
	//Идентификатор записи
	$recordId = $this->input->getInt( $urlVar );
	//Контекст
	$context = "$this->option.edit.$this->context";
	//объект сессии
	$session = JFactory::getSession();
	//проверяем или данные из сессии совпадают с тем что прошло из формы
	if ( (int)$session->get( 'mycaptcha' ) != (int)$data['mycaptcha'] ) {
		//Устанавливаем данные для формы
		$app->setUserState( $context . '.data', $validData );
		//Создаем ошибку о неверно заполненном поле с суммой цифр
		$this->setError( JText::sprintf( 'Вы неверно ввели сумму цифр', $this->getModel()->getError() ) );
		//Устанавливаем сообщение для системы
		$this->setMessage( $this->getError(), 'error' );
		//Редиректим обратно на форму с отображением ошибок
		$this->setRedirect(
			JRoute::_(
				'index.php?option=' . $this->option . '&view=' . $this->view_item
				. $this->getRedirectToItemAppend( $recordId, $urlVar ), false
			)
		);

		return false;
	}
	return parent::save( $key, $urlVar );
}
Если мы введем неправильную сумму цифр то мы получим сообщение об ошибке: Форма после создания поля для защиты от ботов

На этом серия уроков по созданию компонента завершена!

Все что мы выполнили в этом уроке можно скачать ниже!