Новости Joomla

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

tiberian

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Доброго времени суток. Прорыскал интернет и так и не нашел информации как правильно передать данные из модели в вид. А ситуация следующая: запускаю контроллер, вытаскиваю данные из модели, а направить в вид их не получается. Как правильно должен быть написан контроллер для Joomla 3? Вариантов в Google много но каждый выдает ошибку на каком либо этапе работы.
Код
$app = JFactory::getApplication(); 
$view = $app->input->get('raspisanie');
$model=new MycomponentsModelraspisanie();
$stats=$model->getraspisanie();
Это допустимый код вообще?
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Так в самом виде
$model=new MycomponentsModelraspisanie();
$stats=$model->getraspisanie();
http://joomlaforum.ru/index.php/topic,291277.360.html
тут обсуждалось. Читать правда дох.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Самое главное понять зачем вы запускаете контроллер что бы данные в вид передать?
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Самое главное понять зачем вы запускаете контроллер что бы данные в вид передать?
Уху, иногда можно вообще обойтись без конкретного контроллера. Все зависит от ситуации.

Так в самом виде
$model=new MycomponentsModelraspisanie();
$stats=$model->getraspisanie();
http://joomlaforum.ru/index.php/topic,291277.360.html
тут обсуждалось. Читать правда дох.
Так конечно можно сделать, но нежелательно. Представление вообще ничего не должно знать о Запросе - это дело контроллера. Вот хороший пример получения инфы о представлении и установке модели. А данные Вы получаете в представлении - именно такой вариант MVC практикуется в Joomla, где представление больше похоже на View Model (Модель представления)

Контроллер ->
- получение Представления
- получение Модели
- установка Модели для Представления
- вызов Представления

Представление ->
- запрос данных у Модели
- установка метаданных и т.п.
- отображение макета

Конечно, никто не мешает сделать по своему, например:

Контроллер ->
- получение Представления
- получение Модели
- запрос данных у Модели
- передача данных в Представление
- вызов Представления

Представление ->
- установка метаданных и т.п.
- отображение макета
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
 ^-^ Уря. Мнение, что рулить должен контроллер, получает все больше сторонников. Долой тонкие контроллеры.
*

b2z

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

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
^-^ Уря. Мнение, что рулить должен контроллер, получает все больше сторонников. Долой тонкие контроллеры.
Здрасте ) В Joomla и так рулит контроллер! Без контроллера ни одна задаче не выполнится, даже отображение вида не выполнится!
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
По моему в любом фреймворке хорошей практикой являются тонкие контроллеры и толстые модели. Но на самом деле строгих правил нету, бывают разные реализации да и в конце концов это все лишь инструменты..
интернет-блог: http://websiteprog.ru
*

