Drupal Module - Форма в блоке без применения шаблона - PullRequest
0 голосов
/ 30 января 2010

Помогите мне понять, почему моя форма не разрабатывается в стиле sites / all / modules / pecapture / themes / pecapture-displayform.tpl.php

Вот мой код:

/**
 * 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,
    ),
  );
}

В основном это говорит о том, что файлы тем находятся в папке module / theme ($ path)

Существует функция темы pecapture_displayform ($ form = NULL), вызываемая с помощью theme ('pecapture_displayform', $ form), где $ form является массивом форм Drupal

Файл $ pecapture_displayform.tpl.php находится в $ path

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

Это говорит о том, что при просмотре блока используйте функцию pecapture_displayForm () для генерации содержимого. $ block получает php print () ed

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

Это говорит о том, что возвращаем отформатированный в HTML массив drupal формы (для вывода)

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

Это содержимое формы, оно типичное.

Я попытался явно вызвать функцию темы в pecapture_displayform:
return theme('pecapture_displayform', $form);
и
return theme('pecapture_displayform', drupal_get_form($form));

Так почему же форма не проходит через pecapture-displayform.tpl.php?

1 Ответ

1 голос
/ 30 января 2010

Существует два основных способа создания тем из модуля - использование функции темы или использование шаблона. В обоих случаях вам нужно зарегистрировать темы в функции hook_theme для вашего модуля (pecapture_theme). Эта часть вашего примера выглядит правильно.

Если вы зарегистрируете функцию темы, вы создадите функцию темы и вызовете ее theme_themename. Если вы регистрируете шаблон (как вы сделали), вы используете дополнительную функцию template_preprocess и шаблон. Функции Template_preprocess называются template_preprocess_themename и передаются, по ссылке, в массив переменных, которые затем передаются в шаблон. Кроме того, вы никогда не должны напрямую вызывать функцию темы. Всегда использует theme('themename', $args) для доступа к теме, чтобы drupal мог правильно ее обрабатывать (позволяет переопределять и корректировать предварительную обработку переменных).

Итак, во-первых, похоже, что вы пытаетесь напрямую вызвать функцию тематики, которую drupal не распознает как функцию темы. Во-вторых, вы используете шаблон, поэтому вам нужна функция с именем template_preprocess_pecapture_displayform(&$vars), если вы хотите обработать форму перед ее отправкой в ​​шаблон. Также убедитесь, что ваш шаблон называется pecapture-display.tpl.php, чтобы он точно совпадал с именем, которое вы указали в hook_theme, за исключением расширения.

Кроме того, похоже, что вы пытаетесь создать тему для темы. Итак, вам нужно указать drupal_get_form использовать вашу тему, включив $form['#theme'] = 'pecapture_displayform' в функцию формы. Вы можете выводить отдельные элементы формы в своей теме, вызывая drupal_render($form['element']), вызывая drupal_render($form), чтобы отобразить все оставшиеся неотрисованные элементы (drupal отслеживает, поэтому они не будут отображаться дважды).

См. http://api.drupal.org/api/drupal/developer--topics--forms_api.html/6 для получения дополнительной информации о бланках тем.

Пока вы указали тему в своей функции формы, вам не нужно будет вызывать ее явно, поэтому вы сможете делать

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

в вашем блок-хуке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...