私は新しいクラスをいつどこに登録しなければならないのか、そして古いクラスをどのように拡張するのかと思っています。 たとえば、Zend_Form_Element_Selectを拡張して各フォームで使用し、データベース仕様を渡すことができる素晴らしいコードが見つかりました。Zend_Form_Elementの機能を拡張する
私は考えていたので、自分自身のディレクトリを持つことをお勧めします。私は、モジュールレベルでsrc \ Serviceというフォルダを追加しました。
最初の質問:それはモジュールレベルで賢明ですか?私はいくつかのモジュールでそれを使うことができるように、それをrootlevelに置く方が便利でしょうか?私はそれを登録する必要がありますか?
クラスI use文で追加されZend_Form_Element_Select
を拡張:どのように私はきちんとこのZend_Form_Elementに追加することができます。これは私の次の質問になります
Fatal error: Class 'Import\Service\Zend_Form_Element_Select' not found
:
use Zend\Form\Element\Select;
これは致命的なエラーが発生します。問題は、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
が見つかりませんというエラーメッセージが表示されます。
もちろん、私は名前空間が追加されていますが、とにかくコードを投稿するのが最善だと思います。作曲家はここにトピックがありません。 –
はい、ここにコードを入れてください –
それは既にあります –