2011-03-30 42 views
3

我在這裏有一個代碼完美地調用了我的錯誤,但我想添加一些東西。Zend錯誤字符串

 
$this->setDecorators(array(
      'FormErrors', 
      'FormElements', 
     array('HtmlTag',array('tag' => 'dl','class' => 'zend_form')), 
      'Form' 
      )); 

每當這個錯誤被調用。 我只想補充上述dl或低於it..thats文本說

「Arlet的ALERT錯誤錯誤」 只是一個簡單的字符串,每次Zend的錯誤得到所謂

任何想法?

+0

我希望它顯示在形式eveytime之上的常見字符串有一個錯誤..我不是在談論個別元素的錯誤消息。 希望它在上面說:「HEY HEY BELOW ARE ERRORS」作爲一個單獨的字符串 – jayjay 2011-03-30 17:58:35

回答

1

您可以創建一個自定義裝飾器。

App_Form_Decorator_AdditionalError 
    extends Zend_Form_Decorator_Abstract 
{ 
    protected $_options = array(
     'additionalError' => 'ERROR' 
    ); 

    public function render($content) 
    { 
     $element = $this->getElement(); 
     if($element->isErrors()) 
     { 
      $element->addError($this->getOption('additionalError')); 
     } 

     return $content; 
    } 
} 

但是,這隻會將一個額外的錯誤推送到錯誤堆棧。您可以通過實際添加或附加錯誤到$content而不用簡單地將其添加到addError()中來獲得更多幻想。 (也許擴展HtmlTag裝飾者而不是裝飾者Abstract)。但我現在懶得做出完整的例子。抱歉。也許我明天會回到這個。希望這有助於/激勵你。

BTW;上述用法是:

$this->setDecorators(array(
      array(
       'AdditionalError', 
       array('additionalError' => 'Some additional error message') 
      ) 
      'FormErrors', 
      // etc. 

編輯:
好了,所以我有一個良好的睡眠,這裏是一個更好的建議。它延伸Desciption以利用已定義的選項,如tagescape等。它甚至可翻譯(耶!:))。這個增加了一個setError選項並覆蓋了render方法。 雖然未經測試,所以您可能會遇到一些錯誤和/或語法錯誤。

class App_Form_Decorator_AdditionalError 
    extends Zend_Form_Decorator_Description 
{ 
    protected $_error = 'error'; 

    public function setError($error) 
    { 
     $this->_error = (string) $error; 
     return $this; 
    } 

    public function getError() 
    { 
     if(null !== ($error = $this->getOption('error'))) 
     { 
      $this->setError($error); 
      $this->removeOption('error'); 
     } 

     return $this->_error; 
    } 

    public function render($content) 
    { 
     $element = $this->getElement(); 
     $view = $element->getView(); 
     if(!$element->isErrors() || null === $view) 
     { 
      return $content; 
     } 

     $error = $this->getError(); 
     $error = trim($error); 

     if(!empty($error) && (null !== ($translator = $element->getTranslator()))) 
     { 
      $error = $translator->translate($error); 
     } 

     if(empty($error)) 
     { 
      return $content; 
     } 

     $separator = $this->getSeparator(); 
     $placement = $this->getPlacement(); 
     $tag  = $this->getTag(); 
     $class  = $this->getClass(); 
     $escape = $this->getEscape(); 

     $options = $this->getOptions(); 

     if($escape) 
     { 
      $error = $view->escape($error); 
     } 

     if(!empty($tag)) 
     { 
      require_once 'Zend/Form/Decorator/HtmlTag.php'; 
      $options[ 'tag' ] = $tag; 
      $decorator = new Zend_Form_Decorator_HtmlTag($options); 
      $error = $decorator->render($error); 
     } 

     switch($placement) 
     { 
      case self::PREPEND: 
       return $error . $separator . $content; 
      case self::APPEND: 
      default: 
       return $content . $separator . $error; 
     } 
    } 
} 

用法:

public function init() 
{ 
    $this->addPrefixPath('App_Form', 'App/Form'); // or any other namespace you will use 
    $this->setDecorators(array(
     'FormErrors', 
     'FormElements', 
     array(
      'AdditionalError', 
      array('error' => 'You messed up! :)', 'placement' => 'prepend', 'tag' => 'div', 'class' => 'additional-error') 
     ), 
     array(
      'HtmlTag', 
      array('tag' => 'dl', 'class' => 'zend_form') 
     ), 
     'Form' 
    )); 
} 

編輯2:
我現在已經測試過它,並刪除語法錯誤和錯誤。似乎現在按預期工作。

0

過去,我已經使用了Errors decorator,但應用於表單本身(而不是在表單表單上的典型用法)。

在形式:

$this->setDecorators(
    array(
     'FormElements', 
     // whatever other wrapping you need 
     // ... 
     'Form', 
     array('Errors', array('placement' => 'prepend')), 

    ) 
); 

在控制器:

public function someAction() 
{ 
    $form = new My_Form(); 
    if ($this->getRequest()->isPost()) { 
     if ($form->isValid($this->getRequest()->getPost())) { 
      // Perform processing on the submitted data 
     } else { 
      $form->setErrors(array('Note errors below')); 
     } 
    } 
    $this->view->form = $form; 
} 

在視圖

<?= $this->form ?> 

人們可以令人信服地爭辯說,控制器不應該指定錯誤消息文本。從這個意義上說,一個定製的裝飾器 - 正如@fireeyedboy所建議的那樣 - 可以檢測任何表單元素中是否存在錯誤,並顯示固定的(或構造函數指定的)錯誤消息,這可能是更清晰的解決方案。但是上面的方法對我來說只是一個快速而輕微骯髒的解決方案。

希望它有幫助!

0

如果要將字符串附加到ZF中的所有錯誤中,可以使用CSS2 :before假選擇器和content屬性。只是針對ZF的錯誤元素,這是AFAIR ul.errors

ul.errors:before { 
    content: 'Look, there are errors below!'; 
} 

您也可以將一些錯誤,如果傳遞正確的選項來裝飾機和class和id引用它們。