Новости Joomla

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

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте!

Разрабатываю компонент. Есть представление(view), которое должно отображать два разных списка, с объектами разных типов, например книги контактов и список контактов, делая это через разные макеты(layouts). Как предполагаю для одного вида - одна модель.
Соответственно она должна быть потомком класса JModelList(ListModel), в котором, как понимаю, может быть только один метод getListQuery(), указывающий объекты какого типа вытаскивать для списка.
Вопрос, как же тогда достать список объектов второго типа в этом представлении?
« Последнее редактирование: 30.04.2020, 14:35:53 от borro »
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
указывающий объекты какого типа вытаскивать для списка
Так не делается.
Либо 2 разных модели, либо вытащить сразу оба типы.
P.S.
Хотя, конечно, можно параметром запроса указать, какой запрос в БД выполнять, но это уже костыль.
« Последнее редактирование: 30.04.2020, 15:09:58 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
В view можно прописать сколько угодно:
Код
$this->items = $this->get( 'Items' );
$this->one = $this->get( 'One' );
$this->two = $this->get( 'Two' );
а в модели для них определить:
Код
public function getItems(){
// это стандартная
}
public function getOne(){
// это другой тип раз
}
public function getTwo(){
// это другой тип два
}
Эти методы должны возвращать списки объектов (или что угодно, что вам нужно), обращаться к getListQuery() в них не обязательно - стройте свои запрос там и отрабатывайте его.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Так не делается.
но по канонам так не делается, да (как в пред. посте предложено)
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Спасибо всем. А как в представлении можно переключать модели, если их например 2 создать?
Вытащить сразу два типа - это выполнить два запроса и запихнуть их в массив, первый элемент которого - массив объектов одного типа, а второй элемент - массив элементов другого типа?
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Спасибо всем. А как в представлении можно переключать модели, если их например 2 создать?
Зачем? Чтоб самому же запутаться потом?
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Зачем? Чтоб самому же запутаться потом?
это я в познавательных целях :)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Если 2 модели, то 2 вью. Незачем создавать себе геморрой (с пагинацией, например).
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Кстати про пагинацию. sivers, если я пойду по предложенному вами пути, пагинация не запутается, что она сейчас выводит?
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Кстати про пагинацию. sivers, если я пойду по предложенному вами пути, пагинация не запутается, что она сейчас выводит?
Автоматически пагинация будет строиться по объектам из дефолтного метода getItems.

Кастомную пагинацию сделать не сложно тоже:
Код
        jimport('joomla.html.pagination');
        $pagination = new JPagination($total, $limitstart, $limit);
        echo $pagination->getPagesLinks();
        echo $pagination->getPagesCounter();

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

Тут главная непонятность - какое кол-во товаров считать в $total - ведь в разных типах объектов оно будет отличаться.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Спасибо. Это:
        jimport('joomla.html.pagination');
        $pagination = new JPagination($total, $limitstart, $limit);
        echo $pagination->getPagesLinks();
        echo $pagination->getPagesCounter();
получается в layout поместить.

А где задать эти $total, $limitstart, $limit и как?
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
А где задать эти $total, $limitstart, $limit и как?
$total - это кол-во всех элементов по данному запросу. чтоб узнать, надо выполнить тот же запрос (который сейчас на странице у вас вытянул список объектов), только в SELECT вместо полей ставиться COUNT(*) и удаляется LIMIT из запроса,
$limitstart - определяется как произведение номера текущей страницы (начиная с нуля) и кол-ва элементов на странице.
$limit - это кол-во элементов на странице, задается в настройках.

т.е., допустим у вас 30 элементов на странице и вы находитесь на третьей странице, соответственно $limit = 30, $limitstart = (3-1)*$limit = 60. Это дело подставляется в запрос как LIMIT 60, 30 - т.е. читать начиная с 60-го элемента 30 штук (с 60 по 89 получится).

Если хотите расчитывать эти вещи вручную для дефолтной пагинации, то в модели данных определите функцию getTotal, возвращающую целое число. Она автоматически подхватится (переопределит наследуемую от родительского класса). $limitstart прочитайте из аргументов запроса или вычислите из номера страницы. $limit берите из настроек или задайте константой.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Если хотите расчитывать эти вещи вручную для дефолтной пагинации, то в модели данных определите функцию getTotal, возвращающую целое число. Она автоматически подхватится (переопределит наследуемую от родительского класса). $limitstart прочитайте из аргументов запроса или вычислите из номера страницы. $limit берите из настроек или задайте константой.
А разве дефолтная пагинация(как понимаю для getItems()) сама эти параметры не рассчитает? Как понял их нужно рассчитывать только для getOne() из вашего примера, то есть для второго типа объектов. Нет?
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
А разве дефолтная пагинация(как понимаю для getItems()) сама эти параметры не рассчитает? Как понял их нужно рассчитывать только для getOne() из вашего примера, то есть для второго типа объектов. Нет?
В целом да, верно. Но бывают иногда ситуации, когда надо заменить автоматический расчет своим. Например, у вас элементы берутся не из БД, а из файла.

