Div'de iki render dizi elemanını nasıl sararım?


12

Bu yenilenebilir dizi göz önüne alındığında:

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
    ), 
  );

Bu öğelerin her ikisini tek bir DIV'ye nasıl sararım?

Yanıtlar:


29

#containerForm öğesini ve aşağıdakine benzer bir kod da kullanabilirsiniz :

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

#Container elemanı bir ile alt öğeleri sarar <div>CSS sınıf geçirilen biridir etiketi, #attributesmülkiyet.

"Twitter-icon" öğesi için bir kap bile kullanabilirsiniz, ancak aşağıdaki kodda olduğu gibi, buna bir öğe ekleyebilmeniz dışında, size herhangi bir profesyonel vermez:

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('twitter-icon'),
  ),
);

if ($condition) {
  $wrapper['twitter-icon']['twitter-icon-text'] => array(
    '#type' => 'markup',
    '#markup' => t('Icon text'),
  );
}

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

Bana göre bu, en iyi yanıttır, çünkü sarılmakta olanı temsil etmek için fiziksel dizi yapısını kullanır, daha iyi kopyalar ve yapıştırır (@ninjascorner yanıtındaki bir öğeyi taşımak açılış / kapanış DIV'lerini kırabilir) ve ekstra gerektirmez tema fonksiyonları. Teşekkürler!
Justin

Bu doğrudur: #suffixÖzelliği son öğeden veya #prefixözelliği ilk öğeden yeni eklenen öğeye taşımadan aynı kapsayıcıda oluşturulan başka bir öğe ekleyebilirsiniz . Söylediğiniz gibi, bu hataya daha az eğilimlidir.
kiamlaluno

6

Aradığın şey bu mu?

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
      '#prefix' => '<div class="test">',
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/fdgf'),
      '#suffix' => '</div>',
    ), 
);

Umarım yardımcı olur!


@nija + 1ed, Harika cevap Bu özellikleri unuttum. Lütfen cevabımı okuyun, bu ekinize ve ön ekinize göre temalı bir alternatif ile gerçekleştirilebilir mi?
stefgosselin

@stefgosselin, teması için bir tpl dosyası mı oluşturmak istiyorsunuz?
ninjascorner

Bu cevap için teşekkürler. Bunu tek bir elemanda nasıl yapacağımı biliyordum, ancak benim için son eki ve öneki bölmedim. İlginç. Bana dağınık geliyor, ama nedenini açıklayamıyorum, bu yüzden gerçekten bir sorunum yok.
Justin

@ninjascorner Gecikme için özür dilerim, bu konuyla ilgili notumu bulamadım. Ayrıca, tema kancası kullanan tema veya modülde kullanılabilen diğer cevaplardan daha az olası bir yol olduğunu düşünüyorum. theme_render_example_add_div Bkz. Api.drupal.org/api/examples/… )
stefgosselin

Bu, yalnızca her iki öğenin de her zaman oluşturulacağından eminseniz iyidir. Bu şekilde ayrılırken kapatılmamış <div> ile sonlandırmak kolaydır.
kufeiko

2

Bunun için bir tema da oluşturabilirsiniz.

$form['twitter']['#theme'] = 'my_twitter_theme';

$form['twitter']['icon'] = array(
'twitter-icon' => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$form['twitter']['link'] = array(
  '#type' => 'markup',
  '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
);

Ve tema kancanızda:

function my_hook_theme(){
  return array(
    'my_twitter_theme' => array('form' => NULL)
  );
} 

Ve tema işlevinde:

function theme_my_twitter_theme($form){
  $output = "";

  $output .= "<div class=\"twitter\">";
  $output .= drupal_render($form['icon']);
  $output .= drupal_render($form['link']);
  $output .= "</div>";    

  $output .= drupal_render($form);
  return $output;
}

Bunu Drupal 6'da kullanıyorum, D7'de de çalışıp çalışmadığından emin değilim ama umarım


Evet, bu yöntemi gönderdikten sonra anladım (örnek modülü kopyalarım). Harika çalışıyor, ancak en iyi yöntem olduğunu düşünmüyorum çünkü (doğru anlarsam), sınıf adınızı işleve koymanız gerekir, yeniden kullanılabilirliğini azaltır.
Justin
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.