扩展Zend_Form_Element

时间:2017-07-26 16:16:01

标签: zend-framework zend-form zend-form-element zend-framework3

我仍然想知道我何时何地注册新课程以及如何扩展旧课程。 例如,我找到了一个很好的代码,它扩展了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

1 个答案:

答案 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进行安装和卸载。首先,你需要知道作曲家是如何工作的。