0

Zendにカスタムフォーム要素クラスを自動ロードさせることができません。私はMarcinがここで説明しているとおりに作業を行いました(ただし、クラスは「my」ではなく「Zend」で始まりますが、次のエラーが発生します。

Warning: include_once(Zend\Form\Element\Div.php) [function.include-once]: failed to open stream: No such file or directory

私はZend_Form_Element_Div内側forms\elements\Zend_View_Helper_FormDiv内側を持っていますviews\helpers\

基本的に、エラーメッセージ内のすべてのフォルダに「s」がありません。正しいパスは次のとおりです。Zend\Forms\Elements\Div.php

ブートストラップにもこれがありますが、必要かどうかはわかりませんが、フォームとモデルのフォルダーにもこれを使用しています(他のいくつかのフォルダーもありますが、すべてを投稿する必要はないと思います)。

<?php
    $resourceLoader->addResourceTypes(array(
        'model' => array(
        'namespace' => 'Model',
        'path' => 'models'
        ),
        'element' => array(
        'namespace' => 'Element',
        'path' => 'elements'
        ),
        'form' => array(
        'namespace' => 'Form',
        'path' => 'forms'
        )
));
?>

(実際にこの自動読み込みを行う他の方法はありますか?すべてのフォルダーを宣言する代わりに?)

アップデート:

  • application / forms / elements/Div.phpのElement_Div
  • 私のフォームのinit()メソッドでは:$this->addElementPrefixPath('Element_', APPLICATION_PATH . '/forms/elements');
  • 私が得ているエラー:Fatal error: Class 'Element_Div' not found in C:\xampplite\htdocs\code\application\forms\PostForm.php on line 63
4

2 に答える 2

3

基本的に、以下を使用して、カスタム要素を見つける場所をフォームに指示する必要があります。

$form->addElementPrefixPath()

あなたの場合、フォームinit()または__construct()メソッド内で次のようなものを使用します。

$this->addElementPrefixPath('Zend_Form_Element_', APPLICATION_PATH . '/elements);;

しかし、私は@Marcinに同意します。Zend_疑似名前空間を使用して独自のクラスに名前を付けることはお勧めできません。また:

  1. アプリケーションの名前空間を決定し、Bootstrap作成するときに宣言します$resourceLoader

  2. インクルードパス(おそらくZendライブラリと同じレベル)にあるカスタムライブラリを作成し、そこにカスタムのものを配置します。

これらの提案のいずれかについてさらに詳細が必要な場合はお知らせください。説明を少し詳しく説明します。

コメントに基づいて更新

空のappnamespaceを使用すると、への呼び出しは次のようにaddElementPrefixPath()変わります。

$this->addElementPrefixPath('Element_', APPLICATION_PATH . '/elements);

そして、実際には何もしていないので、定義elementsからエントリを削除できると思います。$resourceLoaderBootstrap

アップデート2

次のような短縮名を使用して要素をフォームに追加していると仮定しました。

$form->addElement('div', 'my_div');

この状況では$form、タイプ'div'の要素を見つける場所をとそのプラグインレジストリに指示する必要があります。それが私たちが扱った理由$form->addElementPrefixPath()です。

ただし、報告しているエラーメッセージから、次のようなものを使用してカスタム要素をフォームに追加しているようです。

$div = new Element_Div();
$form->addElement($div, 'my_div');

この場合、$formカスタム要素の検索/ロード/インスタンス化について心配する必要があるのは、およびそのプラグインレジストリではありません。それはその$autoloader経由$resourceLoaderです。その場合、は必要ありません$form->addElementPrefixPath()。これは、基本的に、shortnameによって呼び出されるカスタム要素を見つける方法に関するフォームへのヒントです。

必要なのは、クラスがどこにあるかがわかるように$resourceLoaderバックインを構成することです。Bootstrap空のappnamespaceを使用し(クラスの名前はElement_Div)、ファイルをに配置するとするとapplication/forms/elements/Div.php$resourceLoader呼び出しは次のようになります。

$resourceLoader->addResourceTypes(array(
    'model' => array(
        'namespace' => 'Model_',
        'path' => 'models'
    ),
    'element' => array(
        'namespace' => 'Element_',
        'path' => 'forms/elements'
    ),
    'form' => array(
        'namespace' => 'Form_',
         'path' => 'forms'
    )
));

それはそれをする必要があります。[有名な最後の言葉、え?]

于 2011-03-09T04:27:33.413 に答える
1

私は次のようなフォームを作成することを好みます:

$form->addElement(new My_Form_Element_Whatever(array(
    'name' => 'my_element',
    'label' => 'My element',
)));

また

$form->addElement($whatever = new My_Form_Element_Whatever(array(
    'name' => 'my_element',
    'label' => 'My element',
)));
$whatever->removeDecorator('Errors');

要素をさらに変更する必要がある場合。

于 2011-03-09T12:40:07.983 に答える