私は次のような関数を持っています:
function mymodule_privatemsg_message_validate($message) {
$uid = $vars['message']->author->uid;
//if root or help user, message should always go through regardless of length
if ($uid !== '1') {
if ($uid !== '3') {
if (empty($message->thread_id) && strlen($message->body) < 200 ) {
form_set_error('[body][value]', t('My custom message.'));
}
}
}
}
しかし、私は コメント を受け取りました。「補足として、$ varsを使用していますが、その変数は関数から初期化されておらず、関数のパラメーターでもありません。」これが何を意味するのか、私が間違っているのか理解できません。誰かが私にこれを説明できますか?
hook_privatemsg_message_validate() に指定されたパラメーターは、_$message
_、および_$form
_で、デフォルト値はFALSE
です。
_$vars
_は、関数に渡されるパラメーターではなく、関数から定義されたローカル変数でもありません。この結果、_$vars
_の値はNULL
になります。 _$vars['message']->author->uid
_にアクセスしようとすると、PHPは2つの警告を表示します。
最初の警告は、変数が関数から定義されていないためです。コードで_$vars
_に値が割り当てられている場合、警告は表示されません。 _$vars
_がグローバル(_global $vars;
_を使用)として定義されていて、別の関数からすでに初期化されている場合にも機能します。
2番目の警告は、定義されていないすべてのPHP変数が、NULL
である自動値を取得するためです。_$vars
_はNULL
、および_$vars['message']
_も同様であり、NULL
はオブジェクトではありません。
その結果、_$uid
_もNULL
に設定されます。
次のコードも間違っています。
_ if ($uid !== '1') {
if ($uid !== '3') {
if (empty($message->thread_id) && strlen($message->body) < 200 ) {
form_set_error('[body][value]', t('My custom message.'));
}
}
}
_
_$uid !== '1'
_を使用すると、PHP _$uid
_が_'1'
_とは異なる値の文字列であるかどうかを確認します。_$uid
_の場合が1(整数)に設定されている場合、次のコードは_"different"
_ではなく_"equal"
_を出力します。
_$uid = 1;
if ($uid !== '1') {
print "different";
else {
print "equal";
}
_
これとは異なり、次のコードは_"equal"
_を出力します。
_$uid = 1;
if ($uid != '1') {
print "different";
else {
print "equal";
}
_
また、次のコードは_"equal"
_を出力します。 (読者にとって、その理由を理解するためのタスク。_;)
_)
_$uid = '1a';
if ($uid != 1) {
print "different";
else {
print "equal";
}
_
ユーザーオブジェクトのユーザーIDは文字列ではなく整数であるため、作成するつもりだったのは次のコードです。
_function mymodule_privatemsg_message_validate($message) {
$uid = $message->author->uid;
//if root or help user, message should always go through regardless of length
if ($uid != 1 && $uid != 3) {
if (empty($message->thread_id) && strlen($message->body) < 200 ) {
form_set_error('[body][value]', t('My custom message.'));
}
}
}
_
_$message->author
_が_$message
_に対して定義されたプロパティであるかどうかはわかりませんが、それが本当に必要なものだと思います。
ちなみに、ユーザーオブジェクトのユーザーIDを確認することは避け、その値に基づいてアクションを実行したいと思います。 Drupalでは、次のようなコードを使用して、ユーザーに権限があるかどうかを確認することをお勧めします。
_if (user_access('permission to check', $account)) {
// The user has the permission.
}
_
_$account
_はユーザーオブジェクトです。
ユーザーIDしかない場合は、次のコードを使用できます。
_$account = user_load($uid);
if ($account && user_access('permission to check', $account)) {
// The user has the permission.
}
_
ユーザーIDの代わりに権限をチェックする理由は、コードの保守性です。 100人のユーザーがいて、そのうち50人だけにエラーメッセージが表示される場合を想像してみてください。_$uid
_の値が、エラーメッセージが表示されないユーザーのユーザーIDではないことを確認する必要があります。連続する値がない場合(ユーザーIDが1と3の場合のように)、各値を個別に確認する必要があります。
補足として、user_access()
は常にユーザー#1に対してTRUE
を返します。実際、この関数には次のコードが含まれています。
_function user_access($string, $account = NULL) {
global $user;
if (!isset($account)) {
$account = $user;
}
// User #1 has all privileges:
if ($account->uid == 1) {
return TRUE;
}
// ...
}
_
制御ステートメントが_$account->uid == 1
_ではなく_$account->uid === '1'
_を使用していることに注意してください。
関数のスコープで変数を使用できるようにするには、変数を初期化する必要があります(または、グローバルスコープで初期化し、global
を使用してローカル関数にインポートする必要があります)。
現時点では、$vars
変数を宣言したり渡したりするものは何もありません...初期化されていないため、警告が表示されます。
$message
という関数に変数を渡しています。これは、コードが次のようになっていることを示しています。
$uid = $message->author->uid;
$vars/$variables
との混同は、テーマ関数に渡される唯一の引数の標準名のようなものであるという事実が原因である可能性があります。
function MYTHEME_preprocess_node(&$vars) {
// Use $vars
そのフックの型シグネチャを見ると、
function hook_privatemsg_message_validate($message, $form = FALSE) {
}
$vars
は関数パラメーターではなく、gloabl
であると宣言していません。そのまま使用すると、PHP文句を言う(さまざまな未定義の変数通知の1つ)。現状では、$uid
から何かを抽出しようとすると、$vars
は未定義になります。