블록 내 양식


14

drupal_get_form('event_signup_form')사용자 정의 양식을 블록 안에 포함시키는 데 사용 하고 있습니다. 양식이 의도 한대로 렌더링되고 있지만 양식을 제출하면 아무 것도 트리거되지 않습니다.

양식 함수 자체가 호출 event_signup_form($form, &$form_state)되고 제출 함수가 호출 event_signup_form_submit($form, &$form_state)되었지만 호출되지 않습니다.

hook_block_view 를 사용하여 양식 을 표시합니다.

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

나는 이것을 작동 시켰습니다-여기에 방법이 있습니다.

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
}

답변:


15

Drupal 7부터 drupal_get_form () 은 문자열 대신 렌더 배열을 반환하므로 다음을 사용하십시오.

drupal_render(drupal_get_form('event_signup_form'));

블록에 양식을 포함시킵니다. 자세한 내용은 drupal_get_form () 섹션을 참조하여 6.x 모듈을 7.x로 변환 문서 의 문자열 대신 렌더 배열을 반환합니다.

또한, 나는 당신의 기능 event_signup_form($form, &$form_state)event_signup_form()인수없이 있어야 한다고 생각합니다 .


그러나 hook_block_view 내에서 ($ 델타 = '') api.drupal.org/api/drupal/modules--block--block.api.php/... 난 아무것도 인쇄 아니에요, 내가 배열을 반환하고 있습니다.
kristian nissen 7

4
모듈에 배치 할 수있는 블록 코드를 만드는 도구를 만들었습니다. browse-tutorials.com/tools/drupal/create-block
ram4nd

@Kristian 좋아, 질문에 편집 한 코드로 작동합니까?
Laxman13

예, 작동하게했는데 질문에 업데이트를 추가하겠습니다
kristian nissen

이것은 편집 된 질문에 대해 효과가 있지만 (일종의) , 작업 양식을 블록 안에 넣는 올바른 방법 은 아닙니다 . 문자열이 아닌 렌더 배열을 원합니다. 에 대한 인수 (양식 API에 의해 규정 된대로)를 갖기를 원합니다 hook_form(). 정답은 Francisco Luz의 답변을 참조하십시오.
무료 Radical

11

내 베팅은 $form['#submit'][] = 'event_signup_form_submit';범인입니다. 추가 제출 핸들러를 원하는 경우에만 설정하십시오.

이것은 작동하는 샘플 코드입니다.

<?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
훌륭한 예입니다!
leymannx

1
좋은 예입니다. 사용자 정의 양식 제출이 필요하지 않았지만 처음 두 함수는 사용자 정의 양식을 블록에 넣었습니다.이 페이지를 찾을 때 찾고 있던 것입니다. 감사.
백만개의 잎

나는 이것이 받아 들여야 할 답변이라고 생각합니다.
무료 Radical
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.