Как я могу заставить Zend Decorator разрешить значение по умолчанию?


person Dean Rather    schedule 29.07.2010    source источник
comment
Как сказал @Ololo, используйте для этого Jquery. А также, чтобы предотвратить сохранение значения по умолчанию, проверьте его в своем контроллере или даже напишите для этого собственный валидатор.   -  person Keyne Viana    schedule 29.07.2010


Ответы (2)


Просто используйте соответствующие плагины jQuery: defaultvalue

person Ololo    schedule 29.07.2010

Хорошо, я создал декоратор, который позволяет мне реализовать jquery плагин Ololo. Он проверяет, есть ли у элемента набор меток, и если да, то по умолчанию:

require_once 'Zend/Form/Decorator/Abstract.php';

class Application_Form_Decorator_DefaultEnabledInput extends Zend_Form_Decorator_Abstract
{
    private $attribs = array();
    public function render($content)
    {
        $element = $this->getElement();

        if(get_class($element) != 'Zend_Form_Element_Text') throw new Exception("Application_Form_Decorator_DefaultEnabledInput only works on text fields");

        $element->setAttrib('type', 'text');
        $element->setAttrib('name', htmlspecialchars($element->getName()));
        $element->setAttrib('value', htmlspecialchars($element->getValue()));

        $attribs = '';
        $default = $element->getLabel();
        if($default)
        {
            $element->setAttrib('rel', $default);
            $element->setAttrib('title', $default);
            $class = $element->getAttrib('class');
            $element->setAttrib('class', "$class hasDefault");
            $default = "";
        }
        foreach($element->getAttribs() as $key => $val) $attribs .= "$key='$val' ";
        return "<input $attribs/>";
    }
}

Это позволяет мне определить значение по умолчанию в объекте формы (используя setLabel).

    $element = $this->createElement('text', 'suburb');
    $element->setDecorators(array('DefaultEnabledInput'));
    $element->setLabel('enter suburb here');
    $this->addElement($element); 

И все, что мне нужно сделать, это убедиться, что запрос и плагин включены на страницу, и этот фрагмент кода:

$(document).ready(function() {
    // default values
    $('.hasDefault').each(function(){
        $(this).defaultValue();
    });
});

Затем в шаблоне я могу отобразить объект следующим образом:

<?= $this->form->getElement('suburb') ?>
person Dean Rather    schedule 03.08.2010