ノード オブジェクト$node
を別の Drupal インスタンス (別の Drupal サイト) に渡すことはできますか?
- ノードの競合や問題などは忘れましょう。
- Drupal ノード オブジェクトを別の Drupal インスタンスに渡すことは可能ですか?
- そのノードを別の Drupal サイトに渡すにはどうすればよいですか?
純粋に仮説的に言えば、可能です。これを試みる際に直面する多くの問題を無視します (最大 POST サイズ、両方のサイトのノード タイプとフィールドが同じであると仮定するなど)。
Drupal サイト「A」(送信者)では、スクリプトは「mysendermodule」というカスタム モジュール内の PHP スクリプトであり、Drupal サイト「B」(受信者)では「myrecievermodule」というカスタム モジュールがあると想定しています。 "。
送信者モジュールは、$node オブジェクトを POST 変数として送信できるようにエンコードする必要があります (ここでも、MAX Post サイズの問題は無視しています)。json エンコードに続いて base64 エンコードを選択し、特殊文字を削除します。Sender モジュールは、cURL を使用して Destination に POST 要求を行います。次に、成功したかどうかを確認するために応答を待ちます。
<?php
function mysendermodule_sendNode($node){
$destination = "http://www.otherdrupalsite.com/recieve-node";
//encode the node to be sent
$encoded = base64_encode(json_encode($node));
//built POSTVARS
$postvars = 'node='.$encoded;
//make cURL call to send the node
$ch = curl_init($destination);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
curl_setopt($ch, CURLOPT_HEADER ,0); // DO NOT RETURN HTTP HEADERS
curl_setopt($ch, CURLOPT_RETURNTRANSFER ,1); // RETURN THE CONTENTS OF THE CALL
$return= curl_exec($ch);
curl_close($ch);
//see if we got back a success message
if ($return == 'TRUE'){
return true;
}
return false;
}
カスタム レシーバー モジュールを使用して、他の Drupal サイト (レシーバー) に移動します。最初に、メニュー フックを使用して、ノードを受け取るための宛先ポイントを作成する必要があります。次に、受信したノードをデコードし、node_save を使用してプログラムで挿入し、成功または失敗を返す必要があります。そのようです:
<?php
function myrecievermodule_menu(){
$items['recieve-node'] = array(
'page callback' => 'myrecievermodule_recieveNode',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK,
);
return $items;
}
function myrecievermodule_recieveNode(){
$message = 'FALSE';
//did we recieve a node?
if ($_POST['node']){
//decode it
$node = json_decode(base64_decode($_POST['node']));
//does it have a valid node object field?
if (isset($node->title)){
//attempt to save it (will return nid if successful)
if (node_save($node)){
$message = 'TRUE';
}
}
}
//return just the output of message.
ob_clean();
ob_start();
echo $message;
ob_end_flush();
exit;
}
繰り返しますが、これはこれを実装する際に直面する多くの問題を無視していますが、可能です。