প্রোগ্রাম ফিল্মিকভাবে ফিল্ড আপডেট করা হচ্ছে, হুক_নোড_আপডেট


13

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

  function vbtoken_node_update($node) {


      entity_get_controller('node')->resetCache(array($node->nid));


      $types = node_type_get_types(); //What are the current Node Content Types?
      $yes = ($types['volunteer_project']->type);

      if($node->type === $yes){


        $hash = md5($node->title . $node->nid . $node->nid);
        $hashed = substr($hash, 0, 6);
        $node = node_load($node->nid);
        $node->tcode[$node->language][0]['value'] = $hashed;
        node_save($node);

        watchdog('vbtoken', 'Added a new Token code to %nid', array('%nid' => $node->nid));

        }
        else 
        {
          dpm('not working dude');
        }

    }

উত্তর:


16

সত্তা মেটাডাটা মোড়ক

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

README তে পাওয়া যায় এমন কয়েকটি সাধারণ ব্যবহারের উদাহরণ:

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

$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();

ব্যবহারকারীর মেল ঠিকানা আপডেট করতে যে কেউ ব্যবহার করতে পারে

$wrapper->author->mail->set('sepp@example.com');

অথবা

$wrapper->author->mail = 'sepp@example.com';

সম্পত্তির তথ্য বর্ণিত মোড়করা সর্বদা ডেটা ফেরত দেয় যা সত্তা_সেট_প্রোপার্টি_ইনফো () এর মাধ্যমে বা মোড়কের কাছ থেকে সরাসরি পাওয়া যায়:

$mail_info = $wrapper->author->mail->info();

আউটপুট জন্য স্যানিটাইজড একটি পাঠ্য মান পেতে বাধ্য করার জন্য, যেমন ব্যবহার করতে পারেন

$wrapper->title->value(array('sanitize' => TRUE));

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

$wrapper->body->value->value(array('decode' => TRUE));

ব্যবহারকারীর দেখানো মতে সর্বদা ডেটা পাওয়া যায়। তবে আপনি যদি স্যানিটাইজড টেক্সটাল ডেটা এমনকি সত্যিকারের কাঁচা, অ প্রসারণিত মান পেতে চান তবে আপনি এটির মাধ্যমে এটি করতে পারেন:

$wrapper->body->value->raw();

আরও উদাহরণ:

$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';

$wrapper->save();
$wrapper->delete();

আরও দস্তাবেজ : http://drupal.org/node/1021556


তোমাকে অনেক ধন্যবাদ. আপনার উত্তর আমাকে কী করতে হবে তার কিছু দিকনির্দেশনা দিতে সহায়তা করেছিল। :) সম্প্রদায় শিলা !! \ এম /
এসঘোষ

এই hook_node_update কাজ করবে কিন্তু না hook_node_insert উপর ()। আপনি মাইএসকিএল থেকে একটি সদৃশ প্রাথমিক কী ত্রুটি পাবেন, নোড মডিউল এবং আপনার কাস্টম কোড উভয় একই নোড দু'বার sertোকানোর চেষ্টা করবে (একই নোড আইডি ব্যবহার করে)।
leon.nk

14

আমার জন্য কাজ field_attach_update('node', $node)শেষে কলিং hook_node_update। আমি ধরে নিই যে field_attach_insert('node', $node)শেষেও hook_node_insertকাজ করবে। সুতরাং, একটি নমুনা ফাংশনটি এর মতো দেখায়:

function mymodule_node_update($node) {
  $new_value = // ...do some stuff to compute a new value for the field.
  $node->field_my_field[LANGUAGE_NONE][0]['value'] = $new_value;
  field_attach_update('node', $node);
}

কল করার node_load node_saveবা কোনও কিছু ফেরত দেওয়ার দরকার নেই।

