Pages

2010年3月19日金曜日

ZendFramework 関連する他の項目をチェックする方法

オリジナルのValidateを作ってもいいけどもどうしてもその方法だと、1か所しか使用しないのに作る必要があったりとなんだかスッキリしない。
そこでZend_Validate_Callback を利用する事により、解決する事を発見。

下記のようにformファイル内で実装する。


class Default_Form_Foo extends Zend_Form
{
    public function init()
    {
        $this->addElementPrefixPath('Default_Plugin_Validate_'   , '/foo/Validate'  , 'validate');
        $this->addElementPrefixPath('Default_Plugin_Filter_'     , '/foo/Filter'    , 'filter');

        $element = new Zend_Form_Element_Radio('mode');
        $element
            ->setRequired(true)
            ->setMultiOptions(array(
                'foo1' => 'bar1',
                'foo2' => 'bar2',
            ))
            ->setFilters(array(
                'StringTrim',
            ))
            ->setValidators(array(
                array (
                    'breakChainOnFailure' => true,
                    'validator' => 'Callback',
                    'options' => array(array($this, 'targetNotEmpty'))
                ),
            ))
            ->setDecorators(array(
                array('ViewHelper', array()),
                array('Description', array('tag'=>'div')),
                array('Errors', array('class'=>'Errors')),
            ));
        $this->addElement($element);
    }

    public function targetNotEmpty($value, $context)
    {
        $newsMode = $this->getMaster()->getNewsMode('key');
        $valid = new Zend_Validate_NotEmpty();

        if ($value == $newsMode['summary']) {
            if (!$valid->isValid($context['summary'])) {
                $this->getElement('summary')->addError('未入力です。');
            }
        }
        elseif ($value == $newsMode['link_url']) {
            if (!$valid->isValid($context['link_url'])) {
                $this->getElement('link_url')->addError('未入力です。');
            }
        }
        return true;
    }
}

0 件のコメント:

コメントを投稿

Followers