Генерування <кнопки типу = «подати»> за допомогою API форми


12

У мене є сильна тематична форма для інтеграції, структура якої показана нижче. Я майже там, здебільшого, крім подання.

 <form action="#">
   <fieldset>
     <legend>Authentification</legend>
       <label for="email">Courriel*</label>
       <input type="text" name="email" id="email">
       <label for="password">Mot de passe*</label>
       <input type="password" name="password" id="password" class="last">
       <a href="#" title="Mot de passe oublié?" class="clearfix">Forgot password?</a>
       <button type="submit" class="clearfix"><span>Login</span></button>
   </fieldset>
 </form>

Я спробував багато різних комбінацій, виявляється, тип_типу не впливає на основні. Тому я використав цей злом , сподіваючись, що він вирішить мою проблему. На жаль, це змінює лише атрибут 'type' (очевидно), а не сам елемент. Тип кнопки може містити інші елементи, у цьому випадку проміжок потрібен для фонового зображення, він повинен бути в прольоті, щоб розтягнутись, оскільки текст у кнопці динамічний.

Хтось має підказку, як я можу генерувати наступний рядок розмітки за допомогою API форми?

<button type="submit" class="clearfix"><span>Login</span></button>

Для Drupal 8 кнопкою подання стане <botton type="submit">, дивіться drupal.org/node/1671190
Philipp Michael

Відповіді:


12

У D7 рекомендував би:

$form['custom-form'] = array(
  '#prefix' => '<button type="submit">',
  '#suffix' => '</button>',
  '#markup' => '<span>' . t('Login') . '</span>',
);

Таким чином ви можете замінити #markup у функції alter пізніше, якщо потрібно, без необхідності перебудувати кнопку HTML.


Цей спосіб не підтримує автоконкурент.
Петро Лозовицький

17

Крім того, на випадок, якщо хтось зіткнеться з тією ж проблемою, що і я - при використанні #markupабо #prefix/ #suffixтрюку у actionsгрупі форми , функція зворотного виклику надіслати взагалі не буде викликатися , якщо тільки немає submitелемента типу. Моє вирішення було таким:

$form['actions']['submit'] = array
(
    '#type' => 'submit',
    '#value' => '',
    '#attributes' => array( 'style' => array( 'display: none' )), // hide the input field
    '#submit' => array( 'my_callback_for_the_form_submit' ),
    '#prefix' => '<button type="submit" class="btn btn-primary">Add <i class="fa fa-plus-square-o">',
    '#suffix' => '</i></button>',
);

Таким чином ви можете використовувати спеціальний HTML для подання груп дій.


Це була найкраща відповідь, яку дали…
Пратіп Гош

5

Щоб додати спеціальний тег, ви можете скористатися такими фрагментами:

// Drupal 6.
$form = array();

// Other elements.

$form['custom-form'] = array(
    '#value' => '<button type="submit" class="clearfix"><span>Login</span></button>',
);
// Drupal 7.
$form = array();

// Other elements.

$form['custom-form'] = array(
    '#markup' => '<button type="submit" class="clearfix"><span>Login</span></button>',
);

Це насправді не спрацювало, але це змусило мене спробувати "#markup" замість #value, і це зробило трюк. Дякую брате, я ціную.
stefgosselin

1
Ви не повідомили про свою версію Drupal. #value призначений для Drupal6. #markup представлений у Drupal 7
Shoaib Nawaz

Так друже, мій поганий. Я мав би згадати номер версії.
stefgosselin

2

Просто для повноти я опублікую альтернативне рішення, яке передбачає переосмислення theme_button(взято з цієї публікації в блозі )

Спочатку додайте buttontypeатрибут до елемента форми:

$form['submit'] = array (
    '#type' => 'submit',
    '#buttontype' => 'button',
    '#value' => 'Search',
);

Потім клацніть кнопку теми:

/**
 * Override of theme_button().
 *
 * Render the button element as a button and the submit element as an input element.
 */
function MYTHEME_button($variables) {
  $element = $variables['element'];
  $element['#attributes']['type'] = 'submit';

  element_set_attributes($element, array('id', 'name', 'value'));  

  $element['#attributes']['class'][] = 'form-' . $element['#button_type'];
  if (!empty($element['#attributes']['disabled'])) {
    $element['#attributes']['class'][] = 'form-button-disabled';
  }

  if (isset($element['#buttontype']) && $element['#buttontype'] == 'button') {
    $value = $element['#value'];
    unset($element['#attributes']['value']);
    return '<button' . drupal_attributes($element['#attributes']) . '>' . $value . '</button>';
  }
  else {
    return '<input' . drupal_attributes($element['#attributes']) . ' />';
  }
}

