Патч views_alpha_pager для русских букв

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

Аватар пользователя jason32 jason32 6 апреля 2008 в 15:02

От юзера okolobaxa с удивлением узнал, что ещё никто не выложил решение проблемы русских букв такого полезного модуля, как views_alpha_pager. Попробуем ликвидировать столь досадное упущение и опубликуем здесь, что и как. Осенью сталкивался с этой проблемой и узнал, что почти всегда хватает изменения одной строчки в коде. Итак:
файл views_alpha_pager.module строка где-то так 174-182, вместо
<?php $apage = isset($_GET['apage']) ? substr($_GET['apage'], 0, 1) : ''; ?> пишем
<?php $apage = isset($_GET['apage']) ? $_GET['apage'] : ''; ?>
Также надо добавить где-то <?php setlocale(LC_ALL, 'rus'); ?> - я добавил в начале служебного модуля, можно в начале views_alpha_pager
PS
Вообще то надо узнать свою локаль на вашем сервере. Потребуется название для кириллицы cp1251. Обычно оно приводится в разделе FAQ вашего хостинга, если там его нет, то придется написать запрос в службу поддержки. Другой вариант - перебирать различные комбинации, которые можно встретить в Интернете, путь чаще всего более долгий.
Например, для моего хостинга установка локали cp1251 выглядит так:
setlocale(LC_ALL, 'ru_RU.CP1251');

После этого у меня работает и на локалке, и на хостинге

Комментарии

Аватар пользователя Deep Paul Deep Paul (не проверено) 19 апреля 2008 в 8:55

Блин,не работает... точнее вместо русских букв пишет "_",а там уже все с русские ресурсы пошли... Оч надо! Хелп плиззз! Диплом... Sad

Аватар пользователя jason32 jason32 20 апреля 2008 в 11:51

Deep Paul
у всех работает - значит и у тебя должно,
<?php setlocale(LC_ALL, 'rus'); ?> надеюсь поставил не внутри функций, а вне их?

Аватар пользователя Deep Paul Deep Paul (не проверено) 21 апреля 2008 в 17:32

поставил в самом начале файла,сразу до всех функций...
странно что не работает у меня
там я нашел есть англ алфавит,добавил к нему еще и русский-все равно не пошло

Аватар пользователя smile smile 23 мая 2008 в 12:19

Присоеденяюсь к вопросу.

Все сделал по инструкции, русский алфавит в виде не появился. Вместо него были _ и там все русские.

Немного подшаманил и вместо:
setlocale(LC_ALL, 'rus');

поставил другую локаль:
setlocale(LC_ALL, 'ru');

Русский появилсо,но как-то... эм... НЕ ВЕСЬ. Вот так линейка с буквами выглядит сейчас:
А _ К М Н О П С Т У Х Ш Я All

Проверил - материалы на буквы с Б по К есть, но в списке этих букв почему-то нет.

ВОПРОС: Что это было и как полечить?

Аватар пользователя jason32 jason32 30 мая 2008 в 13:29

парни, это все делалось на локалке,то есть на Винде. На Unix-системах ещё не тестил, но думаю несложно найти нужную локаль. Как буду выкладывать свой проект - отпишу, как решил проблему...

Аватар пользователя direqtor direqtor 8 августа 2008 в 4:23

Тоже на днях предстоит. Пока тестю словарь для сайта на английском.
А нужно будет сделать на русском и китайском... Smile
Посмотрю, что у меня получится.

Аватар пользователя goodboy goodboy 12 декабря 2008 в 15:33

Получилось, спасибо!

Сайт на мастерхосте, http://masterhost.ru/support/doc/php/ вроде как говорит, что локаль ru_RU.CP1251

Проверил setlocale(LC_ALL, 'ru_RU.CP1251') - возвращает не FALSE.

Появились часть букв. Например, "П" есть, а "Л" - нет (черточка).

Убрал в модуле проверку на ctype_alpha:

