Новости Joomla

0 Пользователей и 1 Гость просматривают эту тему.
  • 16 Ответов
  • 2329 Просмотров
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Вкратце....

Страничка на которой выводится список элементов при помощи  AJAX.
Есть кнопка при нажатии на которую можно загрузить ещё часть списка и ещё.
(По умолчанию выводится 20)

Есть меню типа "Категории"
список 1; список 2; список 3;

Проблемам в том, что если находясь в список 1; "дозагрузить" часть элементов, скажем до 100,
то при переключении на список 2; или список 3; будет выведено элементов в таком же количестве, а нужно по умолчанию снова 20.

Если в ссылке пописывать явно ?limit=20? то норм соответственно, но при обновлении страницы список скидывается снова до 20.

Как установить или скинуть параметры пагинации?

......................

Можно конечно AJAX прикрутить и к список 1; список 2; список 3;, но это несколько не удобно.
Так как там помимо списка ещё данные всякие....
И важно чтоб пользователь мог скопировать ссылку или вернуться на страницу.
« Последнее редактирование: 05.09.2014, 02:20:58 от ninth »
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Если я правильно понял суть вопроса, то при подгрузке элементов аяксом лимиты сохраняются в сессию, и после перехода на другие странички, берутся из сессии уже. Если же вы прописываете явно то они считываются из запроса в первую очередь.

Наверное самым правильным в вашем случае решением будет проверить в модели или контроллере пришел ли запрос аяксом, и если это не AJAX то либо удалить эти переменные из сессии (при условии что они присутствуют в запросе) либо прописать их вручную (при условии что для всех списков элементы подгружаются аяксом). Можно еще и в случае AJAX запроса сменить приоритет (сессия-запрос).

ИМХО проще всего при обычном "не аякс" запросе ставить лимиты по умолчанию (тогда их не надо прописывать в урлах).Лимиты скорее всего понадобится прописать в модели, так что код модели в студию если сами не справитесь..
« Последнее редактирование: 05.09.2014, 03:25:30 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3406
  • 428 / 4
Вы бы показли код, ато гадание на кофейной гуще...
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Код в модели:
Код: php
    protected function getListQuery()
    {
        $query = $this->getDbo()->getQuery( true );
        $query->select(array('a.name', 'a.id'));
$query->from('#__myworks AS a');

// Join over the categories.
$query->select('c.title AS category_title')
->join('LEFT', '#__categories AS c ON c.id = a.catid');

if(isset($_GET["catid"]))
{
if($_GET["catid"] != "all")
{
$query->where('catid = '.$_GET["catid"]);
}
}
        return $query;
    }

view.raw.php (стандартная пагинация)
Код: php
jimport('joomla.application.component.view');

class MyworksViewMyworks extends JViewLegacy
{
    protected $mycategory;
    protected $pagination;
    protected $items;

    public function display($tpl = null)
    {
        $this->mycategory = $this->get('Mycategories');
        $this->items = $this->get( 'Items' );
        $this->pagination = $this->get( 'Pagination' );

        $this->setLayout('default_ajax');

        parent::display($tpl);
    }
}

Код в default.php
Код: php
<?php foreach($this->mycategory as $i => $mycategory) : ?>
<a href="<? echo JRoute::_('index.php'.'?catid='.$category->id);?>"><?=$mycategory->title;?></a>
<?php endforeach; ?>  

<? if($this->pagination->total > 0): ?>
  <div class="block-gallery-items-img-load"><?php echo $this->loadTemplate('ajax'); ?></div>
<? endif ?>

Вывод списка default_ajax.php
Код: php
<?php foreach($this->items as $i => $items) : ?>
<div><?=$items->title;?></div>
<?php endforeach; ?>

<div id="next_button_items" rel="<?php echo JRoute::_('&limit='.$this->pagination->limit+20); ?>">[ загрузить ещё 20 ]</div>

Скрип для кнопки выводи ещё 20-ти...
Код: javascript
$(document).on('click', '#next_button_items', function () {
$.get($(this).attr('rel') + '&format=raw', function (responce) {
$('.block-gallery-items-img-load').html(responce);
});
return false;
});
« Последнее редактирование: 05.09.2014, 14:36:04 от ninth »
*

