【发布时间】:2017-07-26 16:16:00
【问题描述】:
我仍然想知道我必须在何时何地注册新课程以及如何扩展旧课程。 例如,我发现了一个很好的代码,它扩展了 Zend_Form_Element_Select 以便我可以在每个表单中使用它并将我的数据库规范传递给。
因为我认为,拥有一个自己的目录是个好主意,所以我在模块级别添加了一个文件夹 src\Service。
第一个问题:在模块级别拥有它是否聪明?将它放在根级别会更方便,以便我可以在多个模块中使用它吗?我必须注册吗?
该类扩展了Zend_Form_Element_Select,我在其中添加了一条 use 语句:
use Zend\Form\Element\Select;
这会导致致命错误:
致命错误:找不到类“Import\Service\Zend_Form_Element_Select”
这将是我的下一个问题:如何正确添加这个 Zend_Form_Element。我认为问题可能是 Zend 没有在 Zend-Directory 中查找。但是我以其他形式使用了Zend_Form_Element_Select,所以它就在那里。但是我的新班级不知道。如果我想使用自己的当然使用 Zend-Classes 的类,我会怎么做?
我基本上是在寻找一种总体上如何做到这一点的方法。目标是在其他项目中轻松重用类。
EDIT1:附加代码sn-ps
这是我在网上找到的课程:
Module\Import\src\Service\CU_Form_Element_DbSelect
<?php
namespace Import\Service;
use Zend\Form\Form;
use Zend\Form\Element\Select;
use Zend\Form\Element;
class CU_Form_Element_DbSelect extends Zend_Form_Element_Select {
private $_dbAdapter;
private $_dbSelect;
private $_identityColumn = 'id';
private $_valueColumn = '';
/**
* Set the database adapter used
* @param Zend_Db_Adapter_Abstract $adapter
*/
public function setDbAdapter(Zend_Db_Adapter_Abstract $adapter) {
$this->_dbAdapter = $adapter;
}
/**
* Set the query used to fetch the data
* @param string|Zend_Db_Select $select
*/
public function setDbSelect($select) {
$this->_dbSelect = $select;
}
/**
* Set the column where the identifiers for the options are fetched
* @param string $name
*/
public function setIdentityColumn($name) {
$this->_identityColumn = $name;
}
/**
* Set the column where the visible values in the options are fetched
* @param string $name
*/
public function setValueColumn($name) {
$this->_valueColumn = $name;
}
public function render(Zend_View_Interface $view = null) {
$this->_performSelect();
return parent::render($view);
}
private function _performSelect() {
if(!$this->_dbAdapter)
$this->_dbAdapter = Zend_Db_Table::getDefaultAdapter();
$stmt = $this->_dbAdapter->query($this->_dbSelect);
$results = $stmt->fetchAll(Zend_Db::FETCH_ASSOC);
$options = array();
foreach($results as $r) {
if(!isset($r[$this->_identityColumn])) {
throw new Zend_Form_Element_Exception(
'Identity column is not present in the result');
}
if(!isset($r[$this->_valueColumn])) {
throw new Zend_Form_Element_Exception(
'Value column is not present in the result');
}
$options[$r[$this->_identityColumn]] = $r[$this->_valueColumn];
}
$this->setMultiOptions($options);
}
}
这也是我想在其中使用它的第一种形式的 sn-p:
namespace Import\Form;
use Zend\Form\Form;
use Import\Service\CU_Form_Element_DbSelect;
.....
$this->add(new CU_Form_Element_DbSelect(array(
'name' => 'ProjectID',
'dbAdapter' => $this->db,
'dbSelect' => 'SELECT ProjectID, Projectname FROM t_project',
'valueColumn' => 'ProjectID',
'label' => 'Choose project'
)));
对我来说,错误消息看起来像 extends Zend_Form_Element_Select 未找到。
【问题讨论】:
标签: zend-framework zend-form zend-form-element zend-framework3