প্রোগ্রামটিমে কোনও নোড থেকে ক্ষেত্রটি কীভাবে সরানো যায়?


16

কীভাবে প্রোগ্রাম থেকে কোনও নোড থেকে একটি ক্ষেত্র সরিয়ে ফেলতে পারে? আমার একটি স্থানান্তর আছে hook_update_Nযা এএ ক্ষেত্র থেকে সামগ্রীগুলি একটি কাস্টম টেবিলের দিকে নিয়ে যায়। সেই স্থানান্তরের পরে, আমি একই ফাংশনে ক্ষেত্রটি সরাতে চাই।

ক্ষেত্র অপসারণের ক্ষেত্রের এমন কোনও ফিল্ড এপিআই রয়েছে?

সম্পাদনা, সমাধান : কারণ উত্তরগুলির প্রকৃত কোডের অভাব রয়েছে, কারণ আমি ব্যবহারকারীদের থেকে ক্ষেত্রগুলিকে আমার নিজের রেকর্ডে স্থানান্তর করতে এবং পরবর্তীকালে ডাটাবেস থেকে ক্ষেত্রটি সরাতে এখানে যা করেছি;

function my_module_update_7005(&$sandbox) {
  $slice = 100;
  //Fetch users from database;
  if (!isset($sandbox['progress'])) {
    $sandbox['progress'] = 0;
    $sandbox['current_uid'] = 0;
    // We'll -1 to disregard the uid 0...
    $sandbox['max'] = db_query('SELECT COUNT(DISTINCT uid) FROM {users}')->fetchField() - 1;
  }
  if (empty($users)) {
    $sandbox["current_uid"] += $slice;
  }
  $users = db_select('users', 'u')
    ->fields('u', array('uid', 'name'))
    ->condition('uid', $sandbox['current_uid'], '>')
    ->range(0, $slice)
    ->orderBy('uid', 'ASC')
    ->execute();
  //Loop trough users;
  foreach ($users as $user) {
    $foo = new Foo();
    // Warning: drupal's fields return mixed values; e.g. NULL versus an int.
    $foo->debits = (int) $user->user()->field_credits["und"][0]["value"];
    $foo->save();

    $sandbox['progress']++;
    $sandbox['current_uid'] = $user->uid;
  }

  $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['progress'] / $sandbox['max']);

  // Remove the field.
  field_delete_field("field_credits"); //note that the name for Foo is field_foo
  field_purge_batch($sandbox['max']+1);//Drupal seems to have an offbyone problem.
}

উত্তর:


29

field_delete_field($field_name)$field_nameপরবর্তী ক্রোন রান চালানোর জন্য মুছে ফেলার জন্য চিহ্নিত করবে ।

আপনি field_purge_batchমুছে ফেলার কাজটি করতে পারেন, যদি আপনি ক্রোন রান করে এটি না করতে চান।

সম্পাদনা: field_delete_field() আপনার অন্যান্য বান্ডিল থেকেও ক্ষেত্রটি মুছতে হবে যখন ব্যবহার করা উচিত। আপনি যদি কেবলমাত্র একটি নির্দিষ্ট বান্ডিল থেকে ক্ষেত্রটি মুছতে চান তবে আপনাকে field_delete_instance()@ ক্লাইভ দ্বারা উল্লিখিত হিসাবে ব্যবহার করা উচিত ।


4
সাবধান, এটি ক্ষেত্রটি অন্য যে কোনও বান্ডিলের সাথে এটি সংযুক্ত থাকতে পারে সেগুলি থেকেও সরিয়ে ফেলবে :) field_purge_batchযদিও জানা ভাল
ক্লাইভ

@ ক্লাইভ: ঠিক আছে, এটি ক্ষেত্রের সমস্ত বান্ডিল মুছে ফেলবে। সংশোধন করার জন্য আপনাকে ধন্যবাদ :) আমি উত্তর সম্পাদনা করেছি।
অজিতস

আমি ক্ষেত্রটি পুরোপুরি, অর্থাৎ সমস্ত বান্ডিল থেকে সরাতে চাইনি। তবে সতর্কবার্তাটি ভাল। ধন্যবাদ।
বার্কস

1
ফিল্ড_ডিলেট_ইনস্ট্যান্স () যাওয়ার উপায়।
রায়ান ম্যাকভিঘ

