Модуль indexpage?

Прислано: Shelendor

вт, 25/07/2006 - 00:40

Другие статьи по теме:

Здравствуйте. Вопрос такой: нужно в одном определённом разделе сайта сделать алфавитную линейку поиска статей. Нашёл для этого только модуль indexpage. Но у него английский алфавит. Кто-нибудь переделывал его на русский? Вот здесь http://drupal.htdogs.ru/node/503#comment-3750 описано изменение в коде, но, судя по всему, там какая-то ошибка в ORDER BY b.weight, n.title;'); - после загрузки исправленного модуля Друпал падает со ссылкой на эту строку. Кто-нибудь знает решение? Или есть другой модуль, позволяющий создать линейку русского алфавита?

Прикреплённые версии модуля от rgb:

1.2.1 - аналог оригинального модуля, но с русским алфавитом.
Вывод английского алфавита можно включать/отключать в настройках.
Так же добавлена возможность отключать использование функции urlencode при формировании ссылок (по словам rgb: "в некоторых ситуациях ссылки получаются некорректными; скорее всего от настроек Apache зависит или ещё чего-то, не разбирался").

1.2.2.1 - добавлена возможность выбора терминов для формирования индекса.
Fix: некорректно формировалась строка алфавита, если есть материалы с заголовком, начинающимся не на букву.

1.2.3 - добавлена ссылка для вывода всех нодов (материалов) данного типа. (см. http://www.drupal.ru/node/1956#comment-13046)
ВНИМАНИЕ: Содержимое файла indexpage.css должно быть добавлено к style.css Вашей темы. С помощь класса CSS, который там описан, можно настраивать внешний вид букв, на странице "indexpage//all".

если вами замечены баги - пишите в комментариях!

Прикрепленный файлРазмер
indexpage-patched-1.2.1.zip3.53 кб
indexpage-patched-1.2.2.1.zip4.26 кб
indexpage-patched-1.2.3.zip5.37 кб

Комментарии


Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Применить"
Опубликовано Natalie в вт, 25/07/2006 - 00:53.

views тоже может делать индексацию.
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.


Опубликовано Nick в вт, 25/07/2006 - 05:26.

ORDER BY b.weight, n.title’);


Опубликовано Shelendor в вт, 25/07/2006 - 12:17.

Nick - спасибо, но не помогло. Упал с таким сообщением:
Parse error: parse error, unexpected '=', expecting ';' in /home/сайт.ru/htdocs/modules/indexpage.module on line 156


Опубликовано Nick в ср, 26/07/2006 - 05:38.

Покажите строки 155,156,157


Опубликовано Shelendor в ср, 26/07/2006 - 21:16.

$russian_string = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ'.implode("",range('A','Z'));
for ($i=0;$i0 AND b.parent=0)
ORDER BY b.weight, n.title');


Опубликовано Shelendor в сб, 29/07/2006 - 11:39.

я так понимаю, идей ни у кого нет? печально...
Наверное, придётся искать какой-то другой модуль...

Natalie - я нашёл информацию о том, чтобы с помощью views поставить статьи на странице в алфавитном порядке. Но это не то, что мне нужно. Что вы имели ввиду по поводу "views тоже может делать индексацию"?


Опубликовано Natalie в сб, 29/07/2006 - 14:42.

Они могут выводить алфавит (как-то через summary). Посмотрите в документации про аргументы
---
---
All content management systems suck, Drupal just happens to suck less. -- Boris Mann at DrupalCON Amsterdam, August 2005.


Опубликовано qman в вс, 30/07/2006 - 16:51.

А может ????
$russian_string = ‘АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ’.implode(“”,range(‘А’,’Я’));
for ($i=0;$i0 AND b.parent=0)
ORDER BY b.weight, n.title’);


Опубликовано Shelendor в вс, 30/07/2006 - 20:04.

whiteman - не катит :)
Natalie - спасибо, попробую там хоть что-нибудь понять...


