将新字段添加到内容类型后,使用默认字段更新所有节点


15

我有一个带有多个节点的现有内容类型。我刚刚添加了一个默认值为“ off”的新布尔字段。

但是,在我重新保存每个节点之前,未设置默认值,因此仅应显示新字段使用默认值的那些节点的视图当前为空。

如何更新在添加字段之前创建的现有节点,以将该字段设置为其默认值?


我使用此精彩视频中概述的Views Bulk Operations and Rules解决了此问题:commerceguys.com/resources/articles/217
DanH 2011年

重新保存节点模块可能有助于您强制更新节点。
Supriya Rajgopal'9

Answers:


9

遗憾的是,没有一种非常简单的方法(VBO /规则除外),但这是我在自定义模块安装文件中的更新函数中使用的代码,当我需要在添加新字段后预先填充特定节点类型的字段值时(在这种情况下,“页面”节点):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

此答案中提到的另一种手动方法使用EntityFieldQuery并加载/保存每个节点。Drupal-y较多,但性能较差...(需要完整的节点加载并为每个节点保存操作!)。


很难过
AlxVallejo 2014年

您是否看到“字段默认值”模块?dgo.to/field_defaults
森林

运行这样的代码而不从实体加载缓存中清除所有受影响的节点是一个错误entity_get_controller('node')->resetCache($nids);-否则后续操作node_load()可能会从缓存中加载陈旧数据,并且node_save()该对象中的任何一个都会将该陈旧数据回到数据库中。
phils

2

最好的选择是直接在MySQl中。这些表如下所示:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

如果您看一下它们,这很简单-您是否需要我来让您开始查询的外观,还是可以从这里开始?


谢谢Mike,不,我可以真正处理SQL并不是问题。我只是觉得应该有一个“重新保存”选项或作为批量操作提供的东西,我想我可能实际上是在看VBO和Rules集成。
DanH 2011年

明白了 我处于类似的位置,我正在将大约30,000条文章从另一个CMS迁移到Drupal。当SQL快速又肮脏时,我看不到添加另一个模块的意义。也许您还可以编写一个快速函数,该函数将为所有节点调用node_load(),这也可能起作用。
迈克,

0

只需尝试下面的逻辑。它的速度要快得多,并且还绕过了所有钩子实现。更多细节。您可以编写一个简单的直接db_select查询来获取所有nid,并使用此示例代码对其进行循环。

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

使用sql,考虑未设置字段值的节点是

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document是与我的字段对应的表,并且包含一个条目par值,该条目的par值设置为与节点有关的实体id

我确实使用SQL插入...选择语法

https://dev.mysql.com/doc/refman/5.5/zh-CN/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

安装并启用“ 视图批量操作”模块,并创建带有页面显示的视图。

添加=>批量操作:视图中的“内容(Content)”字段。

参考

在此处输入图片说明

选择要设置默认值的字段。

保存视图,然后转到它创建的页面。如果结果有一页以上,则可以选择选择当前页面上的所有项目,所有页面上的所有项目,或者可以手动选中与各个节点相对应的复选框。必须至少选中一个复选框才能继续。

现在,您设置默认值并保存。


0

我找到了一种使用此模块更新内容类型字段的简便方法: 字段默认值

参见屏幕截图。您可以使用默认值更新现有内容或保留现有值。

我已经在D7上对其进行了测试,并且可以正常工作。

在此处输入图片说明

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.