Собственно, столкнулся с интересной задачей:
Есть:
Фасетные отборы каталога товаров, реализованные на Facet API+Search API+Apache SOLR в бекэнде.
Нужно:
Реализовать генерацию ссылок в sitemap.xml по первому уровню фасетных отборов (одновременно активен только одно значение любого фасета).
Встречал ли кто что либо похожее (готовое, или sandbox)? Хотелось бы посмотреть подход к решению задачи. Задача не простая в первую очередь с точки зрения производительности - так как планируется использовать эту приблуду на не маленьких объемах данных:
Типов контента: около 150
Общее количество фасет (полей): около 1100
Примерно 60% фасет - поля таксономии, в среднем 10-20 терминов в словаре (есть и большие, по несколько сотен терминов в словаре).
Т. е. количество ссылок для генерации предполагается довольно большим.
Комментарии
на каком принцыпе формируется ссылка?
Facet API + альяс поля в настройке фасеты + FAPI Pretty Path
а модуль сайт мап генератор разве не берет?
а ой сори не совсем правильно сначала понял задачу... вам фактически надо ограничить отбор..... тогда даже не знаю как помочь. сори
Нет, к сожалению готовой интеграции нет, сайтмеп по умолчанию имеет реализации для формирования ссылок по:
хммм уникальная ситуация вы первый кто о таком спрашивает.. лоничное предположение - либо никто о таком даже и не думал и вы первый, либо решение настолько очевидно что о нем никто не пишет..
боюсь что тут именно первый случай..
а жаль вопрос кстати актуален и для меня.//
Хотя... тут же момент такой - результаты деятельности фацетов это же views тоесть вам надо копать в сторону включения views в xml sitemap тоесть например тут http://drupal.org/node/507674
Нашел подход к решению задачи. Возможно не совсем эффективный, я бы сказал "костыльный", зато позволит получить вменяемый результат за короткое время.
1. hook_views_pre_execute() на вьюху каталога
2. $_SERVER['REQUEST_URI'] - урла страницы. Парсим урл, чтобы реагировать только на фасетные отборы.
3. Проверяем наличие записи в XML Sitemap и при необходимости пишем новую запись. Это уже с использованием API XML Sitemap
Минусы:
1. Как то не совсем drupal-way.
2. Как минимум 1 лишний запрос к БД при вызове вьюхи (hook_views_pre_execute() на эту вьюху у меня и так используется в кастомном модуле).
3. В Sitemap попадут только те страницы, которые просматривались пользователями. Это в принципе можно решить запуском краулера по страницам.
Задачу пока закрываю, если найду более правильное решение - отпишусь сюда.
Также создал ишью по этой теме на drupal.org
если ссылки есть с морды то робот и так зайдет
Хоть тема решена нашел еще одно решение, нагуглил https://drupal.org/node/1626468#comment-6117600
Опираясь на этот комент накатал такую функцию. Вроде работает )
<?php
$fild_info = field_info_field($facet_name);
$tree = taxonomy_get_tree($vocabulary->vid);
$field_bundles = $fild_info['bundles']['node'];
$tids = db_select($table_name, 'f')
$href = $adapter->getFacetPath($facet, $tids, 0);
$expl_href = explode("/", $href);
$link = array(
function add_facets_links_to_sitemap () {
$links_type = 'facet';
xmlsitemap_link_delete_multiple(array('type' => $links_type));
$i = 999999; // Not significantly, because the whole group is recreated on the new.
foreach (facetapi_get_searcher_info() as $searcher => $info) {
foreach (facetapi_get_delta_map_queue($searcher, 'block') as $facet_name) {
$adapter = facetapi_adapter_load($searcher);
$facet = facetapi_facet_load($facet_name, $searcher);
$vocab_mn = isset($fild_info['settings']['allowed_values'][0]['vocabulary']) ? $fild_info['settings']['allowed_values'][0]['vocabulary'] : '';
if (
check_plain($vocab_mn)) {$vocabulary = taxonomy_vocabulary_machine_name_load($vocab_mn);
if (isset($vocabulary->vid)) {
foreach ($field_bundles as $content_type) {
$table_name = 'field_data_' . $facet_name;
$field_name = $facet_name . '_tid';
if (
db_field_exists($table_name, $field_name)) {->fields('f', array($field_name))
->condition('f.bundle', $content_type)
->groupBy('f.' . $field_name)
->execute()
->fetchCol();
if (isset(
$expl_href[0])) {if (! $expl_href[0]) {
foreach (
$expl_href as $key => $value) {if ($key != 0 && $key % 2 == 0) {
$h = '/' .$expl_href[$key - 1] . '/' . $value;
'type' => $links_type,
'id' => ++$i, // Must beat the unique within the group.
'loc' => drupal_get_path_alias('catalog/' . $content_type . $h),
'priority' => '0.5',
'changefreq' => '0',
'language' => 'und',
);
xmlsitemap_link_save($link);
}
}
}
}
}
}
}
}
}
}
}
?>