Опубликовано Shelendor в ср, 20/09/2006 - 19:28.

как говорится - UP! :)
С модулем views мы как-то друг друга не поняли :) Так что возвращаюсь к началу.
Может быть за это время кто-нибудь всё же смог по-человечески русифицировать модуль indexpage???


Опубликовано rgb в чт, 21/09/2006 - 05:30.

Если есть желание - присылайте мне вашу версию модуля - помогу разобраться (для связи).


Опубликовано antazy в чт, 21/09/2006 - 08:18.

отпишитесь здесь если разберетесь


Опубликовано Shelendor в чт, 21/09/2006 - 23:53.

rgb - код изменённого модуля отправил. Заранее спасибо! Надеюсь, получится... А то уже всё испробовал - или вообще сайт падает, или вместо русской линейки букв крякозябры. Больше ничего добиться не удалось :)


Опубликовано rgb в пт, 22/09/2006 - 09:22.

2Shelendor: письмо с ответом отправил.

2antazy@drupal.org:

Цитата:

отпишитесь здесь если разберетесь

Отписываюсь :-)

А почему так пессимистично: "если разберётесь"? Надо заменить на "когда" ;-)

Код я отправил Shelendor-у (тут не знаю как выложить). Кусок который выводит строку алфавита:

<?php
 
