web-dev-qa-db-ja.com

カスタムプライベートメッセージブロックはエラーを生成します

グループのすべてのユーザーにメッセージを送信するためのプライベートメッセージリンクを生成するブロックを作成しました。ブロック本体のテキスト形式としてphpコードを使用します。

<?php
$group = og_context();
$og_id = $group->gid;

$query = db_select("og_membership", "ogm");
$query->condition("ogm.gid", $og_id, "=");
$query->fields("ogm", array("entity_type", "etid"));
$result = $query->execute();

$result_tmp = $result->fetchAll();
$recipients = array();

foreach($result_tmp AS $tmem)
{
$recipients[] =  user_load($tmem->etid);
}

echo '<a href=/';
echo privatemsg_get_link($recipients,$account = array(),$subject = NULL);
echo '>Send message to ehood members</a>';
?>

これを使うと、「-」という通知メッセージが表示されました。

Notice: Trying to get property of non-object in privatemsg_user_access() (line 335 of /sites/all/modules/privatemsg/privatemsg.module).
Notice: Trying to get property of non-object in privatemsg_user_access() (line 335 of /sites/all/modules/privatemsg/privatemsg.module).

リンクを生成しましたが、エラーが発生します。 $ accountがどのように言及されているかに何らかの形で関係していると思いますか?

$ accountではなくグローバル$ userを送信しようとしましたが、それでも同じエラーが発生します。

1
Jayaram

この場合、問題は privatemsg_get_link() が_$account_のデフォルト値としてarray()を使用しますが、次のコードを使用することです。

_  if ($account == NULL) {
    global $user;
    $account = $user;
  }
_

この関数は、 ser_access() と同じように、_$account_のデフォルト値としてNULLを使用する必要があります。

_function user_access($string, $account = NULL) {
  global $user;

  if (!isset($account)) {
    $account = $user;
  }

  // ...
}
_

表示されるエラーメッセージは、_$account->uid_が空の配列である場合に、関数が_$account_にアクセスしようとするためです。配列にはプロパティがなく、それがメッセージの内容です。
関数がその値をuser_access()に渡すと、同じエラーがuser_access()から発生し、_$account->uid_の値をチェックします。空の配列は、ユーザーオブジェクトまたはNULLを必要とする_$account_パラメーターに渡す正しい値ではありません。

関数のデフォルト値を使用することは問題ありませんが、パラメーターのデフォルト値を取得するときに関数が何をするかを確認する必要があります。

パラメータにデフォルト値を使用する場合、関数をprivatemsg_get_link($recipients, $account = array(), $subject = NULL)として呼び出すのは誤りです。関数をprivatemsg_get_link($recipients)として呼び出すだけです。コードを使用して、_$account_を空の配列に設定し、_$account_をパラメーターとして渡します。
PHPには 名前付きパラメーター はありませんが、位置パラメーターのみがあります。名前付きパラメーターがある場合は、関数をfunctioname(34, param3 = 4, param2 = 12)またはfunctioname(34, param2 = 12, param3 = 4)として無差別に呼び出すことができます。

3
kiamlaluno

privatemsg_get_link($recipients,$account = array(),$subject = NULL);は、関数を呼び出す適切な方法ではありません。関数がデフォルト値として定義するものを使用するのではなく、$ accountと$ subjectの値を渡す必要があります。このことを考慮:

_<?php
$group = og_context();
$og_id = $group->gid;

... more code ...

global $user
privatemsg_get_link($recipients, $user, 'Some subject line');
?>
_

関数がデフォルト値を定義する場合、

_function my_cool_function($array = array()) {
  // If the array passed to the function is empty, or if an array WASN'T passed...
  if ($array == NULL ) {
    // Create one.
    $array = array('some cool stuff');
  }
}
_

同じデフォルト値を渡すのではなく、実際の値を渡す必要があります。

また、user_load()が有効なユーザーオブジェクトを返したことを確認してから渡します。ユーザーを読み込めなかったためにFALSEが返された場合はどうなりますか?何かのようなもの:

_if ($account = user_load($row->etid)) {
  $recipients[] = $account;
}
_

Protip!->fetchAll()を実行したばかりの場合は、db_selectオブジェクトで->execute()を実行する必要はありません。

_$result = db_select('table', 't')->fields('t', array('id'))->execute();
foreach ($result as $row) {
  print $row->id;
}
_

FetchAll()メソッドは、他のフェッチメソッドの中でも特に、データを渡したり、他の方法で使用したりする場合に非常に便利ですが、foreach()ループで反復するだけの場合は必要ありません。

これで問題が解決しない場合は、ここに投稿してください。回答を修正します。また、この質問は明示的にそのモジュールに関するものであるため、コミュニティに賛成して、質問のタイトルを「pivatemsg」モジュール(またはそれが呼ばれるもの)を含むより多くの質問になるように修正してください。

0