Entity_metadata_wrapper () işlevinin amacı nedir ve neden kullanmalıyım?


23

Şu anda Entity API kullanan birçok modülün eklentilerini geliştiriyor gibiyim ve entity_metadata_wrapper()fonksiyon ortaya çıkmaya devam ediyor.

Docs sayfa bu konuda şunları söylemektedir:

Verilen veriler için bir özellik sargısı döndürür.

Bir varlık sarılırsa, sargı özellikleri için daha fazla sarıcı almak için sarıcı kullanılabilir.

Buradaki 'varlık' kelimesinin harika Freudyen yazımına aldırış etmeden, bu paketleyicilerin amacının ne olduğunu gerçekten anlamıyorum.

Fonksiyonun temelde bir EntityDrupalWrappersınıf döndürdüğünü anlıyorum :

Sarıcı, varlık özelliklerinin alıcı ve ayarlayıcı geri çağrılarının uygulanmasını kolaylaştırır

Ama anlayamadığım şey işleri nasıl kolaylaştırdığını.

Örneğin, bir düğümün status özelliğini güncellemek için bu kodu kullanabilirim:

$node = node_load($nid);
$node->status = 1;
node_save($node);

Bu oldukça temiz. Anladığım kadarıyla (yanlış olabilir) kullanılan eşdeğer kod entity_metadata_wrapper()bundan daha ayrıntılı olacaktır.

Beni burada tetikleyen 'sarmalayıcı' teriminin kullanılmasının basit olup olmadığından emin değilim, ancak Varlık modülündeki kodu da okudum ve anlama konusunda gerçekten daha fazla değilim.

Bu işlevi kullanmanın faydalarının ne olduğunu açıklayabilen biri var ve ortak bir kullanım durumu için basit bir kod örneği olabilir mi?


Bu, varlık api ve sarmalayıcılarına daha derin bir anlayış kazandırabilir. Bu Varlık adamı Fago'nun konuşması. wolfgangziegler.net/drupalcon-denver
Ken,

Teşekkürler, açılış kumarından gerçekten faydalı geliyor. Biraz zamanım olduğunda bir göz
atacağım

Bu "video kaymadan kaldırıldı" ancak slaytlar hala indiriyor.
artfulrobot

Yanıtlar:


23

Evet, bir düğümün durumunu değiştirmek, kodlanmış bir özellik olduğu için önemsizdir.

Öte yandan, alanlar çok daha karmaşık. Üç seviyede iç içe geçmişlerdir , doğru dilde almak için field_get_items () varken, alan değerlerini ayarlamak için böyle bir işlev yoktur. Bu nedenle, her zaman bir alanın çevrilebilir olup olmadığını kontrol etmeniz ve hangi özelliği tam olarak aradığınız / ayarlamak istediğiniz değerleri içerdiğini bilmeniz gerekir.

Varlık sarıcısının ne yapabileceğini gösteren iki örnek:

  • Aşağıdaki satır, ticaret satır öğesini siparişe ekler, aşağıdaki cevaba göre /drupal//a/23513/31 diline ve referans kimliğine sahip gerçek mülke dikkat ederek siparişi ekler

    $order_wrapper->commerce_line_items[] = $line_item;
  • Benzer şekilde, dil veya deltayı kontrol etmek zorunda kalmadan, bir alanın değerine doğrudan erişebilmek, /drupal//a/ adresinden alınan başvurulan varlıklara doğrudan erişebilmek 33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

Varlık sarıcısı, Arama API'sı ve Kurallar gibi esnek ve güçlü modüllerin arkasındaki itici güçtür, çünkü birden fazla referans düzeyinde çalışmalarına olanak sağlar; böylece, örneğin bir kullanıcının bir siparişle satın aldığı ürünün bir alanına erişebilirsiniz. gibi [commerce-order:commerce-line-items:0:commerce-product:some-field](aslında doğru olmayabilir, ancak buna benzer bir şey olabilir) veya başvurulan bir düğümün gövde özetini arama dizininize ekleyin.

Bununla birlikte, ambalajın gerçek API'sine düşkün olmak zorunda değilim, devasa iç diziler ve basit özelliklerin bile tekrar sarmalayıcı sınıfları olduğu söylenebilir. Drupal 8’deki geliştirilmiş varlık (ve umarım alan) sisteminin, sınıflandırılmış varlıklar sayesinde böyle bir sarıcı ihtiyacını ortadan kaldıracağını umuyorum.


Harika, bununla bir şeyleri özleyeceğimi biliyordum. Sanırım EntityDrupalWrapperkargaşaya neden olanın açıklamasıydı; 'mülklerden' bahsettiğinde, alanların hiç dahil olmadığını fark etmedim, kelimenin tam anlamıyla sınıfın mülkleri (nid, statü, vb.) alması anlamına geldiğini düşündüm. Bunu temizlediğiniz için teşekkür ederiz, Kurallar modülünün veri seçici için kullandığını bilmek çok daha mantıklı hale getirir
Clive

@Berdir "Ben ambalajın gerçek API'sine düşkün olmam gerekmiyor ..." Sizinle aynı hislere sahibim. Bununla mücadele etmek için herhangi bir şey yapıyor musun? Değerleri görüntülemek için field_view_value () kullanıyor musunuz? Özel bir iş akışı veya gösterge tablosu için değerleri özel geri aramalarda ayarlamayı nasıl önerirsiniz?
Charlie Schliesser
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.