2017-08-09 11 views
0

私は現在、Drupal 8モジュール開発のベストプラクティスの周りを頭で覆そうとしています。私がしようとしているのは、ユーザーが電子メールアドレスを入力できるページに単純なフォームDemoformを置くことだけです。フォームが提出されると、私はイベントdemo_form.saveを派遣したいと思います。また、ブロック内にユーザーの電子メールアドレスを表示するブロックが必要です(サイドバーを2番目としましょう)。私はすでにEventSubscriberをテストとして実装しているので、イベントは適切に発送され、イベントにも登録されました(しかし、ブロック内の情報を取得する方法)。今、私の質問:このワークフローのベストプラクティス:Drupal 8はブロック内からイベントを購読します

ファイルDemoForm.php

class DemoForm extends ConfigFormBase { 
    ... 
    $event = $dispatcher->dispatch('demo_form.save', $e); 
    ... 
} 

ファイルDemoEventSubscriber.php

class DemoEventSubscriber implements EventSubscriberInterface { 
    static function getSubscribedEvents() { 
    $events['demo_form.save'][] = array('onConfigSave', 0); 
    return $events; 
    } 
    public function onConfigSave($event) { 
    ... 
    } 

} 

これは動作し、私はDemoEventSubscriberクラス内のフォームからの入力にアクセスし、私はそれでやりたいことができます。 今はブロックマークアップ内に電子メールアドレスを表示したいと思います。これはどのように最善を尽くすべきですか?

ファイルDemoBlock.php

class DemoBlock extends BlockBase { 
public function build() { 
    // here return markup with email address from form 
} 
} 

にはどうすればいいeventsubscriberとブロックのマークアップを組み合わせていますか? Blockbase自体はEventSubscriberInterfaceを実装でき、DemoEventSubscriber.phpから独立していますか?あるいは、フォームのデータを送信してブロックのbuild()機能内のサービスにアクセスするサービスを登録する必要がありますか?または、私が行方不明になっている別の方法がありますか?

ありがとうございます。

答えて

1

イベントが必要なのはわかりませんが、イベントをディスパッチするには、すでに表示されているコードをDemoFormクラスのsubmitForm()関数で使用してください。

あなたがConfigFormBaseを使用しているので、私はconfig form documentationからのようなコードを使用して、あなたはconfigに提出した電子メールアドレスを保存することを前提としています

/** 
    * {@inheritdoc} 
    */ 
    public function submitForm(array &$form, FormStateInterface $form_state) { 
    // Retrieve the configuration 
    $this->config('mymodule.settings') 
     // Set the submitted configuration setting 
     ->set('email', $form_state->getValue('email')) 
     ->save(); 

    // Assuming you have injected the dispatcher. 
    $event = $this->dispatcher->dispatch('demo_form.save', $e); 

    parent::submitForm($form, $form_state); 
    } 

あなた内のブロック、あなたはその後、設定にアクセスすることができます静的なラッパーで例えばまたはこれであなたは常に一つだけの電子メールアドレスを設定することができることをサービスSimple Configuration API

$config = \Drupal::config('mymodule.settings'); 
$message = $config->get('email'); 

注意を注入。それがあなたの目的かどうかわかりません。複数の電子メールを収集する場合は、それらをデータベースに格納し、構成には格納しないでください。

+0

本当にありがとうございます。configを使用するとうまくいきます。しかし、私は設定を使用したくないと仮定しましょう、あなたはブロック内の電子メールアドレスを取得する唯一の方法は、データベースに格納することだと思う? – user1841373

+0

永続的に格納する唯一の方法は、データベースにあります。州の情報を格納するのにも使用できる州のAPIもあります。そこにメールを保存すると、状態がクリアされるまでブロックに表示される可能性があります。 – littlethoughts

関連する問題