带有验证器的zend array []元素

时间:2011-04-05 10:56:24

标签: zend-framework forms

你好,我有一个表单,用户可以点击一个按钮并以动态方式添加新元素(使用Jquery)

<input name="sconto[]" type="text"><br>
<input name="sconto[]" type="text"><br>
<input name="sconto[]" type="text"><br>
...

我有一个浮点数的自定义验证器,格式为逗号和点分隔,如20.50和20,50 问题是我似乎无法找到如何使zend将它应用于数组的每个元素。

那么我应该如何声明这个元素以及如何应用验证器?的xD

这是我的验证器

protected $_messageTemplates = array(
self::NON_E_NUMERO  => 'non sembra essere un numero'
);

public function isValid($value, $context = null)
{
    $pos_virgola = strpos($value, ",");
    if ($pos_virgola !== false)
        $value = str_replace(",", ".", $value);

    if (!is_numeric($value))
    {
        $this->_error(self::NON_E_NUMERO, $value);
        return false;
    }
    else
        return true;
}

}

表格我不知道该怎么做,我使用这个,但显然它不起作用

$sconto = $this->createElement('text','sconto')->setLabel('sconto');
//->setValidators(array(new Gestionale_Validator_Float()));
$this->addElement($sconto);
...
$sconto->setDecorators(array(//no ViewHelper
            'Errors',
            'Description',
            array(array('data' => 'HtmlTag'), array('tag' => 'td', /*'class' => 'valore_campo', */'id'=>'sconto')),
            array('TdLabel', array('placement' => 'prepend', 'class' => 'nome_campo'))
    ));

1 个答案:

答案 0 :(得分:1)

如果Marcin评论不是您想要做的,那么这是另一种创建多文本元素的方法。

  1. 创建自定义装饰器“My_Form_Decorator_MultiText”。您需要注册自定义装饰器类。阅读Zend Framework doc以获取详细信息http://framework.zend.com/manual/en/zend.form.decorators.html

    类My_Form_Decorator_MultiText扩展Zend_Form_Decorator_Abstract {

    public function render($content) {
    
        $element = $this->getElement();
        if (!$element instanceof Zend_Form_Element_Text) {
            return $content;
        }
    
        $view = $element->getView();
        if (!$view instanceof Zend_View_Interface) {
            return $content;
        }
    
        $values = $element->getValue();
        $name = $element->getFullyQualifiedName();
        $html = '';
    
        if (is_array($values)) {
            foreach ($values as $value) {
                $html .= $view->formText($name, $value);
            }
        } else {
            $html = $view->formText($name, $values);
        }
    
        switch ($this->getPlacement()) {
            case self::PREPEND:
                return $html . $this->getSeparator() . $content;
            case self::APPEND:
            default:
                return $content . $this->getSeparator() . $html;
        }
    }
    

    }

  2. 现在验证类将验证每个元素值

    class My_Validate_Test扩展Zend_Validate_Abstract {     const NON_E_NUMERO ='numero';     protected $ _messageTemplates = array(         self :: NON_E_NUMERO =&gt; 'non sembra essere un numero'     );

    public function isValid($value, $context = null) {
        if (!is_numeric($value)) {
            $this->_error(self::NON_E_NUMERO, $value);
            return false;
        }
        else
            return true;
    }
    

    }

  3. 这是您可以使用新装饰器

  4. 的方法

    $element = new Zend_Form_Element_Text('sconto', array( 'validators' => array( new My_Validate_Test(), ), 'decorators' => array( 'MultiText', // new decorator 'Label', 'Errors', 'Description', array('HtmlTag', array('tag' => 'dl',)) ), 'label' => 'sconto', 'isArray' => true // must be true )); $this->addElement($element);

    希望这有帮助