メニュー項目を介していくつかのアクションリンクを追加するカスタムモジュールがあります。
function monographs_menu() {
$items['node/%node/clone_comment'] = array(
'access callback' => 'clone_access_cloning',
'access arguments' => array(1),
'page callback' => 'monographs_node_check',
'page arguments' => array(1, 2),
'title' => 'Create For Comment version',
'type' => MENU_LOCAL_ACTION,
);
$items['node/%node/clone_authorized'] = array(
'access callback' => 'clone_access_cloning',
'access arguments' => array(1),
'page callback' => 'monographs_node_check',
'page arguments' => array(1, 2),
'title' => 'Create Final Authorized version',
'type' => MENU_LOCAL_ACTION,
);
return $items;
}
ページコールバックの関数シグネチャは
function monographs_node_check(&$node, $type)
私のローカルマシンと私の開発サーバーでは、これはすべて正常に機能します。ただし、クライアントのサーバー上で、私のdbとrepoのクローンを使用して、このリンクをクリックすると、ウォッチドッグでWSODとこのエラーが発生します。
警告:monographs_node_check()へのパラメーター1は参照であることが期待され、値はmenu_execute_active_handler()で指定されます(...\public_html\includes\menu.incの517行目)。
アクセスできないリモートサーバー上にあるため、デバッグできませんが、自分のローカルマシンと開発サーバーでエラーなしに機能するため、さらに奇妙です。
このエラーの原因となる他の環境で何が異なる可能性がありますか?
ありがとう。
サポートリストから回答を得ました。必要なのは、コールバック関数のシグネチャでノードオブジェクトの参照を削除することだけでした。
function monographs_node_check($node, $type)
とにかく$ nodeはオブジェクトとして渡されるので、署名で参照としてマークする必要はありません。
この問題は、Drupalがcall_user_func_array()
を使用してメニューコールバック関数を呼び出し、それにパラメーターを渡すために発生します。
関数のシグネチャが次の場合:
_function monographs_node_check(&$node, $type)
_
次に、call_user_func_array()
の呼び出しは次のようになります。
_call_user_func_array('monographs_node_check', array(&$node, $type));
_
注意すべき重要な点は、参照渡しは_&$node
_を使用して呼び出し側で明示的に設定されることと、呼び出された関数の宣言で行われることです。
PHP 4。
この場合、Drupalはこれらのパラメーターをcall_user_func_array()
に参照として渡さないため、エラーが発生します。
一方のサーバーでエラーが発生し、もう一方のサーバーでエラーが発生する最も可能性の高い理由は、PHPの前に、バージョンPHP 5.3 .0これはエラーを発生させるのではなく、警告なしに処理されました。エラーの結果として、関数が実際に呼び出されることはないため、ページが表示されることはありません。
this PHPバグレポート で、この問題についての良い議論があります。