Как добавить кастомный виджет для текстового поля.

Главные вкладки

Аватар пользователя engenes engenes 21 марта 2019 в 11:11

Написал скрипт которые делает запись с экрана, отправляет на сервер а в ответ получает ссылку на файл.

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

По сути задача сводится к тому чтобы чтобы при выборке кастомного виджета, возле текстового поля, появлялся произвольный html рядом с этим полем, содержащий кнопки.
Про hook_field_widget_info знаю, но как с помощью него добавить нужный виджет с кодом к определенному полю так и не понял.
Не нашел примеров как зацепиться за определенное поле

Лучший ответ

Комментарии

Аватар пользователя sas@drupal.org sas@drupal.org 21 марта 2019 в 11:52

По сути задача сводится к тому чтобы чтобы при выборке кастомного виджета, возле текстового поля, появлялся произвольный html рядом с этим полем, содержащий кнопки.

План

myModule_field_widget_form_alter
...
$field = $context['field'];
  if ($field['type'] == {{myType}}) {
    foreach (element_children($element) as $delta) {
      // Add all extra functionality provided by the {{myType}} widget.
      $element[$delta]['#process'][] = 'myModule_widget_process';
    }
  }
...

...

myModule_widget_process($element, &$form_state, $form) {
  ...
  //add myButton
  $element['myModule_action_delete'] = array(
    '#value' =>t('My button'),
    '#type' => 'submit',
    '#submit' => ['myModule_myButton_submit']
  );
  return $element;
}

...

myModule_myButton_submit($form, &$form_state) {
...
}
Аватар пользователя engenes engenes 21 марта 2019 в 12:16

Для начала скопировал ваш код, подставив название своего модуля, кеш сбросил.


<?php
    
function a_module_field_widget_info() {
        
$field $context['field'];
        if (
$field['type'] == 'text') {
            foreach (
element_children($element) as $delta) {
               
$element[$delta]['#process'][] = 'a_module_widget_process';
            }
        }
    }
    
a_module_widget_process($element, &$form_state$form) {
      
$element['myModule_action_delete'] = array(
        
'#value' =>t('Start recording'),
        
'#type' => 'submit',
        
'#submit' => ['a_module_myButton_submit']
      );
      return 
$element;
    }

    

a_module_myButton_submit($form, &$form_state) {

    }

?>

Но у текстового поля ничего не появилось. Насколько я понял, в самом модуле тоже где то должно быть объявлено название нового виджета.

Аватар пользователя sas@drupal.org sas@drupal.org 21 марта 2019 в 12:44

Нет это не новый видгет это расширение имеющихся ... = {{type}} кроме типа поля можно использовать критерии, которые можно так же добавить в инстансе нужно поля доп. свойства и по ним селектировать

...
/**
 * Implements hook_field_form_field_ui_field_edit_form_alter().
 */

function myModule_form_field_ui_field_edit_form_alter(&$form, &$form_state) {
  if (!empty($form['#instance']['widget']['type'])) {
    $form['instance']['myModuleFieldFeature'] = array(
      '#type' => 'checkbox',
      '#title' => t('My feature'),
      '#default_value' => isset($form['#instance']['myModuleFieldFeature']) ? $form['#instance']['myModuleFieldFeature'] : FALSE,
    );
  }
}
...