Основной курс по Joomla
0 Пользователей и 1 Гость просматривают эту тему.
  • 24 Ответов
  • 1084 Просмотров
*

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Доброе время суток, гуру программирования и сайтостроения. У меня нарисовалась проблема на Joomla 3, не могу решить, помогите, пожалуйста.

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

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

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

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

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

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

*

tora312

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

robert

  • Профи
  • ********
  • 4009
  • 371
Стандартными средствами - вряд ли. Нужно создать свой шаблон с формой в качестве пагинации вместо ссылки.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

tora312

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

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

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

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

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Злодеи, так никто ничего полезного не написал.(((
*

robert

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

tora312

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


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

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

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

*

robert

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

fsv

  • Практически профи
  • *******
  • 2506
  • 367
В переопределенном шаблоне материала:
Код: php
$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, 01:01:37 от fsv »
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения
*

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
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

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
robert
Цитировать
Не совсем понял ваш вопрос. Запрос вроде нормальный.
Код: php-brief
$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

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Ахтунг! Не работает тут:

$article->ordering;
*

robert

  • Профи
  • ********
  • 4009
  • 371
Спойлер
[свернуть]
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

fsv

  • Практически профи
  • *******
  • 2506
  • 367
По нагрузке. Включите отладку и проверьте оба варианта, потом сюда напишите, что получилось.
По id категории. Зачем в категории из реквеста получаете, если мы в материале? Если надо нечто подобное и в категории, то там на просмотр $this выведите, проще код должен быть.
Язык. Не надо - не пишите. У функции 3 аргумента, категория и язык не обязательны, там по умолчанию значения указаны.
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения
*

tora312

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

По поводу реквеста, не знаю, как по-другому получить 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, 20:20:34 от tora312 »
*

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Спойлер
[свернуть]

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, 20:27:27 от tora312 »
*

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Ёлкиный, не поняла, как можно лимитировать запросы... у меня всё даёт...
*

ChaosHead

  • Профи
  • ********
  • 4683
  • 396
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

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Не, не в том там дело... Устала, не пойму... подскажите, почему, БЛИНА, не работает?

Код
$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, 22:38:15 от tora312 »
*

robert

  • Профи
  • ********
  • 4009
  • 371
Не знаю, почему у вас не работает. Не поленился теститровать у себя:
Спойлер
[свернуть]
- все работает как надо.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.
*

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
- все работает как надо.

Роберт, у меня тоже это работает.))) Но мне нужно взять с 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

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

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0
Спасибки.))) Туплю чёт... кароч... $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, 18:07:48 от tora312 »
*

tora312

  • Осваиваюсь на форуме
  • ***
  • 92
  • 0


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

robert

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