Введение

Joomla предоставляет платформу для реализации проверки как на стороне клиента, так и на стороне сервера.

Проверка на стороне клиента выполняется в браузере с использованием Javascript, который загружается вместе с веб-страницей.

Проверка на стороне сервера выполняется на PHP на сервере, когда поля формы отправляются в HTTP POST запросе.

Из них проверка на стороне сервера является более важной, поскольку хакеры могут использовать утилиты, такие как curl, для отправки HTTP POST-запросов непосредственно на ваш веб-сервер, минуя как вашу HTML-форму, так и ее проверку на стороне клиента.

В этом разделе описывается проверка на стороне сервера в Joomla: ниже описывается проверка на стороне клиента.

Проверка на стороне сервера

Это запускается путем указания validate=... атрибут в определении вашей формы. В образце формы, использованном в предыдущих разделах, есть проверка поля телефонного номера.

<field name="telephone"
    type="telephone"
    label="Enter telephone number"
    required="true"
    size="40"
    class="inputbox"
    validate="tel" />

Тот самый validate="tel" строка запускает проверку для этого поля, и в ней будет использоваться test функция в TelRule в libraries / src /Form / Rule проверяет, является ли значение поля допустимым.

Вы можете просмотреть список правил проверки, предоставляемых Joomla, просмотрев файлы классов в каталоге libraries / src / Form / Rule , и выбрать, какую процедуру проверки вы хотите запустить для полей вашей формы. Например, чтобы использовать правило электронной почты, вы должны включить validate="email" напротив поля электронной почты в определении вашей формы.

Пользовательская проверка на стороне сервера

Вы можете определить собственную проверку для поля, написав пользовательское правило проверки. В качестве примера мы возьмем пользовательское правило под названием "custom", которое мы будем использовать для замены проверки телефонного номера, предоставляемой Joomla. Очевидно, вы можете называть свое собственное правило как угодно. Затем вам нужно сделать 3 вещи:

  • В вашем определении поля напротив поля добавьте атрибут validate="custom" против вашего поля
  • Создайте свой файл CustomRule.php - мы скоро вернемся к этому
  • Сообщите Joomla, где найти ваш класс CustomRule, с помощью addruleprefix атрибут

Допустим, ваш com_example компонент был определен в вашем файле XML-манифеста

<namespace path="src">Mycompany\Component\Example</namespace>

и вы решаете сохранить свое правило в области администратора в src/Rule/CustomRule.php, тогда у вас будет:

<field 
    addruleprefix="Mycompany\Component\Example\Administrator\Rule"
    name="telephone"
    type="telephone"
    label="Enter telephone number"
    required="true"
    size="40"
    class="inputbox"
    validate="custom"
    message="The telephone number field is wrong" />

и внутри твоего CustomRule.php:

namespace Mycompany\Component\Example\Administrator\Rule;
class CustomRule …

Если вы можете указать свое пользовательское правило проверки в виде регулярного выражения, то проще всего повторно использовать класс Joomla FormRule, который проверяет значение с помощью защищенной переменной $regex:

namespace Mycompany\Component\Example\Administrator\Rule;
use Joomla\CMS\Form\FormRule; 
class CustomRule extends FormRule
{
    protected $regex = '^[0-9\*\#]+$';
}

Затем Joomla FormRule проверит поле на соответствие переопределенному $regex значение, в данном случае проверяя, что телефонный номер содержит только символы от 0 до 9, * и #.

Если ваша проверка не может быть выражена в виде регулярного выражения, то вам придется предоставить test действуйте самостоятельно, следуя примеру других правил проверки в libraries /src /Form /Rule:

/**
 * Метод проверки диапазона для числового значения с использованием атрибутов min и max.
 *
 * @param   \SimpleXMLElement  $element  Объект SimpleXMLElement, представляющий тег `<field>` для объекта form field.
 * @param   mixed              $value    Значение поля формы для проверки.
 * @param   string             $group    Управляющее значение группы имен полей. Это действует как контейнер массива для поля.
 *                                       Например, если поле имеет name="foo", а значение группы равно "bar", то
 *                                       полное имя поля в конечном итоге будет "bar[foo]".
 * @param   Registry           $input    Необязательный объект реестра со всем набором данных для проверки по всей форме.
 * @param   Form               $form     Объект формы, для которого тестируется поле.
 */
public function test(\SimpleXMLElement $element, $value, $group = null, Registry $input = null, Form $form = null) { … }

Как вы можете видеть из комментариев, вам передается много информации, на случай, если вашей процедуре проверки потребуется доступ к ней! Например, NumberRule Joomla проверяет, находится ли значение между атрибутами "min" и "max", установленными в определении поля в форме XML, и получает эти ограничения из $element параметр. Таким же образом вы можете указать свои собственные атрибуты в определении поля, извлечь их из $element параметра и используйте их при проверке значения, введенного пользователем. Вам просто нужно вернуть true или false от вашего test функция.

Дополнительная проверка

Помимо любой проверки по заданному полю, Joomla также выполнит две проверки по данным:

  • если атрибут required если значение установлено, то он проверит, что значение было введено
  • если атрибут disabled если значение установлено, то он проверит, что значение (отличное от значения по умолчанию) не было введено

Сообщения об ошибках проверки

По умолчанию Joomla выводит сообщение об ошибке "Недопустимое поле", когда проверка поля завершается неудачно. Чтобы заставить Joomla выводить пользовательское сообщение, вы можете включить message="Wrong telephone number" внесите атрибут в атрибуты поля, как это сделано в определении поля "Телефон" ранее на этой странице.

Поскольку атрибуты поля включены в XML-элемент, который передается для проверки test функции, вы можете установить этот атрибут из test метод. Ниже приведен пример правила проверки телефонного номера.

<?php
namespace Mycompany\Component\SampleForm2\Site\Rule;
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Form\FormRule;
use Joomla\Registry\Registry;
use Joomla\CMS\Form\Form;

class TelephoneRule extends FormRule
{
	protected $regex = '^[0-9\#\*]+$';  // просто цифры плюс * плюс #
    
    public function test(\SimpleXMLElement $element, $value, $group = null, Registry $input = null, Form $form = null)
    {
        if (preg_match(\chr(1) . $this->regex . \chr(1) . $this->modifiers, $value)) {
            return true;
        }
        
        $attr = $element->attributes();
        $error_message = 'The telephone number ' . $value . ' is wrong';
        // то, как вы записываете атрибут message в элемент XML, зависит от того, установлен ли он уже
        if (isset($attr['message'])) {
            $element->attributes()->message = $error_message;
        } else {
            $element->addAttribute('message', $error_message);
        }
        return false;
    }
}