А в вашей ситуации надо решить сперва что вообще будут означать ваши страницы пагинации. У вас будет 2 разные пагинации? Или одна общая? Если общая, то кол-во элементов вы будете учитывать по дефолтным элементам или по максимальному/минимальному значению из двух?
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

fsv

  • Живу я здесь
  • 2781
  • 410 / 2
А как в представлении можно переключать модели, если их например 2 создать?
Using multiple models in an MVC component , последняя часть

Веб-разработка: заказ. Только новая разработка.
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
У вас будет 2 разные пагинации? Или одна общая? Если общая, то кол-во элементов вы будете учитывать по дефолтным элементам или по максимальному/минимальному значению из двух?
Здравствуйте. Как понимаю 2 разные, потому что книг одно число, контактов - другое.
Получается пагинация пагинацией внизу, но мне надо еще самому задавать логику вывода только нужных объектов в соответствии с текущей страницей пагинации?
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Получается пагинация пагинацией внизу, но мне надо еще самому задавать логику вывода только нужных объектов в соответствии с текущей страницей пагинации?
Если у вас сдвоенные объекты будут только на первой странице, а на страницах пагинации - только один тип, то да. Надо делать 2 разные (и независимые) пагинации и думать как это все разделить по пунктам меню.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Спасибо. Обычно вытаскивают с помощью SQL ровно столько строк сколько нужно для страницы пагинации, то есть делают параметризуемый SQL запрос? Тогда как передать параметры в метод модели? Я видел здесь подход, в котором модель инициализируют в представлении и вызывают её метод с параметрами. Это типичный подход или надо в модели через JInput добывать параметры?
« Последнее редактирование: 03.05.2020, 14:21:44 от borro »
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
В модели можно использовать такие:
Код
$this->setState('list.next', $next);
$this->setState('list.page', $page);
$this->setState('list.start', $start);
$this->setState('list.limit', $limit);
$this->setState('list.ordering', $ord);
$this->setState('list.direction', $dir);

Код
$next = $this->getState('list.next');
$page = $this->getState('list.page');
$start = $this->getState('list.start');
$limit = $this->getState('list.limit');
$ord = $this->getState('list.ordering');
$dir = $this->getState('list.direction');
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
setState
Не пойму, для чего мне это использовать. Я вроде про другое спрашивал :) Насколько понимаю setState и getState для сохранения и вызова сохраненного параметра в модели.
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Это типичный подход или надо в модели через JInput добывать параметры?
А здесь речь не о том шла? Тогда я не понял какие параметры выхотите передать. Если уж вам не подходит вариант передачи как аргументы функции.

Еще можно передавать через глобальные переменные.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Или вы хотели сказать, что setState надо сделать в представлении, а getState в модели? Я понял, что оба метода для использования внутри модели.
*

sivers

  • Живу я здесь
  • 2585
  • 359 / 0
Из модели в представление можно передать параметры так (в представлении пишите):
Код
$this->state = $this->get('State');
При этом в модели отработает метод populateState и все, что в нем вы запишете в $this->setState('list.page', $page); будет доступно в представлении через $this->state. В модели тоже. Будет ли в обратную сторону работать - не уверен.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Здравствуйте!

Разрабатываю компонент. Есть представление(view), которое должно отображать два разных списка, с объектами разных типов, например книги контактов и список контактов, делая это через разные макеты(layouts). Как предполагаю для одного вида - одна модель.
Соответственно она должна быть потомком класса JModelList(ListModel), в котором, как понимаю, может быть только один метод getListQuery(), указывающий объекты какого типа вытаскивать для списка.
Вопрос, как же тогда достать список объектов второго типа в этом представлении?
Учитывая что вывод будет разный, к чему этот "цирк" с 2 layouts, ладно если бы данные были из одного источника, а отличались только колонки в select.
Так что делайте 2 view и все. Иначе не только с самими данными намучаетесь, но и маршрутизацией (элементарно ключ придётся делать int, а потому будете путаться какой из ключей какой layout)

Но если действительно решили делать одну view причем с ListModel то делаете это так.
Делаться 3 модели.
modelOne - один тип содержимого
modelTwo - второй тип.
modelView - модель на которую будет обращаться view.

В modelView в методе getItems уже в зависимости от условий обращаетесь на modelOne или modelTwo и получаете из выбранной items, total и pagination (Реализацию можете посмотреть в components/com_content/models/category.php)
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Делаться 3 модели.
Можно проще, с 2 моделями и собственной getModel().
Вопрос: зачем мучиться с 1 view? Если в познавательных целях - лучше  и проще читать код.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте!

Я просто подумал, что раз оба списка данных связаны с темой "Контакты", то это должно быть одно представление. Но похоже вам виднее. Наверно переделаю, спасибо.
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Здравствуйте!

Я просто подумал, что раз оба списка данных связаны с темой "Контакты", то это должно быть одно представление. Но похоже вам виднее. Наверно переделаю, спасибо.
Ну тема и тип данных разные веши. Те же метки(они же тего) имеет 2 листовых view список меток и список элементов.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться