Прыгают фасетные фильтры

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

Аватар пользователя WiseUA WiseUA 12 декабря 2016 в 13:31

Нужна была сортировка по весу указаному в поле(тип list) я сделал, выглядит это так:

<?php/**
 * Implements hook_facetapi_sort_info().
 */
function helper_facetapi_sort_info() {
  $sorts = array();

  $sorts['Field setting'] = array(
    'label' => t('Output by options order'),
    'callback' => 'helper_sort_field_settings',
    'description' => t('Options order set in field setting'),
    'weight' => -51,
  );

  return $sorts;
}

/**
 * Sorts by taxonomy weight.
 */
function helper_sort_field_settings(array $a, array $b) {
  $query_field = isset($a['#query']['f']) ? $a['#query']['f'] : $b['#query']['f'];
  $last_item_number = count($query_field) - 1;
  foreach ($query_field as $key => $item) {
    $query_field[$key] = str_replace(':', '%3a', $query_field[$key]);
  }
  $field = substr($query_field[$last_item_number], 0, strpos($query_field[$last_item_number], '%3a'));
  $my_field = field_info_field($field);
  $allowed_values = (!empty(list_allowed_values($my_field))) ? list_allowed_values($my_field) : FALSE;
  $sort_array = array();
  $n = 0;
  if ($allowed_values) {
    foreach ($allowed_values as $index => $value) {
      $sort_array[$n] = $value;
      $n++;
    }
    $a_sort = array_search($a['#markup'], $sort_array);
    $b_sort = array_search($b['#markup'], $sort_array);
    if ($a_sort == $b_sort) {
      return 0;
    }
    return ($a_sort < $b_sort) ? -1 : 1;
  }
}?>

По логике она должна все идеально сортировать но сортирует она только при первой загрузке страницы, после выбора фильтров пункты в блоках прыгайт в хаотическом порядке. Может кто сталкивался? Спасибо!

Лучший ответ

Аватар пользователя WiseUA WiseUA 27 декабря 2016 в 13:12

Решыл проблему с помощю хака модуля:

diff --git a/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc b/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc
index 3fa3ee0..bf27db2 100644
--- a/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc
+++ b/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc
@@ -1464,10 +1464,11 @@ class FacetapiFacetProcessor {
    */
   protected function initializeBuild() {
     $build = array();
-
+    $current_facet = $this->facet->getFacet();
     // Build array defaults.
     $defaults = array(
       '#markup' => '',
+      '#current_field' => $current_facet['field api name'],
       '#path' => $this->facet->getAdapter()->getSearchPath(),
       '#html' => FALSE,
       '#indexed_value' => '',

Комментарии

Аватар пользователя WiseUA WiseUA 27 декабря 2016 в 13:12

Решыл проблему с помощю хака модуля:

diff --git a/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc b/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc
index 3fa3ee0..bf27db2 100644
--- a/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc
+++ b/docroot/sites/all/modules/contrib/facetapi/plugins/facetapi/adapter.inc
@@ -1464,10 +1464,11 @@ class FacetapiFacetProcessor {
    */
   protected function initializeBuild() {
     $build = array();
-
+    $current_facet = $this->facet->getFacet();
     // Build array defaults.
     $defaults = array(
       '#markup' => '',
+      '#current_field' => $current_facet['field api name'],
       '#path' => $this->facet->getAdapter()->getSearchPath(),
       '#html' => FALSE,
       '#indexed_value' => '',