2009-11-22 4 views
2

J'ai actuellement un formulaire de recherche dans le contrôleur de recherche, de sorte que la seule façon dont je peux y accéder est à travers /search/. Je dois refactoriser mon code pour que ce formulaire de recherche apparaisse non seulement dans le Search Controller mais aussi globalement sur tout le site.Zend - refactoring pour inclure un formulaire globalement sur le site

(Le code isnt exact que je devais retaper certaines d'entre elles)

Ma classe qui étend Zend_Form est situé dans application/forms/forms/SearchForm.php:

class Form_SearchForm extends Zend_Form { 

    public function init() {}; 

} 

Mon contrôleur de recherche est quelque chose comme ..

class SearchController extends Zend_Controller_Action 
{ 
    public function search() { 
     $searchForm = new Form_SearchForm(); 
     $this->view->form = $searchForm; 
    } 
} 

Dans mon Bootstrap.php j'ai un autochargeur pour les modèles:

protected function _initAutoload() { 
    $autoLoader = Zend_Loader_Autoloader::getInstance(); 
    $resourceLoader = new Zend_Loader_Autoloader_Resource(
     array(
     'basePath' => APPLICATION_PATH, 
     'namespace' => '', 
     'resourceTypes' => array(
      'form' => array(
      'path' => 'forms', 
      'namespace' => 'Form_', 
      ), 
      'model' => array(
      'path' => 'models/', 
      'namespace' => 'Model_', 
      ), 
     ), 
     ) 
    ); 

return $autoLoader; 

}

Je me demande où je peux stocker mon code afin que ce le formulaire de recherche est généré dans la vue.

Mon fichier global de mise en page est situé dans application/layouts/scripts/layout.phtml et recrache actuellement une zone de contenu dynamique:

<div id="main"> 
    <?php echo $this->layout()->content;?> 
</div> 

Dois-je ajouter que la forme à ce layout.phtml ou est-il un contrôleur générique que je devrais utiliser?

Editer: Désolé de ne pas spécifier cela aussi, mais que faire si par exemple je voulais ne pas l'inclure pour 1-2 pages spéciales (peut-être une section admin) .. si je l'ai codé en dur dans layout.phtml .. ou devrais-je servir un fichier de mise en page différent pour dire, une zone d'administration?

Répondre

5

La création d'un searchAction() n'est pas bonne pour la performance car elle nécessite un tout nouveau cycle d'expédition. Si, et seulement si, vous avez une logique très complexe qui justifie une action séparée, vous pouvez create a Controller Plugin and add searchAction() to the ActionStack. Si vous n'instanciez/n'attribuez que le formulaire ou si vous n'avez pas besoin du formulaire de recherche pour chaque demande, ce n'est pas une solution optimale. Une autre possibilité serait d'instancier et d'assigner le formulaire dans le bootstrap. Ce genre de rupture de séparation des préoccupations, mais fournit de meilleures performances.

protected function _initSearchForm() 
{ 
    $this->bootstrap('view'); 

    $view = $this->getResource('view'); 
    $searchForm = new Form_SearchForm(); 

    $view->searchForm = $searchForm; 
    return $searchForm; 
} 

Enfin, ma solution préféré serait une aide de vue personnalisée:

<?php 

class My_View_Helper_SearchForm extends Zend_View_Helper_Abstract 
{ 
    public function searchForm() 
    { 
     $searchForm = new Form_SearchForm(); 
     return $searchForm; 
    } 
} 

Pour l'une de ces solutions, vous auriez idéalement sortie la forme dans votre fichier de mise en page pour minimisez reproduction.

layout.phtml:

<?php echo $this->searchForm() ?> 

Et créer une mise en page pour les pages admin.phtml autre de la zone d'administration. Cela vous donne la possibilité de modifier considérablement les pages d'administration lorsque de nouvelles exigences apparaissent.

2
  1. Vous pouvez créer votre formulaire dans un plug-in Controller et l'ajouter à voir vars en quelque sorte (par Zend_Controller_Front?), Qui sont accessibles dans la mise en page, aussi. Mais il est trop compliqué dans la version actuelle ZF (ou je suis trop bête)

  2. Vous pouvez faire Form_SearchForm un singleton

    class Form_SearchForm ... { 
        static function getInstance() { 
          static $instance; 
          if (!$instance) 
           $instance = new Form_SearchForm(); 
          return $instance; 
        } 
    } 
    

    Maintenant, au lieu de créer de nouveaux Form_SearchForm() juste obtenir comme

    $form = Form_SearchForm::getInstance(); 
    
  3. Vous pouvez mettre une instance de Form_SearchForm au registre

  4. J'ai probablement manqué un très cool comme imple manière :)

+0

Je suis désolé que vous m'ayez perdue, est-ce que cela vous dérange de m'étendre là-dessus et de l'abrutir pour mon débutant? –

+0

quelle option préférez-vous? Je ne pense pas que je connais la bonne voie. Mais le plus juste, je pense, est le premier, mais c'est trop compliqué maintenant. –

+0

faire une classe un singleton est simple, je vais ajouter un code pour cela maintenant. Comment ajouter une instance de Form_SearchForm à Zend_Registry, vous pouvez le déterminer par vous-même :) –

1

Je le diviserais en un partiel et un endroit.

dans la disposition.phtml:

<?php if($searchForm = $this->placeHolder('searchForm'): ?> 
    <?php echo $searchForm; ?> 
<?php endif; ?> 

alors votre point de vue vous pouvez appeler:

<?php $this->placeHolder('searchForm')->set($this->partial('search-from.phtml', 'search')); ?> 

Si vous vouliez vous pourriez même faire une aide de vue de la recherche qui fait essentiellement l'appel du porte-lieu.

Le plugin Controller serait mieux si vous avez plus de pages qui n'en ont pas besoin. J'utiliserais probablement encore l'espace réservé pour l'accomplir. De cette façon, vous pouvez facilement l'annuler ou l'ajouter plus tard, vue par vue, sans rien appeler sur le contrôleur frontal.

+0

Comment utiliserait-il le formulaire depuis le contrôleur? –

+0

vous avez accès à la vue et donc au contrôleur helpers. Si vous parlez de construire réellement le from avec un Zend_Form, au lieu d'appeler l'assistant partiel, vous pouvez appeler l'assistant d'action qui va dans le Search_Controller. supposant que $ view est une instance de Zend_View ... et 'form' est le nom de l'action qui affiche le formulaire ... $ view-> placeHolder ('searchForm') -> set ($ view-> action (' forme ',' recherche ',' par défaut)); – prodigitalson

+0

désolé je suis confus, devrais-je avoir le deuxième extrait de code dans chaque vue? –

Questions connexes