Алфавитный указатель в статьях

+34
2.86K
Возникла необходимость навигации по статьям в категории через Алфавитный указатель (как в Универсальном каталоге)
Реализовал.
Есть: Алфавитный указатель, поддержка ЧПУ, а так же без ЧПУ, поддержка подкатегорий (ЧПУ вида site.com/tema1/tema1-1/tema1-1-1)
НЕТ: в админке не птички Выводить ли указатель — можно решить указанием другого шаблона вывода в настройках каталога
Иллюстрация



Я вас очень прошу, серьезно прошу, сделайте бекап сначала
Все есть в архиве: скачать архив
Реализация пошагово:
Добавить в роутер /components/content/router.php в начало перед первыми правилами

  1.  
  2. $routes[] = array(
  3. '_uri' => '/^content\/([0-9]+)\/alphabet\/(.+)$/i',
  4. 'do' => 'view',
  5. 1 => 'id',
  6. 2 => 'letter'
  7. );
  8. $routes[] = array(
  9. '_uri' => '/^content\/([a-z0-9_\/\-]+)\/alphabet\/(.+)$/i',
  10. 'do' => 'view',
  11. 1 => 'seolink',
  12. 2 => 'letter'
  13. );
добавить в модель /components/content/model.php
  1.  
  2. public function getArticlesByLetter($category_id, $letter, $orderby='title', $orderto='asc') {
  3.  
  4. $articles = array();
  5. $today = date("Y-m-d H:i:s");
  6. $sql = "SELECT con.*,
  7. con.pubdate as fpubdate,
  8. u.nickname as author,
  9. u.login as user_login
  10. FROM cms_content con
  11. LEFT JOIN cms_users u ON u.id = con.user_id
  12. WHERE con.category_id = '$category_id' AND con.published = 1 AND con.is_arhive = 0 AND con.pubdate <= '$today'
  13. AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '$today'))
  14. AND UPPER(SUBSTRING(LTRIM( title ) , 1, 1))='".$letter."'
  15. ORDER BY con.".$orderby." ".$orderto;
  16.  
  17. $result = $this->inDB->query($sql);
  18.  
  19. if (!$this->inDB->num_rows($result)) { return false; }
  20.  
  21. while($article = $this->inDB->fetch_assoc($result)){
  22. $article['fpubdate'] = cmsCore::dateFormat($article['fpubdate']);
  23. $articles[] = $article;
  24. }
  25.  
  26. $articles = cmsCore::callEvent('GET_ARTICLES', $articles);
  27.  
  28. //Переносим в архив просроченные статьи
  29. $sql = "UPDATE cms_content SET is_arhive = 1 WHERE is_end = 1 AND enddate < NOW()";
  30. $this->inDB->query($sql);
  31.  
  32. return $articles;
  33.  
  34. }
  35.  
добавить во фронтенд /components/content/frontend.php
в начало:
  1.  
  2. function getAlphaList($cat_id,$seolink=''){
  3. $inCore = cmsCore::getInstance();
  4. $inDB = cmsDatabase::getInstance();
  5. global $_LANG;
  6. $html = '';
  7. $sql = "SELECT UPPER(SUBSTRING(LTRIM( title ) , 1, 1)) AS first_letter, COUNT( id ) AS num
  8. FROM cms_content
  9. WHERE category_id = '$cat_id' AND published = 1
  10. GROUP BY first_letter";
  11. $result = $inDB->query($sql) ;
  12. if ($inDB->num_rows($result)){
  13. $html .= '<div class="content_alpha_list">';
  14. if ($seolink!='') $cat_id=$seolink;
  15. while($a = $inDB->fetch_assoc($result)){
  16. if(preg_match('/^([a-zA-Zа-яёіїєґА-ЯЁІЇЄҐ0-9]+)$/i', $a['first_letter'])){
  17. $html .= '<a class="content_alpha_link" href="/'.$cat_id.'/alphabet/'.urlencode($a['first_letter']).'" title="'.$_LANG['ARTICLES'].': '.$a['num'].'">'.$a['first_letter'].'</a>';
  18. }
  19. }
  20. $html .= '</div>';
  21. }
  22. return $html;
  23. }
  24.  
в обработку view (того же файла /components/content/frontend.php)
найти $content_list = $model->getArticles($cat['id'], $page, $perpage, $cat['orderby'], $cat['orderto']);
и заменить на
  1.  
  2. $alpha = getAlphaList($cat['id'],$seolink);
  3. $letter = urldecode($inCore->request('letter', 'str', ''));
  4. if ($letter != '')
  5. $content_list = $model->getArticlesByLetter($cat['id'], $letter, $cat['orderby'], $cat['orderto']);
  6. else
  7. $content_list = $model->getArticles($cat['id'], $page, $perpage, $cat['orderby'], $cat['orderto']);
  8.  
ниже, в выводе, после $smarty = $inCore->initSmarty('components', $template);
добавить
  1. $smarty->assign('alphabet', $alpha);
для вывода — в шаблон /templates/_default_/components/com_content_view.tpl
в желаемом месте (как правило, после заголовка)
  1. {if $alphabet} {$alphabet} {/if}
