【问题标题】:Drupal 8 store node data alternative in storeDrupal 8 存储节点数据替代存储
【发布时间】:2017-04-04 10:23:48
【问题描述】:

不要有太多的代码示例,只是一个问题和一个想法。

我希望能够使用弹性 DSL 查询将节点数据(来自内容创建)保存到内部数据存储中。

我听过/看过关于 Drupal 支持 MongoDB 的幻灯片,这让我认为这是可行的。即使我必须重写 NodeForm/save 处理程序,是否有办法为此目的操纵节点实体?

【问题讨论】:

    标签: php elasticsearch drupal drupal-8


    【解决方案1】:

    这是完全可行的。我们在所有 Drupal 项目中都使用 Elasticsarch,主要用于全文搜索。每个节点保存两次:

    • 一次在 Drupal 的数据库中,这是每个代码行中使用的节点
    • 在 Elasticsearch 索引中有一次,这个永远不会“使用”;我们使用全文搜索来查找 nid,然后在 Drupal DB 中检索完整对象

    您可以使用elasticsearch_connector 模块来获得这样一个易于使用的管理器:

    $cluster = Cluster::load('ES-CLUSTER');
    $clientManager = \Drupal::service('elasticsearch_connector.client_manager');
    $client = $clientManager->getClientForCluster($this->cluster);
    

    然后使用这个客户端来管理你的节点的索引:

    function hook_node_insert($node) {
      $client->insert($node);
    }
    function hook_node_update($node) {
      $client->update($node);
    }
    function hook_node_insert($node) {
      $client->delete($node);
    }
    

    工作的最大部分是创建映射(如果您希望通过模块对其进行管理),但这里elasticsearch_connector 将为您提供工具:

    $client->indices()->putMapping($params); 
    $client->indices()->putSettings($params); 
    $client->search($params); 
    

    【讨论】:

    【解决方案2】:

    我的想法是让他们保存两次。首先,拥有普通节点,其次是使用那些“弹性 DSL 查询”(不确定它们是什么)。

    无论如何,你可以使用hook_node_presave()

    http://www.drupalcontrib.org/api/drupal/drupal%21core%21modules%21node%21node.api.php/function/hook_node_presave/8

    每次正常节点保存完成时都会调用它,您可以将代码用于“弹性 DSL”保存。通过该挂钩,您可以访问将要保存的数据,但如果需要,您也可以更改它们。

    【讨论】:

    • 缺点是任何一个建议中的钩子都是 Drupal 8 的一部分:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-28
    • 2014-07-12
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多