web-dev-qa-db-ja.com

ノードにPHPを含める最良の方法は何ですか?

一部のサイトをDrupal 6マルチサイトに変換しており、PHPを多用する既存のページがいくつかあります。

これらのスクリプトを含める最も簡単な方法は何ですか?それらが異なる言語の異なるメニューに住みたいと考え、これらのページをサイト上の他のページのように機能させたい場合(たとえば、ルール、ビュー、CCKなどを利用する) 。

  • hook_menu()を使用して_MENU_CALLBACK_を作成すると、他のページのように扱うことができなかった(タイトル/コンテンツを編集したり、ビュー/ルールを使用したりする)ことができないようです。

  • hook_nodeapi()を使用してPHPを追加することは、常にコンテンツの最後(または先頭)にある場合にのみ機能します。

  • PHPフィルタを使用してファイルを含めることは機能しますが、編集者がPHPを使用する権利を必要とすることを意味します。

私が頼りにしている解決策は、キーワード/トークンをファイル/関数で置き換えるカスタムフィルターを作成することです。これにより、編集者はページに{{FOO_SCRIPT}}を追加し、関連するコードが含まれるようになります。

もっと良い方法はありますか?

2
Apemantus

通常、私はhook_preprocess_node(&$vars)のノードで大量のPHPを持ち上げ、$varsのコンテンツを解析/インクルードします。

hook_nodeapi()はもちろんそれを実行する別の方法であり、追加のコンテンツは多くの異なる$operationsで利用可能になります。ノード内で保存、削除などされるデータを変更しない限り、私はhook_nodeapi()を使用しません-ディスプレイレイヤーの場合は、hook_preprocess_node()が常に私を扱います。

ノードに含める前処理とコンテンツの種類を拡張できれば、最適なソリューションをさらに詳しく説明できると思います:)

更新:使用することを目的としたさまざまなタスク(API、追加のDB呼び出し、またはユーザー入力解析など)を考慮して、間違いなくお勧めします hook_nodeapi を使用すると、コンテキストを細かく制御できます。前処理はビューレイヤーのみであり、nodeapi(&$node, $op = 'load')をフックして、情報に広くアクセスできるようにデータエントリを高レベルにしたいと思うかもしれません($node->your_custom_api_fieldnode.tpl.phpなど)。

I highly recommend that you try to stay with Drupal's conventions as much as possible. Using database functions etc. Checkout the http://drupal.org/project/data module and possibly http://drupal.org/project/schema which both help working with your own tables (and the data module even helps expose that table to views so you can stay with Drupal core more!)

p.s。

私のアドバイスは、あなたが持っているデータモジュールごとにカスタムモジュールを作成して、それがそれ自身のhook_nodeapiと、必要となるかもしれない他のフックを使用できるようにすることです:)

5
electblake

トークンフィルター のようなものを考えていますか?

PHP関数をトークンAPIを使用してトークンとして利用できるようにし、これらのトークンをページに入力できるようにします。

0
Jeremy French

ノードについて話していて、PHPを入力フィルターとして使用していた既存のノードを変換する必要があるだけの場合は、Drupal.orgから行われたことを行うことをお勧めします。

  • hook_nodeapi() を実装するカスタムモジュールを作成します。
  • そのフックの実装で、操作が「表示」であるときにコードを追加します
    • 表示されているノードのノードIDを確認します。
    • ノードIDがPHPフィルターを使用していたノードのいずれかのIDと一致すると、ノード本体に含まれていたコードが実行されます。

コードは次のようになります。

_function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  if ($op == 'view') {
    switch ($node->nid) {
      case 23:
        // Change the content of $node->content['body']['#value'].
        break;
      // ... 
    }
  }
}
_

目的が、サイトの変換後も作成されたノードのコンテンツを変更するためにコードを使用できるようにすること、またはサイトが変換可能になる前に存在するページを編集可能にすることである場合、2つの可能性があります。

  • 以前に報告したコードを使用しますが、_$node->content['body']['#value']_の内容を変更する代わりに、実行したコードの結果を_$node->content['body']['#value']_に追加します。
  • フィルターモジュールを使用します。 カスタムフィルター たとえば、適切なアクセス許可を持つユーザー(通常のエディターユーザーには与えないでください)は、(正規表現を使用して)置換する必要がある文字列と置換を定義できますPHPコードから返される文字列、または_$1_、_$2_などを含む文字列)(つまり、使用される文字列と同様の文字列) preg_replace())。

カスタムフィルターに似ている別のモジュールは Regex Filters ですが、これを使用したことがなく、PHPコードを使用できるかどうかはわかりません交換ルール。

一般に、 drupal_eval() (またはeval());を使用しない方が望ましいです。これは、hook_nodeapi()を使用してノードのコンテンツを変更するカスタムモジュール、または入力フィルターを実装し、定義済みの文字列をPHP eval()に渡されないコード。
入力フィルターの問題は、ユーザーがモジュールに置き換えられた文字列を、それを置き換えるために使用される文字列が表示されるべきではないコンテキストで使用できることです。この問題を解決するには、 Better Formats をインストールします。これにより、コンテンツタイプごとに許可される形式を制御し、特定の入力形式を使用できるユーザーを決定できます。

0
kiamlaluno