我仍然想知道我何时何地注册新课程以及如何扩展旧课程。 例如,我找到了一个很好的代码,它扩展了Zend_Form_Element_Select,以便我可以在每个表单中使用它并将我的数据库规范传递给。
因为我认为,拥有一个自己的目录是个好主意我在modulelevel添加了一个文件夹src \ Service。
第一个问题:在modulelevel上有这么聪明吗?在rootlevel上使用它可以更方便,以便我可以在几个模块中使用它吗?我必须注册吗?
该类使用use语句扩展Zend_Form_Element_Select
:
use Zend\Form\Element\Select;
这会导致致命错误:
致命错误:类'导入\服务\ Zend_Form_Element_Select'找不到
这将是我的下一个问题:如何正确添加此Zend_Form_Element。我认为问题可能是Zend没有查看Zend-Directory。但我在其他形式中使用Zend_Form_Element_Select
所以它就在那里。但是我的新班级并不知道。如果我想使用自己的类当然使用Zend-Classes,我该怎么做呢?
我基本上都在搜索一般的方法。目标是在其他项目中轻松重用类。
EDIT1:其他代码段
这是我在网上找到的课程:
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);
}
}
这里还有我想要在其中使用的第一个表单的片段:
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
。
答案 0 :(得分:0)
在模块级别上拥有自己的类没有问题。您也可以在另一个模块上使用它。只需使用use
调用该类即可。只要在config/modules.config.php
中注册的模块,您就可以在其他模块中使用它。
class
放在哪里?根据您的需要。你可以把它放在模块的根目录
ExampleModule/src/YourClass.php
或者您可以将其放在Service
文件夹中。如果这个类可以用作服务
ExampleModule/src/Service/Yourclass.php
关于此错误,请将namespace Import\Service
添加到您的Zend_Form_Element_Select
课程。
致命错误:找不到类'Import \ Service \ Zend_Form_Element_Select'
我发现Autoloader
引起的这种情况无法找到,因为它没有使用正确的namespace
。请使用与模块名称和路径相关的正确名称空间(例如:Import\Service
)。
要使您的课程可以在其他项目中重复使用,您可以按照Zend Modules
创建的方式进行操作。它们可以使用composer进行安装和卸载。首先,你需要知道作曲家是如何工作的。