SmokerMan

  • Гуру
  • 5293
  • 720 / 26
нужно переопределить метод populateState в своей модели и в нем уже задавать нужное значение
Код
$this->setState('list.start', 'значение');
$this->setState('list.limit', 'значение');
по умолчанию оно берется из сессии, поэтому и сохраняется
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
Оффтоп, но все же.

1. Как-то нелогично делать присоединение таблиц
Код: php
// Join over the categories.

перед условием проверки:
Код: php
if(isset($_GET["catid"]))

2.
Код: php
$query->where('catid = '.$_GET["catid"]);
Это прямой путь ко взлому...
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
нужно переопределить метод populateState в своей модели и в нем уже задавать нужное значение
Эти значения будут постоянными или ими можно управлять и сохранять результат при перезагрузке страницы?

Это прямой путь ко взлому...
Так правильно будет? Или нужно по другому?
Код: php
$query->where('catid = '.(int)$_GET["catid"]);
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Так у вас по переходе по ссылкам категории меняются? Тогда наверное логичнее будет сделать так:
Код: php
public function populateState($ordering = null, $direction = null)
{
     $app = JFactory::getApplication();
     parent::populateState($ordering, $direction);
     $cur_cat = (int) $_GET["catid"];
     $old_cat = $app->getUserState($this->context. '.category');
     if ($old_cat != $cur_cat) {
         $app->setUserState($this->context . '.category', $cur_cat);
         $this->setState('list.start', 0);
         $this->setState('list.limit', 20);
     }
}
Не уверен правда что будет работать, проверить сейчас нет возможности, но по логике вроде все верно. Сохраняем в сессиию идешник последней категории и если он изменился то обнуляем лимиты. Возможно их еще нужно в сессии обнулить. Для этого добавить в условие if такие строчки еще:
Код: php
$app->setUserState('global.list.limit', 20);
$app->setUserState($this->context . '.limitstart', 0);
« Последнее редактирование: 05.09.2014, 16:41:34 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

b2z

  • Глобальный модератор
  • 7290
  • 778 / 0
  • Разраблю понемногу
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
zomby6888, большое спасибо.
Все сработало. Только if(isset($_GET["catid"])) добавил.

И ещё такой вопрос.
По категориям нормально.
Не могу разобраться как быть если ?catid=№ не задан. То есть catid вообще отсутствует.
Что тогда с чем сравнивать?

15:51 ........................................

Сделал по аналогии с примером выше. Вроде работает.
Код: php
if( !isset($_GET["limit"]) )
}
$cur_id = JSite::getMenu()->getActive()->id;
$old_id = $app->getUserState($this->context.'.id');
if ($old_id != $cur_id) {
$app->setUserState($this->context.'.id', $cur_id);
$this->setState('list.start', 0);
$this->setState('list.limit', 20);
$app->setUserState('global.list.limit', 20);
$app->setUserState($this->context . '.limitstart', 0);
}
}

...........................

Тоже немного не то.
Если с site/page?catid=111 перейти на site/page сброс не произойдёт.
« Последнее редактирование: 06.09.2014, 16:33:33 от ninth »
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
на будущее, вместо:
Код: php
if( isset($_GET["limit"])==0 )
правильнее будет написать:
Код: php
if( !isset($_GET["limit"]) )
это конечно мелочь все, но слышал что пхпшников уволняли с работы за подобное)
интернет-блог: http://websiteprog.ru
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Не могу разобраться как быть если ?catid=№ не задан. То есть catid вообще отсутствует.
А к пункту меню какая нибудь категория привязана при этом или все грузится? Если не привзяна то можно дополнительно проверку перед проверкой сессии:
Код: php
if (!isset($cur_cat)) 
{
   $cur_cat = 'all';  
}

upd: Хотя нет так Неправильно делать. а зачем кстатии вы проверку на if(isset($_GET["catid"])) добавили? так бы в $cur_cat был 0 если ид категории отсутствует в запросе и 0 бы в сессию записывался.
« Последнее редактирование: 06.09.2014, 16:47:21 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
на будущее, вместо:
Код: php
if( isset($_GET["limit"])==0 )
правильнее будет написать:
Код: php
if( !isset($_GET["limit"]) )
это конечно мелочь все, но слышал что пхпшников уволняли с работы за подобное)

