नोड्स पर "द्वारा परिवर्तित"


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

मैं nodeटेबल पर "बदला हुआ" कॉलम रखना चाहता हूं , ठीक उसी तरह जैसे हमारे पास "(यूआईडी फील्ड)" द्वारा बनाया गया है। यह उस नोड पर अंतिम परिवर्तन करने वाले पर नज़र रखेगा। मुझे पता है कि यह node_revisionतालिका से प्राप्त किया जा सकता है, लेकिन यह उन संशोधनों पर निर्भर करता है जो मेरी रुचि के प्रकारों के लिए सक्षम की जा रही हैं।

तो, ऐसा करने का सबसे अच्छा तरीका क्या है? और Drupal core इसे डिफ़ॉल्ट रूप से क्यों नहीं पेश करता है? मैंने सोचा था कि "द्वारा बदल दिया गया" एक सुंदर मानक जानकारी है जिसे सीएमएस को सामग्री से जोड़ना चाहिए।


2
क्या कोई कारण है कि आप संशोधन करने में सक्षम नहीं हो सकते हैं? लगता है कि आप क्या जरूरत है पाने के लिए सबसे आसान तरीका है। यह शायद मैं क्या करूँगा। यदि लोग बार-बार नोड्स को संपादित करने जा रहे हैं, तो इसका मतलब यह भी है कि आपके पास पिछले संस्करणों का बैकअप है।
चापाबू

हाँ मैं कर सकता हूँ। मैं जानना चाहता हूं कि क्या यह संभव है कि यह मुख्य nodeटेबल पर हो। यह ज्यादा सीधा लगता है।
चेरोविम

जवाबों:


18

मैंने सोचा कि यह करना काफी कठिन होगा, लेकिन जैसा कि यह पता चला है कि यह काफी आसान है।

आपको बस एक कस्टम मॉड्यूल बनाने की ज़रूरत है जो इंस्टॉल करने पर नोड तालिका में एक कॉलम जोड़ता है, hook_schema_alter()इसलिए लागू करें Drupal नए कॉलम के बारे में जानता है, और नोड सहेजे जाने से पहले एक मान प्रदान करने के लिए कुछ तर्क जोड़ें।

यहाँ एक छोटा मॉड्यूल है जो चाल करेगा:

फाइल: node_table_alter.info

name = Node Table Alter
core = 7.x

फ़ाइल: node_table_alter.install

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);
}

फ़ाइल: node_table_alter.module

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एस, आदि इसके साथ जैसे कि यह एक नोड के लिए अन्य मानक गुण के किसी भी थे।

भगवान ने द्रुपाल को इतना विस्तार देने का आशीर्वाद दिया!


BTW आप अपने अन्य प्रश्न का उत्तर देने के लिए बिल्कुल उसी तर्क का उपयोग कर सकते हैं ।
क्लाइव

2
पूर्ण इकाई एकीकरण के लिए, और यदि आपका एंटिटी एपीआई मॉड्यूल का उपयोग कर रहा है, तो आपको इस नई संपत्ति के बारे में सूचना देने के लिए हुक_एंटिटी_प्रॉपर्टी_इनफो () को लागू करने की आवश्यकता होगी।
पियरे बाइल

@PierreBuyle अच्छा बिंदु, कि नहीं सोचा था
क्लाइव

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;
  }
}

मुझे लगता है कि केवल नियम बनाकर उपयोगकर्ता की आईडी के साथ क्षेत्र को अपडेट करना भी संभव है। आप यहाँ और पढ़ सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.