2010-02-19 3 views
1

CRUD를 처리 할 때 양식 객체에서보기를 생성하는 쉬운 방법이 있는지 궁금합니다.Zend_Form에서 뷰를 생성하는 방법이 있습니까? (읽기 전용)

다음과 같은 옵션이있는 경우 : VIEW | 편집 | DELETE 편집 옵션과 같은 VIEW 옵션을 원하지만 양식 요소가 없으면 값만 원합니다.

이렇게하면 이러한보기를 만드는 데 걸리는 시간을 최소화 할 수 있습니다.

누군가가 그런 것을 알고 있습니까?

답변

1

헥터 가장 좋은 방법이 될 것으로 보인다 Nabble, show me this에서 :

class Default_View_Helper_FormView extends Zend_View_Helper_Abstract 
{ 
    public function formView(Zend_Form $form) 
    { 
     $html = "<dl>"; 
     foreach ($form->getElements as $element) { 
      $html .= "<dt>{$element->getLabel()}</dt>"; 
      $html .= "<dd>{$element->getValue()}</dd>"; 
     } 
     $html .= "</dl>"; 
     return $html; 
    } 
} 
0

잘 모르겠지만보기 옵션의 경우 모델에서 데이터를 가져올 수 있다고 생각합니다. Zend_Form을 통해 액세스 할 필요가 없습니다.

그러나 양식을 읽기 전용으로 만들려면 요소에 readonly (setAttrib ('readonly', 'readonly')) 특성을 추가 할 수 있습니다.

+0

왜보기가 입력 요소를 제외하고 양식에 모두 정확하게 할 때 처음부터보고, 만들고? 실제 CRUD 생성을 위해서는 자동화가 필요하다고 생각합니다. –

3

나의 마지막 프로젝트에서 나는이 딜레마도 가지고 있었다. 내 솔루션이 가장 우아하지 않을 수도 있지만, 그 일을했습니다. 전체 데코레이터 대신 요소를 생성하는 대신 Form viewscript 데코레이터를 사용합니다. 그러나 당신은 내가 상상하는 데코레이터를 사용하기 위해이 예제를 조정할 수 있습니다. 제가 보여주고있는 것은 여러분에게 일반적인 아이디어를주기위한 아주 기본적인 예입니다. 여기에 내가 한 일이 있습니다 :

class Cms_Form_Page extends Zend_Form 
{ 
    const FOR_CREATE = 'forCreate'; 
    const FOR_READ = 'forRead'; 
    const FOR_UPDATE = 'forUpdate'; 
    const FOR_DELETE = 'forDelete'; 

    protected $_name = 'page'; 

    private $_for; 

    private $_viewScripts = array(
    self::FOR_CREATE => 'page-manager/partials/form-page-create.phtml', 
    self::FOR_READ => 'page-manager/partials/form-page-read.phtml', 
    self::FOR_UPDATE => 'page-manager/partials/form-page-update.phtml', 
    self::FOR_DELETE => 'page-manager/partials/form-page-delete.phtml' 
); 

    public function __construct($for = self::FOR_CREATE, $options = null) 
    { 
    $this->_for = $for; 

    parent::__construct($options); 
    } 

    public function init() 
    { 
    $this->setName($this->_name) 
     ->setAttribs(array('accept-charset' => 'utf-8')) 
     ->setDecorators(array(
      'PrepareElements', 
      array('ViewScript', array('viewScript' => $this->_viewScripts[ $this->_for ])), 
      'Form' 
     )); 

    $elements = array(); 

    swith($this->_for) 
    { 
     case self::FOR_CREATE: 
     $title = new Zend_Form_Element_Text('title'); 
     $elements[] = $title; 
     break 
     case self::FOR_READ: 
     $id = new Zend_Form_Element_Hidden('id'); 
     $elements[] = $id; 
     break; 
     case self::FOR_UPDATE: 
     $id = new Zend_Form_Element_Hidden('id'); 
     $elements[] = $id; 
     $title = new Zend_Form_Element_Text('title'); 
     $elements[] = $title; 
     break; 
     case self::FOR_DELETE: 
     $id = new Zend_Form_Element_Hidden('id'); 
     $elements[] = $id; 
     break; 
     default: 
     throw new Exception('invalid Form type'); 
    } 

    $submit = new Zend_Form_Element_Button('submit'); 
    $elements[] = $submit; 

    $this->addElements($elements); 
    } 
} 