function indexpage_page_index($type) {
// ...
 
 /* Index by letter block */
  if (variable_get('indexpage_'.$type.'_alphaindex', 1)) {
    $output .= '<div class="filter">';
    $output .= '<h3>'.t('Alphabetically index').'</h3>';
    $output .= '<p>';
 
    $russian_string ='АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ'.implode("",range('A','Z'));
    for ($i=0;$i<strlen($russian_string);$i++) {
      $letter = drupal_convert_to_utf8(substr($russian_string,$i,1), 'Windows-1251');
      $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {node_revisions} r USING (nid) WHERE n.type='%s' AND (r.title LIKE '%s%%' OR r.title LIKE '%s%%')";
      if (db_result(db_query($sql, $type,  $letter, drupal_strtolower($letter)))) {
        $output .= l($letter, "indexpage/$type/".urlencode($letter)) . ' | ';
      }
      else {
        $output .= $letter . ' | ';
      }
    }
 
    $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {node_revisions} r USING (nid) WHERE n.type='%s' AND (r.title REGEXP '^[^[:alpha:]].*$')";
    if (db_result(db_query($sql, $type)) > 0) {
      $output .= l('#', "indexpage/$type/_");
    }
    else {
      $output .= '#';
    }
// ...
}
 
?>

Я постарался тут вносить минимальное кол-во изменений. Должен сразу предупредить, что написано это не очень хорошо (в плане использования ресурсов и быстродействия).

Я немного оптимизировал этот кусок, НО не тестировал его нормально - могут быть глюки.

<?php
 
function indexpage_page_index($type) {
// ...
/* Index by letter block */
  if (variable_get('indexpage_'.$type.'_alphaindex', 1)) {
    $output .= '<div class="filter">';
    $output .= '<h3>'.t('Alphabetically index').'</h3>';
    $output .= '<p>';
 
    // get letters array or make and cache it.
    $letters = variable_get('indexpage_letters', array());
    if (empty($letters)) {
      $utf_upper = drupal_convert_to_utf8('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ'.implode('',range('A','Z')), 'Windows-1251');
      $utf_upper_length = drupal_strlen($utf_upper);
 
      $letters = array();
      for ($i = 0; $i < $utf_upper_length; $i++) {
        $letters[drupal_substr($utf_upper, $i ,1)] = 0;
      }
      variable_set('indexpage_letters', $letters);
    }
 
    // check for data
    $result = db_query('SELECT DISTINCT UPPER(SUBSTRING(r.title, 1, 1)) AS letter'
      . ' FROM {node} n'
      . ' INNER JOIN {node_revisions} r USING (nid)'
      . ' WHERE n.type=\'%s\''
      , $type);
 
    while ($data = db_fetch_array($result)) {
      $letters[$data['letter']]++;
    }
 
    $prefix = "indexpage/{$type}/";
    foreach ($letters as $letter => $count) {
      $output .= ($count ? l($letter, $prefix . urlencode($letter)) : $letter) . ' | ';
    }
 
    $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {node_revisions} r USING (nid) WHERE n.type='%s' AND (r.title REGEXP '^[^[:alpha:]].*$')";
    if (db_result(db_query($sql, $type)) > 0) {
      $output .= l('#', "indexpage/$type/_");
    }
    else {
      $output .= '#';
    }
 
// ...
}
 
?>


Опубликовано antazy в пт, 22/09/2006 - 09:45.

ок, спасибо, сохраню себе в архив, когда-нибудь может пригодиться :)


Опубликовано Shelendor в сб, 23/09/2006 - 11:18.

хм... пока не понимаю. сбоев-то оно не даёт, но...

There are no results

Return to index page for page

:((( при этом английский алфавит выдаёт результат как и должен.


Опубликовано rgb в вс, 24/09/2006 - 08:38.

У меня на 4.7 работает и с русским проблем нет.

Данные в БД в какой кодировке лежат?


Опубликовано rariteth в пн, 25/09/2006 - 06:10.

блин никак не работает, делаю файл называю его index.module кидаю в папку всё труба в дауне с кучей ошибок... можно поподробнее как его установить то? плзз оч надо для текущего проекта


Опубликовано rgb в пн, 25/09/2006 - 12:57.

Дело в том, что приведённый выше код - это только часть работающего модуля. Модуль называется "Index page" (файл, соответственно, indexpage.module).

Далее у Вас несколько вариантов:

  1. попросить у Shelendor-а готовый (патченый, изменённый мною) модуль;
  2. взять с drupal.org модуль этот и самому произвести замены описанные выше;
  3. написать мне (мылом или в приват) и с тем, что бы я Вам выслал код (сейчас просто я не знаю куда слать или как тут выложить).


Опубликовано Shelendor в пн, 25/09/2006 - 13:04.

Прикрепил к первому посту zip с модулем, присланный мне rgb. Пробуйте.


Опубликовано rariteth в пн, 25/09/2006 - 13:16.

респект за терпение. Всё работает, спасибо//
но видно я ослеп или отупел в конец. Я не пойму как мне сделать чтоб на одной из страниц главной категории был алфавитный поиск ищущий в подкатегориях... да вообще как сделать только алфавитный и там где мне нужно...


Опубликовано rariteth в пн, 25/09/2006 - 16:13.

да, видно совсем идиотский вопрос, но я не могу найти как алфавитный указатель вклеить в категорию "фильмы" например :(


Опубликовано Shelendor в пн, 25/09/2006 - 18:07.

хм... а у меня не пашет. наверное и правда проблемы с кодировкой у меня какие-то. буду разбираться...
Заодно тоже задам глупый вопрос - у меня при включении модуля идёт русский алфавит, а следом - английский. Как вообще удалить английский?


Опубликовано rariteth в пн, 25/09/2006 - 19:01.

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


Опубликовано Shelendor в пн, 25/09/2006 - 19:11.

rariteth - я не совсем понял что значит "там поиск повсему сразу, а мне нужен только алфавит"??? В настройках модуля вы указываете какие типы контента - story, page, или созданные вами - будут индексироваться модулем. для себя я решил, что просто тот раздел сайта, который мне нужно загнать под этот алфавитный поиск, я буду делать на одном типе контента и его индексировать, а стальные разделы - на других типах.


Опубликовано rariteth в пн, 25/09/2006 - 19:20.

а.. и тогда можно открывать давать права в "правах" на просмотр? так он работет, я то просто везде галки поставил полез в настройки там ничего... думал что обману буду делать на одном типе и ему разрешу один тип смтреть, а оказалось что он так и работает... лан спасибо за уделённое время. ну всё - равно открываю "indexpage" там:
первое "поиск по алфавиту",
второе "поиск по категория_1" и в подкатегориях
третье " поиск по категория_2" и в подкатегоиях и т.д.
как всё это убрать..., оставить только алфавит? если не надоел ответьте
вот пример сварганил:
Image Hosted by ImageShack.us


Опубликовано rgb в вт, 26/09/2006 - 04:06.

Цитата:

...у меня при включении модуля идёт русский алфавит, а следом - английский. Как вообще удалить английский?

В модуле строку

$utf_upper = drupal_convert_to_utf8('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ'.implode('',range('A','Z')), 'Windows-1251'); 

замените на

$utf_upper = drupal_convert_to_utf8('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ'), 'Windows-1251'); 

и не будет Вам английского алфавита.


Опубликовано Shelendor в вт, 26/09/2006 - 13:08.

rgb - спасибо!

rariteth - хз, у меня такого нет, так что подсказать не смогу, к сожалению...


Опубликовано Гость (гостевой логин) в чт, 28/09/2006 - 00:51.

У меня тоже самое. Подскажите как побороть


Опубликовано Гость (гостевой логин) в чт, 28/09/2006 - 00:55.

/хм… пока не понимаю. сбоев-то оно не даёт, но…

There are no results

Return to index page for page

:((( при этом английский алфавит выдаёт результат как и должен./

У меня тоже самое. Подскажите как побороть


Опубликовано Гость (гостевой логин) в чт, 28/09/2006 - 01:33.

?q=indexpage/page/%25D0%25A3

выдает такую ссылку на букву Н
There are no results

Return to index page for page

Английские работаю нормально


Опубликовано rgb в чт, 28/09/2006 - 04:14.

Цитата:

?q=indexpage/page/%25D0%25A3

Цитата:

выдает такую ссылку на букву Н

Странно, потому как у меня такая ссылка формируется для буквы "У". Для "Н" у меня вот что: indexpage/page/%25D0%259D.

Будем разбираться. Для начала предлагаю проверить, что выдаётся по такой же ссылке, как у меня. Сделайте запрос вида: ?q=indexpage/page/%25D0%259D.

И ещё, скажите, какие ссылки у Вас сформировались для "А" и "Я"? У меня:

  • indexpage/page/%25D0%2590
  • indexpage/page/%25D0%25AF


Опубликовано Гость (гостевой логин) в чт, 28/09/2006 - 09:25.

Да. У меня тоже как у вас все. То есть ссылка выдаеться правильно, а вот

результатов не выводит:

There are no results
Return to index page for page

База у меня в утф-8 юникод

В чем может быть проблема? Очень нужны русские буквы. Подскажите что делать.Может какой-то другой модуль есть?


Опубликовано Гость (гостевой логин) в чт, 28/09/2006 - 09:34.

Нашел! Если вместо буквы в заголовке создаваемой странице написать %25D0%259D, то модуль находит эту строку по нажатию на "Н". Но такой вид заголовка меня совсем не устраивает. Тоесть проблема где-то в конвертировании в юникод. Что делать????


Опубликовано rgb в чт, 28/09/2006 - 13:28.

Цитата:

Если вместо буквы в заголовке создаваемой странице написать %25D0%259D, то модуль находит эту строку по нажатию на “Н”

"Это же не наш метод!" (с) Операция Ы...

Хорошо, попробуем по-другому ;-)

Пробуем вместо

<?php
  // ...
  $prefix = "indexpage/{$type}/";
  foreach ($letters as $letter => $count) {
    $output .= ($count ? l($letter, $prefix . urlencode($letter)) : $letter) . ' | ';
  }
  // ...
?>

написать

<?php
  // ...
  $prefix = "indexpage/{$type}/";
  foreach ($letters as $letter => $count) {
    $output .= ($count ? l($letter, $prefix . $letter) : $letter) . ' | ';
  }
  // ...
?>

Или (если пользуемся оригинальным вариантом алгоритма) вместо

<?php
  // ...
  $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {node_revisions} r USING (nid) WHERE n.type='%s' AND (r.title LIKE '%s%%' OR r.title LIKE '%s%%')";
  if (db_result(db_query($sql, $type,  $letter, drupal_strtolower($letter)))) {
    $output .= l($letter, "indexpage/$type/".urlencode($letter)) . ' | ';
  }
  else {
    $output .= $letter . ' | ';
  }
  // ...
?>

написать

<?php
  // ...
  $sql = "SELECT COUNT(n.nid) FROM {node} n INNER JOIN {node_revisions} r USING (nid) WHERE n.type='%s' AND (r.title LIKE '%s%%' OR r.title LIKE '%s%%')";
  if (db_result(db_query($sql, $type,  $letter, drupal_strtolower($letter)))) {
    $output .= l($letter, "indexpage/$type/$letter") . ' | ';
  }
  else {
    $output .= $letter . ' | ';
  }
  // ...
?>

Другими словами - пробуем при формировании URL-а не urlencode-ить русскую букву.

У меня и такой вариант работает...


Опубликовано Гость (гостевой логин) в чт, 28/09/2006 - 15:20.

Работает на 5+! Причем ваш вариант побыстрее. Большое спасибо!


Опубликовано rariteth в чт, 28/09/2006 - 17:28.

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

и где можно его разделить на русс и енг хотябы <br />


Опубликовано Shelendor в пт, 29/09/2006 - 00:03.

так-с... ща не в состоянии тестировать изменения, люди, кто пробовал - скажите. Если работает, то для для всеобщего удобства и с позволения rgb прикреплю обновлённый модуль в первый пост ветки.


Опубликовано rgb в пт, 29/09/2006 - 04:05.

Выкладывайте конечно! Позволение - есть ;-)


Опубликовано rgb в пт, 29/09/2006 - 08:00.

Цитата:

ищет супер, тока как его поставить в меню?
а то отображается “искать в страницах?”(ясен пень в настройках поставил). мне надо в категории (“фильмы” например) его поставить, а не в меню?

Что-то я не особо понял о чём речь...

Если хотите добавить пункт меню, добавляйте в иерархию и ставьте путь типа "indexpage" или (если надо на определённый тип данных, "films", например) - "indexpage/films". Список возможных ссылок можно глянуть именно на странице "indexpage" ("Infex page for ...").

Как на категории это распространить - пока не знаю. Подробнее можете описать, как это представляется Вам?

Цитата:

и как убрать внизу “создать новую страницу”? тока в коде? и где можно его разделить на русс и енг хотябы <br />

да - без модификации кода "создать новую страницу" не выкинуть.

Сейчас сделаем небольшие добавки в настройки модуля.

Действие 1: меняем функцию indexpage_settings().

Было:

<?php
function indexpage_settings() {
  // ...
  foreach (node_get_types() as $type => $name) {
 
    // ...
 
    $form[$set]['indexpage_'.$type.'_vocfilter'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show vocabulary filters for this node type'),
      '#return_value' => 1,
      '#default_value' => variable_get('indexpage_'.$type.'_vocfilter', 1),
    );
  }
  return $form;
}
?>

Стало:

<?php
function indexpage_settings() {
  // ...
  foreach (node_get_types() as $type => $name) {
 
    // ...
 
    $form[$set]['indexpage_'.$type.'_vocfilter'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show vocabulary filters for this node type'),
      '#return_value' => 1,
      '#default_value' => variable_get('indexpage_'.$type.'_vocfilter', 1),
    );
    $form[$set]['indexpage_'.$type.'_createnew'] = array(
      '#type' => 'checkbox',
      '#title' => t('Show %link link', array('%link'=>theme('placeholder','Create a new entry'))),
      '#return_value' => 1,
      '#default_value' => variable_get('indexpage_'.$type.'_createnew', 1),
    );
    $form[$set]['indexpage_'.$type.'_split'] = array(
      '#type' => 'checkbox',
      '#title' => t('Split alphabet'),
      '#return_value' => 1,
      '#default_value' => variable_get('indexpage_'.$type.'_split', 1),
    );
  }
  return $form;
}
?>

Добавили ещё 2 настройки для каждого типа (см. страницу admin/settings/indexpage):

Show 'Create a new entry' link
Показывать или нет линк “Создать новую страницу”.
Split alphabet
Разделять или нет русский и английский алфавиты.

Действие 2: меняем функцию indexpage_page_index($type).

Было:

<?php
function indexpage_page_index($type) {
  // ...
 
    // get letters array or make and cache it.
    $letters = variable_get('indexpage_letters', array());
    if (empty($letters)) {
      $utf_upper = drupal_convert_to_utf8('АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ'.implode('',range('A','Z')), 'Windows-1251');
      $utf_upper_length = drupal_strlen($utf_upper);
 
      $letters = array();
      for ($i = 0; $i < $utf_upper_length; $i++) {
        $letters[drupal_substr($utf_upper, $i ,1)] = 0;
      }
      variable_set('indexpage_letters', $letters);
    }
 
    // check for data
    $result = db_query('SELECT DISTINCT UPPER(SUBSTRING(r.title, 1, 1)) AS letter'
      . ' FROM {node} n'
      . ' INNER JOIN {node_revisions} r USING (nid)'
      . ' WHERE n.type=\'%s\''
      , $type);
 
    while ($data = db_fetch_array($result)) {
      $letters[$data['letter']]++;
    }
 
    $prefix = "indexpage/{$type}/";
    for ($idx = 1; list($letter, $count) = each($letters); $idx++) {
      $output .= ($count ? l($letter, $prefix . urlencode($letter)) : $letter) . ' | ');
    }
 
  // ...
 
  /* Operations for this node type */
  $output .= '<h3>'.t('Operations').'</h3>';
  $output .= l(t('Create a new entry'), 'node/add/'.$type);
  print theme('page', $output);
}
?>

Стало:

<?php
function indexpage_page_index($type) {
  // ...
 
    // get letters array or make and cache it.
    $international = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЭЮЯ';
    if (variable_get('indexpage_'.$type.'_split', 1)) {
        $break_idx = strlen($international);
    } else {
        $break_idx = 0;
    }
    $letters = variable_get('indexpage_letters', array());
    if (empty($letters)) {
      $utf_upper = drupal_convert_to_utf8($international.implode('',range('A','Z')), 'Windows-1251');
      $utf_upper_length = drupal_strlen($utf_upper);
 
      $letters = array();
      for ($i = 0; $i < $utf_upper_length; $i++) {
        $letters[drupal_substr($utf_upper, $i ,1)] = 0;
      }
      variable_set('indexpage_letters', $letters);
    }
 
    // check for data
    $result = db_query('SELECT DISTINCT UPPER(SUBSTRING(r.title, 1, 1)) AS letter'
      . ' FROM {node} n'
      . ' INNER JOIN {node_revisions} r USING (nid)'
      . ' WHERE n.type=\'%s\''
      , $type);
 
    while ($data = db_fetch_array($result)) {
      $letters[$data['letter']]++;
    }
 
    $prefix = "indexpage/{$type}/";
    for ($idx = 1; list($letter, $count) = each($letters); $idx++) {
      $output .= ($count ? l($letter, $prefix . urlencode($letter)) : $letter) 
        . ($idx == $break_idx ? '<br />' : ' | ');
    }
 
  // ...
 
  /* Operations for this node type */
  if (variable_get('indexpage_'.$type.'_createnew', 1)) {
    $output .= '<h3>'.t('Operations').'</h3>';
    $output .= l(t('Create a new entry'), 'node/add/'.$type);
  }
 
  print theme('page', $output);
}
?>

Здесь мы добавили код, который использует новые настройки. Теперь Вы по своему желанию можете включать/выключать показ ссылки "Создать новую страницу" и разделять/не разделять алфавит.


Опубликовано rariteth в пт, 29/09/2006 - 08:01.

перезалейте в первое сообщение, только, назовите по-другому... может не работать, а первое работает на все 100%


Опубликовано rariteth в сб, 30/09/2006 - 11:04.

ну кто тестировал?


Опубликовано rgb в пн, 02/10/2006 - 11:26.

На всякий случай, замечу, что я не упомянул одно условие: всё, что написано, рассчитано на то, что _исходный_ код в файле модуля (.module) будет в кодировке 'Windows-1251' (или 'cp1251').

Если же он в 'koi8-r' или ещё в какой, то нужны будут модификации. Если кому надо - пишите - приведу тут эти исправления.


Опубликовано Shelendor в пн, 02/10/2006 - 20:14.

rgb - у меня некоторые проблемы.
Первые изменения, описанные вами здесь http://www.drupal.ru/node/1956#comment-11285 я добавил, всё работает, спасибо.

А вот следующие не смог. При попытке внести изменения для полного отключени английского алфавита всё падает со ссылкой на 186 строку.

Далее. Изменил по инструкции http://www.drupal.ru/node/1956#comment-11331 Да, появилась возможность отключать в настройках Create a new entry и разделять алфавит. Но у меня снова выдаёт в результатах "There are no results"

Кстати, в коде у меня было
$prefix = "indexpage/{$type}/";
foreach ($letters as $letter => $count) {
$output .= ($count ? l($letter, $prefix . $letter) : $letter) . ' | ';
}
в "my variant".
Указанный вами здесь
$prefix = "indexpage/{$type}/";
for ($idx = 1; list($letter, $count) = each($letters); $idx++) {
$output .= ($count ? l($letter, $prefix . urlencode($letter)) : $letter) . ' | ');
я найти не смог... Думал, может я чего случайно потёр - слазил в сообщение, которое вы прислали мне с кодом. Там тоже нет. В общем, я уже ничего не понимаю :)

Обновил прикреплённый в 1 сообщении файл. Теперь там лежит indexpage от rgb, корректно работающий с русскими буквами, без приколов в духе %25D0%259D :)

rgb - если мы вам ещё не надоели, помогите разобраться, пожалуйста! :)


Опубликовано rariteth в пн, 02/10/2006 - 20:40.

Shelendor, выкладывай потом разными файлами:
indexpage_[ru+eng].module
indexpage_[ru+eng+splitLng].module
потомучто может комуто надо только это, кому только то... да и вообще у разработчиков принято делать отдельный файл при малейшем изменении кода.. вот мне например не нужна настроеная индекспэйдж под 1251, меня и утф устраивает(как подумаю чтоб перекодировать скока перелопатить нужно - аж плохо становится). А вообще обидно что я в этом мало понимаю - никакой дискуссии, только rgb шарит и не поспоришь даже :)


