Drupal рассматривает глоссарий для нелатинских букв - PullRequest
2 голосов
/ 27 июля 2011

Что ж, я искал на drupal.org и переполнении стека и не смог найти подобную проблему, надеюсь, я что-то не пропустил.

Я создаю сайт в Drupal 7, где у меня есть контент, который должен быть сгруппирован по буквам . Построение представлений в глоссарии кажется лучшим решением, и оно работает хорошо. Единственная проблема состоит в том, что я использую нелатинские буквы, такие как Č Đ Č Š Ž, и порядок испортился . Мне нужен порядок, как в латинском алфавите Гая :

A B C Č Ć D Dž Đ E F G H I J K L Lj M N N N O O R R Š T U V Z Ž

как вы можете видеть, есть и проблема, потому что есть буквы с "двумя буквами", но отображение Lj как L было бы решением, с которым я мог бы жить. Самая большая проблема заключается в том, что C и Ć отображаются под Č, но Đ отделен от D, поэтому я получаю:

А (1) | Č (3) | D (1) | Ž (1) | Đ (1) например.

Есть ли элегантное решение этой проблемы? Отделить C и Ć от Č или объединить D и Đ. Пожалуйста, помогите.

Ответы [ 2 ]

1 голос
/ 20 марта 2015

Я уже опоздал на вечеринку,

Плохие новости : Это полностью связано с сопоставлением SQL, а не с представлениями. Обычная сортировка базы данных для Drupal, utf8_general_ci , предписывает MySQL обрабатывать эти символы как равные в операторах GROUP и WHERE.

В частности; запрос представлений для создания глоссария в настоящее время:

SELECT SUBSTRING(node.title, 1, 1) AS title_truncated, COUNT(node.nid)
AS num_records
FROM 
{node} node
WHERE (( (node.status = '1') AND (node.type IN  ('my_nodetype')) ))
GROUP BY title_truncated
ORDER BY title_truncated ASC
LIMIT 10 OFFSET 0

GROUP BY здесь стирает любую разницу между юникод-символами, перечисленными как сопоставление, перечисленным как равное, потому что он группирует и обрабатывает их как равные.

Хорошая новость : это быстро решается путем реализации hook_views_query_alter (), чтобы дать MySQL команду GROUP и WHERE использовать сопоставление utf8_bin для вашего представления.

/**
 * Implementation of hook_views_query_alter().
 */
function mymodule_views_query_alter(&$view, &$query) {
  if ($view->name == 'my_view') {
    // Stop the glossary from treating characters equal.
    if ($view->is_attachment) {
      foreach ($query->groupby as &$condition_group) {
        if ($condition_group == 'title_truncated') {
          $condition_group = "title_truncated COLLATE utf8_bin";
        }
      }
    }
    // Rewrite the attached view to filter on unique characters.
    else {
      foreach ($query->where as &$condition_where) {
        foreach ($condition_where['conditions'] as &$cur_condition) {
          if ($cur_condition['field'] == 'SUBSTRING(node.title, 1, 1) = :node_title') {
            $cur_condition['field'] = 'SUBSTRING(node.title, 1, 1) = :node_title COLLATE utf8_bin';
          }
        }
      }
    }
  }
}

Надеюсь, это поможет любому, кто столкнулся с такой ситуацией.

0 голосов
/ 07 августа 2011

Ваш сайт все на русском?Если это так, пожалуйста, проверьте эту страницу, Установите Drupal 7.0 на вашем языке из коробки! Он находится на localize.Drupal.org субдомен локализации drupal.org, который предназначен для создания сайтов Drupalязыки, кроме английского.С Drupal 7 можно установить локализованную версию на многих языках, включая русский.

Хотя я еще не пробовал, я считаю, что было бы целесообразно установить локализованную версию, чтобы посмотреть, работает ли глоссарийкак вы хотели бы.Если нет, дайте нам знать здесь.

...