Drupal以编程方式使用body创建节点

时间:2017-05-05 06:52:41

标签: php drupal drupal-7 drush

我正在尝试使用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';

在第二种情况下,使用Entity Wrappers:

$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);

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

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

2 个答案:

答案 0 :(得分:2)

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

$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-&gt; type),它设置了一些默认值(启用了注释,是提升到首页的节点,设置作者,。 ..),所以这些方法之间存在差异。

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

可以替换为

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

答案 1 :(得分:1)

我在这里看到两个问题

  1. 语言
  2. 捆绑类型
  3. 如果是新节点,请使用LANGUAGE_NONE或您的网站语言。

    对于新对象$ node-&gt;语言将为空,您会收到通知:

      

    注意:未定义的属性: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-&gt; type。它是节点内容类型的机器名称。

    请转到admin / content页面,查看新节点的行:

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

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