Опубликовано Shelendor в пн, 02/10/2006 - 21:20.

rariteth - да мне по идее тоже utf надо, но первый вариант при этом результаты выдавать отказывался... :( В итоге мы тут определимся со списком файлов, которые будут прикреплены к 1 сообщению, но пока что придётся ждать rgb :) кроме него вряд ли кто поможет :)


Опубликовано rgb в вт, 03/10/2006 - 14:28.

Shelendor написал(а):

А вот следующие не смог. При попытке внести изменения для полного отключени английского алфавита всё падает со ссылкой на 186 строку.

Не могли бы Вы привести тут отрывок кода со 180-й по 190-ю строки? А то моя версия с Вашей могут отличаться...

Shelendor написал(а):

Далее. Изменил по инструкции http://www.drupal.ru/node/1956#comment-11331 Да, появилась возможность отключать в настройках Create a new entry и разделять алфавит. Но у меня снова выдаёт в результатах “There are no results”

А это потому, что для формирования ссылки в приведённом коде у меня опять используется urlencode(). Просто уберите вызов этой ф-ции: вместо <?php urlencode($letter) ?> поставьте <?php $letter ?>.

Shelendor написал(а):

Кстати, в коде у меня было
$prefix = “indexpage/{$type}/”;
foreach ($letters as $letter => $count) {
$output .= ($count ? l($letter, $prefix . $letter) : $letter) . ’ | ‘;
}
в “my variant”.
Указанный вами здесь...я найти не смог… Думал, может я чего случайно потёр - слазил в сообщение, которое вы прислали мне с кодом. Там тоже нет. В общем, я уже ничего не понимаю