Вместо

   if (ctype_alpha($item->$myfield)) {
      $items[$item->$myfield] = $item->$myfield;
    }
    elseif (ctype_digit($item->$myfield)) {
      $items['0'] = '#';
    }
    else {
      $items['_'] = '_';
    }

Вставил

 if (ctype_digit($item->$myfield))
      $items['0'] = '#';
   else
      $items[$item->$myfield] = $item->$myfield;

Все буквы появились. Для "хорошей" буквы П все работает (%D0%9F), для "плохой" буквы Л(%D0%9B) выводит материалы на букву Л и П.

Далее, изменил модуль таким способом:

      //$where = "INSTR('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', $myfield) = 0";
       $where = "$myfield = '$apage'";

И после этого и для "плохих" букв стало работать.

Аватар пользователя evova evova 12 декабря 2008 в 15:43

Кому интересно могу рассказать как я это сделал. Использовал только views2 (views_alpha_pager не использовался!!!)
Пример - http://peoplestars.ru/stars

P.S на сайт не смотрите он еще не доделанный

Аватар пользователя goodboy goodboy 24 декабря 2008 в 18:51

setlocale(LC_ALL, 'ru_RU.CP1251') отключил, так как поиск перестал работать
Или где-то нужно делать setlocale(LC_ALL, 0)?

Хотя, вроде как и без setlocale работает на двух мастерхостовских сайтах(с моими изменениями, описанными выше в этом топике).

Аватар пользователя jeweller jeweller 23 января 2009 в 15:26

Спасибо!

Вставил в скрипт модуля команду

 passthru('locale -a | grep ru');

Полученный список доступных локалей вставил в команду

echo setlocale(LC_ALL, 'ru_RU.CP1251', 'ru_RU.CP866', 'ru_RU.ISO8859-5', 'ru_RU.KOI8-R', 'ru_RU.UTF-8');

Получил первую подходящую локаль 'ru_RU.CP1251'

В начале модуля вставил

setlocale(LC_ALL, 'ru_RU.CP1251');

// но от этого действительно пришлось отказаться, так как нарушает работу поиска //

заменил как в шапке-вместо

$apage = isset($_GET['apage']) ? substr($_GET['apage'], 0, 1) : '';

вставил

$apage = isset($_GET['apage']) ? $_GET['apage'] : '';

Не помогло.
Тогда внес изменения в модуль, предложенные Goodboy

заменил

if (ctype_alpha($item->$myfield)) {
      $items[$item->$myfield] = $item->$myfield;
    }
    elseif (ctype_digit($item->$myfield)) {
      $items['0'] = '#';
    }
    else {
      $items['_'] = '_';
    }

на

if (ctype_digit($item->$myfield))
      $items['0'] = '#';
   else
      $items[$item->$myfield] = $item->$myfield;

действительно, появилась вся линейка букв, но не работает фильтрация - при нажатии на любую букву выводится весь список ( с разбиением на страницы)

заменил, опять же как предложил Goodboy

$where = "INSTR('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', $myfield) = 0";

на

// $where = "INSTR('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ', $myfield) = 0";
          $where = "$myfield = '$apage'";

И вроде всё заработало.

Аватар пользователя Serg_M Serg_M 18 марта 2009 в 16:29

А у меня русская буква "Р" не работает. Вернее в линейке букв она появляется, а материалы на эту букву не выводятся (пусто). Вроде все делал, как описано выше?????

P.S. повторил эксперимент на другой машине, с другой версией Denwer - все заработало

P.S.2 точнее виновником оказался браузер IE v.6*

Аватар пользователя Serg_M Serg_M 3 марта 2009 в 10:10

В данной версии всё, что начинается на цифры, собираются под #, но выводятся подряд - сначала английские, затем русские, например:
14 Zatoichi
34-й скорый

Как бы доработать модуль, чтобы было две # - одна для английских, другая соответственно - для русских окончаний...