Diğer modülün alan biçimlendiricisine takılsın mı?


9

Şu anda Drupal 7 sitemde render önce hemen programatik mantığa bağlı olarak onun 'görünüm modunu' değiştirecek bir düğüm başvurulan görüntü alanı uygulamaya çalışıyorum. Alan şu anda, her biri 'Oluşturulmuş düğüm' alan biçimlendiricisini kullanan görüntüleme modu ayarları aracılığıyla bir dizi içerik türünde oluşturulmaktadır.

ilk girişim

İlk fikrim, bir kancanın bir kanca bir kanca olduğu düşünüldüğünde aşağıdakileri uygulamaktı:

function HOOK_field_formatter_view( $entity_type, $entity, $field ... ){
  switch ($display['type']) {
    case 'node_reference_node':
      /* Programatical logic here to modfy field render settings */
    break;
  }
}

Açıkçası HOOK'u modülümün adıyla değiştiriyorum.

Yukarıdakilerin orijinal işlevden önce veya sonra tetiklenip tetiklenmeyeceği önemli değildi node_reference_field_formatter_view, node_reference.moduleçünkü ya çıktısını tamamen geçersiz kılacaktım ya da umarım render etmeden önce değerlerini değiştireceğim. Tek sorun, yukarıdaki kanca sadece modül başına çalışıyor gibi görünüyor - yani site çapında değil, bu yüzden temelde benim modül için ateş değil.

Şimdi açıkçası ben oluşturulan bir düğüm çıktı için kendi alan biçimlendirici yazabilirsiniz. Ama zaten var olan bir şey göz önüne alındığında biraz atık gibi görünüyor.

diğer yaklaşımlar

Diğer yaklaşımlarım oldu HOOK_preprocess_nodeve HOOK_preprocess_fieldancak ilki herhangi bir view_modebilgi içermiyor ve ikincisi, hepsinin view_modefarklı seviyelerde bir mülke referansı olan en az 5 farklı karmaşık yapı içeriyor - ve her birini değiştirmek zorunda kalıyor değerler. Belirli view_modeözellikleri değiştirdiğimde bile sonuçta oluşan görüntü değişmez.

soru

Alan biçimlendiricisinin oluşturulmasından önce (bir katkıda bulunan modülün) ve ayarlarını sayfa başına istek temelinde değiştirmenin temiz bir yolunu bilen var mı? Örneğin, gerçek içerik türünün kalıcı görünüm modu ayarlarını değiştirmek zorunda kalmadan mı?


2
hook_field_formatter_view_alter()Muhtemelen bir yılı aşkın bir süredir benzer bir şey arıyorum , maalesef mevcut değil. Bilginize hook_preprocess_node()kesinlikle yok olması view_modeona mevcuttur, İçinde $vars['view_mode'], değil $vars['node']->view_modedenemek için cazip olmuştur olabilir.
Clive

Bilgi, ah ve işaret için @Clive teşekkür view_modeüzerinde hook_preprocess_node, aptal beni! hook_field_formatter_view_alter()
D8'de

Henüz bir şey görmedim ... ama sonra her şey D8'deki eklentilere dönüştürülüyor (alanlar hakkında emin değilim), bu yüzden işi yapmak için mevcut bir sınıfı geçersiz kılabilirsiniz, bu ideal olurdu . İşte umuyoruz!
Clive

1
@Clive, D7 için burada bahsedilen sihirli alter kancanı buldun mu?
tyler.frankenstein

Yanıtlar:


11

Soru hook_field_formatter_view(), yalnızca kaynak modülde çağrılır, ancak alan biçimlendiricisinin sahipliğini üzerinden alabilirsiniz hook_field_formatter_info_alter().

moduleFormatlayıcının anahtarını aşağıdaki gibi MYMODULE olarak ayarlayabilmeniz gerekir :

function MYMODULE_field_formatter_info_alter(&$info) {
  $info['some_field_formatter']['module'] = 'MYMODULE';
}

Daha sonraMYMODULE_field_formatter_view() , isteğe bağlı olarak bir öğeyi değiştirmek için onu ele alan mevcut modülden besleyerek uygulayabilirsiniz .

