Я уже опоздал на вечеринку,
Плохие новости : Это полностью связано с сопоставлением 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';
}
}
}
}
}
}
Надеюсь, это поможет любому, кто столкнулся с такой ситуацией.