2013-04-23 90 views
1

我对Zend_Form默认呈现表单元素的方式感到不满,并且想要通过实例化助手类生成的所有表单都覆盖它我从Zend_Form继承来处理一些我在所有表单上做的事情。用自定义HTML模板覆盖默认的Zend_Form元素渲染器?

我想做的更改似乎比装饰器的合理/可能更复杂,所以我想使用自定义HTML模板来实现这一点,我可以将表单值插入到自定义HTML代码段中。

如何设置由我的类呈现的所有HTML元素以使用HTML模板?我应该从模板中调用哪些属性/函数来获取Zend_Form默认呈现的内容?最后,我宁愿这样做,而不必在我的代码中创建的每个输入元素上手动设置模板。

回答

1

我结束了使用自定义的观点,我泛化,以任意形式工作。

使用这种方法,我能够做以下事情:在一个DIV

  • 所需的表单元素的标签后添加一个星号
  • 组输入和错误在一起,这样,当我漂浮标签的左侧东西还是排队
  • 添加一个特殊的类来示数输入,这样我就可以凸显他们
  • 更改某些错误信息,包括该元素的名称,而不是“价值”
  • 传递文字注释与表单元素沿下输入要显示
  • 在特殊元素

有些事情是不可能没有viewscript,有的只是一个痛苦的不换标签和输入实行。我认为这个解决方案对我而言将会更加灵活。

在我的辅助类render()功能:

$view = new Zend_View(); 
$view->setBasePath(SRC_ROOT . "/templates/forms"); 
$this->setDecorators(array(array('ViewScript', array('viewScript' => 'viewscript.php')))); 

这是我的viewscript:

<link rel="stylesheet" type="text/css" href="/styles.css" /> 

<form id="<?php echo $this->element->html_id ?>" class="<?php echo $this->element->html_class ?>" enctype="application/x-www-form-urlencoded" action="" method="post"> 
    <?php foreach($this->element as $element) { ?> 
     <?php 

     $decorators = $element->getDecorators(); 
     if(isset($decorators["Zend_Form_Decorator_Label"])) { 
      $label = $element->getLabel(); 
     } else { 
      $label = ""; 
     } 

     if($element->isRequired() === true) { 
      $label .= " *"; 
     } 
     ?> 
     <label class="label" for="<?php echo $element->getName(); ?>"><?php echo $label; ?></label> 

     <div class="formInput"> 
      <?php 
      // Add the error class to make the form inputs highlight in red 
      if($element->hasErrors()) { 
       $attribs = $element->getAttribs(); 
       if(!isset($attribs["class"])) { 
        $attribs["class"] = ""; 
       } 
       $attribs["class"] .= " inputError"; 
       $element->setAttribs($attribs); 
      } 

      // Print the input using Zend_Form's own mechanisms 
      $element->setDecorators(array('ViewHelper')); // Removes all decorators (labels, etc.) 
      $v = new Zend_View(); 
      $element->setView($v); 
      echo $element->render(); 

      if(isset($element->note)) { 
       echo "<p>{$element->note}</p>"; 
      } 

      // Print the error messages 
      if($element->hasErrors()) { 
       $errors = $element->getMessages(); 
      ?> 
       <ul class="errors <?php echo sizeof($errors) == 1 ? "noDecorations" : "" ?>"> 
       <?php 
       foreach($errors as $error => $message) { 
        // Custom error messages 
        if($error === "isEmpty") { 
         $message = $element->getLabel() . " cannot be empty"; 
        } ?> 
        <li><?php echo $message ?></li> 
       <?php } ?> 
       </ul> 
      <?php } ?> 
     </div> 
     <div style="float: clear;"></div> 
    <?php } ?> 
</form> 
1

你可以用自己的Custom_Form类扩展defualt Zend_Form类。在init()方法中覆盖默认的元素修饰器。在这里我的代码片段:

//class Custom_Form extends Zend_Form 
public function init() 
{ 
    $this->setElementDecorators(
      array(array('ViewScript', array('viewScript' => '/controller_name/forms/fields/input-text.phtml'))), 
      array('email', 'firstname', 'lastname') 
     ); 
} 
+0

是否有我应该怎么写那个人,通用表单元素工作viewscripts任何文件?我所看到的全部是如何为整个表单编写一个viewscript,这不是我所追求的。我喜欢我可以将元素对象传递给Zend_Form,并且它可以呈现没有我为每个我需要的表单编写HTML的东西,我只是希望它呈现不同的东西*。 – spiffytech 2013-04-24 13:29:24

+0

搜索setElementDecorators() – konradwww 2013-04-24 14:00:29