Autocomplete по терминам и заголовкам нод.

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

Аватар пользователя MihailRM MihailRM 24 апреля 2015 в 17:20

В форму с автозаполнением, в callback нужно передать два параметра, по "терминам" и "заголовкам нод".
Выдаче с начало шли термины и потом заголовки.

Автовозврат по Терминам уже есть, как сюда добавить заголовки.

<?php/**
 *Page callback for menu 'path/autocomplete'
 */
function common_operations_custom_autocomplete($string) {
  $matches = array();
  $result = db_select('taxonomy_term_data', 'ttd');
  $result->fields('ttd', array('name'));
  $result->condition('vid', array('4', '6', '9', '10', '13'), 'IN');
  $result->condition(db_or()->condition('ttd.name', '%' . db_like($string) . '%', 'LIKE'));
  $query = $result->execute();

  foreach ($query as $row) {     
    $matches[$row->name] = $row->name; 
  }

  // Return the result to the form in json
  drupal_json_output($matches);
}?>

Комментарии

Аватар пользователя MihailRM MihailRM 24 апреля 2015 в 19:48

ХулиGUN wrote:
"MihailRM" wrote:
как сюда добавить заголовки.

Так же как и термины... вторым запросом, затем объединить массивы с результатами, тем же самым array_push()

Вот так?

$result = db_select('node', 'n')
$result->fields('n', array('title'))
$result->condition(db_or()->condition('n.title',, '%' . db_like($string) . '%', 'LIKE'));
$query = $result->execute();

Аватар пользователя MihailRM MihailRM 24 апреля 2015 в 22:07

ХулиGUN wrote:
Единственное, что так он будет искать ноды всех content_type, если нужно ограничить выборку, добавьте соответствующий кондишн

Спасибо за ответ.

На выходе получился такой код:
Все ли правильно я сделал?

<?php/**
*Page callback for menu 'path/autocomplete'
*/
function common_operations_custom_autocomplete($string) {
$matches = array();
$result = db_select('taxonomy_term_data', 'ttd');
$result->fields('ttd', array('name'));
$result->condition('vid', array('4', '6', '9', '10', '13'), 'IN');
$result->condition(db_or()->condition('ttd.name', '%' . db_like($string) . '%', 'LIKE'));
$query = $result->execute();

foreach ($query as $row) {
$matches[$row->name] = $row->name;
}

$result = db_select('node', 'n')
$result->fields('n', array('title'))
$result->condition(db_or()->condition('n.title',, '%' . db_like($string) . '%', 'LIKE'));
$query = $result->execute();

foreach ($query as $row) {
$matches[$row->title] = $row->title;
}
// Return the result to the form in json?>

Аватар пользователя MihailRM MihailRM 24 апреля 2015 в 23:40

ХулиGUN wrote:
"MihailRM" wrote:
Все ли правильно я сделал?

Вы массивы не объединили.... В Вашем случае если заголовок ноды совпадёт с названием термина, то выведет только заголовок ноды... Используйте разные переменные для массивов... в конце сделайте array_push() для объединения

Вот щас правильно ?
Если нет, ткните носом Smile
Спасибо.

<?php/**
*Page callback for menu 'path/autocomplete'
*/
function common_operations_custom_autocomplete($string) {
$matches = array();
$result = db_select('taxonomy_term_data', 'ttd');
$result->fields('ttd', array('name'));
$result->condition('vid', array('4', '6', '9', '10', '13'), 'IN');
$result->condition(db_or()->condition('ttd.name', '%' . db_like($string) . '%', 'LIKE'));
$query = $result->execute();

$result = db_select('node', 'n')
$result->fields('n', array('title'))
$result->condition(db_or()->condition('n.title',, '%' . db_like($string) . '%', 'LIKE'));
$query = $result->execute();

foreach ($query as $row) {
$matches[$row->name] = $row->name;
$matches[$row->title] = $row->title;
}

// Return the result to the form in json
drupal_json_output($matches);
}?>