Drupal Modülü - Form Blok şablonu uygulayarak değil

1 Cevap php

Benim form a la sites/all/modules/pecapture/themes/pecapture-displayform.tpl.php tarz almıyor beni neden anlamaya yardımcı

İşte benim kod:

/**
 * Implementation of hook_theme()
 */
function pecapture_theme() {
  $path = drupal_get_path('module', 'pecapture') . '/theme';
  return array(
    'pecapture_displayform' => array(
      'arguments' => array('form' => NULL),
      'template' => 'pecapture-displayform',
      'path' => $path,
    ),
  );
}

Temelde bu tema dosyaları modül / tema klasörü ($ yolu) olduğunu söylüyor

$ Form Drupal şeklidir dizi tema ('pecapture_displayform', $ form) kullanarak adında bir tema fonksiyonu pecapture_displayform ($ form = null) vardır

$ Yolunda bir şablon dosya pecapture_displayform.tpl.php var

function pecapture_block($op = 'list', $delta = 0, $edit = array()) { 
  $block = array();
  if ($op == "list") { // Generate listing of blocks from this module, for the admin/block page
    $block[0]["info"] = t('Persistent E-mail Capture Form Block');
  } 
  else /* if ($op == 'view') */ { // Generate our block content
    $block['subject'] = ''; //'Persistent E-mail Capture Form';
    $block['content'] = pecapture_displayForm();
  }
  return $block;
} // function pecapture_block

Bu bloğu görüntülerken, içeriğini oluşturmak fonksiyonu pecapture_displayForm () kullanın diyor. $ Blok php print () ed alır

/**
* Callback for pecapture_theme 
*/
function pecapture_displayform() {
  return drupal_get_form('pecapture_blockform');
}

Bu (çıkış için) html biçimlendirilmiş drupal formu dizi dönmek diyor

function pecapture_blockform(&$form_state) {
  /* the form, standard ... */

Bu tipik form içeriğini olduğunu.

I've tried calling the theme function explicitly in pecapture_displayform:
return theme('pecapture_displayform', $form);
and
return theme('pecapture_displayform', drupal_get_form($form));

Peki neden formu pecapture-displayform.tpl.php geçiyor değil mi?

1 Cevap

Bir tema işlevini kullanarak, ya da bir şablonu kullanarak - bir modül temalar oluşturmak iki temel yolu vardır. Her iki durumda da, sizin modül için hook_theme işlevinde temaları kayıt gerekir (pecapture_theme). Sizin örnekte bu kısmı doğru görünüyor.

Bir tema işlevi kayıt varsa, o tema işlevi oluşturmak ve onu aramak theme_themename. (Senin gibi) bir şablonu kayıt eğer isteğe bağlı template_preprocess fonksiyonu ve bir şablon kullanın. Template_preprocess fonksiyonları referans ile, değişken bir dizi daha sonra şablona geçirilecek, template_preprocess_themename denir ve geçirilir. Ayrıca, doğrudan bir tema işlevini çağırmak asla. Her zaman (geçersiz kılma sağlar ve doğru değişken önişlemeyi) o drupal doğru işleyebilir böylece theme('themename', $args) bir tema erişmek için kullanır.

Doğrudan drupal tema fonksiyonu olarak tanımadığı bir tema işlevini çağırmak için çalışıyoruz gibi Yani, her şeyden önce, o görünüyor. İkinci olarak, bir şablon kullanıyorsanız, bu yüzden şablona göndermeden önce formu işlemek istiyorsanız template_preprocess_pecapture_displayform(&$vars) adında bir işlev gerekir. Tam olarak ne uzantısı hariç hook_theme verilen adı ile eşleşen yüzden de şablon pecapture-display.tpl.php denir emin olun.

Eğer tema için bir form çalışıyoruz Ayrıca, gibi görünüyor. Yani, form işlevi $form['#theme'] = 'pecapture_displayform' dahil ederek temayı kullanmak için drupal_get_form söylemek gerekir. Sen drupal_render($form) kalan un-render elemanları (iki kez render olmayacak şekilde drupal izler) kılacak çağırarak, drupal_render($form['element']) arayarak tema çıktı bireysel form elemanları yapabilirsiniz.

http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6 tema formlar hakkında daha fazla bilgi için bkz.

Sürece form işlevi tema belirlemiş olduğunuz gibi açıkça onu aramak gerekmez, böylece yapmanız gerekir

$block['content'] = drupal_get_form('pecapture_blockform');

Blok kanca.