2011-12-09 13 views
7

Mam pewne problemy z opracowaniem sposobu użycia niestandardowych formularzy w Zend Framework.Zend Framework Formy niestandardowe z viewScript

Podążyłem za różnymi przewodnikami, ale żaden nie działa. Nic w ogóle nie jest renderowane.

Oto fragmenty kodu, które próbuję użyć (cały kod poniżej znajduje się w module domyślnym). Uprościłem kod do pojedynczego wejścia dla testu.

aplikacje/formy/One/Nametest.php

class Application_Form_One_Nametest extends Zend_Form { 

    public function init() { 

     $this->setMethod('post'); 

     $name = new Zend_Form_Element_Text('name'); 
     $name->setLabel('Box Name') 
       ->setRequired(true) 
       ->addFilter('StripTags') 
       ->addFilter('StringTrim') 
       ->addValidator('NotEmpty'); 

     $submit = new Zend_Form_Element_Submit('submit'); 
     $submit->setLabel('Submit Message'); 
     $submit->setAttrib('id', 'submitbutton'); 
     $submit->setAttrib('class', 'bluebutton'); 

     $this->addElements(array($name, $submit)); 
    } 

} 

application/views/scripts/jeden/formlayout.phtml

<form action="<?= $this->escape($this->form->getAction()) ?>" method="<?= $this->escape($this->form->getMethod()) ?>"> 

    <p> 
     Please provide us the following information so we can know more about 
     you. 
    </p> 

    <? echo $this->element->name ?> 
    <? echo $this->element->submit ?> 

</form> 

application/controllers/IndexController.php

public function formtestAction() { 
    $form = new Application_Form_One_Nametest(); 
    $form->setDecorators(array(array('ViewScript', array('viewScript' => 'one/formlayout.phtml')))); 

    $this->view->form = $form; 
} 

application/views/scripts/index/formtest.phtml

<h1>Formtest</h1> 
<? 
echo $this->form;  
?> 

Powyższy kod nie powoduje żadnych błędów ani renderowania żadnej części formlayout.phtml, w tym znaczników formularzy lub tekstu między znacznikami p.

Czy ktoś może mi powiedzieć, co robię źle?

+0

Częstym błędem jest o konstruktor w klasie postaci, która nie wywoła konstruktor nadrzędnego. Powoduje to wyprowadzanie pustych formularzy, ponieważ jest to konstruktor macierzysty, który ostatecznie wywołuje twoją metodę "init()". Po prostu na głos ... –

Odpowiedz

1

Oto bardzo prosty przykład, aby uzyskać dostosowany od this article.

Postać: -

class Application_Form_Test extends Zend_Form 
{ 
    public function init() 
    { 
     $this->setMethod('POST'); 
     $this->setAction('/'); 
     $text = new Zend_Form_Element_Text('testText'); 

     $submit = new Zend_Form_Element_Submit('submit'); 

     $this->setDecorators(
       array(
        array('ViewScript', array('viewScript' => '_form_test.phtml')) 
        ) 
       ); 

     $this->addElements(array($text, $submit)); 
     $this->setElementDecorators(array('ViewHelper')); 
    } 
} 

Kolejność, w jakiej setDecorators(), addElements() i setElementDecorators() nazywane są bardzo ważne jest tutaj.

Skrypt widokowy _form_test.phtml można nazwać dowolnie, ale musi on być w /views/scripts, aby mógł zostać znaleziony przez renderer.

/views/scripts/_form_test.phtml będzie wyglądać mniej więcej tak: -

<form id="contact" action="<?php echo $this->element->getAction(); ?>" 
     method="<?php echo $this->element->getMethod(); ?>"> 

<p> 
Text<br /> 
<?php echo $this->element->testText; ?> 
</p> 

<p> 
<?php echo $this->element->submit ?> 
</p> 

</form> 

możliwość wystąpienia formularz, przekazać je do widoku i uczynić go jak zwykle. Dane wyjściowe z tego przykładu wyglądają tak: -

<form id='contact' action='/' method='post'> 
    <p> 
     Text<br /> 
     <input type="text" name="testText" id="testText" value=""></p> 
    <p> 

    <input type="submit" name="submit" id="submit" value="submit"></p> 
</form> 

To powinno wystarczyć, aby zacząć tworzyć własne formularze.

0

Zwykle, jeśli nic nie widzisz na ekranie, oznacza to, że wystąpił jakiś błąd. Może masz błędy wyłączone lub coś podobnego, może nie. Po prostu próbuję dać ci pomysły.

Jedyne rzeczy, które mogłem rozpoznać w poniższych miejscach. W poniższym kodzie, musisz jeszcze określić formularz podczas próby wydrukowania elementów.

<form> 
action="<?php $this->escape($this->element->getAction()) ?>" 
method="<?php $this->escape($this->element->getMethod()) ?>" > 

<p> 
    Please provide us the following information so we can know more about 
    you. 
</p> 

<?php echo $this->element->getElement('name'); ?> 
<?php echo $this->element->getElement('submit') ?> 

</form> 

Jako kod pokazuje vascowhite jest, gdy jesteś wewnątrz ViewScript zmienna z formularza jest nazywany elementem.Dekorator viewcript używa częściowego do renderowania i dlatego tworzy swój własny zakres w ramach skryptu z różnymi nazwami zmiennych.

Tak więc, chociaż w oryginalnym widoku był on nazywany $ form, w opisie należy go nazwać elementem.

Być może był to również przyśpieszony kopiuj/wklej, ale użyłeś tagów <? ?> zamiast <?= ?> lub <?php ?>. Być może to spowodowało jakiś błąd, który jest poza analizą i dlatego nie masz wyjścia.

+0

Zajęło mi trochę czasu, zanim zorientowałem się, że muszę użyć numeru <, aby symbol "<" pojawił się w poście. Czy ktoś jeszcze zna inne metody? –

+0

Po prostu wcięcie o 4 spacje, aby pokazać kod i użyj znaku wstecznego, aby uniknąć znaków w linii lub w komentarzach – vascowhite

4

Myślę, że problemem jest dekorator elementów formularza. Powinieneś ustawić dekorator tylko na ViewHelper i Error. Działa przynajmniej dla mnie.

Oto kod użyłem i powinno działać

aplikacje/form/form.php

class Application_Form_Form extends Zend_Form { 

public function loadDefaultDecorators() { 
    $this->setDecorators(
     array(
      array(
       'ViewScript', 
       array(
        'viewScript' => 'index/formlayout.phtml', 
       ) 
      ) 
     ) 
    ); 
} 

    public function init() { 
     $this->setAction('/action'); 
     $this->setMethod('post'); 

     $this->addElement('text', 'name', array(
      'decorators' => array('ViewHelper', 'Errors') 
     )); 
    } 
} 

application/views/scripts/index/formlayout.phtml

<form action="<?php echo $this->element->getAction(); ?>" method="<?php echo $this->element->getMethod(); ?>"> 
    <div> 
    <label for="name">Box Name</label> 
    <?php echo $this->element->name; ?> 
    </div> 

    <input type="submit" value="Submit Message" id="submitbutton" class="bluebutton"> 
</form> 

application/views/scripts/index/index.phtml

<!-- application/views/scripts/index/index.phtml --> 
<?php echo $this -> form; ?> 

application/kontrolery/IndexController.php

public function indexAction() { 
    $form = new Application_Form_Form(); 
    $this -> view -> form = $form; 
}