Drupal संस्करण: 7.21
फ़ील्ड संग्रह मॉड्यूल संस्करण: 7.x-1.0-beta5
संक्षिप्त विवरण : मैं प्रोग्राम संग्रह को प्रोग्रामेटिक रूप से आयात करने की कोशिश में व्यस्त हूं, लेकिन जब उनमें से कुछ को हटा दिया जाता है तो हमेशा कुछ 'फर्जी' फ़ील्ड संग्रह शेष रह जाता है।
लंबी व्याख्या : मेरे उपयोगकर्ताओं के पास उनकी प्रोफ़ाइल पर फ़ील्ड संग्रह फ़ील्ड है। इस फ़ील्ड संग्रह में 3 टेक्स्ट फ़ील्ड हैं। मैं उपयोगकर्ता के क्षेत्र संग्रह में एक कस्टम sql डेटाबेस से डेटा आयात करना चाहता हूं। इस फ़ील्ड संग्रह में कई मान हो सकते हैं। जब मैं पहली बार डेटा आयात करता हूं तो सब कुछ ठीक काम करता है, मैं डेटा को फ़ील्ड संग्रह के क्षेत्रों में देखता हूं। महान।
लेकिन यहाँ मुश्किल हिस्सा आता है। मान लीजिए कि मैं कस्टम डेटाबेस से एक विशिष्ट उपयोगकर्ता 5 पंक्तियों के लिए आयात करता हूं। वे फ़ील्ड संग्रह में जुड़ जाते हैं, इसलिए इस फ़ील्ड संग्रह में 3 फ़ील्ड वाले 5 आइटम हैं। फिर मैं अपने कस्टम डेटाबेस से कुछ पंक्तियों को हटा देता हूं ताकि मेरे पास इस उपयोगकर्ता के लिए केवल 3 पंक्तियाँ बची रहें। मैं फिर से आयात चलाता हूं, फ़ील्ड संग्रह के पहले 3 आइटम को अपडेट करता हूं, लेकिन फिर मैं पिछले आयात से 2 आइटम के साथ छोड़ दिया जाता हूं। उन्हें हटा दिया जाना चाहिए क्योंकि मेरे पास केवल 3 आयातित पंक्तियाँ हैं लेकिन फिर भी 5 फ़ील्ड संग्रह आइटम हैं।
इसलिए मैंने इन फ़ील्ड संग्रह आइटमों को हटाने का प्रयास किया, लेकिन हमेशा एक या अधिक आइटम शेष हैं। जब मैं उपयोगकर्ता प्रोफ़ाइल को देखता हूं, तो फ़ील्ड खाली हैं, लेकिन वहां अभी भी कुछ है। मान लें कि इस बिंदु पर मैं अपने कस्टम डेटाबेस में उपयोगकर्ता के लिए 5 नई पंक्तियाँ जोड़ता हूं, इसलिए मेरे पास इस उपयोगकर्ता के लिए कुल 8 पंक्तियाँ हैं। फिर मैं फिर से आयात चलाता हूं। पहले 3 आइटम अपडेट हो जाते हैं, लेकिन तब जब मैं 4 वीं पंक्ति को जोड़ने की कोशिश करता हूं, तब भी इसे 4 फील्ड संग्रह आइटम से एक इकाई आईडी मिलती है, इसे अपडेट करने की कोशिश करता है, लेकिन विफल रहता है और इस त्रुटि को वापस करता है:
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()
। के बाद आप हटाना क्षेत्रों बार के एक जोड़े क्रॉन चलाने के लिए आवश्यकता हो सकती है (फ़ील्ड डेटा किसी शेड्यूल पर बोझ करने के लिए सभी के साथ एक एकल पृष्ठ लोड पर्ज है तो के रूप में नहीं है कि ऐसा करने के लिए प्रसंस्करण)
entity_delete_multiple
पर एक नज़र है - 100% निश्चित रूप से यह करने के लिए सही तरीका हैfield_collection_field_delete
समारोह है, जो है क्या फील्ड संग्रह ही आइटम को साफ करने का उपयोग करता है जब संदर्भित क्षेत्र निकाल दिया जाता है