Форум русской поддержки Joomla!® CMS
07.12.2016, 16:30:57 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Пагинация на Joomla 3 и SEO, ох уж эта пагинация!

 (Прочитано 766 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« : 30.11.2015, 18:13:04 »

Доброе время суток, гуру программирования и сайтостроения. У меня нарисовалась проблема на Joomla 3, не могу решить, помогите, пожалуйста.

Вопрос в пагинации. Хочу сделать такую пагинацию, чтобы можно было переходить по материалам в рамках одной категории. Т.е. жмякаю в пагинации на 2 и перехожу на статью с orderin = 2 данной категории, т.е. ссылка не вида доменное имя/категория?start=2, а именно доменное_имя/алиас_категории/2-алиас_статьи

Причём чтобы была на всех страницах, для каждого материала в категории.)))

Если сделать блог категорий для пункта меню, сделать отображать по 1 материалу полностью в настройках админки, сдалать пагинацию, то будет корявость вида ?start=2

Если пункт меню превратить в Материал, то при пагинации Вперёд-Назад ссылки будут иметь вид  доменное имя/алиас_пункта_меню/1-алиас_статьи/2-алиас_статьи и т.д. для всей пагинации! тут 1-алиас_статьи - алиас статьи, МАТЕРИАЛА, который укажем для пункта меню. Бредкрамбс примет вид: главная страниц->пункт меню->титл материала меню->титл текущего материала, а надо: главная страниц->пункт меню(или наименование категории)->титл текущего материала

Надеюсь, изложила понятно... Можно чего поделать или надоть писать ручками модуль пагинации? Я плохо умею писать оптимизированные модули пока что...

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

Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #1 : 30.11.2015, 18:13:15 »

Блина... похоже я слишком сложно изложила свою простую мысль... у меня бывает... кароч... надо чтобы пагинация листала по материалам, и в адресной строке не было фигни типа ?start=2
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #2 : 30.11.2015, 22:50:33 »

Стандартными средствами - вряд ли. Нужно создать свой шаблон с формой в качестве пагинации вместо ссылки.
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #3 : 01.12.2015, 08:45:01 »

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

Шаблон я сама сделала... Я так понимаю, это должен быть модуль, содержащий php-скрипт с обращением к БД, и оформленный в виде пагинации для категории? Я правильно поняла?

Можете сказать, как примерно будет выглядеть php-скрипт и наиболее оптимальный запрос к БД? Хотя бы принципиально... не знаю, с чего начать-то...

Если я правильно поняла, задачка нетривиальная и её решения на просторах Рунета нету...((( Причём, поискав решение в Сети, видела, что не я одна задалась такой целью.
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #4 : 03.12.2015, 07:52:53 »

Злодеи, так никто ничего полезного не написал.(((
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #5 : 03.12.2015, 09:56:57 »

tora312, направление я вам подсказал, а написать,
как примерно будет выглядеть php-скрипт и наиболее оптимальный запрос к БД
- это уже за вас работу сделать.
У вас есть 3 варианта:
- Ждать, пока появится кто-нибудь, у кого есть время и желание написать вам пагинацию.
- Взяться за литературу и самой разобраться (впрочем, что я и делаю уже 4-й год), на рабочие вопросы вам здесь охотно ответят.
- Создать тему в комм.разделе.
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #6 : 03.12.2015, 17:22:48 »

tora312, направление я вам подсказал, а написать,- это уже за вас работу сделать.
У вас есть 3 варианта:
- Ждать, пока появится кто-нибудь, у кого есть время и желание написать вам пагинацию.
- Взяться за литературу и самой разобраться (впрочем, что я и делаю уже 4-й год), на рабочие вопросы вам здесь охотно ответят.
- Создать тему в комм.разделе.


))) Почти сделала.))) Сама. Вроде рабочий вопрос.)

С помощью функций Жумлы... или вообще как оптимизировать запрос к БД? Чтобы получить эти данные?

Код:
$query = 'SELECT `id`, `title`, `alias`, `introtext`, `ordering`
FROM `#__content` WHERE `catid`=\''.$idd.'\' AND `state`=\'1\'';

Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #7 : 03.12.2015, 19:57:40 »

Не совсем понял ваш вопрос. Запрос вроде нормальный.
Код
$db=JFactory::getDbo();
$query='SELECT `id`,`title`,`alias`,`introtext`,`ordering` FROM `#__content` WHERE `catid`="'.$idd.'" AND `state`="1"';
$db->setQuery($query);
$result=$db->loadObjectList();
 
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2242


