Bir blok içindeki form


14

drupal_get_form('event_signup_form')Özel formumu bir bloğun içine yerleştirmek için kullanıyorum . Form istendiği gibi oluşturuluyor, ancak formun gönderilmesi hiçbir şeyi tetiklemiyor.

Form işlevinin kendisi çağrılır event_signup_form($form, &$form_state)ve gönderme işlevi çağrılır, event_signup_form_submit($form, &$form_state)ancak çağrılmaz.

Formu göstermek için hook_block_view kullanıyorum :

function event_block_view($delta = '') {
$blocks = array();
if ($delta ...) {
$blocks['content'] = drupal_render(drupal_get_form('event_signup_form'));
}
}

Ben bu işe başardı - işte nasıl (saplama):

function hook_block_view($delta = '') {
$blocks['content'] = drupal_render(drupal_get_form('event_signup_form'));
}

function event_signup_form() {
// Register form submit handler, same goes for validation handler
$form['#submit'][] = 'event_signup_form_submit';

return $form;
}

function event_signup_form_submit($form, &$form_state) {
// This is now triggered
}

Yanıtlar:


15

Drupal 7'den itibaren, drupal_get_form () , dize yerine bir oluşturma dizisi döndürür, bu nedenle şunu kullanmayı deneyin:

drupal_render(drupal_get_form('event_signup_form'));

formu bloğa gömmek için. Bilgi için bölüme bakın Drupal_get_form () , 6.x Modüllerini 7.x'e Dönüştürme makalesinde bir dize yerine bir render dizisi döndürür.

Ayrıca, işlevinizin event_signup_form($form, &$form_state)sadece event_signup_form()(argümanlar olmadan) olması gerektiğine inanıyorum .


Ama hook_block_view ($ delta = '') içinden api.drupal.org/api/drupal/modules--block--block.api.php/… Bir dizi döndürmüyorum , hiçbir şey yazdırmıyorum.
kristian nissen

4
Modülünüze yerleştirebileceğiniz blok kodu oluşturan bir araç yaptım: browse-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian tamam, sorunuzda düzenlediğiniz kodla çalışıyor mu?
Laxman13


Bu, düzenlenen soru için işe yarayabilir (bir çeşit) olsa da, bir çalışma formunu bir bloğa koymak için doğru yol değildir . Bir dize değil, bir oluşturma dizisi istiyorsunuz. Ayrıca (Form API'sı tarafından belirtilen şekilde) için bağımsız değişkenlere sahip olmak istersiniz hook_form(). Doğru cevap için Francisco Luz'un cevabına bakınız.
Ücretsiz Radikal

11

Benim bahse girerim $form['#submit'][] = 'event_signup_form_submit'; suçlu budur. Bunu yalnızca ek bir teslim işleyicisi istiyorsanız ayarlayın.

Bu, çalışan bir örnek koddur.

<?php
/**
 * Implements hook_block_info().
 */
function MYMODULE_block_info() {
  $blocks = array();

  $blocks['MYBLOCK'] = array(
    'info' => t('My block'), 
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {
  $block = array();

  switch ($delta) {
    case 'MYBLOCK':
      $block['subject'] = t('My block title');
      $block['content'] = drupal_get_form('MYFORM_form');
    break;
  }
  return $block;
}

/**
 * Custom form.
 */
function MYFORM_form($form, &$form_state) {
  $form['MYFIELD'] = array(
    '#type' => 'textfield',
    '#title' => t('Some Field'),
  );

  $form['submit'] = array(
    '#type' => 'submit',
    '#value' => t('Submit Button'),
  );

  return $form;
}

/**
 * Custom form submit function.
 */
function MYFORM_form_submit($form, &$form_state) {
  // You need the have Devel module enabled for dpm() to work.
  dpm($form_state);
}

1
Mükemmel bir örnek!
leymannx

1
Harika bir örnek. Özel form göndermeye ihtiyacım yoktu, ancak ilk iki işlev özel formumu bir bloğa koydu, bu da bu sayfayı bulduğumda aradığım şeydi. Teşekkürler.
millionleaves

Bunun kabul edilen cevap olması gerektiğini düşünüyorum.
Ücretsiz Radikal
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.