2

我大部分时间都是通过 Drupal 6 将 Drupal 5 站点迁移到 Drupal 7。CCK 内容迁移做得很好,但有一个例外:“选择列表”格式中的所有字段都有键|标签对的几个问题之一在他们的“允许值”列表中。

如果原来的“允许值”列表没有使用键|标签对,像这样:

Alabama
Alaska
Arizona 

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

1|Alabama
2|Alaska
3|Arizona

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

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

movie|Movie
television|Television
product_or_service|Product or Service

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

product_or_service | Product or Service

变成:

product_or_service|Product or Service

但这里的问题是密钥显示在节点(如 product_or_service)而不是标签(如产品或服务)中。

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

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

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

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

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

4

1 回答 1

0

1) 用正确的字符串替换 DB 中的数值。我会使用 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)确保键与数据库中的数据匹配 - 一旦它们相同,那么当您编辑节点时,它应该选择正确的值。如果您遇到问题,请在键的值和存储在数据库中的值之间进行比较 - 这应该突出显示任何细微的差异,例如额外的空格......

于 2012-09-04T08:53:16.593 回答