node内のglobal 設定宣言について

Events happening in the community are now at Drupal community events on www.drupal.org.
redboxhosting's picture

お世話になります。

Drupal7xにてNode内でPHPを利用しているのですが、独自につくった関数内からグローバル変数にアクセスする際にはどのようにしたらよろしいでしょうか。
関数の中で以下の様にGlobalと宣言しても、$a $bが空になりうまく効いていないように見受けられます。

NODE外で直接PHPを置いた場合期待した動作になりますので、おそらくDrupalのNodeの何かが原因ではないかと推測しています。

例:

$a = 1;
$b = 2;

function Sum()
{
global $a, $b;
$b = $a + $b;
}

Sum();

宜しくお願い致します。

Comments

blauerberg's picture

node内にphpを書いた場合、最終的には eval() を通して実行されるので、スコープはそのeval内に閉じられて $a, $bはグローバル扱いにならないような気がします。

以下のような感じでそれっぽい動きになるかと思います。
variable_setしたデータはDBに入るので、↓の例の場合は a,bの初期化は一度だけ実行されます。グローバル変数にした場合とちょっと動きが違うと思いますので、そのあたりはアレンジしてください。

<?php
if (is_null(variable_get('a', NULL)) {
 
variable_set('a', 1);
}
if (
is_null(variable_get('b', NULL)) {
 
variable_set('b', 2);
}

function
Sum()
{
 
$a = variable_get('a');
 
$b = variable_get('b');
 
variable_set('b', $a + $b);
}

Sum();
?>
redboxhosting's picture

早速アドバイス有り難うございます。

やはりグローバル扱いにはならないのですね。

教えて頂きましたvariable_setを利用してみましたが、3行目の variable_set('a', 1);で
Evalエラーとなってしまいました。

念のため以下の様なコードで試しましたがやはりsetする時点で動作しないようです。。

<?php

global $conf;
$var = "1";
variable_set('var1', $var);
print_r variable_get('var1');
?>

また、variable_setしたデータはDB内に格納されるとおもうのですが、
このNodeは異なるユーザーがアクセスするため、変数内はユーザー毎に異なっている必要があります。その場合、変数名をユニークにするか毎回variable_delするなどで代用する必要があるのでしょうか。

例:
ユーザー1 変数 $a = 1
ユーザー2 変数 $a = 2

宜しくお願い致します。

blauerberg's picture

あ、2箇所、閉じカッコが足りませんでした、申し訳ない。。

<?php
if (is_null(variable_get('a', NULL))) {
 
variable_set('a', 1);
}
if (
is_null(variable_get('b', NULL))) {
 
variable_set('b', 2);
}

function
Sum()
{
 
$a = variable_get('a');
 
$b = variable_get('b');
 
variable_set('b', $a + $b);
  return
$b;
}

echo
Sum();
?>

でどうでしょう?

このNodeは異なるユーザーがアクセスするため、変数内はユーザー毎に異なっている必要があります。
その場合、変数名をユニークにするか毎回variable_delするなどで代用する必要があるのでしょうか。

はい、そうですね。
認証済みユーザーだけであれば

<?php
global $user;
$user->uid;
?>

でユーザーIDがとれますので、variable_setする時のキーを

<?php
global $user;
variable_set("{$user->uid}_a", 1);
?>

のようにすればユーザー毎に分離できます。
anoymousユーザーの場合は、 $user->uid は0が返ってくるので、session IDをキーにするなどの考慮が必要かもしれません。

ありがとうございます。

redboxhosting's picture

ありがとうございます。 

試しにコードを記載したところページリロードするたびに1つづ増えていっているので
正常に値が保存され読み込まれているようです。

またユーザーについても有り難うございます。現状は認証ユーザーのみ対象とするので
$user->uidでUIDを拾って変数をユニークにして対応するようにします。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: