Dil [und] ile çalışırken en iyi uygulama nedir?


51

Modülümdeki verilere erişmek için bu formu kullanmaya başladım. ( Yorum # 1'e bakınız .)

$node->field_test[$node->language][0]['value']

Ben oldukça iyi bir çözüm gibi görünüyordu, ancak daha fazla aynı sorunun aşağı buldum düşündüm bu :

'Und' öğesinin, dili olmayan varlıklar için, çevrilemeyen alanlar için ve tüm alanlar olan varlık çeviri modülü olmadan olduğunu varsaymayın. Dahası, bu konuda Drupal'ın çeşitli 7.x versiyonları arasında farklılıklar var. Verilerin hangi dil koduyla kaydedileceğini
belirleyen field_get_items()işlevi kullanmak daha iyidir.

Ve şimdi bilmiyorum ne kullanıyorum yoldan bir şey kırabilir mi.

Yanıtlar:


39

Varlık API modülünü kullanmanın çok yardımcı olduğunu ve aynı zamanda kodu daha okunaklı hale getirdiğini biliyorum . Düğümün dili ve alanın dili farklı olabileceğinden yukarıdaki kod her zaman çalışmaz.

Varlık API modülü ve sargısı ile aşağıdaki kodu kullanabilirsiniz:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

Bu kurşun geçirmez olmalı. Varlık modülünü kullanma ile ilgili bir şey, var olmayan bir alana erişmeye çalışırsanız, kötü bir hata ve bildirim ve yanlış davranış yerine atılan bir istisna elde edersiniz.

Bundan kaçınmak için, böyle yakalamaya çalışın

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Veya dahili olarak isset()hangi EntityMetadataWrappertutamaçları kullanabilirsiniz :

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

Bu işlev entity_metadata_wrapper()kullanımdan kaldırıldı mı? Modülümde bunu çağırmayı denedim ve anladım Fatal error: Call to undefined function entity_metadata_wrapper()- Dreamweaver'daki Drupal 7.12 kurulumumla ilgili kaynak araştırması yaptım ve kodun başka bir yerinde 0 sonuç buldum!
Aditya MP,

1
aditya - bu Varlık API modülünde - özünde değil.
lazysoundsystem

1
@adityamenon Tembel olduğu gibi, bunun özünde olmadığını söylüyor ... henüz, muhtemelen Drupal 8 için olacak. İşletme API'leri en azından büyük ölçüde iyileştirilecektir. Drupal 7 için varlık sistemi için gerekli olan tüm API'leri oluşturma zamanı gelmedi, bu yüzden varlık API modülünün elde etmeye çalıştığı şey bu.
googletorp

Teşekkürler millet, cevabı doğru okumamı ve Entity API proje sayfasının bağlantısını takip etmem konusunda aptaldım :)
Aditya MP

1
Entity_metadata_wrapper'ın kaynak kodunu okuduğumda ve tavşan izini daha kolay alan manipülasyonu sağlamak için başlatılmış ve genişletilmiş tüm sınıfların içinden takip ettiğimde, hepsine değip değmeyeceğini merak ediyorum. Önyüklememe başka bir 3k + kod satırı daha eklemek ve tüm değişken atamalarıyla başa çıkmak için daha fazla bellek almak ... daha hafif bir şey var mı? Görünüşe göre $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';bu gerçekten en etkili yol.
Charlie Schliesser

19

Okumak için, daima sizin için doğru dili seçecek olan field_get_items () yöntemini kullanabilmeli ve aynı zamanda alanın herhangi bir değeri olup olmadığını kontrol etmelisiniz.

Ne yazık ki, alan API 7.x'te çok sınırlıdır, örneğin ilk alan öğesini almanın bir yolu yoktur, tek bir işlev çağrısı ile değer elde etme hakkında soru sormaya bile cesaret edemezsiniz ... Ve hiçbir alan_set_items yok ( ) karşılık.

Bu yüzden evet, varlık API modülü , oldukça fazla ek yük getirdiği dezavantajıyla daha iyi bir API sağlar (Temel olarak her bir değeri, bunlara eklenmiş tonlarca iç içe özellik bilgi dizisi olan sarıcı nesnelere dönüştürür). Bir varlık sargısını atmaya çalışmak genellikle size hiçbir şey ya da okunamayan dizilerin bir duvarını verir.


1
Drupal 8'de böyle şeylerin iyileşebileceğini söylediklerinizden aldığım izlenimi edindim. Eğer öyleyse, bu tür şeylerin nasıl ilerlediğini bulmak nasıl bir şey olur? Modül sayfalarının dışında Do benim için bir labirent gibidir! :)
Clive

1
Eh, her zaman umut vardır :) Ve Drupal 8'de neler olup bittiğine dair yüksek düzeyde bir bakış açısı tutmak zordur, bir yol da girişimleri takip etmektir. Bu, mevcut direktiflerin doğrudan bir hedefi değildir. Varlık API modülünün bölümleri taşınır / çekirdeğe taşınır (Şimdi Varlık sınıfı var ve varlıklar yeni sisteme dönüştürülüyor). Bu yüzden, örneğin alanlarla uğraşmak için doğrudan bu sınıflara metotlar alma şansımız var. Taahhütlü değişiklikler için, yeni değişiklik kayıt sistemi iyi bir kaynaktır, bkz. Drupal.org/list-changes/drupal .
Berdir

Brilliant, bu tam da aradığım şeydi, çok teşekkürler! :) Umarım sorun değil, site için gerçekten konuyla ilgili olmadığını biliyorum… Çekirdeğe katkıda bulunmayı çok isterdim ama açık kaynaklarda hiç yer almadım her şeyi buldum biraz korkutucu ... başlamak için iyi bir yer olması güzel :)
Clive

Clive: drupalofficehours.org adresini ziyaret edin - bu kesinlikle insanların katkıda bulunmaya başlamalarına yardımcı olmak içindir. Orada daha fazla kaynak var. Ayrıca çekirdek çekirdeği sık sık veya daha büyük olasılıkla çekirdekli bir iki devin olacağı bir DrupalCamp olan bir kullanıcı grubuna gitmeyi de tavsiye ederim. Yerel grubunuzu groups.drupal.org adresinde bulun ve çalışabilmelisiniz. drupical.org da faydalı olabilir.
wizonesolutions

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

Bunun neden soruyu yanıtladığına dair kısa bir açıklama ekleyebilir misiniz?
Serbest Radikal
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.