0

我可以将节点对象传递$node给另一个 Drupal 实例(另一个 Drupal 站点)吗?

  • 让我们忘记节点冲突......和问题等......
  • 是否可以将 Drupal 节点对象传递给另一个 Drupal 实例?
  • 如何将该节点传递到另一个 Drupal 站点?
4

1 回答 1

1

纯粹假设地说,你可以。我将忽略您在尝试此操作时会遇到的许多问题(最大 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;
    }

同样,这忽略了您在实现此功能时将面临的许多问题,但是这是可能的。

于 2012-10-08T21:27:19.190 回答