Использовать модуль в контроллере кастомного компонента

  • 5 Ответов
  • 184 Просмотров

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

*

voron121

  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге
Доброго времени суток. Прошу помочь в решении моей задачи.
Имеется кастомный компонент объявлений. В объявлении есть опции, к примеру срок аренды. В админке срок аренды задается через список селект со значениями 1,2,3, так далее. Далее в субконтроллере вида view.html.php в цикле происходит обработка вывода этих значений и присвоение им текстовых параметров . То есть к примеру если срок аренды = 1 то ему присваиваем определенную языковую переменную из языкового файла. И далее уже в виде се красиво.

Теперь более подробно с чем я столкнулся и что я не могу понять как решить. На странице вывода объявлений  есть AJAX подгрузка объявлений. Из вьюхи в котроллер .  com_arenda/controllers/arenda.php  я передаю параметры для sql запроса на выборку объявлений. То есть сейчас в контроллере у меня и запрос на выборку из БД и предполагаемая пост обработка данных для формирования вывода их в вид. Но модель может усложняться и я хочу отделить при AJAX подгрузке контента модуль и контроллер.

Если отталкиваться от патерна MVC я должен передать из вида в контроллер параметры, далее их передать в модель, получить ответ от модели и его уже обработать и отдать в вид. Я понимаю что MVC это не 100% как надо делать но для меня сейчас это решение . Что бы не громоздить конструкцию из 100500 if else в контроллере и там же не обращаться к БД я хочу получить данные в контроллере, подгрузить метод выборки из модели в которую передам то что получил в контроллере, и уже далее в контроллере перебрать в цикле foreach то что мне вернет бд и оформить так как мне нужно.

То есть что мне нужно
: подскажите, как правильно написать конструкцию запроса обращения к методу модули из контроллера, что бы в контроллере получить результат работы БД
 

*

fsv

  • *******
  • 2505
  • 367
Запрос на url:
'index.php?option=com_arenda&task=arenda.getData'
или на
'index.php?option=com_arenda&task=arenda.getData&format=json'

в com_arenda/controllers/arenda.php
или в
в com_arenda/controllers/arenda.json.php

Код
public function getData()
{
    JSession::checkToken() or jexit (JText::_('JINVALID_TOKEN'));
    $jinput = JFactory::getApplication()->input;
    ........

    try
    {
        $model = $this->getModel();  // или $model = $this->getModel('modelName');
        if( $model->blabla($any) )   // получить объявления из базы
        {
        // обработать и echo данные
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

voron121

  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге
Спс, буду пробовать. :)

Можно еще вопрос? :) А вот такая ситуация : у меня в модели есть метод выборки записей

Код: php

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select('*');
$query->from('#__zaim');
$query->where('`published` = 1');
$query->order('`top` DESC');
return($query);

получается он возвращает строку запроса sql в бд. И далее в view.html.php он уже перебирается. Сейчас я в моделе создал еще один метод, который возвращает объект с данными. По сути они будут идентичны. То есть выборка будет одинаковая но т.к в дальнейшем модель  будет обрастать условиями я думаю как сделать так что бы метод в моделе был один и для обычного вывода  на странице записей и для подгрузки аякса.

Если я в контроллере делаю вот так

Код: php
  			$db = JFactory::getDbo(); 
                        $model = $this->getModel();
$db->setQuery($model, $start, 1);
$list = $db->loadObjectList();

То в контроллере будет ошибка связанная с неверным запросом в БД. Причина ошибки ясна но я хотел уточнить : в целом такой подход может быть ? То есть у меня есть 1 метод в моделе для выборки записей и в контроллере я уже   обращаясь к нему же, возвращаю объект с данными и его обрабатываю ? Или е то что я написал некий БДСМ и есть методы и попроще ?

*

robert

  • ********
  • 4002
  • 371
Ваши контроллер и модель, скорее всего, являются "дочерьми" контроллера и модели API Joomla. Родительская модель в конечном счете возвращает массив объектов, просто она разбила скрипт на несколько методов для более удобного использования.
Метод, который формирует запрос, называется getListQuery(). Он передает запрос в функцию getItems(), которая, в свою очередь, делает выборку из БД.
Если в вашей модели нет getItems, это не значит, что она не может использовать тот же метод от своего родителя.
Как правило, вы пишете для своей модели свой метод getItems только в случае, когда вы хотите обрабатывать результат, полученный от родительского класса.
  • Не будь паразитом, сделай что-нибудь самостоятельно!
  • В личке и по Skype не даю советов.

*

fsv

  • *******
  • 2505
  • 367
я думаю как сделать так что бы метод в моделе был один и для обычного вывода  на странице записей и для подгрузки аякса.
Он и так один. Модель ничего не знает, какой будет вывод. Она просто вернет данные. Как вы их отразите, ее не волнует.

Если я в контроллере делаю вот так
не надо

То есть у меня есть 1 метод в моделе для выборки записей и в контроллере я уже   обращаясь к нему же, возвращаю объект с данными и его обрабатываю ?
Заказать разработку:    расширения Joomla  |   интерфейсы на javascript(jQuery)  |  мобильные приложения

*

voron121

  • ****
  • 222
  • 1
  • Метод тыка и мата помогает в кодинге