নোডগুলিতে "দ্বারা পরিবর্তিত"


9
mysql> select nid, uid, created, changed from node;
+-----+-----+------------+------------+
| nid | uid | created    | changed    |
+-----+-----+------------+------------+
|   1 |   8 | 1336040166 | 1336046390 |
+-----+-----+------------+------------+

আমি nodeটেবিলে একটি "পরিবর্তিত" কলামটি রাখতে চাই , ঠিক যেমনটি আমাদের একটি "তৈরি" (ইউআইডি ক্ষেত্র) রয়েছে। কে এই নোডে শেষ পরিবর্তন করেছে তা ট্র্যাক করে রাখবে। আমি জানি যে এটি node_revisionটেবিল থেকে নেওয়া যেতে পারে তবে এটি আমার আগ্রহী বিষয়বস্তুর জন্য সক্ষম হওয়া সংশোধনগুলির উপর নির্ভর করে।

সুতরাং, এটি করার সর্বোত্তম উপায় কী? এবং কেন ড্রুপাল কোর ডিফল্টরূপে এটি প্রস্তাব করে না? আমি ভেবেছিলাম যে "পরিবর্তিত" হ'ল একটি মানক তথ্য যা একটি সিএমএসকে সামগ্রীতে সংযুক্ত করা উচিত standard


2
এমন কোনও কারণ আছে যা আপনি সংশোধন সক্ষম করতে পারবেন না? আপনার যা প্রয়োজন তা পাওয়ার সহজ উপায় বলে মনে হচ্ছে। এটা সম্ভবত আমি কি করতাম। লোকেরা ঘন ঘন নোডগুলি সম্পাদনা করতে চলেছে, এর অর্থ এটিও হ'ল আপনার আগের সংস্করণগুলির ব্যাকআপ রয়েছে।
চাঁপবু

হ্যা আমি পারি. nodeযদিও মূল টেবিলে এটি রাখা সম্ভব কিনা তা আমি জানতে চাই । এটি আরও সোজা দেখায় looks
চেরোভিম

উত্তর:


18

আমি ভেবেছিলাম এটি করা বেশ শক্ত হবে, তবে এটি প্রমাণিত হয়েছে যে এটি মোটামুটি সহজ।

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

এখানে একটি ছোট মডিউল যা কৌশলটি করবে:

ফাইল: নোড_ট্যাবল_াল্টার.ইনফো o

name = Node Table Alter
core = 7.x

ফাইল: নোড_ট্যাবল_াল্টার.ইনস্টল

function node_table_alter_install() {
  // Add the new field to the node table
  $field = array(
    'description' => 'Stores the user id of the last user to alter the node',
    'type' => 'int',
    'unsigned' => TRUE
  );

  db_add_field('node', 'changed_by', $field);
}

ফাইল: নোড_টেল_লটার.মডিউল

function node_table_alter_schema_alter(&$schema) {
  // Add the new field to the schema cache
  $schema['node']['fields']['changed_by'] = array(
    'description' => 'Stores the user id of the last user to alter the node',
    'type' => 'int',
    'unsigned' => TRUE
  );
}

function node_table_alter_node_presave($node) {
  // Populate the changed_by column with current user's id
  $node->changed_by = $GLOBALS['user']->uid;
}

আপনি আনইনস্টল করে আবার ক্ষেত্রটি সরাতে যুক্তি যুক্ত করতে এবং changed_byকলামের জন্য টেবিলটিতে একটি সূচক যুক্ত করতে (দেখতে db_add_index()) দেখতে চাইতে পারেন , তবে এটি আপনাকে শুরু করার জন্য একটি ভাল জায়গা দেয়।

এই পদ্ধতির সৌন্দর্য হ'ল আপনি কার্যকরভাবে নোডে একটি নতুন সম্পত্তি যুক্ত করেছেন। আপনি এটির সাথে ব্যবহার করতে সক্ষম হবেন node_load(), EntityFieldQueryযেমন এটি কোনও নোডের জন্য অন্য কোনও মানক বৈশিষ্ট্য।

Rupশ্বর দ্রুপালকে এত প্রসারিত হওয়ার জন্য মঙ্গল করুন!


বিটিডাব্লু আপনি অন্য একই প্রশ্নের উত্তর দিতে ঠিক একই যুক্তি ব্যবহার করতে পারেন ।
ক্লাইভ

2
সম্পূর্ণ সত্তা ইন্টিগ্রেশনের জন্য এবং আপনি যদি সত্তা এপিআই মডিউলটি ব্যবহার করছেন তবে আপনাকে এই নতুন সম্পত্তি সম্পর্কে তথ্য প্রকাশের জন্য hook_entity_property_info () প্রয়োগ করতে হবে।
পিয়েরে বুয়েল

@ পিয়ারবুইল ভাল কথা, এটি সম্পর্কে ভাবেন নি
ক্লাইভ

1
এটি ইউআইডি মডিউলটি ঠিক তাই করে। অনুরূপ কিছু আরও সম্পূর্ণ বাস্তবায়নের জন্য এটি পরীক্ষা করে দেখুন। drupal.org/project/uuid
পল-মি

বিস্তারিত ব্যাখ্যা এবং পরিষ্কার সমাধানের জন্য অনেক ধন্যবাদ!
চেরোভিম

1

আমার ধারণা আপনি field_changed_by_userযে বিষয়বস্তুটি ট্র্যাক করতে হবে তার জন্য আপনি কোনও সত্তা রেফারেন্স ফিল্ড যুক্ত করতে পারেন (আসুন এটি কল করুন )। তারপরে আপনি hook_node_presaveনোডে এই জাতীয় ব্যবহারকারীর আইডি সংরক্ষণ করতে ব্যবহার করতে পারেন :

function hook_node_presave($node) {
  if ($node->nid && $node->type == 'content_type_to_track_changes_for') {
    global $user;
    $node->field_changed_by_user['und'][0]['target_id'] = $user->uid;
  }
}

আমি মনে করি কেবল একটি নিয়ম তৈরি করে ব্যবহারকারীর আইডি দিয়ে ফিল্ডটি আপডেট করাও সম্ভব। আপনি এখানে আরও পড়তে পারেন ।

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