迁移到Drupal 7后,如何更正"select list"字段(和相应数据)中更改的键|标签对?



我已经完成了将Drupal 5站点通过Drupal 6迁移到Drupal 7的大部分工作。CCK内容迁移做得很好,但有一个例外:"选择列表"格式的所有字段的"允许值"列表中的键|标签对都有几个问题之一。

如果原始的"允许值"列表没有使用键|标签对,如下所示:

Alabama
Alaska
Arizona 

当允许的值迁移到Drupal7时,它们会自动更新为key|label格式,如下所示:

1|Alabama
2|Alaska
3|Arizona

这不会太糟糕,只是数据库中的实际数据没有相应地改变,所以现有数据会显示"Alabama"而不是"1"。据推测,任何新数据都会存储"1"而不是"Alabama"。此外,在编辑节点时,尽管该字段存在数据,但值"-None-"仍会在选择列表中预先选择。

在某些情况下,"允许值"列表确实使用了键|标签对(以字符串作为键),如下所示:

movie|Movie
television|Television
product_or_service|Product or Service

在这些情况下,密钥存储在数据库中。与前面的情况一样,在编辑节点(而不是显示现有数据)时,会预先选择值"-None-"。当迁移到Drupal7时,键|标签对没有改变,尽管我注意到空格被删除了,例如:

product_or_service | Product or Service

变成:

product_or_service|Product or Service

但这里的问题是,密钥显示在节点中(如product_or_service),而不是标签(如product或service)。

在所有情况下,从视图中的这些选择列表创建的公开过滤器都不会返回结果。我试着用其他不是选择列表的字段(比如文本字段)创建公开的过滤器,这些字段运行得很好(一旦在该视图的高级选项中选择了"使用AJAX")。

所以问题是:推进这些领域的最佳方式是什么?我希望对现有节点和新节点一致地使用键|标签数据。如果可能的话,我希望避免回到Drupal6重新开始迁移过程!

我在网上只找到了两个关于这个问题的参考资料。一个人似乎在遇到同样的问题后手动更新了数据(请参阅本文的单个评论)。我并不反对这样的解决方案,因为我们没有太多的节点,但我需要一些关于如何做到这一点的非常具体的指导(如果你知道我的意思的话,我通过phpMyAdmin访问我的数据库)。

另一个人似乎已经在Drupal 6中修复了它,但我希望避免回溯到6,因为我们已经在Drupal7中了,而且几乎已经完成了(除了这个)!在这种情况下,我可能也需要具体的指导。

有人经历过吗?或者知道一个智能/简单的解决方案?如有任何想法或建议,我们将不胜感激。非常感谢。

1)用正确的字符串替换数据库中的数值。我会用php来做这件事,比如:

$countries = db_query('SELECT nid, field_country_value FROM field_data_field_countries')->fetchAll();
$search = array(1,2,3);
$replace = array('Alabama', 'Alaska', 'Arizona');
while($country = db_fetch_array($countries)) {
    $country_name = str_replace($search, $replace, $country['field_country_value']);
    db_query('UPDATE field_data_field_countries SET field_country_value=:field_country_value WHERE nid=:nid', 
        array(':field_country_value'=>$country_name, ':nid'=>$country['nid']));
}

这可以从任何自定义模块运行。(我很抱歉,其中一些是在Drupal 7而不是Drupal 6代码中,但你明白了)

2) 确保键与数据库中的数据匹配——一旦它们相同,那么在编辑节点时,应该选择正确的值。如果你有问题,那么在键的值和存储在DB中的值之间进行比较——这应该会突出任何微小的差异,比如额外的空格。。。

相关内容

  • 没有找到相关文章

最新更新