it-swarm.asia

تحديث حقل برمجياً ، hook_node_update

تحاول حاليًا تحديث حقل في كل مرة يتم فيها إنشاء عقدة أو تحديثها. ومع ذلك ، لا يتم ملء القيمة داخل العقدة ، هل يمكنني الوصول إلى كائن العقدة باستخدام هذا الخطاف بالتحديد؟ ما الذي يمكن أن أفقده؟

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

    }
13
generalconsensus

أغلفة بيانات تعريف الكيان

توفر واجهة برمجة تطبيقات الكيان بعض فئات المجمّع التي قد تستخدمها للتعامل بسهولة مع الكيانات والاستفادة من وحدات معلومات خصائص الكيان المقدمة. بمساعدة الأغلفة ، يمكنك الوصول إلى معلومات الملكية ، والتكرار فوق الخصائص المعروفة ، أو فقط الحصول على/تعيين قيم البيانات الموصوفة ، إلخ.

هذه بعض أمثلة الاستخدام البسيطة كما هو موضح في README:

للاستفادة من هذه المعلومات (البيانات الوصفية) ، توفر الوحدة بعض فئات الغلاف التي تسهل الحصول على القيم وتعيينها. يدعم المجمّع الاستخدام المتسلسل لاسترداد الأغلفة لخصائص الكيان ، على سبيل المثال للحصول على عنوان بريد مؤلف العقدة ، يمكن استخدام:

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

لتحديث عنوان بريد المستخدم يمكن للمرء أن يستخدم

$wrapper->author->mail->set('[email protected]');

أو

$wrapper->author->mail = '[email protected]';

تقوم الأغلفة دائمًا بإرجاع البيانات كما هو موضح في معلومات الموقع ، والتي يمكن استرجاعها مباشرة عبر الكيان_get_property_info () أو من الغلاف:

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

من أجل فرض الحصول على قيمة نصية مطهرة للإخراج يمكن للمرء أن يستخدم ، على سبيل المثال.

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

للحصول على عنوان العقدة المطهرة. عندما يتم إرجاع خاصية تم تعقيمها بالفعل بشكل افتراضي ، مثل نص العقدة ، قد يرغب المرء في الحصول على البيانات غير المطهرة كما ستظهر في متصفح لحالات الاستخدام الأخرى. للقيام بذلك ، يمكن للمرء تمكين خيار "فك الترميز" ، والذي يضمن لأي بيانات معقمة يتم تجريد العلامات وتشفير كيانات HTML قبل إرجاع الخاصية:

$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

16
retif

استدعاء 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_loadnode_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'); أيضًا. هذا لن يخلق مراجعة جديدة.

14
grobemo

هذه هي الطريقة التي تغير بها القيم على العقدة:

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

تحسين حل لانس أعلاه ، وتجنب حفظ عقدة كاملة عندما يتم تعديل عدد قليل من قيم الحقول:

$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

1
amuli