Спасибо. Поправился.

А к пункту меню какая нибудь категория привязана при этом или все грузится? Если не привзяна то можно дополнительно проверку перед проверкой сессии:

Немного по другому сделал. Теперь вообще всёравно что к чему привязано.
Если использовать вместо $cur_id = JSite::getMenu()->getActive()->id;  $cur_id = $_SERVER['REQUEST_URI'];,
тогда всё как нужно работает. Только не знаю, правильно ли так?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Если использовать вместо $cur_id = JSite::getMenu()->getActive()->id;  $cur_id = $_SERVER['REQUEST_URI'];,
тогда всё как нужно работает. Только не знаю, правильно ли так?
не очень красиво, а чем плох вариант с  $cur_cat = (int) $_GET["catid"]; . Если категория отсутствует то в $cur_cat будет 0. Правда будет вылезать уведомление strict standarts, типа что отсутствует индекс массива. Если оно мешает можно так написать:
Код: php
$input = JFactory::getApplication->input;
$cur_cat = $input->getInt('catid' , 0);
интернет-блог: http://websiteprog.ru
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
Картина в целом....

Есть меню:
По категориям - site/category
По клиентам - site/client
По датам - site/date

Также у каждого меню есть подменю типа:
По категориям/Категория site/category?catid=10
По клиентам/Клиент site/client?cid=10
По датам/Дата site/date?date=10

Ну и соответственно список элементов в зависимости от выбранного пункта меню / подменю.

Есть пара AJAX запросов.
Один добавляет количество элементов в список, второй сортирует - "первые / последние"

Подумал что лучше чем писать все условия для каждого $_GET["..."], проще отслеживать смену адреса в строке и AJAX запросы.
В первом и во втором AJAX запросе присутствует format=raw.

Код: php
if(!isset($_GET["format"]))
{
$cur_path = $_SERVER['REQUEST_URI'];
$old_path = $app->getUserState($this->context.'.path');
if ($old_path != $cur_path) {
$app->setUserState($this->context.'.path', $cur_path);
$this->setState('list.start', 0);
$this->setState('list.limit', 20);
//$app->setUserState('global.list.limit', 20);
//$app->setUserState($this->context . '.limitstart', 0);
}
}

Получается что если идёт AJAX запрос или страница просто обновляется, то лимит остаётся прежнем.
Если переход на другой пункт меню или подменю лимит равен 20.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Ну да в таком случае можно и так, но я бы наверное к каждой ссылке с меню добавил уникальный параметр какой нибудь и его сверял с сессионным. Тогда бы проверка на if(!isset($_GET["format"])) не потребовалась. И не надо всю URL хранить в сессии. С ЧПУ еще заморока у вас, по хорошему то все эти параметры post-ом передавать.
интернет-блог: http://websiteprog.ru
*

ninth

  • Захожу иногда
  • 59
  • 0 / 0
  • [ 9 ]
zomby6888, огромное вам спасибо.

...С ЧПУ еще заморока у вас, по хорошему то все эти параметры post-ом передавать.
Думаю это ещё нужно будет решать )))
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Pagination компонента и данные из формы модуля

Автор platonische

Ответов: 4
Просмотров: 627
Последний ответ 29.01.2020, 11:32:43
от mardok
Установка демо данных из админки расширения

Автор effrit

Ответов: 16
Просмотров: 1052
Последний ответ 28.05.2018, 10:54:48
от effrit
Обработка параметров модуля при сохранении

Автор lesh1j

Ответов: 5
Просмотров: 819
Последний ответ 15.12.2017, 22:49:11
от lesh1j
Фильтр не сохраняет данные ввода при пагинации

Автор onelawyer

Ответов: 24
Просмотров: 1438
Последний ответ 29.08.2017, 17:33:56
от Aleks.Denezh
Ошибка в компоненте при передаче параметров в форму для редактирования на стороне сайта

Автор GuDeVic

Ответов: 66
Просмотров: 3478
Последний ответ 23.11.2016, 22:53:48
от GuDeVic