好吧,我在drupal.org上搜索并堆栈溢出,找不到类似的问题,我希望我没有错过任何东西。
我正在drupal 7中建立一个网站,我的内容需要按字母分组。构建词汇表的视图似乎是最好的解决方案,并且运行良好。唯一的问题是我使用像ČĐČŽ这样的非拉丁字母,并且命令搞砸了。我需要命令在 Gaj的拉丁字母:
中A BCČĆDDžĐEF G H I J K L Lj M N Nj O P RSŠTU VZŽ
正如你所看到的还有一个问题,因为有字母带有“两个字母”,但是将Lj显示为L将是我可以忍受的解决方案。最大的问题是Č和Ć显示在Č下但是Đ与D分开,所以我得到:
A(1)| Č(3)| D(1)| Ž(1)|例如,(1)。
这个问题有优雅的解决方案吗?从Č分离C和or或合并D和Đ。请帮忙。
答案 0 :(得分:1)
我参加派对的时间已经很晚了,
坏消息:这完全是由于SQL排序规则而不是视图。 Drupal的常用数据库排序规则, utf8_general_ci 指示MySQL在GROUP和WHERE语句中将这些字符视为相等。
特别是;目前,views查询生成词汇表:
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';
}
}
}
}
}
}
希望这对遇到这种情况的其他人有帮助。
答案 1 :(得分:0)
您的网站是否全部使用俄语?如果是这样,请查看此页面Install Drupal 7.0 in your language out of the box!在localize.Drupal.org上可以找到drupal.org的本地化子域名,该子域名专门用于创建非英语语言的Drupal站点。使用Drupal 7,可以安装多种语言的本地化版本,包括俄语。
虽然我没有尝试过,但我认为安装本地化版本以查看词汇表是否按照您的意愿运行是值得的。如果没有,请告诉我们。