0

私は新しいクラスをいつどこに登録しなければならないのか、そして古いクラスをどのように拡張するのかと思っています。 たとえば、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が見つかりませんというエラーメッセージが表示されます。

答えて

0

モジュールレベルで自分のクラスを持つことは問題ありません。また、別のモジュールで使用することもできます。 useを使用してクラスに電話するだけです。限り、config/modules.config.phpに登録されているモジュールを別のモジュールで使用することができます。

classはどこに置くのですか?あなたの必要に応じて。あなたはモジュール

ExampleModule/src/YourClass.php 

か、Serviceフォルダにそれを置くことができるのルートにそれを置くことができます。このクラスは、サービス

ExampleModule/src/Service/Yourclass.php 

そして、このエラーに関するとして使用することができれば、私は通常、このフォルダに自分のクラスを入れて、あなたのZend_Form_Element_Selectクラスにnamespace Import\Serviceを追加してください。

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

私はそれが正しいnamespaceを使用していないので、それを見つけることができない、これはAutoloaderによって引き起こさ参照してください。モジュール名とパスに関連する正しい名前空間を使用してください(例:Import\Service)。

あなたのクラスを別のプロジェクトで再利用できるようにするには、Zend Modulesの作成方法に従います。それらは、コンポーザーを使用してインストールおよびアンインストールできます。最初に、あなたは作曲家の仕事を知る必要があります。

+0

もちろん、私は名前空間が追加されていますが、とにかくコードを投稿するのが最善だと思います。作曲家はここにトピックがありません。 –

+0

はい、ここにコードを入れてください –

+0

それは既にあります –

関連する問題