ক্ষেত্রটি তৈরি হয়ে গেলে আমি কীভাবে তার মেশিনের নাম পরিবর্তন করব


18

ফিল্ডের নাম টাইপ করার সময় আমি স্পেস আউট করে ফেলেছি এখন মেশিনের নামটি আমি এটির মতো হতে চাইনি। আমি জানি এটি কেবল বিরক্তি। তবে আমি ভাবছি যে কোনও ক্ষেত্র তৈরি হয়ে গেলে তার নাম পরিবর্তন করার কোনও উপায় আছে কিনা some

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

উত্তর:


15

সংক্ষেপে, আপনি মেশিনের নাম পরিবর্তন করতে পারবেন না। তত্ত্বগতভাবে, এটি স্পষ্টতই সম্ভব, তবে এটির জন্য ডেটাবেসটি নিয়ে বেশ কিছুটা গণ্ডগোলের প্রয়োজন হবে। আপনি যদি কেবলমাত্র ক্ষেত্রটি তৈরি করেছেন, এটি অপসারণ এবং একটি নতুন তৈরি করা অনেক সহজ।

বুনিয়াদি হ'ল সমস্ত এন্ট্রিগুলিকে নতুন করে নামকরণ করা হবে field_configএবং field_config_instanceআপনি ক্ষেত্রটি ব্যবহার শুরু করার সাথে সাথেই মেশিনের নামগুলি একশো আলাদা জায়গায় সংরক্ষণ করা হবে। ভিউ কনফিগারেশন, প্যানেল কনফিগারেশন, বৈশিষ্ট্যগুলি এবং আরও অনেক কিছু এবং ততক্ষণে এটি পরিবর্তন করা মজাদার নয়

ক্ষেত্রগুলি মোছার কাজটি এখানে করা যায়: admin/structure/types/manage/[machine_name_of_content_type]/fieldsআপনি যে কোনও সামগ্রীর ধরণের " ক্ষেত্রগুলি পরিচালনা করুন " ট্যাবের মাধ্যমে পৌঁছাতে পারবেন ।


তবে ক্ষেত্রগুলি এখনও ডাটাবেসে থাকে না, উদাহরণস্বরূপ, আমি পপার নাম দিয়ে একটি নতুন ক্ষেত্র তৈরি করেছি, তবে আমি যখন কোনও সামগ্রীর ধরণের সাথে একটি নতুন ক্ষেত্র যুক্ত করতে যাই, তখনও পুরানো ক্ষেত্রের নামটি বিকল্প হিসাবে উপস্থিত হয় .. সম্ভবত ক্ষেত্রগুলি কীভাবে কাজ করে তা আমি বুঝতে পারছি না।
ব্যবহারকারীর 379468

1
একটি কার্যকারিতা রয়েছে যা আমি খুব বেশি তদন্ত করে দেখিনি, যা ক্ষেত্রগুলি এবং তাদের সামগ্রী সময়ের সাথে সাথে মুছে ফেলে। কারণটি হ'ল হাজারে এন্ট্রি সহ কোনও ক্ষেত্র মুছে ফেলার সময় কোনও সাইটটি থামতে পারা যায়। যদি ক্ষেত্রটি কোথাও ব্যবহার না করা হয় তবে আমি আশা করব যে এটি পরবর্তী ক্রোন রান হয়ে চলে যাবে।
লেথারিওন

আমি একটি সাইট কোড এবং ডাটাবেস ডাম্পে সেড -i -es / old_field / new_field / করার চেষ্টা করেছি। দুর্ভাগ্যক্রমে, কিছু ভুল হয়েছে এবং ডাম্প পুনরুদ্ধারের সাইটটি ত্রুটিযুক্ত ছিল। কোনও ধারণা কীভাবে এটি সঠিকভাবে করবেন?
দিমিত্রি ভয়াল

1
@ দিমিত্রি ভয়াল: ক্ষেত্রের নামটি সিরিয়ালযুক্ত অ্যারেতে কয়েকটি স্থানে সংরক্ষণ করা হয় - একটি স্ট্রিংকে অন্য দৈর্ঘ্যের অন্য স্ট্রিংয়ের পরিবর্তে অ্যারের unserialize () ভাঙতে পারে এবং সম্ভবত পরবর্তী বুটস্ট্র্যাপ বা দ্রুপাল ভাঙতে পারে।
চার্লি শ্লিয়েসার

@ চার্লি এস: ধন্যবাদ, ভবিষ্যতে এটি যত্ন নেবে।
দিমিত্রি ভয়াল

16

আমার পদ্ধতিটি হ'ল প্রথমে ক্ষেত্রটি ক্লোন করতে ড্রাশ ব্যবহার করা, তারপরে নতুন ফিল্ড টেবিলের সাথে ডিবি ক্যোয়ারী সহ ফিল্ড ডেটা অনুলিপি করুন। ক্লোন করা ক্ষেত্রের সামগ্রীগুলি যাচাই করার পরে আমি আসল ক্ষেত্রটি মুছব delete

