New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

プラグイン課題:個別フックポイント仕様 #1411

Closed
chihiro-adachi opened this Issue Jan 19, 2016 · 1 comment

Comments

Projects
None yet
2 participants
@chihiro-adachi
Contributor

chihiro-adachi commented Jan 19, 2016

個別フックポイント仕様

課題事項

現状のフックポイントはbefore/afterで粒度が大きく、
フォームのエラー制御ができない、entityのidが取得できないなどの問題がある

個別フックポイント仕様

変更点

FOSUserBundleを参考に、コントローラ内にイベントを追加する

  • コントローラ内イベント
    • フォーム初期化後
    • 登録完了後
    • テンプレートのレンダリング
  • サービス/レポジトリ内イベント
    • 検証中...

Hooking into the controllers
http://symfony.com/doc/current/bundles/FOSUserBundle/controller_events.html

FOSUserBundle
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Controller/GroupController.php#L86

フォーム初期化後イベント

フォーム初期化後に実行されるイベント.
入力項目の追加等を行う. 追加された項目はform_restで出力される.

コードイメージ(本体側)

class TradelawController extends AbstractController
    public function index(Application $app)
    {
        $Help = $app['eccube.repository.help']->get();
        $form = $app['form.factory']
                    ->createBuilder('tradelaw', $Help)
                    ->getForm();
        //  フォーム初期化後のイベント
        $event = new GenericEvent(null, array(
            'form' => $form
        ));
        $app['eccube.event_dispatcher']->dispatch('tradelaw.form_initialized', $event);
        if ('POST' === $app['request']->getMethod()) {
            $form->handleRequest($app['request']);
            if ($form->isValid()) {

コードイメージ(プラグイン側)

    public function onFormInitialized($event)
    {
        // フォーム項目追加
        $form = $evet->getArgument('form');
        $form->add('plg_hoge_huga', 'text', array(
                 'mapped' => false, // mapped => falseは必要
                 'constraint’ => array(
                       new Assert\NotBlank();
                  )
        );
        // 初期値登録する場合.
        $form['plg_hoge_huga’]->setData('aaa’);
    }

登録完了後イベント

コントローラの登録処理完了後に実行されるイベント
プラグイン側のエンティティ等のデータ登録を行う。

コードイメージ(本体側)

    if ('POST' === $app['request']->getMethod()) {

        $form->handleRequest($app['request']);

        if ($form->isValid()) {
            $Help = $form->getData();
            $app['orm.em']->persist($Help);
            $app['orm.em']->flush();

            // 登録完了後イベント
            $event = new GenericEvent(null, array(
                'form' => $form,
                'Help' => $Help,
            ));
            $app['eccube.event_dispatcher']->dispatch('tradelaw.completed', $event);

            $app->addSuccess('admin.register.complete', 'admin');

コードイメージ(プラグイン側)

    public function onCompleted($event)
    {
            $form = $event->getArgument('form');
            $Help = $event->getArgument('Help'); 

            $hogehuga = $form['plg_hoge_huga']->getData();

            $entity = new Plugin/HogeHuga/Entity/Hoge();
            $entity->setHelp($Help);
            $entity->setHogehuga($hogehuga);
            $this->app['orm,em']->persist($entity);
            $this->app[''orm.em]->flush($entity); 
    }

テンプレートイベント

twigテンプレートのレンダリング時に発生するイベント
プラグインで用意したテンプレートの差し込みを行う
※現renderフックポイントと異なり、twigのテンプレートを更新していく

コードイメージ(本体側)

// ApplicationTrait::renderメソッド
public function render($view, array $parameters = array(), Response $response = null)
{
    $twig = $this['twig'];

    // $viewはProduct/list.twigなどtwigファイル名.
    // getSourceで文字列化
    $source = $this['twig.loader']->getSource($view);
    $event = new GenericEvent(null, array(
        'view' => $view,
        'source' => $source,
        'parameters' => $parameters
    ));
    // テンプレート書き換えイベント
    $eventName = 'template.render.'.$view;
    $this['eccube.event_dispather']->dispatch($eventName, $event);

    if ($response instanceof StreamedResponse) {
        $response->setCallback(function () use ($twig, $view, $parameters) {
            $twig->display($view, $parameters);

コードイメージ(プラグイン側)

    public function onTempleteRender($event)
    {  
      $source = $event->getSource();
      $snipet = file_get_content('/path/to/plugin/resouce/template/hoge.twig');
      $source = str_relace('<aaa>', '<aaa>'.$snipet, $sourece);
      $event->setSource($source);

      $parameters = $event->getParameters();
      $parameters['plg_foo_var'] = 1111;
      $event->setParameters($parameters);
    }
@chihiro-adachi

This comment has been minimized.

Show comment
Hide comment
@chihiro-adachi
Contributor

chihiro-adachi commented Feb 17, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment