2011-12-09 10 views
7

Sto riscontrando qualche problema nell'usare come utilizzare i moduli personalizzati in Zend Framework.Forme personalizzate di Zend Framework con viewScript

Ho seguito varie guide ma nessuna sembra funzionare. Niente viene reso.

Ecco i bit di codice che sto cercando di utilizzare (Tutto il codice che segue è nel modulo di default). Ho semplificato il codice per un singolo input per il test.

applicazioni/forme/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/un/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/controller/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

0.123.

Il codice sopra riportato non genera errori o non restituisce alcuna parte di formlayout.phtml, compresi i tag del modulo o il testo tra i tag p.

Qualcuno può dirmi cosa potrei fare di sbagliato?

+0

Un errore comune sta avendo un costruttore nella classe forma che non chiamare il costruttore genitore. Ciò si traduce in output di moduli vuoti poiché è il costruttore genitore che alla fine chiama il metodo 'init()'. Sto solo pensando ad alta voce ... –

risposta

1

Ecco un esempio molto semplice per farti andare adattati da this article.

La forma: -

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')); 
    } 
} 

L'ordine in cui setDecorators(), addElements() e setElementDecorators() sono chiamati è molto importante qui.

visualizzazione Script _form_test.phtml può essere chiamato qualcosa che ti piace, ma ha bisogno di essere in /views/scripts in modo che possa essere trovato dal renderer.

/views/scripts/_form_test.phtml sarebbe simile a questa: -

<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> 

si crea un'istanza del modulo, passare alla vista e renderlo come al solito. L'output di questo esempio è il seguente: -

<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> 

Questo dovrebbe essere sufficiente per iniziare a creare i propri moduli.

0

Di solito, se non si vede nulla sullo schermo significa che una sorta di errore è accaduto. Forse hai errori disattivati ​​o qualcosa del genere, forse no. Sto solo cercando di darti delle idee.

Le uniche cose che ho potuto individuare dove segue. Nel codice seguente, devi ancora specificare il modulo quando provi a stampare gli elementi.

<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> 

Come dimostra codice di vascowhite, una volta che siete dentro la ViewScript, la variabile con la forma si chiama elemento.Il decoratore di viewscript usa un partial per eseguire il rendering e quindi crea il proprio scope all'interno del viewscript con nomi di variabili differenti.

Così, anche se in vista originale è stato chiamato $ form, nel ViewScript dovrete chiamare elemento.

Inoltre, forse era la fretta di copia/incolla, ma hai usato i tag <? ?> invece dei tag <?= ?> o <?php ?>. Forse questo ha causato un errore che va oltre l'analisi ed è per questo che non hai ottenuto alcun risultato.

+0

Mi ci è voluto un po 'per capire che dovevo usare < per far apparire il simbolo' <'nel post. Qualcun altro conosce altri metodi. –

+0

Basta indentare di 4 spazi per mostrare il codice e utilizzare l'apice per sfuggire caratteri in linea o nei commenti – vascowhite

4

Credo che il problema è decoratrice del vostro elemento modulo. È necessario impostare il decoratore su ViewHelper e solo su Errore. Funziona almeno per me.

Ecco il codice che ho usato e dovrebbe funzionare

applicazioni/forme/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> 

applicazione/viste/script/indice/index.phtml

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

application/controller/IndexController.php

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