2010-10-08 22 views
5

Bir $node verildiğinde, şu düğümün çıktılarını iki yol arasında karar vermeye çalışıyorum.

$output = theme('node', $node); 

veya

node_build_content($node); 
$output = drupal_render($node->content); 

Her ikisi de benzer sonuçlar veriyor gibi görünüyor, ama diğer yol üzerinde bir yol seçmeden önce düşünmem gereken bir şey var mı?

cevap

7

Çıktınız tema katmanından çıktıyı değiştirecek başka modül ve tema yoksa benzerdir.

Ama! Tema katmanını atlarsanız, büyük olasılıkla modülleri veya temaları yüklediğinizde ve düğümün çıktısını değiştirmek için tema katmanını kullanan yapılandırma ayarlarını değiştirdiğinizde beklenmedik davranışlar yaşamaya başlarsınız.

Kısacası, tema katmanını baypas ederek, uygulamanıza bir hata oluşturuyorsunuz. Bunlar hata (belki bir istemci) birine başvurunuzu teslim sonra eğer ilgilenirsen

dekoratör desen bakın/yönetici değişen ayarları başlar kim ortaya çıkması muhtemeldir. Drupal bunu yaygın olarak kullanıyor.

http://en.wikipedia.org/wiki/Decorator_pattern

+0

hangisi tema katmanını atlar? Bunu çok fazla baypas etme problemi yaratan theme() 'ı kullandığını anlıyorum. – JeroenEijkhof

+0

Eminim $ output = drupal_render ($ node-> content); etrafında gidiyor. – Rimian

0

Tema katmanından geçirildiği için ilk önce önerilir.

0

burada çalışan bu tekniklerin her ikisi de bir arada olan çözelti. Sadece theme('node', $node); kullanıyor node_build_content($node); yardımı olmadan işe yaramıyor.

İşte bir örnek sonucu yalnızca theme('node', $node); kullanıyor. Biz ilk teması işlevine $ düğümü çalışmalardan önce node_build_content($node); yaparsanız

alt text

Ama form düğmesi de render olduğunu görebiliriz.

alt text

nedenle, gerçek bir çözümdür:

node_build_content($node); 
$output = theme('node', $node); 
+1

node_view() bunu fonksiyonun kendisinde yapar + çıngırak çınlamak gibi iyi olan ek şeyler. – JeroenEijkhof

6

Eh, sortof. Eğer gerçekten istediğiniz ne

sadece node_build_content diyoruz ve sonra tema ('düğüm', $ düğüm) ararsanız hook_nodeapi('alter') asla denir,

$output = node_view($node); 

, ne de hook_link() olduğunu. Herhangi modül inşa düğüm değiştirmek için bekliyor eğer oradakiler de olmayacağım üzerinde bağlantılar olacaksa gerekiyordu eğer

Yani, alışkanlık için bir şans ve.

Ek olarak, bağlantıları olmayan düğümü veren $output = node_view($node, FALSE, FALSE, FALSE); numaralı telefonu arayabilirsiniz.

node_view() belgelerine bakın.

+0

Bu sadece keşfettiğim şey: 'node_view (stdClass node nesnesi, bool teaser, bool sayfası, bool linkler) . – JeroenEijkhof

1

drupal_render() kaynağına bakarsanız, aslında theme() kendisini de (#theme geçersiz kılma sağlanmıştır) çağırır. Drupal 7

1

, yapmanız gereken: Bunlardan

$elements = node_view($node, 'teaser'); 
$rendered_node = drupal_render($elements);