আমি এটি এইভাবে করি কারণ আমি মনে করি ক্লোনিংয়ের ক্ষেত্রগুলির ড্রাশ পদ্ধতিটি সর্বদা আমি যে কোনও ক্লোনিং কোড হিসাবে নিজেকে তৈরি করতে পারি তার পক্ষে কমপক্ষে নির্ভরযোগ্য হবে, ডেটা অনুলিপি কোয়েরিটি বেশ সহজ, এবং আসলটি মুছে ফেলার আগে আমি নতুন ক্ষেত্রটি পরীক্ষা করতে পারি ।

  1. drush field-clone field_my_field field_my_field_clone
  2. এর মধ্যে সারি সন্নিবেশ করান field_my_field_clone, যেমন,INSERT field_my_field_clone SELECT * FROM field_my_field;
  3. এর বিষয়বস্তু যাচাই করুন field_my_field_clone
  4. ইউআই ব্যবহার করে ক্ষেত্রটি মুছুন, উদাহরণস্বরূপ, admin/structure/types/manage/my-content-type/fields

1
এটা অসাধারণ! ডি 7 এর জন্য: INSERT ফিল্ড_ডাটা_ফিল্ড_মি_ফিল্ড_ক্লোন নির্বাচন করুন * ক্ষেত্র_ডাটা_ফিল্ড_মি_ফিল্ড; INSERT ফিল্ড_রিভিশন_ফিল্ড_মাই_ফিল্ড_ক্লোন নির্বাচন করুন * FROM ফিল্ড_রিভিশন_ফিল্ড_মি_ফিল্ড;
joelpittet

আমি জানতাম না "ড্রশ ফিল্ড-ক্লোন" কমান্ড আছে! দুর্দান্ত :)
লোভাউ

ভিউ, প্যানেল ইত্যাদির কী হবে? ম্যানুয়াল ফিক্স?
zkent

আপনি যদি ড্রাশ ব্যবহার করছেন তবে আপনি সরাসরি ক্ষেত্রটি মুছে ফেলতে পারেন drush field-delete xxxএবং আপনি drush sql-queryনিউব্রিডের পরামর্শ মতো পছন্দ করতে পারেন । @ জাকেন্ট, আপনি বিদ্যমান ভিউ, প্যানেল ইত্যাদিতে নতুন ক্ষেত্রটিকে পুনরায় সংযুক্ত করতে পারবেন
xaa

10

ড্রুপাল 7 এ, আপনি ক্ষেত্রের পুনর্নামকরণ মডিউলটি ব্যবহার করতে পারেন । ড্রুপাল 6 এ, আপনি সিসিকে ক্ষেত্রের নাম পরিবর্তন মডিউলটি ব্যবহার করতে পারেন ।


1
এই মডিউলটির এখন একটি ড্রুপাল 7 সংস্করণ রয়েছে drupal.org/project/field_rename
ডারেল ডুয়েন

এটা কাজ করে। সর্বাধিক নীচে নাম দৈর্ঘ্য রাখা মনে রাখবেন।
ফ্রান্সিসকো মোরেলেস মোরালেস

6

আমি একটি আপডেট স্ক্রিপ্ট লিখেছি, যা নতুন মেশিনের নামের সাথে একটি নতুন ক্ষেত্র এবং উদাহরণ তৈরি করে, পুরানো ক্ষেত্রের সমস্ত ডেটা নতুনটিতে অনুলিপি করে এবং শেষ পর্যন্ত পুরানো দৃষ্টান্তটি মুছে দেয়।

// Set variables
$old_name = 'field_old_name';
$new_name = 'field_new_name';
$entity_type = 'node';
$bundle = 'page';

// Get old field info
$old_field = field_info_field($old_name);

// Create new field
$new_field = $old_field;
$new_field['field_name'] = $new_name;

if (!field_info_field($new_name)) {
  field_create_field($new_field);
}
else {
  field_update_field($new_field);
}

// Get old field instance
$old_instance = field_info_instance($entity_type, $old_name, $bundle);
$new_instance = $old_instance;
$new_instance['field_name'] = $new_name;

if (!field_info_instance($entity_type, $new_name, $bundle)) {
  field_create_instance($new_instance);
}
else {
  field_update_instance($new_instance);
}

// Migrate old fields' data to the new ones
$field_data = db_select('field_data_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($data = $field_data->fetchAssoc()) {
  $data_new = array();
  foreach ($data as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $data_new[$column] = $value;
  }
  db_insert('field_data_' . $new_name)
    ->fields($data_new)
    ->execute();
}

// Migrate old fields' revision data to the new ones
$field_revision = db_select('field_revision_' . $old_name, 'old')
  ->fields('old')
  ->condition('entity_type', $entity_type)
  ->condition('bundle', $bundle)
  ->execute();