Не - это моя ошибка, я скопировал код при составлении сообщения не из того места. Имелся ввиду именно такой код, как у Вас.

Хм.. кажется на patch надо переходить уже :-)

Shelendor написал(а):

rgb - если мы вам ещё не надоели, помогите разобраться, пожалуйста!

Не надоели :-) Я с удовольствием помогу по мере возможности.

---

rariteth написал(а):

Shelendor, выкладывай потом разными файлами...

Да - пожалуй стоит в порядок всё привести.

Что у нас есть?

  1. Исходный вариант модуля
  2. Вариант с русским алфавитом и оригинальным алгоритмом построения списка
  3. Вариант с русским алфавитом и моим алгоритмом построения списка
  4. Вариант без использования urlencode() для оригинального алгоритма
  5. Вариант без использования urlencode() для моего алгоритма
  6. Вариант с включением опций "Show ‘Create a new entry’ link" и "Split alphabet" с использованием моего алгоритма

Это приблизительно в хронологическом порядке. Вопрос (1): стоит ли и дальше все исправления приводить для оригинального и моего вариантов алгоритма? Вопрос (2): предлагаю выбрать один из вышеприведённых вариантов в качестве основного, с тем, что б развивать уже только его, а то опять запутаемся :-)

На голосование ставится кандидатура последнего варианта (мой алгоритм + urlencode + доп.опции). Если кого-то что-то в нём не устраивает - можем добавить опций, например, сделать использование urlencode - опциональным или вывод английского алфавита - тоже опциональным.

