1

私は経験豊富な Java/C++ プログラマーですが、Drupal/PHP はまったく初めてです。

短い質問:

特定のブロックへの入力に基づいて、ページ内のすべてのブロックを更新するにはどうすればよいですか?

正確なシナリオ:

http://www.google.com/financeに似た表示と動作を持つ Web サイトを作成しようとしています。Drupal 7 でこのためのカスタム モジュールの作成を開始しました。

  1. ユーザーが特定の会社名を入力できる上部の入力ブロック。
  2. 一般的な内容から始まるメイン ブロック(例: テーブルと経済に関する最新ニュースなど)。ブロック 1 で会社が選択されるとすぐに、これは選択された会社に関するニュースと表に変わります。
  3. いくつかの関連するグラフなどを表示するサイドグラフ ブロックです。ここでも、会社が選択されていない場合は、一般的なグラフ (S&P、ダウ ジョーンズ、NASDAQ など) が表示され、会社が選択されている場合は、選択された会社の詳細が表示されます。

私の見方では、ウェブサイトはユーザーの「現在のコンテキスト」で機能します。では、Drupal でセッション レベル変数を設定し、この変数の現在の値に基づいてすべてのブロックを更新できますか?

ただし、これを達成する方法がわかりません。これを行うための最良の方法は何ですか? (AJAX? タクソノミー?)

ポインタ、ヒント、提案、例、サンプル コードは大歓迎です。

4

1 に答える 1

2

これは、あなたが説明した方法に基づいて、この問題にアプローチする方法です。Views モジュールによって処理される機能の大部分。

次の設定があると仮定します。

  • 会社名を用語として持つ「会社」と呼ばれる分類語彙。
  • 企業に関するニュース情報を含む「ニュース」と呼ばれるコンテンツ タイプ。最も重要なことは、関連する会社を選択できる分類フィールドが必要になることです (このフィールドを「company_reference」と呼びましょう)。
  • 「テーブル」(?) と呼ばれるコンテンツ タイプ。「テーブル」にどの情報が必要かはわかりませんが、企業を参照するための分類フィールドがあることが最も重要です。(同じフィールド「company_reference」にすることができます)

探している機能の大部分は、Views モジュールを使用して構築できます。

ビューを作成します (「会社データ」と呼びましょう)。ビューには、それぞれ「ブロック」タイプの 3 つの異なるディスプレイが表示されます。

ディスプレイ 1:入力ブロック

  • 表示名を「user_input_block」などの意味のある名前に設定します
  • このブロックでは、FORMAT設定をそのままにしておきます。
  • FIELDS設定については、「コンテンツ: タイトル」のみを使用します (このブロックではあまり重要ではありません)。
  • FILTER CRITERIA設定では、フィルターを追加して「company_reference」フィールドを選択し、オートコンプリートに設定して、フィルターを訪問者に公開し、(「more」セクションで) Filter Identity を「company」に変更します。
  • PAGER設定では、特定の数のアイテムを表示するように設定し、「1」に設定します。(これにより、このブロックが取得するデータが制限されます)
  • 詳細セクションの下で、「マシン名」を意味のあるものに変更します。たとえば、「user_input_block」とします。
  • 引き続き[詳細] セクションで [テーマ: 情報] をクリックします。これにより、このビューに使用できるさまざまなカスタム テンプレート ファイルのリストが表示されます。「出力の表示」については、リストの最後のテンプレートの提案を書き留めます。「views-view--company-data--user-input-block.tpl.php」(「views-view--{yourビュー名}--{表示名}.tpl.php")。「出力の表示」をクリックして、リストされている PHP をコピーします。(これは、ビューのビューのデフォルトの PHP です)。
  • テキスト エディター/IDE (使用するものは何でも) で、コピーした PHP コードを貼り付け、書き留めたテンプレート名でカスタム テーマに保存します。PHP を編集し、コメント アウトするか、" <?php if ($rows): ?>...<?php endif; ?>" というセクションを削除します (これにより、返されたコンテンツが表示から削除されます)。

そのため、(カスタム テンプレートを使用して) 作成したばかりのビュー表示を確認すると、ユーザーが会社名を入力するとオートコンプリートされるフィールドのみを含むブロックが表示されます。次に、フォームを送信し、GET 変数として現在の URL (www.yoursite.com/yourpage?company=users company") に渡します。

ディスプレイ 2: ** メイン ブロック **

  • 表示名を「company_news」などの意味のある名前に設定します。
  • FORMAT設定を好きなように設定します(またはそのままにしておきます)
  • FILTER CRITERIAには、"Content:type" フィルターを追加し、"News" および "Tables" コンテンツ タイプを選択します。
  • 詳細セクションで、[コンテキスト フィルター] の横にある [追加] をクリックします。) URL でコンテキスト フィルターが渡されます。入力ブロックから渡された値を取得します。) フィールドとして「Content: field_company_reference」を選択し、「適用」をクリックします。
  • 「フィルター値が利用できない場合」セクションで「デフォルト値を提供する」を選択します
  • 「タイプ」に「PHP コード」を選択すると、PHP コードは次のようになります" return isset($_GET['company']) ? $_GET['company']:false;"
  • 「フィルタが利用可能でデフォルトが提供されている場合」については、「検証基準を指定する」をチェックし、「バリデータ」を「分類用語」に設定し、「会社」語彙をチェックし、「フィルタ値のタイプ」で「用語名を変換する」を選択します。タームID」
  • 「フィルター値が検証されない場合に実行するアクション」で「すべての結果を表示」を選択します

確認すると、このビュー表示には、「ニュース」と「表」のコンテンツをリストするブロックが表示されます。GET 変数「company」が (入力ブロックから) 渡された場合、このブロックのコンテンツはフィルタリングされ、そのブロックに関連付けられているコンテンツのみが表示されます。

ディスプレイ 3: ** グラフ ブロック**

このブロックにどのデータを表示したいのか (またはどこから来ているのか) は正確にはわかりませんが、メイン ブロックの設定について説明したように設定すると、会社ごとにフィルター処理されます (同じコンテキストを使用します)。フィルタおよび会社分類参照フィールドを持つコンテンツ)。

このアプローチとの 1 つの違いは、ユーザーが会社を入力ブロックに入力したときにページをリロードする必要があることです。これを回避したい場合は、次の変更を行うことができます。

  • メイン ブロックグラフ ブロックでは、コンテキスト フィルターを使用する代わりに、会社参照フィールドに通常のフィルターを使用します (入力ブロックで設定したのと同じ設定)。これらの両方のブロックについて、[詳細設定] セクションで [AJAX を使用] を [はい] に設定し、カスタム CSS を使用して公開されたフィルターをビューから非表示にします。
  • ページに追加の JS を追加するカスタム モジュール (またはカスタム テーマ) を使用します。入力ブロックのフィールドによって JS がトリガーされるようにします。ユーザーが値を入力すると、JS はその値を他のブロックの公開された (ただし非表示の) フィールドにコピーし、Drupal をトリガーして、渡されたフィルターを使用して AJAX 経由でそれらをリロードします。 .

私はこれをテストしていません。Drupal に関する私の知識に基づいた単なる理論上のものですが、正しい道を歩み始めるはずです。

于 2012-09-25T16:10:22.980 に答える