ফিল্ড_পুর্জ_বাচ () আসলে ব্যাচ আকারের যত ফিল্ড আইটেম এতে পাস হবে কেবল তা মুছে ফেলবে delete ক্ষেত্রের কয়েকটি আইটেম থাকলে ক্ষেত্রের উদাহরণটি সম্পূর্ণরূপে মুক্তি পাওয়ার জন্য এটি আপনাকে সাহায্য করতে পারে, ক্রোনটি পরিষ্কার করার জন্য আপনাকে ক্রোন অপেক্ষা করার দরকার নেই। আপনার যদি ক্ষেত্রের অনেক মান থাকে তবে ব্যাচের আকার খুব বেশি বাড়িয়ে দেওয়ার প্রলোভন করবেন না (নামে "ব্যাচ" এর অর্থ এই নয় যে এটি কোনও ব্যাচিং নিজেই করবে, এর অর্থ কেবল এটি একটি একক ব্যাচ করে যতগুলি আইটেম আপনি এটি জিজ্ঞাসা করুন); আপনি পিএইচপি মেমরি বা সময় সীমাতে শেষ হতে পারে।
ইল্কে ব্লক

24

কোনও নির্দিষ্ট বান্ডিল থেকে কোনও ক্ষেত্র অপসারণ করতে আপনি ব্যবহার করতে পারেন field_delete_instance()

মুছে ফেলার জন্য কোনও ফিল্ড উদাহরণ এবং এর ডেটা চিহ্নিত করে।

উদাহরণ:

function my_module_update_7001() {
  if ($instance = field_info_instance('node', 'field_name', 'page'))  {
    field_delete_instance($instance, TRUE);
    field_purge_batch(1);
  }
}

সিস্টেম থেকে কোনও ক্ষেত্র সম্পূর্ণরূপে সরাতে আপনি ব্যবহার করতে পারেন field_delete_field()

মোছার জন্য একটি ক্ষেত্র এবং এর দৃষ্টান্ত এবং ডেটা চিহ্নিত করে।

উদাহরণ:

function my_module_update_7001() {
  field_delete_field('field_name');
  field_purge_batch(1);
}

ক্ষেত্রগুলি / দৃষ্টান্তগুলি কেবল মুছে ফেলার জন্য চিহ্নিত করা হয়েছে, পরবর্তী ক্রোন রান চলাকালীন ডেটা আসলে মুছে ফেলা হবে। এটিকে ম্যানুয়ালি কার্যকর করতে:

field_purge_batch(1);

1
কল করার সময় field_delete_field()এবং field_purge_batch()কাজ করার সময়, এটি রেকর্ডটি রাখে field_config_instanceএবং করে field_config। কেন এমন?
বার্কস

1-এর মান সহ ফিল্ড_পুর্জ_বাচে কল করা সমস্ত ক্ষেত্রের ডেটা থেকে মুক্তি পাবে কেন আমি যথেষ্ট তা পাই না। যদি আমি কোডটি সঠিকভাবে বুঝতে পারি তবে এটি $ ব্যাচসাইজ সত্তাগুলির ক্ষেত্রের ডেটা পেয়ে যায় এবং এটিতে এটি ছেড়ে দেয় (অর্থাত্ পুনরাবৃত্তভাবে ফাংশনটি কল করা বা কোনও কিছু নয়); দেখে মনে হবে যে সমস্ত ডেটা গেছে কিনা তা কলারের উপর নির্ভর করে এবং যদি না হয়, তবে ফাংশনটি কল করতে থাকুন। তবে সম্ভবত আমি মূলত কিছু ভুল বুঝছি।
ইল্কে ব্লক

আসলে, এই ক্ষেত্রের_উই.ডমিন.ইনকের এই মন্তব্যটি এটি ব্যাখ্যা করার ক্ষেত্রে অনেক বেশি এগিয়ে যায়: // ক্ষেত্রগুলি ক্রোনটিতে পরিষ্কার হয়। তবে ফিল্ড মডিউলটি মডিউলগুলি অক্ষম করা রোধ করে // যখন তারা প্রদত্ত ক্ষেত্রের ধরণগুলি সম্পূর্ণভাবে শুদ্ধ না হওয়া অবধি কোনও ক্ষেত্রে ব্যবহৃত হয়। ক্ষেত্রের মধ্যে ন্যূনতম বা কোনও সামগ্রী নেই সে ক্ষেত্রে, ক্ষেত্র_পুরজ_বাচে () থেকে একটি একক কল // এটি সিস্টেম থেকে সরিয়ে ফেলবে। যখন // এই শর্ত পূরণ করে এমন দৃষ্টান্তগুলি সরানো হয় তখন ক্রোন রানের জন্য অপেক্ষা করতে না পারার জন্য প্রশাসকদের এড়াতে // লো ব্যাচের সীমাতে এটিকে কল করুন।
ইল্কে ব্লক