আমি মনে করি এর কারণ হ'ল node_save, যা থেকে hook_node_updateএবং hook_node_insertবলা হয়, লেনদেনে সমস্ত ডেটাবেস কোয়েরিগুলিকে আবৃত করে। (প্রথম পংক্তির নোটটি নোট করুন node_save:। $transaction = db_transaction()) এই প্রশ্নগুলি node_saveশেষ না হওয়া পর্যন্ত বলা হয় না । সর্বশেষ ক্যোয়ারী যা node_saveলেনদেনে যুক্ত হয় সেখান থেকে কল করা হয় field_attach_update, যা $ নোড অবজেক্টটিকে আগে hook_node_update যেমন বলা হয় তেমনি ব্যবহার করে । সুতরাং আপনাকে field_attach_updateআবার কল করে আরেকটি প্রশ্নের সন্ধান করতে হবে। কমপক্ষে, এটি আমার বোধগম্য যা হচ্ছে।

নোডের (ক্ষেত্রবিশেষ) নন-ফিল্ড বৈশিষ্ট্যগুলি পরিবর্তন করতে আপনার যদি সমস্যা হয় তবে খুব $node->logকল করার চেষ্টা করুন _node_save_revision($node, $user->uid, 'vid');। এটি কোনও নতুন সংশোধন তৈরি করবে না।


2

আপনি নোডের মানগুলি এভাবে পরিবর্তন করেন:

$node = node_load($nodeID);
$node->field_fieldname['und'][0]['value'] = $val;
node_save($node);

4
undএখানে সত্যিই উপযুক্ত নয়, ওপি ইতিমধ্যে কোডে জানিয়েছে যে তারা $node->languageভাষা
ক্লাইভ

এটি ক্লাইভ এবং ল্যান্সের জন্য অত্যন্ত সহায়ক, তবে আমি নোডটি যখনই সংরক্ষণ করা হয় তখন ক্ষেত্রের মানটি সংরক্ষণ করা হয় তা নিশ্চিত করতে চাই, অতএব আমার হুক_নোড_আপডেট ব্যবহার। এই হুকের $ নোডটি ফেরানো কি সম্ভব হবে নাকি আমার একেবারে নোড_লোড করতে হবে? আমি সত্যিই ভেবেছিলাম আমার নোড অবজেক্টটি hook_node_update এর মাধ্যমে সরাসরি প্রবেশ করেছে ....
কনসেপ্ট

ঠিক আছে তাই আমি আপনার প্রস্তাবনা অনুযায়ী কোড আপডেট করেছি - এটি মূল শরীরে। সমস্যা: অন্তহীন লুপ যেখানে পৃষ্ঠাটি লোড হয় না এবং মাইএসকিএল এবং অ্যাপাচি উভয়ই সিপিইউতে 85% লোডের wardsর্ধ্বমুখী হতে শুরু করে। অবশ্যই এখানে কিছু লুপিং চলছে। অন্য কোন পরামর্শ?
generalconsensus

কি হচ্ছে তা আমি বলতে পারছি না। তবে সম্ভবত আপনি একবারে কেবল নোড লোড করার জন্য, ক্ষেত্রটিতে কিছু লিখুন এবং নোড_সেভ () ব্যবহার করে সংরক্ষণ করুন once অথবা কেবল লোড করুন, কিছু মুদ্রণ করুন (ওয়াচডগ বা ডিপিএম ব্যবহার করে) (এটি ব্যবহার করে কিনা তা দেখতে এটি আবার সংরক্ষণ করুন
ল্যান্স

ইস্যুটি নোডটিকে সংরক্ষণ করার আগে এটি পুনরাবৃত্ত লুপের ফলে সংরক্ষণ করার আগে সংরক্ষণ করা হয়েছিল। দরিদ্র হুক পছন্দ এবং দরিদ্র বিল্ড
23con12

1

উপরের লেন্সের সমাধানের একটি উন্নতি, যখন কেবলমাত্র কয়েকটি ক্ষেত্রের মান পরিবর্তন করা হয় তখন পুরো নোডের সঞ্চয় এড়ানো:

$node = node_load($nodeID);
// for each field whose value remains unchanged
unset($node->field_<field-name>); 
// for each field whose value changes
$node->field_<field-name>[LANGUAGE_NONE][0]['value'] = <new-value>;
field_attach_update('node', $node);
entity_get_controller('node')->resetCache(array($node->nid));

এর পার্শ্ব প্রতিক্রিয়া এড়াতেও এটি কার্যকর হতে পারে node_save()

উত্স: নোড নিজেই সংরক্ষণ না করে নোডের ক্ষেত্রগুলি সংরক্ষণ করা

https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself

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