Однак це створює проблеми, якщо у формі більше однієї кнопки, оскільки Drupal не в змозі виявити, яку кнопку було натиснуто.

Це можна вирішити, додавши #after_buildдо форми зворотний дзвінок:

$form['#after_build'][] = 'mymodule_force_triggering_element';

А потім у функції after build:

function mymodule_force_triggering_element($form, &$form_state) {
  if (isset($form_state['input']['submit'])) {
    $form_state['triggering_element'] = $form['submit'];
  } elseif (isset($form_state['input']['other_button'])) {
    $form_state['triggering_element'] = $form['other_button'];
  }
  return $form;
}

1

Я спробував відповідь Оскара Гомеса Альканіса, але моя форма все ще не надходила. Як вирішення, я змінив його рішення, щоб введення сиділо над кнопкою, але було прозорим:

$form['actions']['submit'] = array (
    '#type' => 'submit',
    '#value' => '',
    '#attributes' => array( 'style' => 'position: absolute; left: 0; right: 0; top: 0; bottom: 0; border: none; opacity: 0; width: 100%;'), // put input field over the top of button and make transparent
    '#prefix' => '<button type="submit" class="btn btn-primary">Add <i class="fa fa-plus-square-o">',
    '#suffix' => '</i></button>',
);

Таким чином input[type="submit]натискають фактичне натискання та запуск дії, але кнопку

Ймовірно, гарна ідея вмістити все це CSS у таблицю стилів у реальному житті, але просто поставити тут тег стилю inline як приклад.


0

Ось як я цього досягаю в Drupal 8. В основному я створюю нову пропозицію щодо теми, щоб я міг перекрити кнопку зі спеціальним файлом гілочок.

Додайте цей код у файл mythemename.theme:

/**
 * Add twig suggestions for input elements.
 *
 * If a form api element has a data-twig-suggestion attribute, then allow twig
 * theme override, add to suggestions.
 *
 * @param array $suggestions
 *   Current list of twig suggestions.
 * @param array $variables
 *   Every variable of the current element.
 */
function mythemename_theme_suggestions_input_alter(&$suggestions, array $variables) {
  $element = $variables['element'];

  if (isset($element['#attributes']['data-twig-suggestion'])) {
    $suggestions[] = 'input__' . $element['#type'] . '__' . $element['#attributes']['data-twig-suggestion'];
  }
}

У своєму коді, де б ви не створили форму, додайте атрибут "дані-гілочки-пропозиції" до кнопки подання:

$form['submit'] = [
      '#type' => 'submit',
      '#value' => t('Submit') . ' >',
      '#attributes' => [
        'data-twig-suggestion' => 'button',
      ],
    ];

Тепер якщо у вас включена налагодження гілочок і ви перевіряєте html-джерело своєї кнопки на сайті, ви побачите нову пропозицію гілочки:

<!-- FILE NAME SUGGESTIONS:
   * input--submit.html.twig
   * input--submit--button.html.twig
   x input.html.twig
-->

Тепер ви можете створити файл input - submit - button.html.twig (я розміщую це у моєму імені / шаблонах / form_elements, але ви можете розмістити його в іншому місці, якщо хочете):

<button{{ attributes }} type='submit'>
    <span class="great-success">Submit</span>
</button>

-3

Більш правильний спосіб:

$form['submit'] = array(
  '#type' => 'button',
  '#value' => '<span>Login</span>',
);

Він видає дійсний HTML таким чином:

<button value="&lt;span&gt;Login&lt;/span&gt;" type="submit">
    <span>Login</span>
</button>

... і цей метод не гальмує автозаповнення та інші функції.


1
Він не повертає <button>тег, принаймні у D7. Останній рядок theme_button()у включає / form.inc єreturn '<input' . drupal_attributes($element['#attributes']) . ' />';
Daniels

Чи можете ви повторно перевірити? Я скопіював цей код з мого робочого спеціального модуля.
Петро Лозовицький

Якщо це працює для вас, це означає, що ви перекрили тема_button у спеціальній темі чи модулі. Даніель - це правильно.
Фелікс Єва,

@FelixEve, правильно! Я змінив кнопку в спеціальній функції. Чи є якийсь інший спосіб зробити це без спеціальної функції?
Петро Лозовицький

Цей потік має хороший огляд усіх доступних методів.
Фелікс Єва
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.