« Ответ #8 : 03.12.2015, 21:08:25 »

В переопределенном шаблоне материала:
Код
$model = JModelLegacy::getInstance('Articles', 'ContentModel');
$model->setState('filter.category_id', $this->item->catid);
$articles = $model->getItems();
echo '<ul>';
foreach( $articles as $article ){
   echo '<li><a href="'.JRoute::_(ContentHelperRoute::getArticleRoute($article->id, $article->catid, $article->language)).'">'.$article->title.'</a></li>';
}
echo '</ul>';
//echo '<pre>'.print_r($articles, true).'</pre>';
« Последнее редактирование: 04.12.2015, 00:01:37 от fsv » Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #9 : 04.12.2015, 08:17:24 »

fsv

Ой какой Вы молодец! Обожаю Вас! Вот оно, что надо! Ну... я надеюсь, я плохо шарю в функция Joomla... если правильно поняла, этот кусок кода создаст меньшую нагрузку на сайтик, чем прямой запрос к БД? Статей ведь может быть много... 100 и более...

А если я узнаю текущую категорию:

Код:
if (JRequest::getVar('view') == 'category') {
$idd=JRequest::getInt('id');
} else if (JRequest::getVar('view')=='article') {
$idd=JRequest::getInt('catid');}

А потом:

Код:
$model = JModelLegacy::getInstance('Articles', 'ContentModel');
$model->setState('filter.category_id', $idd);
$articles = $model->getItems();
echo '<ul>';
foreach( $articles as $article ){
    echo '<li><a href="'.JRoute::_(ContentHelperRoute::getArticleRoute($article->id, $article->catid, $article->language)).'">'.$article->title.'</a></li>';
}
echo '</ul>';

Можно вопросик?

Эээ... вот это зачем?
Код:
$article->language
Язык тут нужен? И в каком порядке тут идут данные? By ordering? И как можно лимитировать запрос, ограничив его нужным числом статей... например первые 12? Или с 13 по последнюю?? Спасибки заранее!)))
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #10 : 04.12.2015, 08:36:50 »

robert
Цитировать
Не совсем понял ваш вопрос. Запрос вроде нормальный.
Код
$db=JFactory::getDbo();
$query='SELECT `id`,`title`,`alias`,`introtext`,`ordering` FROM `#__content` WHERE `catid`="'.$idd.'" AND `state`="1"';
$db->setQuery($query);
$result=$db->loadObjectList();
 

Я запросы умею... но если Joomla уже взяла эти данные, а я опять их беру... лишняя нагрузка к БД? Извините, возможно я рассуждаю примитивно.)
Чёт я с рендером села... лан, ща попробкую.)
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #11 : 04.12.2015, 09:29:51 »

Ахтунг! Не работает тут:

$article->ordering;
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #12 : 04.12.2015, 12:29:51 »

Показать текстовый блок
Записан
fsv
Практически профи
*******

Репутация: +330/-2
Offline Offline

Пол: Мужской
Сообщений: 2242


« Ответ #13 : 04.12.2015, 15:51:45 »

По нагрузке. Включите отладку и проверьте оба варианта, потом сюда напишите, что получилось.
По id категории. Зачем в категории из реквеста получаете, если мы в материале? Если надо нечто подобное и в категории, то там на просмотр $this выведите, проще код должен быть.
Язык. Не надо - не пишите. У функции 3 аргумента, категория и язык не обязательны, там по умолчанию значения указаны.
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #14 : 04.12.2015, 19:12:39 »

Уважаемые гуру, прошу ногами не бить.))) Учтите, что я по профессии преподаватель физкультуры в средней школе.))) Аха, именно так.))) Для своего любимого сайтика делаю.)
По поводу >>Включите отладку и проверьте оба варианта, потом сюда напишите, что получилось. - Дык... не знаю, как это делать.)

По поводу реквеста, не знаю, как по-другому получить id категории. Ещё мне нужен алиас категории.))) Дело в том, что работать должно как для материала в категории, так и для пункта меню Блог категории. Может я чего неоптимально сделала, на локалке работает.)

Вот что получилось, запихала усё в модуль, привязав к пункту меню... без рендера и стилей:

Код:
//Относительный url текущей страницы и текущую категорию - ВОТ ТУТ РЕАЛЬНО НЕ ПОНЯЛА КАК МОЖНО ЕЩЁ ПОЛУЧИТЬ ID КАТЕГОРИИ.
$urii = &JFactory::getURI();
$urll = $urii->toString(array('path', 'query', 'fragment'));

