我已经完成了将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中的值之间进行比较——这应该会突出任何微小的差异,比如额外的空格。。。