使用View从另一个Drupal数据库加载节点


12

我正在尝试使用Views从另一个在settings.php中定义的Drupal数据库中加载节点,并使用'cms'键。这两个站点都是Drupal7。另一个数据库是一个不同的Drupal安装,它充当内容存储库或集中式CMS。我的目标是在目标站点上创建新的视图类型/组,因此,在创建视图时,站点构建可以选择“ CMS内容”而不是“内容”。我希望站点构建器能够正常地基于内容类型和集中式CMS站点中的内容来构建视图,即使我必须告知每种内容类型中所有字段的视图也是如此。

在我的hook_views_data()实现中,我设置了'database'键,但是在不覆盖$ data ['node']的情况下无法弄清楚如何从节点表中读取数据。

function cms_connector_views_data() {
  $data['cms_connector']['table']['group'] = t('CMS Content');
  $data['cms_connector']['table']['base'] = array(
    'field' => 'nid',
    'title' => t('CMS Content'),
    'help' => t('Content from the centralized CMS.'),
    'database' => 'cms',
  );

  return $data;
}

当然,这不是在寻找节点表,而是cms_connector在我的cms数据库中寻找一个不存在的表。

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'cms.cms_connector' doesn't exist

http://views-help.doc.logrus.com/help/views/api-tables说$ data中的键…

应该是表的实际数据库名称(不包括前缀),但可以是别名,只要连接信息(稍后说明)包含表的真实名称即可。

我实际上并不想进行联接,而是想从另一个数据库的节点表创建基表。但是在看到http://drupal.org/node/1713010#comment-6310438之后,我还是尝试了此方法(即使这实际上没有意义):

$data['cms_connector']['table']['join'] = array(
  'node' => array(
    'left_field' => 'nid',
    'left_table' => 'node',
    'field' => 'nid',
    'table' => 'node',
  ),
);

我在这里搜索,搜索和堆栈溢出,但是我发现的大部分是“其他数据库到Drupal”,而不是“ Drupal到Drupal”。

我在这里找到了/drupal/12736/using-nodes-from-another-site-database问题,但这是关于节点引用的,尚未得到解答。

我曾考虑过使用Services从集中式站点读取XML / JSON,但是这种方法存在很多障碍。我也不想同步节点。


1
通过创建扩展了views_plugin_query_default的自定义查询插件,我取得了一些进步。我在查询设置中添加了一个选项,该选项可切换视图并从其他数据库中提取数据。我可以从另一个数据库的节点表中提取节点标题和其他数据,但仍在努力获取字段。
科茨(Cottser)2012年

Answers:


1

考虑查看Forena模块。它可用于查询(而非更新)其他数据库中的数据。支持各种DBMS格式,例如另一个Drupal数据库。

Forena的构想是使用SQL从数据库中获取数据,并使用XHTML和CSS将其格式化为Web报表。有关Forena的更多详细信息,提供了2种类型的文档:

  • 社区文档
  • Forena随附的文档,您可以在安装和启用模块后立即访问。在演示站点上查看最新的在线示例:

    • Forena文档 -使用链接“报告文档”或访问相对链接/ reports / help。
    • Forena样本 -使用“报告样本”链接或访问相对链接/ reports / samples(这些样本功能齐全,因此请务必尝试一下,例如SVG Graph样本上的向下钻取)。

披露:我是Forena 的共同维护者,
我希望这不会违反该网站的自我宣传政策




-1

一种使用settings.php文件的选项。在settings.php文件中配置第二个数据库实例。设置实例后,使用该数据库使用db_set_active('drupal2')功能,并对第二个数据库执行任何操作。

例如

$databases = array(
    'default' =>
    array(
        'default' =>
        array(
            'database' => 'drupal1',
            'username' => 'root',
            'password' => '',
            'host' => 'localhost',
            'port' => '',
            'driver' => 'mysql',
            'prefix' => '',
        ),
    ),
    'cms' => // additional database starts here
    array(
        'default' =>
        array(
            'database' => 'cms',
            'username' => 'root',
            'password' => '',
            'host' => 'localhost',
            'port' => '',
            'driver' => 'mysql',
            'prefix' => '',
        )
    ),
);

在您的模块中,您可以使用以下两个数据库:

db_set_active('cms');
$node = node_load(10);
var_dump($node):

尽管这对视图没有帮助……
Cottser '16

您是否尝试过'database' => 'cms',用文件中的数据库cms配置了密钥。cmssettings.php
AshwinP '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.