0

我还在想我何时何地必须注册新类以及如何扩展旧类。 例如,我找到了一个扩展了Zend_Form_Element_Select的好代码,以便我可以在每个表单中使用它并将我的数据库规范传递给它。扩展Zend_Form_Element的功能

因为我认为,这是一个好主意,有一个自己的目录,我在modulelevel添加了一个文件夹src \ Service。

第一个问题:在模块级别上有它聪明吗?将它放在根级别以便我可以在几个模块中使用它会更方便吗?我必须注册吗?

类扩展Zend_Form_Element_Select我添加了一个使用声明:

use Zend\Form\Element\Select; 

这会导致一个致命错误:

Fatal error: Class 'Import\Service\Zend_Form_Element_Select' not found

这将是我的下一个问题:我怎样才能正确地添加这个的Zend_Form_Element 。我认为问题可能是Zend没有查看Zend目录。但我用其他形式的Zend_Form_Element_Select,所以它在那里。但我的新班级并不知道。我要怎么做,如果我想使用自己的类,当然使用Zend类?

我基本上寻找一种方法如何做到这一点。目标是在其他项目中轻松地重用类。

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

在模块级别拥有自己的类没有问题。您也可以在另一个模块上使用它。只需使用use即可致电课程。只要在config/modules.config.php中注册的模块可以在其他模块中使用。

哪里可以放class?取决于你的需求。你可以把它放在根模块

ExampleModule/src/YourClass.php 

,或者你可以把它放在Service文件夹。我通常把我自己的类此文件夹,如果这个类可以作为服务

ExampleModule/src/Service/Yourclass.php 

而关于此错误,请加namespace Import\ServiceZend_Form_Element_Select类。

Fatal error: Class 'Import\Service\Zend_Form_Element_Select' not found

我看到这引起Autoloader找不到它,因为它不使用正确的namespace。请使用正确的命名空间,关联模块名称和路径(例如:Import\Service)。

为了让您的课程在另一个项目中可重复使用,您可以按照如何创建Zend Modules。他们可以使用composer进行安装和卸载。首先,你需要知道作曲家是如何工作的。

+0

当然我已经添加了命名空间,无论如何,我认为最好是发布代码,然后你就可以看到已经完成了什么。作曲家在这里不是话题。 –

+0

是的,请把代码放在这里 –

+0

它已经在那里 –