11

カスタム スタイルをベンダー モジュールのフォームに適用したり、独自のビュー スクリプトに埋め込んだりするにはどうすればよいですか? 具体的には、EdpUser モジュール (https://github.com/EvanDotPro/EdpUser) が提供するフォームを操作したいと考えています。

最も簡単な方法は、ベンダーのスクリプトを直接変更することです。しかし、明らかに、これはベンダーの将来のアップデートと競合します。

別の方法は、ベンダーのコントローラーを自分のモジュールにコピーしてから、自分のビューを提供するようです。ただし、これには、ベンダーの将来の更新と同期が取れなくなるという同様の問題があります。また、名前空間には注意する必要があります。

ベンダーのコントローラーをコピーするのではなく、拡張する必要があるかもしれません。これは名前空間でうまく機能し、コントローラー内のフォームに非常に簡単にアクセスできるはずです。独自のビュー スクリプトを使用している間。これは正しい方法ですか、それともより良い方法がありますか?

ありがとう

4

1 に答える 1

36

モジュールのディレクトリ、特に に配置されたモジュールを変更することは、推奨される方法ではありませ/vendor//config/autoload/これは、構成テンプレートを独自のディレクトリにコピーする必要がある理由でもあります。

モジュールは、使用に十分な柔軟性を持たせるために、十分な拡張ポイントを提供する必要があります。これらの可能性の中には、次のオプションがあります。

ルートを変更する

ZfcUser モジュールは、/user url の下に自身を登録します。たとえば、これを /account に変更したい場合は、これを構成に追加するだけです。

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'route' => '/account',
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

コントローラーを変更する

の使用に満足できずZfcUser\Controller\UserController、このコントローラーのアクションをオーバーライドしたい場合は、カスタム コントローラーを作成できますMyUser\Controller\UserController。を拡張してZfcUser\Controller\UserControllerこの構成を提供すると、準備完了です。

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\Mvc\Router\RouteStack' => array(
                'parameters' => array(
                    'routes' => array(
                        'zfcuser' => array(
                            'options' => array(
                                'defaults' => array(
                                    'controller' => 'MyUser\Controller\UserController'
                                ),
                            ),
                        ),
                    ),
                ),
            ),
        ),
    ),
);

zfcuserDI エイリアスを使用して、DI 構成のエイリアスをオーバーライドすることもできます。

<?php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'zfcuser' => 'MyUser\Controller\UserController'
            ),
        ),
    ),
);

フォーム インスタンスを変更する

たとえば、ZfcUser モジュールはいくつかのイベントをトリガーして、他のモジュールがフォーム作成プロセスにフックできるようにします。両方とも、すべてのフォーム要素を設定した後にイベントZfcUser\Form\LoginZfcUser\Form\Registerトリガーします。initこれにより、要素を追加または削除できます。

use Zend\EventManager\StaticEventManager;

$events = StaticEventManager::getInstance();
$events->attach('ZfcUser\Form\Login', 'init', function ($e) {
  $form = $e->getTarget();
  $form->addElement('text', 'something-new');
});

ここで、次の 2 つの点に注意する必要があります。

  1. すべてのモジュールは、独自のトリガーを提供する必要があります。この ZfcUser にはinit両方の形式がありますが、これはすべてのモジュールに与えられているわけではありません。これについて調べるには、ドキュメントまたはソース コードを調べる必要があります。
  2. は現在、シングルトンを、ロケーターを介してインスタンス化できるインスタンスZend\EventManagerに置き換えるリファクタリング中です。このリファクタリングの進行状況は、このプル リクエストで確認できます。StaticEventManagerSharedEventManagerZend\Di

ビューまたはフォームのレンダリングを変更する

この RFCに従って、Zend\Formコンポーネントは変更される可能性があります。特にレンダリングでは、デコレーターが削除され、「ただの」通常のビュー ヘルパーが代わりにフォームをレンダリングします。これに加えて、ビューをオーバーライドする可能性があるため、いくつかのビュー スクリプトのみで別のモジュールを使用するだけで、アクションのレンダリングを非常に簡単に変更できます。

独自のモジュールを作成してこの構成を提供する場合は、テンプレート パス スタックに新しい場所を追加します。

<?php
return array(
    'di' => array(
        'instance' => array(
            'Zend\View\Resolver\TemplatePathStack' => array(
                'parameters' => array(
                    'paths' => array(
                        'myuser' => __DIR__ . '/../view',
                    ),
                ),
            ),
        ),
    ),
);

viewこれで、モジュールのディレクトリにビュー スクリプトを作成できます。「MyUser」という名前のモジュールが下に/modules/MyUserあり、ZfcUser ( にある) からのログイン ビュー スクリプトをオーバーライドする場合は、 で/vendor/ZfcUser/view/zfcuser/login.phtmlビュー スクリプトを作成します/modules/MyUser/view/zfcuser/login.phtml

于 2012-03-21T09:59:10.573 に答える