Kaydetme sonrası işlemler için hangi kancayı kullanabilirim?


16

Bu aynı soruyla birkaç gönderi buldum, ancak cevaplar her zaman başka bir konuya yöneliyor veya ihtiyaçlarım için çalışmıyor.

Bir düğüm kaydedildikten sonra, özel modülümün, yeni düğümün nid'ini içeren özel tablolarımdan birine bir satır eklemesini istiyorum. Ne zaman hook_node_submitçağrılırsa, nid henüz mevcut değildir. hook_node_insertnid var, ama sadece düğüm ilk kaydedildiğinde çağrılır, ancak potansiyel olarak düğüm her kaydedildiğinde harekete geçmem gerekir.

Planım, işlevselliğimi kendi yöntemine ayırmak ve her iki kancayı da uygulamaktır, ancak Drupal ile işleri düzgün bir şekilde yapmayı öğrenmeye çalışıyorum ve bu yüzden gereksinimlerime gerçekten uyan bir kanca olup olmadığını merak ediyorum.

Her düğüm kaydedilişinde çağrılıp kayıt işlemi tamamlandıktan SONRA çağrılmış bir kanca var mı?


3
hook_node_insertve hook_node_update((düğüm her kaydedildiğinde gerçekleşir) birleşimini kullanabilirsiniz .
AjitS

Evet, bunu yukarıdaki yazıda anlattım.
Kenny Wyland

@KennyWyland bahsetmiştin hook_node_submitama değil hook_node_updatemi?
David Thomas

Düğümü içeride olduğu hook_node_insertgibi içeride alacaksınız hook_node_update.
Sumit Madan

2
hook_node_insert()ve hook_node_update()bunun için doğru kancalar hook_node_submit(), düğüm kaydedilmeden önce form gönderme işlemi sırasında çağrılır. Bir kanca eklediğinizde / çıkardığınızda önbellekleri temizlemeniz gerektiğini unutmayın
Clive

Yanıtlar:


5

Bariz çözüm kanca kullanmaktır gibi soru üzerine yorumlarına baktığımızda, göründüğü hook_node_insert()ve hook_node_update().

Aslında cevapta anlatıldığı gibi çok benzer bir şey yaptım: Her bir düğüm oluşturulduğunda / güncellendiğinde ne yapmak istediğimi yapan bir fonksiyon yazdım ve sonra bu kancaların her birinden çağırın. Sadece iyi çalışıyor.


Çok havalı! Bunu bile yapabilirsin hook_form_alter(). drupal.stackexchange.com/a/221041/15055
leymannx

1
@leymannx Bu yöntemin dezavantajı, yalnızca belirli bir form aracılığıyla bir düğüm eklendiğinde / güncellendiğinde çağrılmasıdır. Benim durumumda, düğümlerin tüm eklemelerini ve değişikliklerini yakalamam gerekiyordu.
donut

12

Bunu yapmanın doğru yolu Drupal'ın db işlemine saygı duymaktır. Hook_node_insert içinde herhangi bir veritabanı eylemi yapmak istiyorsanız, düğümün henüz kaydedilmediğini düşünmelisiniz. bu da başarısız olursa ve geri alınırsa, veritabanınızda artık verilerle karşılaşırsınız. Dolayısıyla Drupal veritabanı API'sı kullanılmalı ve doğrudan sorgu yürütülmemelidir.

Düğümün kendisini hook_node_insert içinde güncellemek istiyorsanız, düğüm henüz veritabanına kaydedilmediğinden ve çağrılması istisnaya neden olduğu için node_save kullanılamaz. Bir çözüm register_shutdown_function işlevini ve nid değerini iletmektir, gerçekten kaydedildiğinden emin olmak için node_load komutunu kullanabilir ve daha sonra yeni düğümde istediğiniz herhangi bir işlemi yapabilirsiniz.

function your_module_node_update($node){
  if($node->type == 'your_node'){
    register_shutdown_function('_your_module_post_insert',$node->nid);
  }
}

function _your_module_post_insert($nid) {
  $node = node_load($nid);
  if ($node) {
      node_save($node);
  }
} 

GÜNCELLEME: Burada daha kolay bir alternatif de bulabilirsiniz /programming//a/24035797/1726778


1
İyi bir fikir. Yine de kullanmak daha iyi drupal_register_shutdown_function(). Ancak, her ikisinin de php-fpm ortamında sorun yaşadığını unutmayın
Shevchuk

Bir düğümün Organik Grup olarak hareket edip etmediğini kontrol etmekte sorun yaşıyordum og_is_group. Sanırım bu nedenle yanlış negatifler alıyordum.
icicleking

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.