2012-12-07 43 views
13

Tôi đang phát triển ứng dụng bằng Zend Framework 2 và tôi sử dụng trình trợ giúp FormRow để hiển thị nhãn, dữ liệu nhập và lỗi (nếu có) trong Biểu mẫu.Thêm thuộc tính lớp vào Lỗi mẫu

//within the view 
echo $this->formRow($form->get('Name')); 

Khi một người dùng gửi các hình thức nếu không điền đầu vào FormRow trường văn bản yêu cầu render's nó với các thông báo lỗi sau:

<label> 
    <span>Name: </span> 
    <input class="input-error" type="text" value="" placeholder="Insert Name Here" name="Name"> 
</label> 
<ul> 
    <li>Value is required and can't be empty</li> 
</ul> 

Làm thế nào tôi có thể thiết lập một lớp học cho li tag để tạo kiểu cho nó sau đó?

Tôi biết rằng tôi có thể echo formElementErrors với thuộc tính lớp mong muốn qua ..

<?php echo $this->formElementErrors($form->get("Name"), array('class' => "valuerequired", 'message' => "errortestmessage")); ?> 

..nhưng FormRow vẫn sẽ làm cho thông báo lỗi mà không có lớp.

Chỉ cần để tham khảo cách thiết lập các tổ chức theo cách này Tôi đang:

public function getInputFilter() 
    { 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 

      $factory = new InputFactory(); 

      $inputFilter->add($factory->createInput(array(
       'name'  => 'Name', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name'  => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min'  => 1, 
          'max'  => 100, 
         ), 
        ), 
       ), 
      ))); 

      $this->inputFilter = $inputFilter; 
     } 
     return $this->inputFilter; 
    } 

Trả lời

10

Ok, giải pháp cho vấn đề của riêng tôi đã ở ngay trước mặt tôi, thay vì sử dụng:

//within the view 
echo $this->formRow($form->get('Name')); 

tôi gọi mỗi phần tử của mẫu đơn riêng lẻ:

//within the view 
    echo $this->formLabel($form->get('Name')); 
    echo $this->formInput($form->get('Name')); 
    echo $this->formElementErrors($form->get("Name"), array('class' => "some_class", 'message' => "errormessage")); 

Đừng biết nếu đó là cách hiệu quả nhất để làm điều đó, plz thả một dòng nếu bạn nghĩ khác đi.

22

Xem the code of formElementErrors

Về cơ bản bạn có thể làm một cái gì đó như:

$this->formElementErrors($elem) 
    ->setMessageOpenFormat('<ul%s><li class="some-class">') 
    ->setMessageSeparatorString('</li><li class="some-class">'); 

Nhưng đó là khá vụng .. .

Giải pháp tốt hơn là mở rộng Zend \ Form \ View \ Helper \ FormElementErrors bởi lớp của riêng bạn và sau đó đăng ký form-helper formElementErrors đến lớp của bạn. Vì vậy, về cơ bản bạn sẽ có một cái gì đó như thế này:

namespace Mymodule\Form\View\Helper; 

use Zend\Form\View\Helper\FormElementErrors as OriginalFormElementErrors; 

class FormElementErrors extends OriginalFormElementErrors 
{ 
    protected $messageCloseString  = '</li></ul>'; 
    protected $messageOpenFormat  = '<ul%s><li class="some-class">'; 
    protected $messageSeparatorString = '</li><li class="some-class">'; 
} 

Điều cuối cùng sẽ là đăng ký trợ giúp xem với lớp mới này. Đối với điều này bạn cung cấp đoạn mã sau bên trong module của bạn Module.php

public function getViewHelperConfig() 
{ 
    return array(
     'invokables' => array(
      'formelementerrors' => 'Mymodule\Form\View\Helper\FormElementErrors' 
     ), 
    ); 
} 

displaimer: Mã này không được thử nghiệm, cho tôi biết nếu có một số lỗi, nhưng tôi nghĩ rằng điều này sẽ làm việc ra khá tốt.

+1

+1 Chỉ để xác nhận, điều này đang làm việc. Cảm ơn một lần nữa sam :) – webcoder

+1

Đây là loại của một chủ đề cũ, nhưng chỉ để thêm hai xu của tôi: một cách khác để đăng ký này là thêm một mục vào 'view_helpers => invokables' trong tập tin module.config.php của bạn thay vì thực tế Module.php. Hiệu ứng tương tự, phương pháp khác nhau. – blainarmstrong

2

FormRow kiểm tra xem plugin "form_element_errors" đã được đăng ký chưa. Và nếu sử dụng nó như mặc định để hiển thị thông báo lỗi.

Tác phẩm ví dụ của Sam. Bạn nên xác định lại plugin chuẩn và thông báo cho mvc về nó.

Tôi đã hoàn thành nó trong module.config.php

'view_helpers' => array(
'invokables' => array(
    'formElementErrors'=> 'MyModule\View\Helper\FormElementErrors', 

và FormRow bắt đầu lỗi hiển thị như tôi muốn :)

1

Như vấn đề của bạn, hãy thử

Thay đổi

//within the view 
echo $this->formRow($form->get('Name')); 

để

//within the view 
echo $this->formRow($form->get('Name'),null,false); 
// Note: add more 2 last parameters, false- for $renderErrors => will NOT render Errors Message. 
//Look original function in helper/formrow.php: function __invoke(ElementInterface $element = null, $labelPosition = null, $renderErrors = null, $partial = null) 

Render lỗi tin nhắn như funciton bạn

echo $this->formElementErrors($form->get('name'), array('class' => 'your-class-here')); 
0

tôi sử dụng echo $this->formElementErrors($form, array('class' => "error-messages")); để hiển thị tất cả các thông báo lỗi ở một nơi:

echo $this->formElementErrors($form, array('class' => "error-messages"));// Print all error messagess 

echo $this->formLabel($form->get('Name')); 
echo $this->formInput($form->get('Name')); 

echo $this->formLabel($form->get('Name2')); 
echo $this->formInput($form->get('Name2')); 
Các vấn đề liên quan