Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
78 lines (70 sloc) 4.5 KB
<?php
/**
* RelationValidator устанавливает аттрибут в значение, возвращённое указанным relation.
*
* @author Павел Воронин <pavel.a.voronin@gmail.com>
* @license MIT
* @version 1.0
*/
/**
* Copyright (c) 2012 Павел Воронин
*
* Данная лицензия разрешает лицам, получившим копию данного программного
* обеспечения и сопутствующей документации (в дальнейшем именуемыми
* «Программное Обеспечение»), безвозмездно использовать Программное
* Обеспечение без ограничений, включая неограниченное право на использование,
* копирование, изменение, добавление, публикацию, распространение,
* сублицензирование и/или продажу копий Программного Обеспечения, также как и
* лицам, которым предоставляется данное Программное Обеспечение, при
* соблюдении следующих условий:
*
* Указанное выше уведомление об авторском праве и данные условия должны быть
* включены во все копии или значимые части данного Программного Обеспечения.
*
* ДАННОЕ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО
* ГАРАНТИЙ, ЯВНО ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ
* ГАРАНТИЯМИ ТОВАРНОЙ ПРИГОДНОСТИ, СООТВЕТСТВИЯ ПО ЕГО КОНКРЕТНОМУ НАЗНАЧЕНИЮ
* И ОТСУТСТВИЯ НАРУШЕНИЙ ПРАВ. НИ В КАКОМ СЛУЧАЕ АВТОРЫ ИЛИ ПРАВООБЛАДАТЕЛИ НЕ
* НЕСУТ ОТВЕТСТВЕННОСТИ ПО ИСКАМ О ВОЗМЕЩЕНИИ УЩЕРБА, УБЫТКОВ ИЛИ ДРУГИХ
* ТРЕБОВАНИЙ ПО ДЕЙСТВУЮЩИМ КОНТРАКТАМ, ДЕЛИКТАМ ИЛИ ИНОМУ, ВОЗНИКШИМ ИЗ,
* ИМЕЮЩИМ ПРИЧИНОЙ ИЛИ СВЯЗАННЫМ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ
* ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ ИЛИ ИНЫМИ ДЕЙСТВИЯМИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ.
*/
/**
* RelationValidator устанавливает аттрибут в значение, возвращённое указанным relation.
*
* В большинстве случаев relation будет типа STAT, но RelationValidator не проверяет
* тип relation специально, так что вы вольны указывать relation произвольного типа
* (например, для последующей сериализации выборки ).
*/
class RelationValidator extends CValidator
{
/**
* Значение указанного relation будет установлено в качестве значения аттрибута
* @var string
*/
public $relation;
/**
* Перегружать ли relation, если он уже был ранее загружен
* @var boolean
*/
public $forceRefresh = true;
public $skipOnError = true;
/**
*
* @param CActiveRecord $object У CModel нет relations, так что валидатор применим только к CActiveRecord и потомкам
* @param string $attribute Имя аттрибута
* @return void
* @throws RelationValidatorException Если relation у объекта не найден
*/
protected function validateAttribute ( $object, $attribute )
{
if ( ! $object->metaData->hasRelation ( $this->relation ) )
throw new RelationValidatorException ( 'ActiveRecord model \'' . get_class ( $object ) . '\' doesn\'t have relation with name \'' . $this->relation. '\'' );
$object->$attribute = $object->getRelated ( $this->relation, (bool) $this->forceRefresh );
}
}
/**
* Класс ошибки валидатора
*/
class RelationValidatorException extends CException {}