非拉丁字母的 Drupal 视图词汇表

Posted

技术标签:

【中文标题】非拉丁字母的 Drupal 视图词汇表【英文标题】:Drupal views glossary for non latin letters 【发布时间】:2011-07-27 08:23:50 【问题描述】:

嗯,我在drupal.org和***上搜索过,没有找到类似的问题,希望没有漏掉什么。

我正在使用 drupal 7 构建一个网站,其中的内容需要按字母分组。词汇表中的视图似乎是最好的解决方案,而且效果很好。唯一的问题是我使用了非拉丁字母,如 Č Đ Č Š Ž 并且顺序混乱。我需要像 Gaj 的拉丁字母中的顺序:

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

如您所见,还有一个问题,因为有些字母带有“两个字母”,但将 Lj 显示为 L 将是我可以接受的解决方案。最大的问题是C和Ć显示在Č下但Đ与D分开,所以我得到:

A (1) | Č (3) | D (1) | Ž (1) | Đ (1) 为例。

这个问题有没有优雅的解决方案?将 C 和 Ć 与 Č 分开或合并 D 和 Đ。请帮忙。

【问题讨论】:

【参考方案1】:

我在这个派对上迟到了,

坏消息:这完全是由于 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 消除了排序规则列出为相等的 unicode 字符之间的任何差异,因为它将它们分组并视为相等。

好消息:通过实现 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';
          
        
      
    
  

希望这对遇到这种情况的其他人有所帮助。

【讨论】:

【参考方案2】:

您的网站都是俄语的吗?如果是这样,请查看此页面,Install Drupal 7.0 in your language out of the box! 它位于 localize.Drupal.org,它是 drupal.org 的本地化子域,专门用于创建非英语语言的 Drupal 站点。使用 Drupal 7,可以安装多种语言的本地化版本,包括俄语。

虽然我还没有尝试过,但我相信值得安装本地化版本来查看词汇表是否能如您所愿。如果没有,请在此处告诉我们。

【讨论】:

该网站是塞尔维亚语,Drupal 的翻译尚未完成。但我仍然认为即使翻译了字母顺序也将保持不变。我设法找到了分类学的解决方案。我用我需要的所有字母创建了一个词汇表,并使用重量来订购它们。连Lj、Nj……都没有问题。然后在视图中我创建了一个块,现在我可以将字母放在任何我想要的地方:) 很高兴听到您解决了这个问题。分类法和视图可以一起做很多事情!

以上是关于非拉丁字母的 Drupal 视图词汇表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Drupal 7 中使用视图模块列出和显示它们被分类词汇标记的项目

基于词汇的 Drupal 变化展示

Drupal 视图/块不显示

分类的自定义 url > Drupal 6 的词汇表

PHP Drupal打印与节点关联的词汇表和术语

将Drupal标记从一个词汇表移到另一个词汇表中