Zend Framework Kayıt Formu işlemek için en iyi yolu

2 Cevap php

Öğretici örneğin sonra inşa temel kayıt formu ile iyisin sonra, size daha profesyonelce tasarlanmış Kayıt Formu istiyorum fark. Örneğin Ben Kullanıcı ve Yönetici alanlarda aynı tablo için kayıt formunu çoğaltmak istemiyorum.

1) Herkes hemen hemen benzer yönetici ve kullanıcı formları tekrarını azaltmak için, bazı mekanizma, muhtemelen miras kullanıyor mu? O daha iyi, sadece kopyala-yapıştırma yapmak bazen külfetli veya mi?

2) Herkes bazı temel Record sınıf oluşturmak için iyi bir fikir olarak kabul etti

  • bu sayfada çeşitli kayıt formları arasında olduğunu belirlemek, mevcut sonrası bu kayıt formu için özel olarak hitap edilir
  • Bu düğmeleri Düzenle ayırt veya Sil bazı organize moda tıklar.

3) Benim şu anki uygulama yapıcı tüm form yapılandırma kodu (dekoratörler, doğrulamaları, başlangıç ​​değerleri) koyarak ve işleme gereksiz kod ücretsiz denetleyiciye ayrı ProcessSubmit () yöntemi konur teslim formu içerir.

Herhangi bir kılavuz, böyle biraz daha gelişmiş kayıt işleme ya da insanlar için iyi bir örnek uygulama var acaba tüm yukarıda bazı beklenen Kayıt Formu işlevsellik adresleri ve hala tekerleği reinveting vardır. Böyle impovements ile durdurmak gerekir nereye ve nasıl kadar merak ...

2 Cevap

Önerileri çift:

Her şeyden önce - formu sınıflara zaman sizin öğeler eklemek için init() işlevini yerine Kurucular kullanın. Eğer sınıfa geçmek parametreleri ayarlandıktan sonra init () işlevi olur.

İkincisi - Bunun yerine formu sınıflara - sadece yönetici şeyler etkinleştirmek için bir "seçenek" olarak ayarlayabilirsiniz:

class My_Record_Form extends Zend_Form {
    protected $_record = null;
    public function setRecord($record) {
      $this->_record = $record;
    }

    public function getRecord() {
      if ($this->_record === null || (!$this->_record instanceOf My_Record)) {
        throw new Exception("Record not set - or not the right type");
      }
      return $this->_record;
    }

    protected $_admin = false;
    public function setAdmin($admin) {
      $this->_admin = $admin;
    }

    public function getAdmin() { return $this->_admin; }

    public function init() {
      $record = $this->getRecord();

      $this->addElement(......);
      $this->addElement(......);
      $this->addElement(......);

      if ($this->getAdmin()) {
        $this->addElement(.....);
      }

      $this->setDefaults($record->toArray());
    }

    public function process(array $data) {
      if ($this->isValid($data)) {
        $record = $this->getRecord();
        if (isset($this->delete) && $this->delete->getValue()) {
          // delete button was clicked
          $record->delete();
          return true;
        }
        $record->setFromArray($this->getValues());
        $record->save();
        return true;
      }
    }
}

Sonra denetleyicisi gibi bir şey yapabilirsiniz:

$form = new My_Record_Form(array(
  'record'=>$record, 
  'admin'=>My_Auth::getInstance()->hasPermission($record, 'admin')
));

Orada da yönetici şeyler kolları My_Record_Admin_Form yapma ile "yanlış" bir şey - ama bu yöntem tek bir yerde tüm "kayıt formu" kod tutar bulundu ve korumak için biraz daha kolay.

Bölüm 2 cevap: benim kod düzenleme formları modelinin bir işlevinden döndürülen: $record->getEditForm() kontrolör kod biraz bu gibi bakarak biter:

  protected $_domain = null;
  protected function _getDomain($allowNew = false)
  {
    if ($this->_domain)
    {
      return $this->view->domain = $this->_domain;
    } else {
      $id = $this->_request->getParam('id');
      if (($id == 'new' || $id=='') && $allowNew)
      {
        MW_Auth::getInstance()->requirePrivilege($this->_table, 'create');
        $domain = $this->_table->createRow();
      } else {
        $domain = $this->_table->find($id)->current();
        if (!$domain) throw new MW_Controller_404Exception('Domain not found');      
      }
      return $this->view->domain = $this->_domain = $domain;
    }
  }

  public function editAction()
  {
    $domain = $this->_getDomain(true);

    MW_Auth::getInstance()->requirePrivilege($domain,'edit');
    $form = $domain->getEditForm();

    if ($this->_request->isPost() && $form->process($this->_request->getPost()))
    {
      if ($form->delete && $form->delete->getValue())
      {
        return $this->_redirect($this->view->url(array(
          'controller'=>'domain', 
          'action'=>'index',
        ), null, true));
      } else {
        return $this->_redirect($this->view->url(array(
          'controller'=>'domain', 
          'action'=>'view',
          'id'=>$form->getDomain()->id,
        ), null, true));        
      }
    }    
    $this->view->form = $form;
  }

Böylece - kaydın gerçek id örneği için URI / domain/edit/id/10 geçirilir. Bir sayfada bu formların birden koymak olsaydı - o forma özgü bir eyleme işaret formun "eylem" özniteliği ayarlamak için emin olun.

I a SimpleTable extends Zend_Db_Table oluşturuldu ve SimpleForm extends Zend_Db_Form sınıfları. Bunların ikisi de tablo otomatik artan bir ID sütunu olduğunu varsayalım.

SimpleTable kaydının sütununa form elemanı adları için bağlayıcı dinamiği kullanan bir saveForm(SimpleForm $form) fonksiyonu vardır. Ayrıca herhangi bir özel kullanım için bir geçersiz kılınabilir saveFormCustom($form) dahildir.

SimpleForm kurulum için formu geçersiz olması gerekir setup() soyut vardır. Ben (örneğin gizli kimliği alan ekleme gibi) ilk kurulumunu yapmak için init() kullanın.

Ancak, dürüst olmak gerekirse, ben gerçekten Zend_Form nesnesi kullanarak sevmiyorum, ben değil Modeli veya Controller, View ele alınmalıdır gibi hissediyorum.