【问题标题】:Drupal create node with body programmaticallyDrupal 以编程方式创建带有主体的节点
【发布时间】:2017-10-03 13:06:33
【问题描述】:

我正在尝试使用 php 脚本在 Drupal 7 中创建节点,然后使用 Drush 执行。

虽然我能够创建一个带有标题的基本节点,但由于某种原因我无法设置正文。

我使用在其他论坛上找到的不同建议尝试了两种不同的方法。

第一种情况,直接设置节点元素:

...
$node->title = 'Your node title';
$node->body[$node->language][0]['value'] = "<p>this is a test</p>";
$node->body[$node->language][0]['summary'] = "body summary;
$node->body[$node->language][0]['format'] = 'full_html';

在第二种情况下,使用实体包装器:

$node_wrapper = entity_metadata_wrapper('node', $node);
$node_wrapper->body->set(array('value' => '<p>New content</p>', 'format' => 'full_html'));

在这两种情况下,我都将节点保存如下:

$node = node_submit($node);
node_save($node);

在这两种情况下,我都会发布一个新节点,但主体永远不会设置或显示。

如何正确设置要保存的新节点的主体?

【问题讨论】:

    标签: php drupal drupal-7 drush


    【解决方案1】:

    要使用包装器(需要实体模块)创建节点,请尝试以下代码:

    $entity_type = 'node';
    $entity = entity_create($entity_type, array('type' => 'article'));
    $wrapper = entity_metadata_wrapper($entity_type, $entity);
    $wrapper->title = 'title';
    $wrapper->body->value = 'body value';
    $wrapper->body->summary = 'summary';
    $wrapper->body->format = 'full_html';
    $wrapper->save();
    

    在Сергей Филимонов的例子中,他没有调用node_object_prepare($node)(需要node->type),它设置了一些默认值(启用评论,是否提升到首页的节点,设置作者,...) ,因此这些方法之间存在差异。

    $entity = entity_create($entity_type, array('type' => 'article'));  
    

    可以替换为

    $entity = new stdClass();
    $entity->type = 'article';
    

    【讨论】:

    • 我没有使用“entity_create”,我使用了“new stdClass”(这不是一个完整的例子),我会试试看。
    • 相应地编辑了帖子。
    【解决方案2】:

    我发现这里有两个问题

    1. 语言
    2. 捆绑类型

    如果是新节点,请使用 LANGUAGE_NONE 或您的站点语言。

    对于新对象 $node->language 将为空,您会收到通知:

    注意:未定义的属性:stdClass::$language

    此代码适用于我:

    $node = new stdClass();
    $node->title = 'Your node title';
    $node->type = 'article';
    $node->language = LANGUAGE_NONE;
    $node->body[$node->language][0]['value'] = '<p>this is a test</p>';
    $node->body[$node->language][0]['summary'] = 'body summary';
    $node->body[$node->language][0]['format'] = 'full_html';
    $node = node_submit($node);
    node_save($node);
    

    始终在此处设置正确的节点包类型 $node->type。它是节点内容类型的机器名称。

    所以转到管理/内容页面并使用您的新节点查看行:

    • 空类型列 - 捆绑包问题。
    • 未定义的语言 () - 语言问题。

    但是您可以尝试使用 node_load() 函数加载您的节点,使用 var_dump() 打印它并查看您的字段,可能是节点输出的问题。

    【讨论】:

    • 是的,我正在做所有这些......这不是一个完整的例子......问题是身体永远不会出现。
    【解决方案3】:

    同意Сергей,只是想补充一点,node_object_prepare() 也应该被调用:

    https://api.drupal.org/api/drupal/modules%21node%21node.module/function/node_object_prepare/7.x

    $node = new stdClass();
    $node->type = 'article';
    node_object_prepare($node);
    

    然后设置其他值,title,body...

    【讨论】:

    • 是的,我正在做所有这些......这不是一个完整的例子......问题是身体永远不会出现。
    • 尝试加载和打印一些现有文章的对象(在后端创建)以查看确切的节点对象结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多