Zend - sitede küresel bir form eklemek için üstlenmeden

3 Cevap php

Şu anda arama denetleyicisi bir arama formu var, bu yüzden alabilirsiniz tek yolu /search/ geçer. Bu arama formu Arama denetleyicisi değil sadece görünür değil, aynı zamanda küresel site genelinde ki benim kod refactor gerekiyor.

(Ben bunu bazı yeniden yazmak zorunda gibi kod exact değil)

Genişleten benim sınıf Zend_Form bulunan application/forms/forms/SearchForm.php:

class Form_SearchForm extends Zend_Form {

    public function init() {};

}

Benim arama denetleyicisi gibi bir şeydir ..

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

Benim bootstrap.php ben modelleri için bir autoloader var:

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;

}

Küresel arama formu görünümünde oluşturulur böylece benim kod saklayabilirsiniz nerede merak ediyorum.

Benim küresel düzen dosyası application/layouts/scripts/layout.phtml bulunan ve şu anda dinamik bir içerik alanı tükürür edilir:

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

Ben sadece bu layout.phtml için form eklemek ya da kullanması gereken bazı genel denetleyici var mıdır?

Edit: bu çok belirtilerek, ama ben layout.phtml içine kodlanmış ne varsa, örneğin ben 1-2 özel sayfaların (belki bir yönetici bölüm) için dahil değil istedim .. hala .. görünür ya da gerektiği olmaz için üzgünüm Söyleyecek başka bir düzen dosyası, bir yönetici alanı hizmet?

3 Cevap

Oluşturma yepyeni bir gönderme döngüsü gerektirir, çünkü searchAction() performans için iyi değil. Eğer, sadece ve sadece, size verebilecek searchAction() ActionStack . If you are only instantiating/assigning the form or if you don't need the search form for every isteği, optimal bir çözüm değil ekleyin.


Diğer bir olasılık, özyükleme formu örneğini ve atamak olacaktır. Bu tür-endişeleri sonları ayrılması, ama daha iyi performans sağlar.

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

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

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


Son olarak, benim preferred çözüm, özel bir görünüm yardımcı olacaktır:

<?php

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

Bu çözümlerden biri için, size düzen dosyasında ideal çıkış formu tekrarını önlemek ederim.

layout.phtml:

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

Ve alternatif bir düzen admin.phtml admin alanı sayfaları için oluşturun. Bu size yeni ihaleler açılır zaman anlamlı yönetici sayfalarını değiştirmek için esneklik sağlar.

  1. Bir Kontrolör Plugin içinde formu oluşturmak ve bir şekilde değişkenler görüntülemek için ekleyebilirsiniz (Zend_Controller_Front tarafından?), Düzeni erişilebilir olan, çok. Ama şimdiki ZF sürümde çok karmaşık (ya da ben çok aptalım)

  2. Sen Form_SearchForm singleton'ununu yapabilirsiniz

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

    Şimdi yerine yeni Form_SearchForm oluşturma () sadece gibi olsun

    $form = Form_SearchForm::getInstance();
    
  3. Sen kayıt Form_SearchForm bir örneğini koyabilirsiniz

  4. Herhalde bir çok serin basit bir şekilde kaçırmış :)

Ben bir kısmi ve bir yer tutucu bölmek istiyorum.

layout.phtml in:

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

sonra görünümlerinde size çağırabilirsiniz:

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

İstediğin IF bile temelde yer tutucu çağrıyı yapan bir arama görünümü yardımcısı yapabilir.

Eğer olsa d daha ihtiyacınız yok daha fazla sayfa varsa Kontrolör eklenti daha iyi olurdu. Ben hala muhtemelen bunu başarmak için olsa yer tutucu kullanabilirsiniz. Bu şekilde kolayca geçersiz veya ön kontrolör şey çağırmadan bir görünüm-by-görünüm olarak daha sonra buna ekleyebilirsiniz.