Новости Joomla

Вышли релизы безопасности Joomla 6.1.4 и Joomla 5.4.9

Релиз безопасности Joomla 6.1.4 и Joomla 5.4.9

Проект Joomla! рад сообщить о выходе Joomla 6.1.4 и Joomla 5.4.9. Это релизы безопасности и исправления ошибок для серий 5.x и 6.x.

JoomShift - компонент переноса контента между Joomla сайтами.

‍ JoomShift - компонент переноса контента между Joomla сайтами.

JoomShift - компонент переноса контента между Joomla сайтами.Он позволяет экспортировать модули, меню, материалы, категории, пользовательские поля и пользователей в виде переносимых JSON/ZIP-файлов, а затем импортировать их в любую другую установку Joomla.

Возможности компонента:- Модули — полная настройка, назначение пунктов меню, позиционирование и содержимое SP Page Builder.
-Меню — иерархия родительских/дочерних элементов, типы элементов, ссылки, уровни доступа и параметры. Отсутствующие типы меню создаются автоматически, а элементы, указывающие на неустановленные компоненты, пропускаются с предупреждением.
-Статьи и категории — контент, метаданные, изображения и иерархия категорий.
-Пользовательские поля — группы полей, определения, ограничения по категориям и значения (включая поля с несколькими значениями) — экспортируются и автоматически создаются заново на целевом сайте.
-Пользователи — данные профиля, назначения групп и хэши паролей, чтобы учетные записи работали сразу после импорта.
-Кросс-версииJoomla - компонент адаптируется к различиям в схеме базы данных между версиями Joomla.
-Создан для крупных сайтов — постраничные списки (20/50/100/250строк) и автоматический пакетный экспорт для сайтов с более чем 500 элементами, поэтому он продолжает работать на обычном хостинге.
-Опция перезаписи — обновляет совпадающие элементы при повторном импорте вместо создания дубликатов.
-Drag-n-drop импорт с подробным отчетом о том, что было импортировано, обновлено или пропущено, и почему.

На момент написания заметки для скачивания необходима регистрация/логин на сайте разработчика.

-Joomla Extensions Directory-Страница расширения#joomla#расширения

Модуль joomLab JS Ajax Cart позволит организовать в Вашем интернет-магазине на компоненте JoomShopping удобную AJAX корзину с возможностью добавлять товары и изменять их количество без перезагрузки страницы.

Модуль joomLab JS Ajax Cart позволит организовать в Вашем интернет-магазине на компоненте JoomShopping удобную AJAX корзину с возможностью добавлять товары и изменять их количество без перезагрузки страницы.

Кроме этого, в состав пакета установки входит плагин, который позволяет выводить атрибуты товара в список всех товаров, менять эти атрибуты и добавлять товар в корзину из списка товаров. Если атрибутов много, то их можно выводить в всплывающем (модальном окне).

В модуле предусмотрено 2 макета дизайна для Bootstrap и UIkit и максимальная кастомизация для переопределения макетов в шаблон.Демо расширенияСтраница расширения

Видео в Telegram

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

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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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

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

b2z

  • Глобальный модератор
  • 7288
  • 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

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


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

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

Aleks.Denezh

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

b2z

  • Глобальный модератор
  • 7288
  • 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

  • Глобальный модератор
  • 7288
  • 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
Просмотров: 3662
Последний ответ 11.04.2022, 08:44:33
от sivers
Документация по разработки компонента для Joomla 3.x

Автор Aspik

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

Автор tm2010

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

Автор balancer

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

Автор platonische

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