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.