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

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




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

Код PHP:
$routes[] = array(
                            '_uri'  => '/^content\/([0-9]+)\/alphabet\/(.+)$/i',
                            'do'    => 'view',
							1 		=> 'id',
							2		=> 'letter'
                         );
        $routes[] = array(
                            '_uri'  => '/^content\/([a-z0-9_\/\-]+)\/alphabet\/(.+)$/i',
                            'do'    => 'view',
							1 		=> 'seolink',
							2		=> 'letter'
                         );
добавить в модель /components/content/model.php
Код PHP:
public function getArticlesByLetter($category_id, $letter, $orderby='title', $orderto='asc') {

        $articles = array();
		$today = date("Y-m-d H:i:s");
        $sql = "SELECT con.*, 
                       con.pubdate as fpubdate,
                       u.nickname as author,
                       u.login as user_login
                FROM cms_content con
				LEFT JOIN cms_users u ON u.id = con.user_id
                WHERE con.category_id = '$category_id' AND con.published = 1 AND con.is_arhive = 0 AND con.pubdate <= '$today'
                      AND (con.is_end=0 OR (con.is_end=1 AND con.enddate >= '$today'))
					  AND UPPER(SUBSTRING(LTRIM( title ) , 1, 1))='".$letter."'
                ORDER BY con.".$orderby." ".$orderto;

        $result = $this->inDB->query($sql);

        if (!$this->inDB->num_rows($result)) { return false; }

        while($article = $this->inDB->fetch_assoc($result)){
			$article['fpubdate'] = cmsCore::dateFormat($article['fpubdate']);
            $articles[] = $article;
        }

        $articles = cmsCore::callEvent('GET_ARTICLES', $articles);

        //Переносим в архив просроченные статьи
        $sql = "UPDATE cms_content SET is_arhive = 1 WHERE is_end = 1 AND enddate < NOW()";
        $this->inDB->query($sql);

        return $articles;

    }	
добавить во фронтенд /components/content/frontend.php
в начало:
Код PHP:
function getAlphaList($cat_id,$seolink=''){
    $inCore = cmsCore::getInstance();
    $inDB = cmsDatabase::getInstance();
    global $_LANG;
    $html = '';
    $sql = "SELECT UPPER(SUBSTRING(LTRIM( title ) , 1, 1)) AS first_letter, COUNT( id ) AS num
            FROM cms_content
            WHERE category_id = '$cat_id' AND published = 1
            GROUP BY first_letter";
    $result = $inDB->query($sql) ;
    if ($inDB->num_rows($result)){
        $html .= '<div class="content_alpha_list">';
		if ($seolink!='') $cat_id=$seolink;
        while($a = $inDB->fetch_assoc($result)){
			if(preg_match('/^([a-zA-Zа-яёіїєґА-ЯЁІЇЄҐ0-9]+)$/i', $a['first_letter'])){
            	$html .= '<a class="content_alpha_link" href="/'.$cat_id.'/alphabet/'.urlencode($a['first_letter']).'" title="'.$_LANG['ARTICLES'].': '.$a['num'].'">'.$a['first_letter'].'</a>';
			}
        }
        $html .= '</div>';
    }
    return $html;
}
в обработку view (того же файла /components/content/frontend.php)
найти $content_list = $model->getArticles($cat['id'], $page, $perpage, $cat['orderby'], $cat['orderto']);
и заменить на
Код PHP:
$alpha = getAlphaList($cat['id'],$seolink);
$letter = urldecode($inCore->request('letter', 'str', ''));	
	if ($letter != '')
		$content_list = $model->getArticlesByLetter($cat['id'], $letter, $cat['orderby'], $cat['orderto']);
	else
	    $content_list   = $model->getArticles($cat['id'], $page, $perpage, $cat['orderby'], $cat['orderto']);
ниже, в выводе, после $smarty = $inCore->initSmarty('components', $template);
добавить
Код PHP:
$smarty->assign('alphabet', $alpha);
для вывода - в шаблон /templates/_default_/components/com_content_view.tpl
в желаемом месте (как правило, после заголовка)
Код PHP:
{if $alphabet} {$alphabet} {/if}
ВНИМАНИЕ!
для корректной работы необходимо из url_rewrite.php удалить правила совместмости 1.5.х, по крайней мере для content'a

---------------
не стесняемся кидать копеечку в стаканчик smile и за спасибо буду благодарен тоже) /forum/thread6731.html
R124054188127
Z230845734769
U184007373206/anum
FIX: Прозрачность PNG при ресайзе
Комментарии (23)
reload 26 января 2012 в 19:24 +2
Интересный и полезный хак +
tarzan, а демки нет случайно?)
Protomoto 26 января 2012 в 19:27 +1
демка-то есть, но сайт пока закрыт...
Protomoto 26 января 2012 в 19:58 +1
Перезалил архив - я там сильно погорячился с урл-реврайтом (де-факто, он там нерабочий smile )
lezginka.ru 26 января 2012 в 21:01 +1
+
а если прикрутить яндекс разметку, вообще отлично было бы
Александр 27 января 2012 в 00:25 +2
Я вас очень прошу, серьезно прошу, сделайте бекап сначала
Вот за одно это надо ставить 10 плюсов кряду-)))) автор сразу настроение поднял.
Александр 27 января 2012 в 00:26 +1
А теперь серьезно, хак просто очень полезный, странно что никому до этого не приходило в голову для статей так сделать. У меня на одном сайте на копилось их уже более 5000 а так будет проще искать
nedoriko 27 января 2012 в 01:29 0
+
а демку глянуть можно у кого?
lezginka.ru 29 января 2012 в 21:33 0
а к utf8 версии 1,9 это применимо ?
Protomoto 30 января 2012 в 11:17 0
Лезгинка, не тестировал и не смотрел, затрагивается ли в бете компонент Материалы в данной части
Protomoto 17 апреля 2012 в 17:27 0
Кого там демка интересовала... http://sexlike.com.ua/slovar-terminov
nedoriko 6 февраля 2013 в 13:14 +1
Опубликовано: 377 дней назад (26 января 2012)
Чтото я совсем не помню как год пролетел smile
Anonim 23 марта 2013 в 10:43 -1
А в 1.10 работает?
Anonim 23 марта 2013 в 10:50 -1
Да, есть такой только гугль помог
Anonim 23 марта 2013 в 10:50 -1
Но он платный
oll 23 марта 2013 в 13:23 0
В версии 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));
Anonim 23 марта 2013 в 14:45 0
Спасибо
ded-pikto 23 марта 2013 в 18:12 +1
Спасибо большое за скрупулёзность и ollеративность!
Только у меня на Хроме (?) коды режутся, плюс-минус и дата/время вообще не видны. Масштабирование в браузере не помогает.
Как бы это подправить?
Ну а плюсовать пойду в профиль, если он открыт)))
""
Изображение уменьшено. Щелкните, чтобы увидеть оригинал.
ded-pikto 23 марта 2013 в 18:19 0
Спойлер
Anonim 8 мая 2013 в 16:23 -1
Контент АБС для 1.10.1 арбайтн +)
Anonim 8 мая 2013 в 16:32 0
Только почему-то, когда сортируешь по букве не работают потом ссылки у заголовков статей
Anonim 8 мая 2013 в 19:55 0
Работает, но криво... Обсудим?
lezginka.ru 7 сентября 2013 в 11:23 0
кто устанавливал для 1.10.* ?
lezginka.ru 7 сентября 2013 в 18:21 0
подскажите, кто уже установил.
в каком месте должно появиться "указатель А=Я", что-то не вижу ?