if (JRequest::getVar('view') == 'category') {
$idd=JRequest::getInt('id');
} else if (JRequest::getVar('view')=='article') {
$idd=JRequest::getInt('catid');}


// Закажем класс БД.
$db = JFactory::getDbo();

// Узнаем url категории. ВООБЩЕ ID КАТЕГОРИИ МНЕ НУЖЕН ДЛЯ `path` текущей категории... ЕГО МОЖНО ПОЛУЧИТЬ ЛЕГЧЕ?
$db->setQuery('SELECT `path` FROM `#__categories` WHERE `id`=\''.$idd.'\' LIMIT 1'); // Пришлось один прямой запрос сделать.(((
$list = $db->loadObjectList();
foreach($list as $comp)
{
$path = $comp->path;
}

// Создадим массив с данными о материалах.
$model = JModelLegacy::getInstance('Articles', 'ContentModel');
$model->setState('filter.category_id', $idd); // ВОТ ТУТ СТАВЛЮ ТЕКУЩЕЕ ЗНАЧЕНИЕ КАТЕГОРИИ $idd, ЧТОБЫ ПОЛУЧИТЬ ВСЕ ДАННЫЕ МАТЕРИАЛОВ
//ДАННОЙ КАТЕГОРИИ.
$articles = $model->getItems();
foreach( $articles as $i=>$article ){ // Получаю ВСЕ НУЖНЫЕ МНЕ ДАННЫЕ О СТАТЬЯХ В СООТВЕТСТВУЮЩЕЙ КАТЕГОРИИ
$comps[$i]['id'] = $article->id;
$comps[$i]['title'] = $article->title;
$comps[$i]['alias'] = $article->alias;
$com_pg[$i]['url'] = '/'.$path.'/'.$comps[$i]['id'].'-'.$comps[$i]['alias'];
$com_pg[0]['url'] = '/'.$path;
}

В итоге вывожу пагинацию циклом на всю категорию, привязывая к БЛОГУ КАТЕГОРИИ.

Наверное, можно проще... я хз.
« Последнее редактирование: 04.12.2015, 19:20:34 от tora312 » Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #15 : 04.12.2015, 19:20:21 »

Показать текстовый блок

robert, я правильно поняла... Если я хочу получить всё то, что сделала выше для всех материалов с 11 до последнего в категории 3 , упорядочив по возрастанию ордерин, делаю (Проверила, чёт не робит...):

Код:
$model = JModelLegacy::getInstance('Articles', 'ContentModel');
$model->setState('filter.category_id', 3);
$model->setState('list.ordering','a.ordering');
$model->setState('list.start', 11);
$articles = $model->getItems();
foreach( $articles as $i=>$article ){...}

Как можно упорядочить, скажем, по дате создания? И как тут получить `ordering` - ОН МНЕ ОЧ. НУЖЕН, у меня может быть значение -1.)))
Помогите с этим, плиз... Очень надо...
« Последнее редактирование: 04.12.2015, 19:27:27 от tora312 » Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #16 : 04.12.2015, 19:30:13 »

Ёлкиный, не поняла, как можно лимитировать запросы... у меня всё даёт...
Записан
ChaosHead
Профи
********

Репутация: +381/-10
Offline Offline

Пол: Мужской
Сообщений: 4392



« Ответ #17 : 04.12.2015, 19:33:39 »

Just idea:
Если в стандартном варианте пагинация выглядит как:
http://designexpo.info/?start=10
http://designexpo.info/?start=20
А вы хотите:
http://designexpo.info/?start=2
http://designexpo.info/?start=3
Можно запилить плагин, который будет перехватывать этот параметр, делить на 10 (или сколько у вас материалов в категории) и прибавлять 1 и отображать, а когда страничка будет отображаться, то в обратном порядке.
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #18 : 04.12.2015, 21:07:12 »

Не, не в том там дело... Устала, не пойму... подскажите, почему, БЛИНА, не работает?

Код:
$model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
$appParams = JFactory::getApplication()->getParams();
$model->setState('params', $appParams);
$model->setState('filter.category_id', $params->get('catid', $idd));
$model->setState('list.ordering','a.ordering');
$model->setState('list.start', 10);
$model->setState('list.limit', (int) $params->get('count', 0)); // ДОЛЖЕН ВСЁ ВЗЯТЬ С 10-Й СТАТЬИ ПО УМОЛЧАНИЮ, А НЕ РОБИТ! ЗАРАЗА. НИЧЁ НЕ БЕРЁТ!
$articles = $model->getItems();
« Последнее редактирование: 04.12.2015, 21:38:15 от tora312 » Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #19 : 04.12.2015, 22:12:53 »