while ($revision = $field_revision->fetchAssoc()) {
  $revision_new = array();
  foreach ($revision as $column => $value) {
    $column = str_replace($old_name, $new_name, $column);
    $revision_new[$column] = $value;
  }
  db_insert('field_revision_' . $new_name)
    ->fields($revision_new)
    ->execute();
}

// Delete old instance
field_delete_instance($old_instance);

// Purge fields
field_purge_batch(1000);

2

আমাকে কেবল এটি করতে হয়েছিল এবং এটি খুব বেশি কঠিন নাও হতে পেরেছিল তবে আমার সাইটটি মোটামুটি সহজ।

এটা চেষ্টা কর:

  1. সঠিক নাম দিয়ে একটি নতুন ক্ষেত্র তৈরি করুন।
  2. এই প্রশ্নগুলি মাইএসকিউএল চালান:
INSERT INTO field_data_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_data_[OLD MACHINE NAME]` cf
INSERT INTO field_revision_[NEW MACHINE NAME] (entity_type, bundle, deleted, entity_id, revision_id, language, delta, field_fabric_color_pattern_tid) SELECT cf.* FROM  `field_revision_[OLD MACHINE NAME]` cf

([নতুন ম্যাচনি নাম] এবং [পুরাতন মেশিন নাম] এর সাথে সরিয়ে আউট field_your_field_names)

  1. নতুন ক্ষেত্রটি ব্যবহারের জন্য জড়িত কোনও মতামত এবং যে নির্দিষ্ট ক্ষেত্রের দিকে ইঙ্গিত করে এমন কোনও মডিউল আপডেট করুন (এটি আপনার সাইট জটিল হলে জিনিসগুলি কুৎসিত হতে পারে)। আপনি এখানে আপনার পুরানো ক্ষেত্র ব্যবহার করে এমন কোনও দর্শন দেখতে পারেন:/admin/reports/fields/views-fields
  2. সাইটের ক্যাশে সাফ করুন

2

// ফিল্ড স্টোরেজ টেবিলের নাম পরিবর্তন করুন। এখানে আমরা পুরানো টেবিলের নামটি নতুন নাম দিয়ে পরিবর্তন করছি।

db_rename_table($data_table_name, 'field_data_' . $new_field_name);
db_rename_table($revision_table_name, 'field_revision_' . $new_field_name);

// ফিল্ড_কনফিগ এবং ফিল্ড_ইনস্ট্যান্স_কনফিগ সারণিতে ক্ষেত্রের নামগুলি পরিবর্তন করুন।

db_update('field_config')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

db_update('field_config_instance')
  ->fields(
    array(
      'field_name' => $new_field_name,
    )
  )
  ->condition('field_name', $field_name, '=')
  ->execute();

1

উপরের ড্রাশ ফিল্ড-ক্লোন উত্তরের সাথে আপনি ড্রাশের সাথেও শেষ মাইএসকিউএল পদক্ষেপটি করতে পারেন (ডি 7 উদাহরণ):

drush sql-query "INSERT field_data_field_my_field_clone SELECT * FROM field_data_field_my_field"

drush sql-query "INSERT field_revision_field_my_field_clone SELECT * FROM field_revision_field_my_field"

0

আপনি যদি মাইএসকিএল-এ ঝাঁকুনি না দেখতে চান তবে ফিল্ড ভ্যালু কপি বলে আমি লিখেছিলাম এমন একটি ড্রাশ স্ক্রিপ্ট চেষ্টা করতে পারেন ।

আপনাকে প্রথমে আপনার নতুন ক্ষেত্রটি সেটআপ করতে হবে এবং তারপরে কল করতে হবে

drush fieldcopy OLDFIELDNAME NEWFIELDNAME

পুরানো ক্ষেত্রটি মুছে ফেলার পরে এটি বিদ্যমান ক্ষেত্রগুলিকে নতুন ফিল্ডে স্থানান্তরিত করবে।



-3

আপনার ডাটাবেসের এসকিউএল ফাইলটি রফতানি করুন, sedপরিবর্তনের জন্য শব্দটির সমস্ত উপস্থিতি প্রতিস্থাপন করতে কমান্ড লাইনটি ব্যবহার করুন এবং আপনার ডাটাবেসটি পুনরায় আমদানি করুন।


1
আপনার মন্তব্যকে অগ্রাহ্য করা হয়েছে কারণ ডাটাবেসে যেখানে ক্ষেত্রের নামগুলি পিএইচপি সিরিয়ালযুক্ত রয়েছে সেখানে কয়েকটি জায়গা থাকার কারণে এই পদ্ধতিটি আপনার ড্রুপাল ইনস্টলেশনটিকে ধ্বংস করে দেবে। এই সম্পর্কে আরও তথ্যের জন্য, উপরের গৃহীত উত্তরের নীচে @ চার্লিএস (এবং অন্যান্য) এর মন্তব্য দেখুন।
hargobind
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.