Drupal版本:7.21
字段收集模块版本:7.x-1.0-beta5
简短说明:我正忙于尝试以编程方式导入字段集合,但是在删除其中一些字段时,总会剩下一些“伪”字段集合。
详细说明:我的用户的个人资料上有一个字段收集字段。该字段集合包含3个文本字段。我想将数据从自定义sql数据库导入到用户的字段集合中。该字段集合可以具有多个值。当我第一次导入数据时,一切正常,我在字段集合的字段中看到了数据。大。
但是,这是棘手的部分。假设我为一个特定用户从定制数据库中导入了5行。它们被添加到字段集合中,因此此字段集合有5个项目,每个项目包含3个字段。然后,从自定义数据库中删除一些行,以使该用户仅剩下3行。我再次运行导入,更新了字段集合的前3个项目,但是接下来剩下的是前一次导入的2个项目。应该删除它们,因为我只有3个导入行,但仍然有5个字段收集项。
因此,我尝试删除这些字段收集项,但始终剩下一个或多个项。当我查看用户个人资料时,这些字段为空,但那里还是有东西。假设此时我在自定义数据库中为该用户添加了5个新行,因此该用户总共有8行。然后,我再次运行导入。前3个项目得到更新,但是当我尝试添加第4行时,它仍然从第4个字段集合项中获取实体ID,尝试对其进行更新,但失败并返回此错误:
Fatal error: Call to undefined method stdClass::save()
我尝试使用以下每种方法删除字段收集项:
// Method 1
entity_delete_multiple('field_collection_item', array($fc_id));
// Method 2
$field_collection_item = field_collection_item_load($fc_id);
$field_collection_item->delete();
// Method 3
$field_collection_item = field_collection_item_load($fc_id);
$field_collection_item->deleteRevision();
这是我的完整代码:
function import_user_field_collection(&$user, $old_user_id) {
// I do a query to get the rows I want to import for this specific user.
db_set_active('custom_sql_database');
$result = db_query("SELECT * FROM {users} WHERE user_id = :user_id", array(':user_id' => $old_user_id));
db_set_active('default');
$i = 0; // Keep count of how many rows I imported.
foreach($result as $row) {
// Check if the field collection item already exists.
if(!empty($user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'])) {
// If it does exists, update this particular field collection item.
$fc_id = $user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'];
$field_collection_item = entity_load('field_collection_item', array($fc_id));
// These 3 text fields are children of the field collection field.
$field_collection_item[$fc_id]->field_profile_diploma_instituut[LANGUAGE_NONE][0]['value'] = $row->instituut;
$field_collection_item[$fc_id]->field_profile_diploma_vakgebied[LANGUAGE_NONE][0]['value'] = $row->vakgebied;
$field_collection_item[$fc_id]->field_profile_diploma_jaar[LANGUAGE_NONE][0]['value'] = $row->jaar_diploma;
$field_collection_item[$fc_id]->save(TRUE);
} else {
// If the field collection item doesn't exist I want to create a new field collection item.
$field_collection_item = entity_create('field_collection_item', array('field_name' => 'field_profile_diploma_opleiding'));
$field_collection_item->setHostEntity('user', $user);
$field_collection_item->field_profile_diploma_instituut[LANGUAGE_NONE][0]['value'] = $row->instituut;
$field_collection_item->field_profile_diploma_vakgebied[LANGUAGE_NONE][0]['value'] = $row->vakgebied;
$field_collection_item->field_profile_diploma_jaar[LANGUAGE_NONE][0]['value'] = $row->jaar_diploma;
$field_collection_item->save(TRUE);
}
$i++;
}
$fc_fields = field_get_items('user', $user, 'field_profile_diploma_opleiding');
// Check if there are more field collection items than imported rows
if(count($fc_fields) > $i) {
for($i; $i <= count($fc_fields); $i++) {
// Run through each field collection item that's left from the previous import and delete it.
if(!empty($user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'])) {
// Method 1
$fc_id = $user->field_profile_diploma_opleiding[LANGUAGE_NONE][$i]['value'];
entity_delete_multiple('field_collection_item', array($fc_id));
// Method 2
//$field_collection_item = field_collection_item_load($fc_id);
//$field_collection_item->delete();
// Method 3
//$field_collection_item = field_collection_item_load($fc_id);
//$field_collection_item->deleteRevision();
}
}
}
}
所以我的问题是:如何删除字段收集项以使它们实际上消失了?
entity_delete_multiple()
。删除字段后,您可能需要运行cron几次(按计划清除字段数据,以免单页加载处理所有工作)
entity_delete_multiple
是100%绝对正确的方法-查看field_collection_field_delete
功能,这是移除引用字段时Field Collection本身用来清理项目的功能