그래서 기본적으로 클래스 생성자 중 하나를 생성자에 전달합니다. 그리고이 값을 기반으로 양식에 필요한 요소와 요소를 렌더링하는 방법을 결정합니다.

예를 들어, 생성을 위해 Locale을 선택할 드롭 다운 양식 필드를 선택할 수 있습니다. 여기에서 삭제하려면 숨겨진 필드 (예 : btw에 표시되지 않음)가됩니다.

희망이 있으시면 몇 가지 아이디어가 있습니다.

PS : 당신이 단순히 같은과 (너무 숨겨진 요소를 렌더링과 함께) 요소의 값 보여줄 수 선택한 viewscripts 중 하나에서
: 그래서

<? 
    $form = $this->element; 
?> 

... some html 

// let's presume id and locale are hidden form fields for current form type 
// (Cms_Form_Page::FOR_UPDATE for instance) 
<?= $form->id->renderViewHelper(); ?> 
<?= $form->locale->renderViewHelper(); ?> 

// and here we simply output the current locale value 
// of course, you should have populated the values in the form somewhere first 
<dt>Current locale:</dt> 
<dd><?= $form->locale->getValue(); ?></dd> 

...etc 

을, I 폼에 viewscript 데코레이터를 사용하는 것이 가장 좋다고 생각하거나 숨겨진 필드 (필요한 경우)를 렌더링하고 일부 html 태그에 값을 표시하는 자체 양식 요소 데코레이터를 굴릴 수 있습니다.

+0

Thx! 너는 내게 빛을 비춰 주었다. 이를 염두에두고 viewscript 대신 "form-page-read"에 대해 다른 뷰 헬퍼가있을 수 있다고 생각했습니다. 예를 들어 $ value이 될 것입니다. 이 뷰 헬퍼는 $ form-> populate()를 통해 전달 된 값을 에코하여 요소를 렌더링하는 뷰 헬퍼를 제외하고는 일반 폼의 동일한 장식자를 사용합니다. 그걸로 나는 완전한 CRUD 세대를 이룰 수 있다고 생각합니다. –

+0

@Keyne : 정확히! 그것은 제가 제안한 것과 같습니다. :) –

0

허용 대답 유일한 문제는 당신이 그들을 무시하고 모든 요소를 ​​만들고있는 것입니다.

fireeyedboy의 대답을 통해 제어 논리를 사용하면 모든 요소를 ​​Zend_View_Helper_FormNote으로 전환 할 수 있습니다. 동일한 작업을 수행합니다.

최적화가 중요한지 여부에 달려 있습니다.

0

특별한 경우가 될 수있는 일반적인 요소를 충당하기 위해 허용 대답에 몇 가지 사소한 추가를 제작 :

class Default_View_Helper_FormView extends Zend_View_Helper_Abstract 
{ 
    public function formView(Zend_Form $form) 
    { 
    $html = '<dl>'; 

    foreach ($form->getElements() as $element) { 

     if($element instanceof Zend_Form_Element_Submit) { 
     continue; 
     } 

     $html .= '<dt>' . $element->getLabel() . '</dt>'; 

     $value = $element->getValue(); 

     if($element instanceof Zend_Form_Element_Checkbox) { 
     $value = ($value) ? 'Yes' : 'No'; 
     } 
     else if($element instanceof Zend_Form_Element_Select) { 
     $value = $element->getMultiOption($value); 
     } 

     $html .= '<dd>' . $value . '</dd>'; 
    } 

    $html .= '</dl>'; 

    return $html; 
    } 
}