function MYMODULE_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  // Your custom logic
  $element = OTHER_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display);
  // Any alterations
}

Cevabınızı detaylandırabilir misiniz? Kod girilsin mi?
Scott Joudry

Güzel bir çözüm, neredeyse hiçbir zaman başka bir modülün işini tamamen ele geçirmeyi düşünmüyorum (ve değişikliklerden sonra geri röle) ... sadece olsa da denedim ve çok daha basit bir kodla bitirdim. Şerefe!
Pebbl

1
@ScottJoudry ~ Sadece bu şekilde devralmak olmadığından emin hepinizin yöntemleri var yapmak gerekir belirterek değerinde olabilir field_formatternode_reference yani işlevselliği MYMODULE_field_formatter_settings_summaryve MYMODULE_field_formatter_settings_form(onlar sadece vekil fonksiyonları orijinal modülüne geri bile) aksi back- son kullanıcı arabirimi, bu modülleri yanlış modülde bulmaya çalıştığında tüm ekran modu panellerinde kırılır.
Pebbl

Graham C'nin yaklaşımı ilginçtir, ancak çok fazla geçersiz kılma gerektirir.
milkovsky

2

Ok ben neden benim değişiklikleri için gerçekleştirilen #view_modebirinde hook_preprocess_nodeve hook_preprocess_fieldsçalışmıyordu. (Tamamen varlığını kaçırdığı işaret için Clive sayesinde #view_modede hook_preprocess_node) .

Benim sorunum #view_modezaten işlenmiş ve doğru #image_styleözelliğe dönüştürülmüş gerçeği kaynaklandı - aramayı ihmal etti bir şey.

Buna rağmen, bu değeri değiştirmek, hangi kancada değiştirdiğinize çok fazla bağlı görünüyor. Sonunda yine de işlenmiş görüntüyü değiştiren bazı kodları aldım:

function HOOK_preprocess_field( &$vars ){
  $element     = &$vars['element'];
  $entity_type = !empty($element['#entity_type']) ? $element['#entity_type'] : 'unknown';
  $bundle      = !empty($element['#bundle'])      ? $element['#bundle']      : 'unknown';
  $view_mode   = !empty($element['#view_mode'])   ? $element['#view_mode']   : 'unknown';
  $field_name  = !empty($element['#field_name'])  ? $element['#field_name']  : 'unknown';
  switch ( "$entity_type:$view_mode:$bundle/$field_name" ) {
    case 'node:full:mlandingpage/field_lead_image':
      if ( !empty($vars['items']) && 
           ($subelement = &$vars['items'][0]) ) {
        if ( !empty($subelement['field_image']) && 
             ($subfield = &$subelement['field_image'][0]) ) {
          /// this needs to be set to the image_style value, not the view_mode value.
          $subfield['#image_style'] = 'grid-normal-4-cols';
        }
      }
    break;
  }
}

Yukarıdakiler hala çok iyi hissetmiyor, ama en azından işe yarıyor. Alan biçimlendiricileri için böyle bir _alter yönteminin bulunmadığı konusunda Clive'nin sözünü alacağım - bu bir utanç, biçimlendiriciler D7'nin son derece güçlü bir özelliği, daha fazla büyütme yeteneğine sahip olmak güzel olurdu.

Her neyse, gelecekteki insanların daha iyi fikirleri varsa, cevap ver :)


0

En kolay yaklaşım Panelizer'i kullanmak olacaktır .

Panelizer'ı değil, varsayılan Drupal görünüm modlarını veya Display Suite'i kullanıyorsanız hook_field_display_alter () veya hook_field_display_ENTITY_TYPE_alter () yöntemini deneyin .

Varlık, görüntüleme bağlamı ve tüm biçimlendirici ayarlarınız var. Ayrıca, alan oluşturma ayarlarını kolayca değiştirebilirsiniz. Alan biçimlendiricisini farklı bir biçimle bile değiştirebilirsiniz.

Bu yaklaşım benim için mükemmel. Tek dezavantajı, "Görüntüyü yönet" arayüzünde farklı ayarlarla karıştırılmış olmanızdır.


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.