Ваше слово, коллеги!

rariteth написал(а):

вот мне например не нужна настроеная индекспэйдж под 1251, меня и утф устраивает

Оно всё вроде под ЮТФ заточено. Исходники - в Win1251, вывод - UTF8. У кого-то не так? Говорите...

rariteth написал(а):

А вообще обидно что я в этом мало понимаю - никакой дискуссии, только rgb шарит и не поспоришь даже

Cпорить-то можно и без знания PHP ;-)

---

Shelendor написал(а):

rariteth - да мне по идее тоже utf надо, но первый вариант при этом результаты выдавать отказывался

Странно это... Не пойму в чем причина. В любом случае - у меня и так и сяк работает...

Shelendor написал(а):

мы тут определимся со списком файлов, которые будут прикреплены к 1 сообщению

Думаю, что лучше всё же один какой-то вариант оставить (см. выше)


Опубликовано Shelendor в вт, 03/10/2006 - 21:54.

ок, на днях заменю <?php urlencode($letter?> на <?php $letter ?> и потестирую.
rgb - предлагаю остановиться на вашем последнем варианте с максимальным количеством включающихся/отключающихся опций. Потому что: 1. ваш вариант по скорости и тяжести явно лучше стандартного. 2. люди в зависимости от потребностей смогу отключить или включить всё, что им надо.


Опубликовано rgb в ср, 04/10/2006 - 06:04.

Shelendor написал(а):

предлагаю остановиться на вашем последнем варианте

В таком случае пишите, что добавить туда. Как я понял, первое - это опциональное использование urlencode?


Опубликовано Shelendor в ср, 04/10/2006 - 09:32.

да! именно его :) а второе - не знаю, поддержат ли меня остальные - возможность полного отключения английского алфавита.


Новое на сайте