Alan Çoğaltma Kancası


15

Birden çok değeri kabul edebilen bir görüntü alanı görüntüsünü biçimlendiren özel bir modül var. Alanın ilk değerini (örneğin "[image1]") çoğaltmak için hangi kanca kullanmalıyım bilmek istiyorum array_unshift()ve geri kalanı (sanırım ile) benim fonksiyonları geri kalanı önce dizinin başına eklemek alanın teması / teması.

Peki neydi

  • [İmage1]
  • [İmage2]
  • [İmage3]

olur

  • [İmage1]
  • [İmage1]
  • [İmage2]
  • [İmage3]

O zaman onları ayrı ayrı ele alacağım, ama sanırım bu kısmı zaten çözdüm.

Şu anda kullanıyorum hook_field_formatter_view()ve sadece $itemsişlevin üstündeki dizinin başlangıcına eklemeye çalıştım , ama bu işe yaramadı. Bundan hemen dprint_r()sonra $itemsdizi gösterir, ancak sadece 3 öğe çıktı almak; Alan sayısının başka yerlerde belirlendiğini varsayıyorum.


1
Sadece resmi kopyalamak istiyorsanız, yol Javascript olabilir mi?
Codium

Hayır ben özür dilerim. Sonuçlarda js kullanıyorum ama veri ile başka şeyler yapmak gerekiyor hook_field_formatter_viewama görüntü başına sadece bir kez çalışır.
Şans G

Bir hata ayıklayıcıda baktım ve göz ardı ediliyor diziye eklenen ekstra deltalar bulmak için sürpriz oldu.
Adam S

Sorunuz için +1, ilginç bir konu. Ancak, gerçek çözümü düşünmemize yardımcı olmak için, ana amacınızın ne olduğu konusunda daha spesifik olabilir misiniz (ilk görüntünün kopyalanmasını istemenizin nedeni)? Ne kadar çok bilgi bilirsek, o kadar iyi yanıt alabilirsiniz. :)
Sk8erPeter

Javascript ile bu sorunu çözdüm. Ama soruyu cevaplamak için; Set başına bir büyük görüntü ve daha sonra kullanıcının büyük resmi değiştirmesine izin vermek için tüm görüntülerin küçük resimlerini kullanan hoverzoom uygulamaya çalışıyordum.
Şans G

Yanıtlar:


1

Bunun yerine hook_field_formatter_prepare_view () istiyorsunuz . Bu kancanın tek bir varlıkta değil, bir grup varlık üzerinde çalıştığını unutmayın.

İşte çalışan bir pasaj. Deltaların doğrusal olarak korunması gerektiğinden, on satırlık çirkin bir döngü yazmamak için bazı dizi-fu'ya ihtiyaç vardır.

<?php

function MODULE_field_formatter_prepare_view($entity_type, $entities, $field, $instances, $langcode, &$items, $displays) {
  foreach ($entities as $id => $entity) {
    $array = array(0 => $items[$id][0], 1 => $items[$id][0]);
    if (count($items[$id]) > 1) {
      array_splice($array, 2, 0, array_slice($items[$id], 1));
    }
    $items[$id] = $array;
  }
}

0

hook_field_formatter_view()kodunuzun kullanıcıya gösterilen çıktıyı oluşturduğu yerdir ve bu nedenle, döndürülebilir bir diziyi bir dönüş değeri olarak ister. İlk görüntüyü iki kez işleyin ve farklı bir css sınıfı falan verin.

Gibi bir şey:

$output = array();
if (($field == 'myFieldType') && ($display == 'full')) {
  $output[] = renderFirstImage(reset($items));
  foreach ($items as $item) {
    $output[] = renderImage($item);
  }
}
return $output;

Yana hook_field_formatter_view()beklentiden bir renderable dizi ve renderable diziler basitçe bir hale olarak işaretlenmiş, render ve sonra sonradan sefere göz ardı edilmesine neden olacaktır aynı nesneye iki başvuru yaparak render yaparken işlenen olarak işaretlenmiş beri.


Üzgünüm Paul ama sorumu okudun mu? Ben öğeleri dizinin başına eklemek mümkün. Mesele, hala çıktı alınmamasıydı.
Şans G

hook_field_formatter_view () alanları alır ve bunları yenilenebilir dizilere dönüştürmeniz gerekir. Aynı diziye yalnızca iki başvuru yaparsanız, bu öğe işlenmiş olarak işaretlenir ve yeniden oluşturulmaz. Bu nedenle, istediğiniz her öğe için yeni bir yenilenebilir dizi oluşturmanız gerekir.
paul-m

Cevap bu mu?
paul-m

Hayır. Diziye fazladan bir öğe ekleyebiliyorum. Gösterdiğim diziyi dpm yaptığımda yazdırmıyor. Doğru olan tüm cevapları kabul ediyorum.
Şans G

Bahsettiğim gibi, render sistemi öğeleri halihazırda oluşturulmuş olarak işaretler. Bu, ikinci bir görüntüyü referans olarak iletirseniz, ilk kez oluşturulduğu gibi işaretlenecek ve daha sonra zaten işaretlendiği için ikinci kez OLMAYACAKTIR.
paul-m
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.