Jump to main content Jump to doc navigation

Что такое валидация объектов в xPDO?

Проверка (или валидация) объекта выполняется с помощью xPDO\Validation\xPDOValidator, класса проверки в xPDO (в MODX 3 подменяется на MODX\Revolution\Validation\modValidator). Он автоматически доступен из любого xPDOObject через метод getValidator().

Как это делается?

Валидация может быть выполнена либо при помощи XML схемы, либо во время выполнения с помощью методов xPDOValidator.

Пример использования

Преждем всего давайте создадим нашу модель с этим объектом:

<model package="test" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" tablePrefix="test_">
    <object class="myTest" table="test" extends="xPDOSimpleObject">
        <field key="name" dbtype="varchar" precision="255" phptype="string" default="" null="false" />

        <validation>
            <rule field="name"
                name="preventBlank"
                type="xPDOValidationRule"
                rule="xPDOMinLengthValidationRule"
                value="1"
                message="Пожалуйста укажите имя"
             />
        </validation>
    </object>
</model>

Идем дальше и генерируем модель из XML схемы. А теперь в сниппете вызываем Test:

$output = '';
$modx->addPackage('test','/path/to/my/test/model/','test_');
$obj = $modx->newObject('myTest');
$validator = $obj->getValidator();
if ($validator->validate() == false) {
    $messages = $validator->getMessages();
    foreach ($messages as $errorMsg) {
        $output .= 'Произошла ошибка в поле "'.$errorMsg['field'].'": '.$errorMsg['message'];
    }
}

Будет выведено:

Произошла ошибка в поле “name”: Пожалуйста укажите имя.

Правила

Существует три вида правил, callable, preg_match, и xPDOValidationRule.

Правило ‘callable’

Это правило, основанное на функции, которую вы передаете.

Это можно сделать несколькими способами. В параметре “rule” схемы вы можете указать имя функции, например “myCallable”, а затем обязательно определить функцию, прежде чем вызывать validate() функцию.

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

<rule field="number" name="callable2"
    type="callable" rule="myCallable"
    min="10" message="Значение слишком маленькое. Может быть 10 или больше"
/>

Вызывается при помощи следующего кода:

function myCallable($value,$parameters) {
    return $value < $parameters['min'];
}
$obj->set('number',101);
$validator = $obj->getValidator();
if ($validator->validate() == false) {
    $messages = $validator->getMessages();
    foreach ($messages as $errorMsg) {
        $o .= 'Произошла ошибка в поле "'.$errorMsg['field'].'": '.$errorMsg['message'].'<br />';
    }
}

Будет возвращено:

Произошла ошибка в поле “number”: Callable failed.

Вы также можете вызывать методы класса; если у вас есть класс A с методом B, вы можете сделать xml атрибут правила вида A::B для доступа к функции.

Правило ‘preg_match’

Это правило представляет собой регулярного выражения, которое должно передаваться в поле для проверки объекта. Пример правила в схеме такой: проверяется, содержит ли поле строку ‘php’:

<rule field="name" name="phpMatch"
    type="preg_match" rule="/php/i"
    message="Не содержит строку 'php'." />

А в PHP следующий вызов:

$obj->set('name','test');
$validator = $obj->getValidator();
if ($validator->validate() == false) {
    $messages = $validator->getMessages();
    foreach ($messages as $errorMsg) {
        $o .= 'Произошла ошибка в поле "'.$errorMsg['field'].'": '.$errorMsg['message'].'<br />';
    }
}

Вывод будет следующим:

Произошла ошибка в поле “name”: Не содержит строку ‘php’.

Правило ‘xPDOValidationRule’

Это определенный тип правила, основанный на расширении класса класса xPDOValidationRule. Это позволяет делать более сложные правила, а также использовать встроенные. Встроенные правила включают в себя:

  1. xPDOForeignKeyConstraint
  2. xPDOMaxLengthValidationRule
  3. xPDOMaxValueValidationRule
  4. xPDOMinLengthValidationRule
  5. xPDOMinValueValidationRule
  6. xPDOObjectExistsValidationRule

О том, как объявлять правила в схеме и писать собственные, читайте в разделе Validation Rules.

Смотрите также

Support the team building MODX with a monthly donation.

The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.

Backers

  • modmore
  • STERC
  • Digital Penguin
  • Jens Wittmann – Gestaltung & Entwicklung
  • CrewMark
  • Fabian Christen
  • Sepia River Studios
  • Dannevang Digital
  • A. Moreno
  • Alex
  • Chris Fickling
  • Stéphane Jäggi
  • Murray Wood
  • Anton Tarasov
  • JT Skaggs
  • deJaya
  • Lefthandmedia
  • eydolan
  • Following Sea
  • Guido Gallenkamp
  • YJ
  • Raffy
  • Snow Creative
  • Nick Clark
  • Guest
  • Helen
  • krisznet
  • Yanni
  • Richard

Budget

$194 per month—let's make that $500!

Learn more