ড্রুপাল সংস্করণ: 7.21
ক্ষেত্র সংগ্রহের মডিউল সংস্করণ: 7.x-1.0-বিটা 5
সংক্ষিপ্ত ব্যাখ্যা : আমি ফিল্ড সংগ্রহগুলি প্রোগ্রামগতভাবে আমদানির চেষ্টাতে ব্যস্ত আছি তবে তাদের কিছু মুছার সময় সবসময় কিছু 'বোগাস' ফিল্ড সংগ্রহ বাকী থাকে।
দীর্ঘ ব্যাখ্যা : আমার ব্যবহারকারীদের প্রোফাইলে একটি ক্ষেত্র সংগ্রহের ক্ষেত্র রয়েছে। এই ক্ষেত্রের সংগ্রহে 3 টি পাঠ্য ক্ষেত্র রয়েছে। আমি ব্যবহারকারীর ক্ষেত্র সংগ্রহের জন্য একটি কাস্টম এসকিএল ডাটাবেস থেকে ডেটা আমদানি করতে চাই। এই ক্ষেত্র সংগ্রহের একাধিক মান থাকতে পারে। যখন আমি প্রথমবার ডেটা আমদানি করি যখন সবকিছু ঠিকঠাক হয়, আমি ক্ষেত্র সংগ্রহের ক্ষেত্রগুলিতে ডেটা দেখি। গ্রেট।
তবে এখানে আসে জটিল অংশ। ধরা যাক আমি কাস্টম ডেটাবেস থেকে একটি নির্দিষ্ট ব্যবহারকারীর জন্য 5 টি সারি আমদানি করি। তারা মাঠের সংগ্রহে যোগ হয়, সুতরাং এই ক্ষেত্র সংগ্রহে প্রতিটি 3 টি ক্ষেত্র সমেত 5 টি আইটেম রয়েছে। তারপরে আমি আমার কাস্টম ডাটাবেস থেকে কয়েকটি সারি মুছলাম যাতে এই ব্যবহারকারীর জন্য আমার কাছে কেবল 3 টি সারি থাকে। আমি ফিল্ড সংগ্রহের প্রথম 3 টি আইটেম আপডেট করে আবার আমদানি চালাই, তবে তারপরে আমি পূর্ববর্তী আমদানি থেকে 2 টি আইটেম রেখেছি। সেগুলি মুছে ফেলা উচিত কারণ আমার কাছে কেবল 3 টি আমদানি করা সারি রয়েছে তবে 5 টি ক্ষেত্র সংগ্রহের আইটেম রয়েছে।
সুতরাং আমি এই ক্ষেত্র সংগ্রহ আইটেমগুলি মুছে ফেলার চেষ্টা করেছি, কিন্তু সবসময় এক বা একাধিক আইটেম বাকি আছে। ক্ষেত্রগুলি শূন্য হয় যখন আমি ব্যবহারকারীর প্রোফাইল দেখি তবে এখনও সেখানে কিছু আছে। এই মুহুর্তে বলি আমি আমার কাস্টম ডাটাবেসে ব্যবহারকারীর জন্য 5 টি নতুন সারি যুক্ত করি, সুতরাং এই ব্যবহারকারীর জন্য আমার কাছে মোট 8 টি সারি রয়েছে। তারপরে আমি আবার আমদানি চালাই। প্রথম 3 টি আইটেম আপডেট হয়, তবে তারপরে আমি যখন চতুর্থ সারি যুক্ত করার চেষ্টা করি তখনও এটি 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
ফাংশনটি দেখুন, যা ক্ষেত্র সংগ্রহ যখন রেফারেন্সযুক্ত ক্ষেত্রটি সরানো হয় তখন আইটেমগুলি পরিষ্কার করতে নিজেই ব্যবহার করে