Zend framework 带验证器的zend数组[]元素

Zend framework 带验证器的zend数组[]元素,zend-framework,forms,Zend Framework,Forms,您好,我有一个表单,用户可以在其中单击按钮并以友好方式添加新元素(使用Jquery) } 这个表格我不知道怎么做,我用这个,但显然它不起作用 $sconto = $this->createElement('text','sconto')->setLabel('sconto'); //->setValidators(array(new Gestionale_Validator_Float())); $this->addElement($sconto); ... $scont

您好,我有一个表单,用户可以在其中单击按钮并以友好方式添加新元素(使用Jquery)

}

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

$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'))
    ));

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

  • 创建自定义装饰器“My_Form_decorator_MultiText”。您需要注册自定义装饰器类。有关详细信息,请阅读Zend Framework文档

    类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;
        }
    }
    
    }

  • 现在,您的验证类将验证每个元素值

    类My_Validate_测试扩展了Zend_Validate_抽象{ 常量NON_E_NUMERO='NUMERO'; 受保护的$\u messageTemplates=数组( self::NON_E_NUMERO=>“NON sembra essere un NUMERO” ))

    }

  • 这就是如何使用新的装饰器

  • 
    $element=new Zend\u Form\u element\u Text('sconto',数组(
    “验证程序”=>数组(
    新建My_Validate_Test(),
    ),
    “装饰器”=>数组(
    “MultiText”,//新装饰程序
    “标签”,
    “错误”,
    “说明”,
    数组('HtmlTag',数组('tag'=>'dl',))
    ),
    'label'=>'sconto',
    “isArray”=>true//必须为true
    ));
    $this->addElement($element);
    


    希望这对您有所帮助

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

  • 创建自定义装饰器“My_Form_decorator_MultiText”。您需要注册自定义装饰器类。有关详细信息,请阅读Zend Framework文档

    类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;
        }
    }
    
    }

  • 现在,您的验证类将验证每个元素值

    类My_Validate_测试扩展了Zend_Validate_抽象{ 常量NON_E_NUMERO='NUMERO'; 受保护的$\u messageTemplates=数组( self::NON_E_NUMERO=>“NON sembra essere un NUMERO” ))

    }

  • 这就是如何使用新的装饰器

  • 
    $element=new Zend\u Form\u element\u Text('sconto',数组(
    “验证程序”=>数组(
    新建My_Validate_Test(),
    ),
    “装饰器”=>数组(
    “MultiText”,//新装饰程序
    “标签”,
    “错误”,
    “说明”,
    数组('HtmlTag',数组('tag'=>'dl',))
    ),
    'label'=>'sconto',
    “isArray”=>true//必须为true
    ));
    $this->addElement($element);
    


    希望这对您有所帮助

    您能为表单和验证程序提供代码吗?我认为在ZF中,您无法轻松创建包含多个名为“sconto[]”字段的表单。但是,您可以执行“sconto[0]”、“sconto[1]”等操作。例如,请看一看。我可以执行sconto[0]sconto[1]。。。使用javascript,问题是我不知道用户会输入多少。是的,这就是为什么我更喜欢自己处理表单和$u POST数据的原因。我只是希望Zend_Form能够达到版本2中Zend Framework的其他部分。您能为表单和验证器提供代码吗?我认为在ZF中,您无法轻松创建具有多个名为“sconto[]”字段的表单。但是,您可以执行“sconto[0]”、“sconto[1]”等操作。例如,请看一看。我可以执行sconto[0]sconto[1]。。。使用javascript,问题是我不知道用户会输入多少。是的,这就是为什么我更喜欢自己处理表单和$u POST数据的原因。我只是希望Zend_Form能够达到版本2中Zend Framework的其他部分。我不明白为什么这会适用于任意长度的数组,我觉得验证器只传递了一个值?你不清楚你想要什么。使用Zend_格式的JavaScript创建数组元素或添加新元素很容易。你有其他成员发布的不同答案,我发布了另一个选项。所有答案都将获得相同的结果数组元素。祝你好运我不明白为什么假设这是一个任意长度的数组,我觉得验证器只传递了一个值?你不清楚你想要什么。使用Zend_格式的JavaScript创建数组元素或添加新元素很容易。你有其他成员发布的不同答案,我发布了另一个选项。所有答案都将获得相同的结果数组元素。祝你好运
    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;
        }
    }
    
    public function isValid($value, $context = null) {
        if (!is_numeric($value)) {
            $this->_error(self::NON_E_NUMERO, $value);
            return false;
        }
        else
            return true;
    }