1

ページの本文コンテンツ領域内で PHP コードを使用する際に問題があります。このサイト、Drupal のサイト、その他のサイト全般を精力的に検索したので、このサイトのどこかに答えがある場合は申し訳ありませんが、見つけることができず、助けが必要です。

サイト全体で再利用する多くの情報を、変数として PHP ファイルに保存したいと考えています。現在、私たちのサイトでこれを行っていますが、サイト全体を Drupal を使用するように書き直しています。たとえば、ソフトウェアを販売していますが、サイトのさまざまな「カートに追加」ボタンの製品 URL ごとに変数が必要です。製品の URL を各リンクにハードコードする必要はなく、任意の drupal ページで呼び出すことができる PHP 変数を設定する必要があります。

何も機能しません。いくつかの提案について読みましたが、どれも機能しません。変数を独自のブロックとして設定し、新しいページを作成するときにページ内からそれらを呼び出してみました。ページ上の変数をエコーできますが、それらが含まれているブロック内でのみ、変数を呼び出して他のブロックまたはコンテンツ領域からエコーすることはできません。グローバル キーワードを使用してみましたが (1 つの提案に従って)、うまくいきませんでした。

これが理にかなっていることを願っています。他の情報?Drupal 6.x を使用しています。ページの作成時に PHP コードを有効にしています。PHP フィルター モジュールを有効にしています。PHP コードをレンダリングできるので、動作していることはわかっています。必要な場所で動作していません。なれ。

私は言うべきです (これを読んだだけでは明らかでない場合!) 私は Drupal の初心者です。

前もって感謝します。

2011 年 3 月 15 日編集

さらに説明するために、いくつかのサンプル コードを投稿します。まだ表示するものがあまりないため、まだこれを行っていません。また、問題がさらに混乱する可能性があると考えました。

そこで、ソフトウェアの試用版をダウンロードするための Drupal の「ページ」を作成しました。設定したい PHP 変数はダウンロード リンク用です。それらを 1 か所に設定して、将来ダウンロード リンクを変更する必要が生じた場合に、1 か所で変更するだけで済むようにしたいと考えています。ご覧のとおり、さまざまなサイト ページにダウンロード リンクがあります。同じことが、「今すぐ購入」リンクにも当てはまります。ページコードは次のとおりです。

<p>Try [product] free for 30 days.</p>

<!--<p>[token_custom_ewintry]</p>-->

<p><?php global $ewintry; ?><a href="<?php print $ewintry; ?>">Download for Windows PC</a></p>

<p><?php global $emactry; ?><a href="<?php print $emactry; ?>">Download for Mac OS X</a></p>

<p><?php global $ebbtry; ?><a href="<?php print $ebbtry; ?>">Download for   BlackBerry</a></p>


<?php 
$ebbtryprint = variable_get("ebbtry", "default");
print $ebbtryprint;
?>

<p><a href="<?php print $ewmtry; ?>">Download for Windows Mobile</a></p>

<p><?php global $ipewlstorelink; ?>iPhone, iPad, iPod touch owners: <a href="<?php print $ipewlstorelink; ?>">Download [product] on the iTunes App Store</a>. You'll be able to create 10 cards for free to try [product] before you buy!</p>

このサンプルでは、​​私が試したすべてを残しました。グローバル変数への呼び出しが表示されますが、これは機能しませんでした。作成して「コンテンツトップ」領域に配置したカスタムブロックで定義されたグローバル変数があります。呼び出しが機能しなかったため、ページの本文コンテンツに実際にアクセスできる領域はないようです。

Tokens モジュールで昨日作成したカスタム トークンがあります。うまくいきませんでしたが、別の投稿で、デフォルトではトークンが本文コンテンツ領域で利用可能であり、特別なフィルターが必要であると読みました。私はまだフィルタを見つけていないので、このソリューションが機能するかどうかはわかりません.

variable_get への呼び出しがあります。さて、これはうまくいきました。template.php ページ内で variable_set を定義しました。上記のコード サンプルの print 呼び出しを使用すると、値が出力されます。しかし、今朝このページを見ましたが、それは私が必要としている答えではないと思います。何かを印刷する前に、すべてのページで variable_get を呼び出す必要があるからですよね? そして、それは、すべてを 1 か所に設定するだけでどこでも呼び出せるようにしたいという問題を解決しません。カスタム ブロックに variable_get 呼び出しを入れようとしましたが、ボディ コンテンツ エリアから「コンテンツ トップ」にアクセスできません。variable_get 呼び出しは、「コンテンツ上部」に値を出力しますが、コンテンツ領域のそれより下には再出力しません。

