Поисковые события в drupal7
У меня есть сайт, который работает на drupal 7 и использует civicrm 4.4.1. Мне нужно, чтобы события были включены в результаты поиска.
До сих пор все, что я нашел, было датированной документацией по civicrm, для которой требовались модули, недоступные для Drupal 7.
Я также попробовал модуль поиска страницы, и он не захватывает события.
3 ответа
Я не видел ничего готового, который включал бы события CiviCRM в стандартный поиск по сайту Drupal. Глядя на API поиска, я думаю, что для этого можно создать модуль, но я не думаю, что это тривиально. Я не написал никаких модулей для поискового API, но похоже, что для написания такого рода интеграции нужно сделать немного бухгалтерии.
Я справился с этим несколькими способами для моих клиентов. Во-первых, создайте тип контента для событий и поместите подробное описание и базовую информацию о дате в тип контента. При создании событий в CiviCRM просто создайте событие barebones для регистрации и создайте ссылку на страницу регистрации событий непосредственно из узла событий. Во-вторых, сделайте поиск событий отдельным действием, с красивой ссылкой и представлением.
Я знаю, что ни одно из этих решений не является идеальным, но я не вижу быстрого решения, кроме написания собственного поискового плагина.
Немного неясно, что вы ищете, поэтому я отвечу двумя способами.
Вы можете легко найти участников мероприятия, зайдя в меню "Поиск" и выбрав "Расширенный поиск". Вы можете увидеть информацию о событиях, нажав на заголовок "События" - откроется раздел. Вам не нужно вводить что-либо еще в форму поиска, если вы не хотите искать это тоже (например, участники по сбору средств, которые живут в Западной Вирджинии).
Если вы хотите, чтобы события CiviCRM отображались в результатах поиска контента в Drupal, вам нужно, чтобы события отображались как контент. Информация CiviCRM на 100% отделена от содержимого Drupal, но вам может повезти, если вы воспользуетесь модулем CiviCRM Entity https://drupal.org/project/civicrm_entity для представления событий CiviCRM в качестве сущностей.
Мы создаем контент в Drupal и связываем его со страницами событий Civi, используя вычисляемое поле, которое сопоставляет имя события с полем заголовка узла, а дату начала события с полем даты события узла. Пример кода для вычисляемого поля:
list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
$query = "SELECT
ce.id
FROM {node} n
INNER JOIN {field_data_field_event_date} de ON n.nid = de.entity_id AND n.vid = de.revision_id
INNER JOIN {civicrm_event} ce ON n.title = ce.title COLLATE utf8_unicode_ci
AND ce.start_date = convert_tz(field_event_date_value,'GMT','America/New_York')
WHERE n.nid = :nid
AND n.vid = :vid
LIMIT 1";
$result = db_query($query,
array(':vid' => $vid, ':nid' => $id))->fetchField(0);
if ($result === NULL || $result == "")
{
$entity_field[0]['value'] = 0;
}
else
{
$entity_field[0]['value'] = $result;
}
Затем вы можете использовать немного кода для отображения, например так:
if ($entity_field_item['value'] == 0)
{
$display_output = '';
}
else
{
$display_output = '<a href="https://examplesite.org/civicrm/event/register?reset=1&id=' . $entity_field_item['value'] . '">Buy tickets</a>';
}
Поскольку у нас есть код события Civi, сохраненный на узле, мы также можем использовать любые встроенные функции поиска в Drupal или представления, а также проявлять креативность в шаблонах Drupal по мере необходимости. Другими вариантами может быть написание собственного модуля, который делает что-то подобное, или рассмотреть возможность использования конечной точки Civi REST. /sites/all/modules/civicrm/extern/rest.php?entity=Event&action=getlist&json={"sequential":1}&api_key=yoursitekey&key=yourkey
с модулями Drupal Feeds и Feeds Extensible Parsers для решения, которое создает и обновляет события Drupal с минимальным необходимым кодом.