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