tiberian

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Большое спасибо. Я наконец разобрался.
Вот код контроллера.
Код
function raspisanie ()  
  {
$document=JFactory::getDocument();
$vName=$this->input->getCmd('view','raspisanie');
$vFormat=$document->getType();
$lName=$this->input->getCMD('layout','raspisanie');
$view=$this->getView($vName,$vFormat);
$model=$this->getModel('raspisanie');
$getd=JRequest::getVar('getd');
$view->setModel($model,true);
$view->setLayout($lName);
$view->document=$document;
$view->viewsR();
Оно бы всё и не чего работает как надо, только вот вопрос в том что данные из модели берутся с определенными параметрами.
Код
class MycomponentsModelraspisanie extends JModelLegacy
{
function getraspisanie()
{
//Подключение к бд Joomla
$db = $this->getDbo();
$query = 'SELECT * FROM #__raspisanie where month(dates)=month(CURDATE()) and day(dates)=day(CURDATE()) order by times';
$db->setQuery($query);
$row = $db->loadObjectlist();
//вернуть row
return $row;
}
А засунуть параметры в модель из контроллера. Смысл вообщем такой.Есть календарь, и нужно отобразить данные из таблицы на выбранную дату. Я правильно понял что забрать данные из GETa я должен в контроллере. и передать их в модель? Получить данные из GET сложности не составило, а вот при направлении в модель проблема( Как правильно это сделать?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Получить данные из GET сложности не составило, а вот при направлении в модель проблема( Как правильно это сделать?
Получайте данные из get непосредственно в вызываемой функции в модели.
*

tiberian

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
А это правильно. Я считал что обработка входящих данных должна происходить непосредственно в контроллере. То есть модель не должна знать про то какие данные передал пользователь. И при этом если данные пустые можно было бы использовать другую модель и вид.
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
А это правильно. Я считал что обработка входящих данных должна происходить непосредственно в контроллере. То есть модель не должна знать про то какие данные передал пользователь. И при этом если данные пустые можно было бы использовать другую модель и вид.
Верно. Я бы использовал состояние модели.

И вместо JRequest используйте JInput

Код: php
...
$getd = $this->input->get('getd');

$model = $this->getModel('raspisanie');
$model->setState('getd', $getd);

$view->setModel($model, true);
...

Потом в модели можно получит это значение:
Код: php
$getd = $this->getState('getd');
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Ну если следовать логике то принимать данные должен контроллер, в некотрых mvс используются строгие параметры в контроллерах, который позволяет получать из реквеста только те данные которые разрешено принимать, а вот их обработка и валидация уже происходит в модели. Я кстатии много видел в коде Joomla когда данные в брались из реквеста, минуя контроллер, так что даже разработчики строгих правил не придерживаются)
интернет-блог: http://websiteprog.ru
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Я кстатии много видел в коде Joomla когда данные в брались из реквеста, минуя контроллер, так что даже разработчики строгих правил не придерживаются)
Так нигде не написано, что надо делать именно так. По сути, каждый решает сам, как он будет реализовывать =) Joomla и её фреймворк лишь инструмент, а как его применять - решать разработчику. Но если ты правильный разработчик, ты не будешь городить огород, а попытаешься следовать общепринятым практикам MVC. К сожалению, таких разработчиков мало...
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
использовал состояние модели.

И вместо JRequest используйте JInput

Код: php
...
$getd = $this->input->get('getd');

$model = $this->getModel('raspisanie');
$model->setState('getd', $getd);

$view->setModel($model, true);
...

Потом в модели можно получит это значение:
Код: php
$getd = $this->getState('getd');
Вот! Это тот самый пример работы с состоянием модели, о котором мне столько говорили (писали) и который я оч.долго искал, и нашел наконец-то! УРЯ!
« Последнее редактирование: 03.07.2014, 13:16:34 от b2z »
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Вот! Это тот самый пример работы с состоянием модели, о котором мне столько говорили (писали) и который я оч.долго искал, и нашел наконец-то! УРЯ!
Прошу прощения, код неверен! Я поправил свое предыдущее сообщение и Ваше тоже. Мыслю фреймворком, а это - CMS... В них по разному устанавливается состояние модели.
*

b2z

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

tiberian

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
И снова проблема с передачей данных от контроллера и далее в глубь(((
Имею контроллер:
Код
class MycomponentsController extends JControllerLegacy
{

function display ()
  {
$document=JFactory::getDocument();
$vName=$this->input->getCmd('view','Mycomponents');
$vFormat=$document->getType();
$lName=$this->input->getCMD('layout','default');
$view=$this->getView($vName,$vFormat);
$model=$this->getModel('Mycomponents');
//Получаем данные из массива GET
$getm=$this->input->get('getm');
$gety=$this->input->get('gety');
//Проверяем что получили
IF (JRequest::getVar('getm')==null or !(is_numeric(JRequest::getVar('getm'))) or JRequest::getVar('gety')==null or !(is_numeric(JRequest::getVar('gety')))){
$getm=intval(date("m"));
$gety=intval(date("Y"));
}
//Теперь точно везде числа
$model->setState('getm',$getm);
$model->setState('gety',$gety);
$view->setModel($model,true);
$view->setLayout($lName);
$view->document=$document;
$view->display();
  }
Через него передаю данные в модель всё без проблем
Код
function getMycomponent()
{

$getm=$this->getState('getm');
$gety=$this->getState('gety');
$db = $this->getDbo();
$query = 'SELECT DAY(dates) as Dday FROM #__raspisanie where MONTH(dates)='.$getm.' and YEAR(dates)='.$gety.' Group BY Dday';
$db->setQuery($query);
$row = $db->loadObjectlist();
return $row;

}

Соответственно иду в вид
function display ($tpl = null)
   {
   $model = $this->getModel();
   $rows = $model->getMycomponent();
   $this->assignRef('rows',$rows);
   
parent::display($tp1);
   }
Ну и тут проблема в шаблоне есть функция отображающая данные из модели, она привязана к параметрам из контроллера $getm и $gety. Но увы зацепить ну не как  не получается их((( В данный момент получаю их через JRequest::getVar(), но очень уж хочется из контроллера. подскажите как?
Код
calendar(JRequest::getVar('gety'),JRequest::getVar('getm'),$this->rows);
« Последнее редактирование: 16.07.2014, 09:14:22 от tiberian »
*

tiberian

  • Осваиваюсь на форуме
  • 17
  • 0 / 0
Нашел пример для Joomla 1.5 но сразу получаю множество ошибок. компонент на Joomla 3.0.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Омг! Зачем вы все это делаете!
Зачем вы из контроллера передаете данные в модель которые у вас в $_REQUEST?
Получайте их сразу в модели!!

В контроллере метод display()  вообще сделать таким:
Код: php
function display( $cachable = false, $urlparams = array() )
{
$this->default_view = 'вид_по_умолчанию';
parent::display( $cachable, $urlparams );
}

В модели:
Код: php
function getMycomponent()
{
$input = JFactory::getApplication()->input;
$getm = $input->get( 'getm' );
$gety = $input->get( 'gety' );


$db = $this->getDbo();
$query = 'SELECT DAY(dates) as Dday FROM #__raspisanie where MONTH(dates)=' . $getm . ' and YEAR(dates)=' . $gety . ' Group BY Dday';
$db->setQuery( $query );
$row = $db->loadObjectlist();
return $row;
}

А дальше в виде просто:
Код: php
protected $rows;
function display ($tpl = null)
{
$this->rows = $this->get('Mycomponent');
parent::display($tp1);
}

И все! Вы усложняете себе жизнь в 10 раз!
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Омг! Зачем вы все это делаете!
Зачем вы из контроллера передаете данные в модель которые у вас в $_REQUEST?
Получайте их сразу в модели!!
Я уже писал о том - модель ничего не должна знать об окружении.


В представлении:
Код: php
$state = $this->get('State');

В шаблоне:
Код: php
$this->state->get('getm');
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Я уже писал о том - модель ничего не должна знать об окружении.
Но ведь все стандартные компоненты Joomla работают по такому принципу! И все знают о окружении! Зачем делать двойную работу и городить бредовый код? Зачем делать то что уже за нас сделано!
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Но ведь все стандартные компоненты Joomla работают по такому принципу!
Но это совсем не значит, что это правильно, хотя и кажется очень удобным...

Вообщем, делайте как знаете =) Я не пытаюсь навязать свою точку зрения, просто показываю общепринятые практики. Вот неплохая статья и комментарии.

Цитировать
Открываем паттерн MVC.
Читаем:

Implementing the MVC pattern requires the following components:

Model – This component contains one or more classes and interfaces that are responsible for maintaining the
data model. The state of the model is kept in attributes and the implementation of methods. To be able to notify
view components of any change in the model, the model keeps a reference to each registered view (there can be
more than one at the same time). When a change occurs, every view component that has registered should be
notified.

View – The classes and interfaces of the view provide a representation of the data in the model component. The
view may consist of visual GUI components, but is not required to. A view must be registered with the model to
be notified of changes to the model data. When a notification of such a change is received, the view component is
responsible for determining if and how to represent this change.

The view component also keeps a reference to the model to retrieve data from the model, but it can only retrieve
information, not change it. The view can also be used to render the controller, but requests for change are always
forwarded to a controller component; so the view needs to keep a reference to one or more controllers.

Controller – This component manages changes to the model. It keeps a reference to the model component who
is responsible for carrying out the change, whereas the controller calls one or more update methods. The requests
for change may come from a view component.

И еще неплохой пост:

Цитировать
Модель — это та часть вашего приложения, которая должна использоваться в любом интерфейсе без каких-либо изменений: веб, десктоп, RPC, командная строка и т. п. Поэтому любой код специфичный для конкретного интерфейса должен быть помещен в контроллер (или вид).
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Вобще конечно по хорошему параметры запроса должны быть отфильтрованы в контроллере. Но при использование состояния есть ложка дегтя, например если я в контроллере пропишу:
Код: php
public function display($cachable = false, $urlparams = array())	
{
   $model = $this->getModel();
   $model->setState('var','testvar');  
   parent::display($cachable, $urlparams)  
}

в модели:
Код: php
public function getItem() 
{
  return $this->getState('var');
}

и во вью попытаюсь вывести $this->get('Item'); то ничего не отобразится, оно как бы и логично ведь в родительском display во вью устанавливается новый экземпляр модели. Конечно я могу вместо parent::display() написать:
Код: php
$view =  $this->getView('viewname', 'html');
$view->setModel($model, true);
$view->display()

и переменная отобразится, но тогда походу не будет работать кэширование да и как то вобще писанины много получается..
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Дима у меня английский плохой, но в том что ты привел разве написано что модель не может получать данные из $_REQUEST?

Модель — это та часть вашего приложения, которая должна использоваться в любом интерфейсе без каких-либо изменений: веб, десктоп, RPC, командная строка и т. п. Поэтому любой код специфичный для конкретного интерфейса должен быть помещен в контроллер (или вид).
Если следовать этому то да, придется получение данных помещать в контроллер и передавать в модель! Но в данный момент у нас не проектировка мультиплатформенного приложения, да и J не предназначена для этого! Поигравшись с кучей MVC фреймворков понимаешь что писать нужно как удобно, ибо  на 100% единого стандарта нет! И у каждого программиста код совершенно разный!
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
и переменная отобразится, но тогда походу не будет работать кэширование да и как то вобще писанины много получается..
А ещё вы можете в методе display() написать:
Код: php
public function display($cachable = false, $urlparams = array())
{
$document = JFactory::getDocument();
$viewType = $document->getType();
$viewName = $this->input->get('view', $this->default_view);
$viewLayout = $this->input->get('layout', 'default', 'string');

$view = $this->getView($viewName, $viewType, '', array('base_path' => $this->basePath, 'layout' => $viewLayout));

// Get/Create the model
if ($model = $this->getModel($viewName))
{
// Push the model into the view (as default)
$view->setModel($model, true);
}

$view->document = $document;

$conf = JFactory::getConfig();

// Display the view
if ($cachable && $viewType != 'feed' && $conf->get('caching') >= 1)
{
$option = $this->input->get('option');
$cache = JFactory::getCache($option, 'view');

if (is_array($urlparams))
{
$app = JFactory::getApplication();

if (!empty($app->registeredurlparams))
{
$registeredurlparams = $app->registeredurlparams;
}
else
{
$registeredurlparams = new stdClass;
}

foreach ($urlparams as $key => $value)
{
// Add your safe url parameters with variable type as value {@see JFilterInput::clean()}.
$registeredurlparams->$key = $value;
}

$app->registeredurlparams = $registeredurlparams;
}

$cache->get($view, 'display');
}
else
{
$view->display();
}

return $this;
}

Да да да, скопировать содержимое метода из класса JControllerLegacy от которого вы наследуетесь, и дальше влупить что угодно не боясь о том что кривое кеширование перестанет работать ))
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Да да да, скопировать содержимое метода из класса JControllerLegacy от которого вы наследуетесь, и дальше влупить что угодно не боясь о том что кривое кеширование перестанет работать ))
Я так кстати и сделал в свое время :)

Дима у меня английский плохой, но в том что ты привел разве написано что модель не может получать данные из $_REQUEST?
Если следовать этому то да, придется получение данных помещать в контроллер и передавать в модель! Но в данный момент у нас не проектировка мультиплатформенного приложения, да и J не предназначена для этого! Поигравшись с кучей MVC фреймворков понимаешь что писать нужно как удобно, ибо  на 100% единого стандарта нет! И у каждого программиста код совершенно разный!
Поэтому и говорю, каждый делает по своему ;) Вообщем холивар это все!
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
)) кстатии конструкция типа такой:

if(!isset($view->getModel()))
   $view->setModel($model, true);

могла бы наверное решить эту проблему. Хотя не не решила бы, надо еще и экземпляр view передавать.
« Последнее редактирование: 16.07.2014, 14:26:09 от zomby6888 »
интернет-блог: http://websiteprog.ru
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Отправка файлов через ajax в модуль Joomla

Автор hemicide

Ответов: 19
Просмотров: 2265
Последний ответ 11.04.2022, 08:44:33
от sivers
Документация по разработки компонента для Joomla 3.x

Автор Aspik

Ответов: 9
Просмотров: 3311
Последний ответ 23.01.2021, 07:55:56
от hmr
Применение ajax (Аякс) в модуле Joomla

Автор tm2010

Ответов: 34
Просмотров: 5314
Последний ответ 26.09.2020, 09:38:35
от b2z
Обработка AJAX в компоненте Joomla!3

Автор balancer

Ответов: 33
Просмотров: 11921
Последний ответ 23.07.2020, 07:45:53
от Dolphin4ik_1
Pagination компонента и данные из формы модуля

Автор platonische

Ответов: 4
Просмотров: 1043
Последний ответ 29.01.2020, 11:32:43
от mardok