【问题标题】:extend functionality of Zend_Form_ElementZend_Form_Element 的扩展功能
【发布时间】: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


    【解决方案1】:

    在模块级别拥有自己的课程没有问题。您也可以在另一个模块上使用它。只需使用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 安装和卸载它们。首先,您需要了解作曲家的工作原理。

    【讨论】:

    • 当然我已经添加了命名空间,无论如何我认为最好发布代码,然后您可以看到已经完成的内容。作曲家不是这里的主题。
    • 我已经检查了你的代码。而且我认为会有很多问题。 Zend_View_InterfaceZend_Db_TableZend_DbZend_Form_Element_Exception 也将找不到。你也需要加载它们。我认为那些class 会有更多的依赖。 packagist 中有 zendframework/zendframework1 包。它包含来自 ZF1 的所有库。您可以尝试将其添加到您的作曲家"zendframework/zendframework1": "^1.12",但我不确定它是否会在您的项目中正常运行。
    • 好的,我明白了,那么我怎么能在 ZF3 中构建这样的东西呢?
    • 您需要将其转换为使用 Zend 模块,如 Zend\Db\AdapterZend\Db\TableGatewayZend\Form\ElementZend\View 等。这是由于 ZF1 和 ZF2 之间存在很大差异造成的。 ZF2 和 ZF3 没有太大区别
    • 仅此而已?好的,我会试试这个。我有时会有点困惑,我使用了几种编程语言以及 ZEND1 和 Zend3,有时我有点迷失在语法中 ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-11-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 2020-02-14
    相关资源
    最近更新 更多