我可以将节点对象传递$node
给另一个 Drupal 实例(另一个 Drupal 站点)吗?
- 让我们忘记节点冲突......和问题等......
- 是否可以将 Drupal 节点对象传递给另一个 Drupal 实例?
- 如何将该节点传递到另一个 Drupal 站点?
纯粹假设地说,你可以。我将忽略您在尝试此操作时会遇到的许多问题(最大 POST 大小,假设两个站点具有相同的节点类型和字段,等等。)
在您的 Drupal 站点“A”(您的发件人)上,我假设您的脚本是一个名为“mysendermodule”的自定义模块中的 PHP 脚本,而在您的 Drupal 站点“B”(您的接收者)上,您有一个名为“myrecievermodule”的自定义模块”。
您的发送者模块需要以一种可以将其作为 POST 变量发送的方式对 $node 对象进行编码(同样,我们忽略了 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;
}
同样,这忽略了您在实现此功能时将面临的许多问题,但是这是可能的。