Как сохранить элемент разметки формы Drupal от рендеринга внутри оболочки элемента submit? - PullRequest
0 голосов
/ 01 декабря 2011

Я программно добавил элемент «разметка» в форму Drupal. Когда он рендерится на странице, элемент появляется в обертке для кнопки отправки. Пояснение: должно появиться между элементом 'field_school_name_value' и элементом 'distance'. Я установил вес каждого элемента в надежде, что это заставит макет быть правильным но это, похоже, не помогает. Что я делаю не так?

<?php
function abq_misc_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'views_exposed_form') {
    $state_select = array(
      '#attributes' => array(
        'style' => 'width:10em;',
      ),
      '#default_value' => 'All',
      '#multiple' => FALSE,
      '#options' => array_merge(array('All' => 'State'), location_get_provinces()),
      '#title' => NULL,
      '#type' => 'select',
      '#weight' => 0,
    );
    $form['province'] = $state_select;

    $school = &$form['field_school_name_value'];
    $school['#attributes'] = array(
      'size' => 15,
    );
    $school['#weight'] = 1;

    // THIS GUY
    $form['divider'] = array(
      '#type' => 'item',
      '#markup' => '<div>&ndash;or&ndash;</div>',
      '#weight' => 2,
    );

    $form['distance']['#weight'] = 3;

    $search_distance = &$form['distance']['search_distance'];
    $search_distance['#attributes'] = array(
      'placeholder' => 'miles',
      'size' => '5',
    );
    $search_distance['#prefix'] = 'Within';
    $search_distance['#suffix'] = 'of';
    unset($search_distance['#title']);
    $search_distance['#weight'] = 0;

    $postal_code = &$form['distance']['postal_code'];
    unset($postal_code['#title']);
    $postal_code['#attributes'] = array(
      'placeholder' => 'Zip Code',
      'size' => '5',
    );
    $postal_code['#weight'] = 1;

    hide($form['distance']['search_units']);

    $form['submit']['#weight'] = 4;
 }

}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Хотя это проблема почти 7 лет, я просто запускаю эту проблему. Вот решение: https://www.drupal.org/project/views/issues/2070533

Во-первых, вы должны объявить вашу разметку в вашем хуке form_alter, но ключ '#printed' должен быть объявлен в вашем определяющем массиве. Затем вы должны реализовать функцию template_preprocess_views_exposed_form () в вашем модуле или в теме. Здесь вы можете визуализировать необходимый элемент формы с помощью drupal_render и добавить его в переменные $. И, наконец, вы можете распечатать переменную в теме (как пользовательскую переменную или среди виджетов). Но самая простая версия: клонируйте views -cted-form.tpl.php в каталог шаблонов вашей темы, назовите его так, как предлагается (например, views -cted-form - news.tpl.php) и распечатайте перевод строки, где ты хочешь.

0 голосов
/ 01 декабря 2011

Я не уверен, почему это происходит, нет веских оснований для того, чтобы ваш элемент отображался внутри оболочки для кнопки отправки.

Однако простым решением было бы использование #prefixатрибут на кнопке отправки, который гарантировал бы, что ваша разметка была отображена непосредственно перед упаковщиком для кнопки отправки:

$form['submit']['#prefix'] = '<div>&ndash;or&ndash;</div>';

ОБНОВЛЕНИЕ

Просто для внесения изменений,Я думаю, что то же самое решение может быть применено, если вместо этого установить #prefix элемента distance:

$form['distance']['#prefix'] = '<div>&ndash;or&ndash;</div>';

Возможно, что есть какой-то дополнительный формат, выполненный другим модулем, который реализует hook_form_alter, который происходит сбеги за своей, испортить свою хорошую работу.Применяя префикс к элементу distance, вы убедитесь, что он идет непосредственно перед элементом field_school_name_value.

Я должен упомянуть, что у меня возникли проблемы именно с этим при обращении к массивучлен предоставленного $form (который вы делаете с $school = &$form['field_school_name_value'];).В качестве дополнительной проверки работоспособности я бы порекомендовал изменить этот бит кода на это и посмотреть, поможет ли он (попробуйте это перед другим предложением, приведенным выше, поскольку это может просто исправить):

$form['field_school_name_value']['#attributes'] = array('size' => 15);
$form['field_school_name_value']['#weight'] = 1;

вместо

$school = &$form['field_school_name_value'];
$school['#attributes'] = array(
  'size' => 15,
);
$school['#weight'] = 1;
...