だから多分そのコードは誰かが私を助けるのを助けるでしょう。私が試したことのない唯一の他の提案であるため、CCK について詳しく見ていきます。誰かが助けてくれるなら、前もって感謝します。

4

3 に答える 3

1

グローバル変数を設定し、それを関数/メソッド ブロック内で使用しようとしている場合は、インポート時に global キーワードを使用する必要があります。

<?php 

// For some reason, this sometimes gives me problems
$foo = 'test';

// So I do this instead, they are equivalent
$GLOBALS['bar'] = 'test';

echo "<p>Global <br/> foo: $foo <br/> bar: $bar</p>";

function globalTest() {
    global $foo;

    echo "<p>globalTest() <br/> foo: $foo <br/> bar: $bar</p>";
}

globalTest();

function globalBarTest() {
    global $foo, $bar;

    echo "<p>globalBarTest() <br/> foo: $foo <br/> bar: $bar</p>";
}

globalBarTest();

?>

実際: http://jfcoder.com/test/globals.php

版画:

Global
foo: test
bar: test

globalTest()
foo: test
bar:

globalBarTest()
foo: test
bar: test

私は常に $GLOBALS を使用してグローバル変数を設定する習慣を身につけてきましたが、この方法で問題が発生したことはありません。

ただし、グローバル スコープの変数を設定することは有害 (または少なくとも不必要) と見なされることに注意してください。コード内の別の場所 (あなたや他の誰かによって) を誤って上書きしてしまう可能性があるからです。

説明で述べられているアプローチはかなり面倒に聞こえます。ファイルを編集して一部のリンクやデータを PHP ファイルにハードコーディングするのではなく、データベースを使用して、データストアからデータを整理、設定、取得する方法を Drupal に抽象化させる必要があります。これは私があなたの説明を読んで考えていることであり、公平ではないかもしれませんが、言及する必要があると思いました.

編集

Drupal では、 を使用して default/settings.php ページでグローバル変数を設定しvariable_set()、 を使用variable_get()して変数を名前で取得できます。

http://api.drupal.org/api/drupal/sites--default--default.settings.php/6

variable_set('foo','bar');

http://api.drupal.org/api/drupal/includes--theme.inc/function/template_preprocess/6

function yourtemplate_preprocess (&$variables) {
    $vars['foo'] = variable_get('foo');
}

編集2

関数のソースに注意してください。variable_set()

<?php

function variable_set($name, $value) {
    global $conf;

    $serialized_value = serialize($value);
    db_query("UPDATE {variable} SET value = '%s' WHERE name = '%s'", $serialized_value, $name);
    if (!db_affected_rows()) {
        @db_query("INSERT INTO {variable} (name, value) VALUES ('%s', '%s')", $name, $serialized_value);
    }

    cache_clear_all('variables', 'cache');

    $conf[$name] = $value;
}

?>

編集

わかりました、これがあなたができることです:

/drupal-root/htdocs/sites/settings.php

settings.php ファイルを開き、下部で $GLOBALS グローバル変数を使用して PHP 変数を設定します。次のようにします。

$GLOBALS['test1_variable'] = 'test 1 variable';

次に、テンプレートで (PHP 入力形式を選択して):

<?php

echo "<p>This is my {$GLOBALS['test1_variable']}.</p>";

?>

または...

<p>This is my short tag <?=$GLOBALS['test1_variable'];?>.</p>

そして、変数がテンプレート コードからページに出力されるはずです。$GLOBALS 変数を囲む中括弧に注意してください。

于 2011-03-14T14:46:36.353 に答える
0

token_filter モジュールを探しているようです。私の問題は、(トークン モジュールで) D7 の準備がまだ整っていないことです。

于 2011-03-18T12:00:51.747 に答える
0

一部のノードに追加情報を提供する必要がある場合は、CCKを使用して、すべての追加情報を含むコンテンツ タイプを作成する必要があります。テンプレート内でスタイルを設定すると、ほぼすべてのものをアーカイブできます。

CCK が代替可能でない場合 (ほとんどの場合、それはまさにあなたが望むものです)、_preprocess_関数を実装する必要があります。これは次のようになります

function yourtemplate_preprocess_page(&$variables) {
  $vars['my_custom_var'] = "hello"; //anything can go here
}

これ$my_custom_varで、ページ テンプレート ファイルが利用可能になりました。

Drupal のテンプレート システムに慣れておいてください (まだ慣れていない場合)。

于 2011-03-14T15:59:06.600 に答える