Drupal sürümü: 7.21
Alan toplama modülü sürümü: 7.x-1.0-beta5
Kısa açıklama : Alan koleksiyonlarını programlı olarak içe aktarmaya çalışmakla meşgulüm, ancak bazılarını silerken her zaman 'sahte' alan koleksiyonu kaldı.
Uzun açıklama : Kullanıcılarımın profillerinde bir alan toplama alanı var. Bu alan koleksiyonu 3 metin alanı içerir. Kullanıcının alan koleksiyonuna özel bir sql veritabanından veri almak istiyorum. Bu alan koleksiyonunun birden fazla değeri olabilir. Verileri ilk kez içe aktardığımda her şey yolunda gidiyor, veriyi alan koleksiyonunun alanlarında görüyorum. Harika.
Ama işin zor kısmı geliyor. Özel bir veritabanından belirli bir kullanıcı için 5 satır içe aktardığımı varsayalım. Alan koleksiyonuna eklenirler, bu nedenle bu alan koleksiyonunda her biri 3 alan içeren 5 öğe bulunur. Sonra bu kullanıcı için sadece 3 satır kaldı böylece benim özel veritabanından bazı satırları silin. Alan koleksiyonunun ilk 3 öğesini güncelleyerek içe aktarmayı tekrar çalıştırıyorum, ancak önceki içe aktarmadan 2 öğe kaldı. Yalnızca 3 içe aktarılmış satırım, ancak yine de 5 alan toplama öğem olduğu için silinmelidir.
Bu yüzden bu alan koleksiyonu öğelerini silmeye çalıştım, ancak her zaman bir veya daha fazla öğe kaldı. Kullanıcı profiline baktığımda alanlar boş ama hala orada bir şeyler var. Bu noktada, özel veritabanımda kullanıcı için 5 yeni satır eklediğimi varsayalım, bu nedenle bu kullanıcı için toplam 8 satırım var. Sonra içe aktarmayı tekrar çalıştırıyorum. İlk 3 öğe güncellenir, ancak daha sonra 4. satırı eklemeye çalıştığımda hala 4. alan toplama öğesinden bir varlık kimliği alır, güncellemeye çalışır, ancak başarısız olur ve bu hatayı döndürür:
Fatal error: Call to undefined method stdClass::save()
Aşağıdaki yöntemlerin her biri ile alan toplama öğeleri silmeyi denedim:
// 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();
Bu tam kodum:
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();
}
}
}
}
Benim sorum şu: Alan toplama öğelerini gerçekten gitmeleri için nasıl silebilirim?
entity_delete_multiple()
. Alanları sildikten sonra birkaç kez cron çalıştırmanız gerekebilir (alan verileri, yapılacak tüm işlemlerle tek bir sayfa yükü yüklememek için bir programda temizlenir)
entity_delete_multiple
% 100 kesinlikle bunu yapmanın doğru yoludur -field_collection_field_delete
fonksiyona bir göz atın , referans alınan alan kaldırıldığında Alan Koleksiyonu'nun kendisi öğeleri temizlemek için kullandığı şey