Могу ли я создать текстовое поле для автозаполнения Drupal в блоке? - PullRequest
0 голосов
/ 19 января 2012

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

hook_block_view:

function my_module_block_view($delta = '') {
    //The $delta parameter tells us which block is being reqested.
    switch ($delta) {
        case 'my_module_my_block':
            $block['subject'] = t('Block Subject');
            $block['content'] = drupal_get_form('my_module_my_form');
            break;
    }

    return $block;
}

Код формы:

function my_module_my_form($form, &$form_state) {   
    $form = array();

    $form['term'] = array(
        '#type' => 'textfield',
        '#autocomplete_path' => 'my-module-autocomplete'
    );

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

    return $form;   
}

Форма загружается, поле есть, но автозаполнение не работает: (

Если я вызываю путь my-module-autocomplete, я получаю верный ответ по сравнению с редактированием типа контентаформа. Спиннер ajax в поле ввода никогда не появляется, поэтому ajax не вызывается. Реально все, что мне нужно, это поле автозаполнения ... отправка будет обработана вручную.

Ответы [ 3 ]

0 голосов
/ 26 апреля 2014

должно работать следующее:

function mymodule_block_info() {
  $blocks['mymodule'] = array(
    // The name that will appear in the block list.
    'info' => t('My Module'),
    // Default setting.
    'cache' => DRUPAL_NO_CACHE,
  );
  return $blocks;
}

function mymodule_block_view($delta = ''){
  switch($delta){
    case 'mymodule':
      if(user_access('access content')){ //good idea to check user perms here
         $block['subject'] = t('My Module');
         $block['content'] = 'Hi :)';
         $block['content'] = drupal_get_form('mymodule_form');
         return $block;
      }
      break;
  }
}

function mydmodule_menu() {  
    $items['module/autocomplete'] = array(
    'page callback' => 'mymodule_autocomplete',
    'access arguments' => array('access content'),
    'type' => MENU_CALLBACK
  );
  return $items;
}

function mymodule_form($form, &$form_state) {
     $form['greenentry'] = array(
          '#type' => 'textfield', 
          '#title' => t('Enter'),
          '#autocomplete_path' => 'mymodule/autocomplete',
     );


     $form['submit'] = array(
          '#type' => 'submit',
          '#value' => t('Submit'),
     );
     return $form;
}

function mymodule_autocomplete($string) {  
  $matches = array();

  // Some fantasy DB table which holds cities
  $query = db_select('cities', 'c');

  // Select rows that match the string
  $return = $query
    ->fields('c', array('city'))
    ->condition('c.city', '%' . db_like($string) . '%', 'LIKE')
    ->range(0, 10)
    ->execute();

  // add matches to $matches  
  foreach ($return as $row) {
    $matches[$row->url] = check_plain($row->url);
  }

  // return for JS
  drupal_json_output($matches);
}
0 голосов
/ 14 мая 2015

этот код так хорош для добавления автозаполнения в блоке.Но я только что нашел крошечное уведомление здесь.если кто-то получит ошибку

Произошла ошибка ajax.http код результата 200

, затем просто добавьте

exit();

после строки

drupal_json_output($matches);

, поэтому устраните проблему.

0 голосов
/ 20 января 2012

Это, вероятно, потому что вы сбрасываете $form в пустой массив в начале функции. В Drupal 7 есть куча вещей, добавленных к этому элементу, прежде чем они будут переданы вашей функции формы (поэтому $form передается вашей функции, тогда как в Drupal 6 это не так).

Просто удалите $form = array(); и все должно работать, кроме того, ваш код выглядит идеально.

...