Nasıl bir drupal modülünde bir fieldset için özel # tema işlevini kullanabilirim?

5 Cevap php

Ben bir fieldset içeren bir form oluşturur bir modülü var. Bunun yerine fieldset başlığı işlemek için <legend> elemanı kullanarak, ben yerine <div> öğesi bu içeriği yerleştirmek istiyorum. Ama sadece modülü tarafından döndürülen form için davranışlarını değiştirmek istiyorum, bu yüzden benim temanın template.php dosyası içine herhangi bir yeni işlevsellik yerleştirmek istemiyorum.

Mymod.module Ben tanımlanmış:

// custom rendering function for fieldset elements
function theme_mymod_fieldset($element) {
  return 'test';
}

// implement hook_theme
function mymod_theme() {
  return array(
    'mymod_fieldset' => array('arguments' => array('element' => NULL)),
    'mymod_form' => array('arguments' => array())
  );
}

// return a form that is based on the 'Basic Account Info' category of the user profile
function mymod_form() {
  // load the user's profile
  global $user;
  $account = user_load($user->uid);

  // load the profile form, and then edit it
  $form_state = array();
  $form = drupal_retrieve_form('user_profile_form', $form_state, $account, 'Basic Account Info');

  // set the custom #theme function for this fieldset
  $form['Basic Account Info']['#theme'] = 'mymod_fieldset';

  // more form manipulations
  // ...

  return $form;
}

Benim sayfa render aldığında, ben tamamen benim test mesajı 'test' ile değiştirilmesi 'Temel Hesap Bilgisi' temsil fieldset görmek bekleniyor. Bunun yerine ne olur <fieldset> ve <legend> elemanları, normal olarak, fakat böyle yerine test mesajı ile ikame alan kümesi gövdesi ile işlenmiş olmasıdır:

<fieldset>
  <legend>Basic Account Info</legend>
  test
</fieldset>

Neden # tema fonksiyonu tüm <fieldset> elemanını değiştirmek için şansı yok? Ben yerine bu işlevi Textfield sarın, ben tamamen kendi etiketiyle birlikte <input> elemanını değiştirmek mümkün duyuyorum. Ben theme_fieldset benim sitenin template.php bir kılma sağlamak Ayrıca, eğer beklenen ve ben tamamen <fieldset> yerine mümkün olduğum gibi çalışır, bu yüzden mümkün olduğunu biliyoruz.

Ne bir modül içinde fieldsets için # tema fonksiyonları sağlayan ilgili farklı?

5 Cevap

Yerine # tema işlevini kullanarak () theme_fieldset geçersiz denediniz mi? . Ben size modül dosyasında böyle bir şey yapabileceğini inanıyorum:

function mymodule_fieldset($element) {
  // do something;
  return $html;
}

Bu, tüm fieldsets için geçerli olacaktır. Eğer etkileyen ve daha sonra tüm diğerleri için varsayılan uygulama kullanmak istediğiniz fieldsets için $ elemanı üzerinde kontrol çeşit yapabilirdi.

http://api.drupal.org/api/function/theme_fieldset/6: bir göz atın

Ben bu eski bir yazı olduğunu biliyorum - ama aynı sorunu çalıştırmak. Etrafta çirkin bir çalışma ile geldi. Bu kesinlikle Form API bir hata. Belki benim geçici bir düzeltme birine yararlı olacaktır.

Ben buldum (ve ekli) burada bir hata raporu: http://drupal.org/node/225698

Benim hacky düzeltmeyi denemeden önce bu kontrol değer.

Ben çocuklar bu örnekte $form['Basic Account Info'] olarak ne olduğundan emin değilim, ama temelde ne yapabilirim ki fieldset çocuklar üzerinde kullanılması drupal_render(), ve sonra bir fieldset dizi {ayrı yeniden [(0)]}, tema bu theme() ile geri biçimlendirme gibi formu diziye geçmek ..

$fieldsetElement = array(
   //$child is the key of whatever child you need in the fieldset
   //you may have to alter this for multiple children, stringing 
   //together multiple drupal_render calls on each children
   //(#children needs to be a string.. unless your theme can handle the array)
   '#children'=>drupal_render($form['Basic Account Info'][$child]),
   '#attributes'=>array(),//set real attributes
   '#title'=>$form['Basic Account Info']['#title']
);
$form['Basic Account Info'] = array(
  '#type'=>'markup',//not really needed, is default
  '#value'=>theme('mymod_fieldset',$fieldsetElement)
);

süpersiniz hack, olası nedenleri formu devlet ve potansiyel doğrulama hatası ile bağlantısını kesmek - ancak her iki formu API ile deneme ve yanılma ile tamir edilebilir. Eğer gerçekten PHP ve drupal formu API ile ellerini kirli almak istediğiniz sürece ben bu tavsiye etmem, ama sizin modülünde değişken fieldset temalar olmadan yaşayabiliriz sürece, gerçekten tek yolu var ... Belki önek ve sonek deneyin?

Bu sadece benim başın üst kapalı ama eğer sen bir fieldset, bir form elemanı ama sadece bir ayırıcı ya da bir grouper olmadığından belki farktır. Belki #theme geri form elemanları için sadece?

Kodunuzu kavramı size ne yapmak istediğinizi yapabilirsiniz, yani çalışıyor.

Bu işe yaramazsa niçin bazı şeyler vardır.

  • Fieldset değil $form['Basic Account Info'].
  • Önbelleğini temizlemeniz gerekiyor.
  • $ Form ['Temel Hesap Bilgisi'] ['# teması'], daha sonra kod yürütülmesine geçersiz / kaybolur.

Eğer DeÄčiÅčikliÄči birini yapmak için önce $form bakmak için deneyin. Ben kodu kopyalayın çalıştım ben bir hata içine çalıştırın:

  • user.pages.inc dosya yüklü gereken

Ben aynı sorunu başlamıştı.

Sen #theme_wrappers yerine #theme kullanımı gerekir

'#type' => 'fieldset',
'#theme_wrappers' => array('mymodule_fieldset'),