@ ক্লাইভ, আমি বিশ্বাস করি আপনি পরামর্শটি বেশ স্পষ্টভাবেই লিখেছেন, তবে কোনও শর্তে কোনও ঘোষণাপত্র পাওয়া আমার কাছে কতটা অদ্ভুত বলে মনে হচ্ছে আমি তা পেতে পারি না। এটা কি উদ্দেশ্য? আমি উল্লেখ করছি $instance = field_info_instance('node', 'field_name', 'page')। পরিবর্তে এটি হওয়া উচিত নয় $instance = field_info_instance('node', 'field_contact', 'job');এবং তারপর যদি বিবৃতিটি ফেলে দেয়?
সিডমো

1
@ সিডমোকে একে "শর্তে অ্যাসাইনমেন্ট" বলা হয় এবং হ্যাঁ এতে সমস্যা আছে । তবে দ্রুপাল কোর এটি সর্বশেষতম সংস্করণে এমনকি উদার ব্যবহার করে, তাই এটি অন্ততপক্ষে নজির রয়েছে। সত্যি কথা বলতে কি এটি 5 বছর আগে ছিল এবং আমি এখন কিছুটা বুদ্ধিমান, আমি হয় এটি ব্যবহার করি না, বা যদি যাই হোক না কেন কারণের জন্য আমি অ্যাসাইনমেন্টটি গুটিয়ে রাখি (যেমন if ( ($foo = $bar) ) {উদ্দেশ্যটি স্পষ্ট এবং সম্ভাব্য ত্রুটিটি সীমিত - যদি বিবৃতিটি নিজেই প্রয়োজনীয় কারণ field_delete_instance
ক্লাইভ

5

@ বার্কস প্রশ্নের উত্তর দিতে:

field_delete_field()মুছে ফেলার জন্য ক্ষেত্রটি চিহ্নিত করে, যার ফলে পরবর্তী ক্রোন রান থেকে এটি শুদ্ধ হয়ে যায়। তবে এটিfield_config_instance বাদ দেওয়া ক্ষেত্র সম্পর্কিত ডেটা ছেড়ে দেয় না। ক্রোন চলমান বা মুছে ফেলা কলামটি ক্ষেত্রের জন্য সেট করা থাকলেও টেবিল field_purge_batch()থেকে এই ডেটাটি সরাবে না ।field_config_instance1

আমার প্রতিটি ক্রেনড ফিল্ডের জন্য field_delete_instance()একটি field_purge_batch()ব্যবহার করে কাজ করা - তাত্ক্ষণিকভাবে উভয় ক্ষেত্রটি ডাটাবেস থেকে (ক্রোনের প্রয়োজন ছাড়াই) অপসারণ করার পাশাপাশি field_config_instanceকোনও ক্ষেত্রের ডেটা সারণী মুছে ফেলা (মুছে ফেলা ক্ষেত্রের জন্য)।

সমাধান এখানে:

/**
 * Implements hook_uninstall().
 */
function hook_uninstall() {
  // Delete all fields for all xyz entity bundles.

  // Retrieve all bundles for an entity.
  $bundles = field_info_bundles('XYZ'); // The name of your entity type, for example, 'node'.
  foreach ($bundles as $bundle => $properties) {

    // Retrieve all the fields for a given bundle.
    $instances = field_info_instances('XYZ', $bundle);
    foreach ($instances as $instance) {
      field_delete_instance($instance, TRUE);
      field_purge_batch(1);
    }
  }
}

TRUEঅন নোট করবেন না field_delete_instance(), কারণ এটি নির্দেশ করে যে ফিল্ড এপিআই-এর ক্লিনআপ অপারেশন করা উচিত।


এই কোডটি কীভাবে ব্যবহার করবেন? আমি কোনও সামগ্রীর ধরণ থেকে শিরোনাম ক্ষেত্রটি মুছতে চাই
ওমায়ের
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.