ВНИМАНИЕ!
для корректной работы необходимо из url_rewrite.php удалить правила совместмости 1.5.х, по крайней мере для content'a

---------------
не стесняемся кидать копеечку в стаканчик smileи за спасибо буду благодарен тоже) instantcms.ru/forum/thread6731.html
R124054188127
Z230845734769
U184007373206/anum
+2
reload reload 12 лет назад #
Интересный и полезный хак +
tarzan, а демки нет случайно?)
+1
Protomoto Protomoto 12 лет назад #
демка-то есть, но сайт пока закрыт...
+1
Protomoto Protomoto 12 лет назад #
Перезалил архив - я там сильно погорячился с урл-реврайтом (де-факто, он там нерабочий smile )
+1
lezginka.ru lezginka.ru 12 лет назад #
+
а если прикрутить яндекс разметку, вообще отлично было бы
+2
Александр Александр 12 лет назад #
Я вас очень прошу, серьезно прошу, сделайте бекап сначала
Вот за одно это надо ставить 10 плюсов кряду-)))) автор сразу настроение поднял.
+1
Александр Александр 12 лет назад #
А теперь серьезно, хак просто очень полезный, странно что никому до этого не приходило в голову для статей так сделать. У меня на одном сайте на копилось их уже более 5000 а так будет проще искать
0
nedoriko nedoriko 12 лет назад #
+
а демку глянуть можно у кого?
0
lezginka.ru lezginka.ru 12 лет назад #
а к utf8 версии 1,9 это применимо ?
0
Protomoto Protomoto 12 лет назад #
Лезгинка, не тестировал и не смотрел, затрагивается ли в бете компонент Материалы в данной части
0
Protomoto Protomoto 12 лет назад #
Кого там демка интересовала... http://sexlike.com.ua/slovar-terminov
+1
nedoriko nedoriko 11 лет назад #
Опубликовано: 377 дней назад (26 января 2012)
Чтото я совсем не помню как год пролетел smile
-1
Anonim Anonim 11 лет назад #
А в 1.10 работает?
-1
Anonim Anonim 11 лет назад #
Да, есть такой только гугль помог
-1
Anonim Anonim 11 лет назад #
Но он платный
0
oll oll 11 лет назад #
В версии 1.101 работает.
Сделать все как выше описано, только сдесь по другому...
в обработку view (того же файла /components/content/frontend.php) найти $content_list = $model->getArticles($cat['id'], $page, $perpage, $cat['orderby'], $cat['orderto']); и заменить на
Во frontend.php выше строки
Код PHP:
  1. $pagebar = cmsPage::getPagebar($total, $page, $model->config['perpage'], $model->getCategoryURL(null, $cat['seolink'], 0, true));
123
Вставить
Код PHP:
  1. //navigation alpfabetics
  2. $alpha = getAlphaList($cat['id'],$cat['seolink']);
  3. $letter = urldecode($inCore->request('letter', 'str', ''));
  4. if ($letter != '')
  5. $content_list = $model->getArticlesByLetter($cat['id'], $letter, $cat['orderby'], $cat['orderto']);
  6. else
Получиться
Код PHP:
  1. ////navigation alpfabetics
  2. $alpha = getAlphaList($cat['id'],$cat['seolink']);
  3. $letter = urldecode($inCore->request('letter', 'str', ''));
  4. if ($letter != '')
  5. $content_list = $model->getArticlesByLetter($cat['id'], $letter, $cat['orderby'], $cat['orderto']);
  6. else
  7. $pagebar = cmsPage::getPagebar($total, $page, $model->config['perpage'], $model->getCategoryURL(null, $cat['seolink'], 0, true));
0
Anonim Anonim 11 лет назад #
Спасибо
+1
ded-pikto ded-pikto 11 лет назад #
Спасибо большое за скрупулёзность и ollеративность!
Только у меня на Хроме (?) коды режутся, плюс-минус и дата/время вообще не видны. Масштабирование в браузере не помогает.
Как бы это подправить?
Ну а плюсовать пойду в профиль, если он открыт)))
""
0
ded-pikto ded-pikto 11 лет назад #
Спойлер
-1
Anonim Anonim 11 лет назад #
Контент АБС для 1.10.1 арбайтн +)
0
Anonim Anonim 11 лет назад #
Только почему-то, когда сортируешь по букве не работают потом ссылки у заголовков статей
0
Anonim Anonim 11 лет назад #
Работает, но криво... Обсудим?
0
lezginka.ru lezginka.ru 11 лет назад #
кто устанавливал для 1.10.* ?
0
lezginka.ru lezginka.ru 11 лет назад #
подскажите, кто уже установил.
в каком месте должно появиться "указатель А=Я", что-то не вижу ?

Еще от автора

FIX: Прозрачность PNG при ресайзе
Добрый день. Предлагаю исправление "забытой Богом" библиотеки /includes/graphic.inc.
Субдомен имени пользователя (user.instantcms.ru)
Продолжаем усоциаливать инстант Как сделать имена типа user.instantcms.ru Открываем core/cms.
Прямое имя пользователя (без /users/)
А как можно сделать чтоб адрес выглядел не как сейчас например http://instantcms.ru/users/nikitka просто http://instantcms.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.