Не знаю, почему у вас не работает. Не поленился теститровать у себя:
Показать текстовый блок
- все работает как надо.
Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #20 : 05.12.2015, 10:13:43 »

- все работает как надо.

Роберт, у меня тоже это работает.))) Но мне нужно взять с 11 статьи все до конца, сколько бы там ни было статей. Если я НЕ указываю лимит - $model->setState('list.limit',10); - грит ошибка.

Помогите мне с 3 вещами, пожалуйста!

Если я указываю по умолчанию $model->setState('list.limit',0); и $model->setState('list.start', 11); - ничего не берёт.((( Помогите мне с этим и ещё помогите ПЛИЗ узнать ордерин текущей статьи, учитывая что могут попадаться ордерин -1.)  А то у меня не работает почему-то

Код:
foreach( $articles as $i=>$article ){
$comps[$i]['ordering'] = $article->ordering;
}

И как узнать патч текущей категории без запроса к БД, функциями Joomla? И всо...))) Пока для полноты счастья мне больше ничего не надо.

Тут застряла и сижу.((( А пагинацию ещё вчера сделала, спасибки ВАМ ВСЕМ ОГРОМНЕЙШЕЕ!
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #21 : 05.12.2015, 13:10:11 »

Код
$model->setState('list.ordering','a.любой_столбец');// a - алиас таблицы #__content
$model->setState('list.start',10);// выборка начинается с 11-й записи
$model->setState('list.limit',18446744073709551615);// для MyISAM таблиц
 
А пагинацию ещё вчера сделала
Вы просто молодец! Такие, как вы, всегда приветствуются.
« Последнее редактирование: 05.12.2015, 13:15:47 от robert » Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #22 : 05.12.2015, 16:56:08 »

Спасибки.))) Туплю чёт... кароч... $model->setState('list.start',10); - без лимита не будет работать, потому надоть загнать поболя число в лимит?))) Чтобы наверняка?) Можно и 99999999, не обязательно ведь 18446744073709551615

$model->setState('list.ordering','a.любой_столбец'); - Не поняла... $model->setState('list.ordering','a.ordering'); - это ведь упорядочить по ордерин? А как получить сами значения ордерин?? Можно, если Вас не затруднит, на примере... как это 'a.любой_столбец'... Чтобы могла заполнить массив по материалам:

Код:
foreach( $articles as $i=>$article ){
$comps[$i]['ordering'] = $article->ordering;}

И крайний вопрос... как получить патч текущей категории. например, мы на странице мой _сайтик/категория/123-алиас, как узнать "категория"?? Или если мы на странице Блог категорий... без прямого запроса к БД... с таким запросом умею.)))

Я так делала... можно сразу узнать патч из запроса, а не ид?:

Код:
if (JRequest::getVar('view') == 'category') {
$idd=JRequest::getInt('id');
} else if (JRequest::getVar('view')=='article') {
$idd=JRequest::getInt('catid');}

$db->setQuery('SELECT `path` FROM `#__categories` WHERE `id`=\''.$idd.'\' LIMIT 1');
$list = $db->loadObjectList();
foreach($list as $comp)
{
$path = $comp->path;
}
« Последнее редактирование: 05.12.2015, 17:07:48 от tora312 » Записан
tora312
Осваиваюсь на форуме
***

Репутация: +2/-0
Offline Offline

Сообщений: 79


« Ответ #23 : 05.12.2015, 17:04:46 »



Поясните пожалуйста, как для девушки.) Никак не пойму. Лучше примером.)))
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3586


« Ответ #24 : 05.12.2015, 20:40:45 »

как получить сами значения ордерин?
Придется подключить модель Article, принцип тот же, что и с Articles, и методом getItem() загружать каждый материал.
Но это уже извращение, лучше с самого начала сделать 1 запрос, в котором выбирается и ordering.
Что значит
патч текущей категории
? Путь, что ли?
Код
$path=JRoute::_('index.php?option=com_content&view=category&id='.$this->item->catid);
//ну или по всем канонам Joomla
$path=JRoute::_(ContentHelperRoute::getCategoryRoute($this->item->catslug));
 
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet