드루팔 버전 : 7.21
필드 수집 모듈 버전 : 7.x-1.0-beta5
간단한 설명 : 프로그래밍 방식으로 필드 컬렉션을 가져 오려고하는데 바쁘지만 일부를 삭제하면 항상 '가짜'필드 컬렉션이 남아 있습니다.
자세한 설명 : 내 사용자는 자신의 프로필에 필드 수집 필드를 가지고 있습니다. 이 필드 모음에는 3 개의 텍스트 필드가 있습니다. 사용자 지정 SQL 데이터베이스에서 사용자의 필드 컬렉션으로 데이터를 가져오고 싶습니다. 이 필드 컬렉션은 여러 값을 가질 수 있습니다. 데이터를 처음 가져올 때 모든 것이 제대로 작동하면 필드 컬렉션의 필드에 데이터가 표시됩니다. 큰.
그러나 여기 까다로운 부분이 있습니다. 사용자 정의 데이터베이스에서 특정 사용자 5 행을 가져옵니다. 필드 콜렉션에 추가되므로이 필드 콜렉션에는 각각 3 개의 필드를 포함하는 5 개의 항목이 있습니다. 그런 다음 사용자 정의 데이터베이스에서 일부 행을 삭제 하여이 사용자에 대해 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
기능을 살펴보십시오 . 참조 된 필드를 제거 할 때 필드 컬렉션 자체가 항목을 정리하는 데 사용됩니다