Новости Joomla

JoomGallery 4.1.0 - компонент галереи изображений для Joomla

JoomGallery 4.1.0 - компонент галереи изображений для Joomla

Новая итерация компонента продолжает развиваться, ведь с v.4.x компонент был переписан практически с нуля.

v.4.1.0. Что нового?

Редактирование метаданных изображений. Теперь метаданные можно не только читать, но и напрямую редактировать и записывать обратно в изображение JPG. Поддерживаются данные EXIF ​​и IPTC.

Полная совместимость с Joomla! 4.x, 5.x и 6.x. Компонент почистили от устаревших методов в коде.

Заметно ускорили загрузку больших галерей. Списки в админке, особенно для очень больших галерей ( >30 000 изображений), теперь загружаются значительно быстрее.

Несколько сеток lightGallery на одной странице. Будь то плагины контента или модули изображений: теперь вы можете отображать несколько галерей или категорий на одной странице без каких-либо ограничений.

Множество мелких исправлений ошибок и оптимизаций.

Сайт проекта

GitHub расширения

Скачать

Вышел релиз Joomla 5.3.2

Релиз исправлений ошибок Joomla 5.3.2

Проект Joomla рад сообщить о выпуске Joomla 5.3.2. Это релиз исправлений ошибок для серии Joomla 5.3.

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

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Одномоментно поле "sm" существует только одно, там же условие вывода на php.
Выяснил, что это из-за свойства поля readonly, поменял на label, после чего закрытие системных сообщений восстановило работоспособность (взаимосвязь непонятно вообще).
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Выяснил, что это из-за свойства поля readonly, поменял на label, после чего закрытие системных сообщений восстановило работоспособность (взаимосвязь непонятно вообще).
http://stackoverflow.com/questions/6241943/how-can-i-make-an-input-field-read-only-but-still-have-it-send-data-back-to-a-fo
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
$params = JComponentHelper::getParams('com_mfo'); - так я получаю параметры компонента в модуле, а как реализовать обратную задачу, получение параметров модуля в компоненте?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Код: php
jimport('joomla.application.module.helper');
$module = JModuleHelper::getModule('module_name','module_title');
$params = new JRegistry;
$params->loadString($module->params);
echo $params->get('your_param');
интернет-блог: http://websiteprog.ru
*

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');

И вот тут вопрос (1): когда из модели вызывается метод public function getMethod(), в представлении $redult->get('Method');, то как метод в модели, выполняющий основной код самостоятельно, может получить параметры не из реквеста, а из состояния, если контроллер в этот момент не используется, а представление по идее должно работать только с данными из модели? или же все-таки непосредственно в представлении устанавливать эту модель?

И как при этом быть (2), если метод в модели не выполняет основной код, а возвращает результат выполнения метода из хелпера: return Helper::Method();? Хелпер берет параметры напрямую из реквеста или эти данные ему каким-либо образом должна передавать модель?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
1. То есть как быть, если вызывается такой метод модели, который использует состояние, а это состояние не установлено, так как не используется контроллер? Приведите практический пример такой ситуации. По идее она не должна возникать без контроллера.

2. Хелпер по идее живет сам по себе.
*

zomby6888

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

А для хелпера да.. вобще нет никаких правил) это твой помощник, когда у тебя много кода где то в одном месте происходит, ты просто задумываешся: блин,  а надо бы какой-то рефакторинг замутить а то ппц какойто, это в хелпер, это в модель, это еще куда-то..Чаще всего в хелперы запихиваются какие то статические методы которые HTML генерируют, но вобще туда можно все что тебе нравится запихнуть.
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
По идее, хорошо поразмыслив, пришел к выводу, что через состояние модели можно при первичном обращении к модели через контроллер передать этой модели все, что угодно, и потом смело использовать внутри любого public function getMethod(), в т.ч. передавая эти данные в качестве параметров метода в хелпер, изолируя также и его:
Код: php
public function getMethod()
{
  $getd = $this->getState('getd');
  redult Helper::Method($getd);
}
Удобно однако, особенно когда имеет место быть несколько схожих вьюх, реализующих вывод результата выполнения одного и того же набора функций ))
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Состояние это вроде как объект который принадлежит модели, таким же макаром можно установить свойство для модели или передать данные в метод
Свойства модели не должны содержать в себе переменные окружения, потому что они логически не вписываются в класс. Для этого и существует объект состояния как одно единое свойство модели, который содержит в себе всякие временные переменные окружения.

Хороший пример - фильтры. Ну вот каким макаром они связаны с моделью как с классом / объектом? Никаким. С другой стороны, они нужны для условий выборки данных. Вот тут и приходит на помощь состояние, которое может изменять модель в зависимости от внешних условий (фильтров).

Блин, надеюсь, уловили мою мысль ;D

По поводу хелперов - тут надо осторожно. По сути zomby6888 прав - обычно их используют как помощников представлений. А вот когда модель использует хелпер для возврата результатов - нужно задуматься об архитектуре приложения. Что-то тут не так.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А во view как правильно данные передавать? Из модели то понятно а если надо из контроллера (модель допустим вобще не используется), я обычно просто свойство устанавливаю в классе вьюхи, насколько это правильно?
интернет-блог: http://websiteprog.ru
*

aspidy

  • Завсегдатай
  • 1008
  • 55 / 1
  • Миграция joomla 1.0-1.5-2.5
Хелпер это по сути продолжение индексного файла, чтобы не загромождать индекс создается хелпер. По сему в него можно включать все, что вам необходимо.
Мелкий ремонт. skype poisk-plus
*

b2z

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

Хелпер это по сути продолжение индексного файла, чтобы не загромождать индекс создается хелпер. По сему в него можно включать все, что вам необходимо.
Какого индексного файла? В Joomla на уровне компонента такого нет. Поясните.

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

aspidy

  • Завсегдатай
  • 1008
  • 55 / 1
  • Миграция joomla 1.0-1.5-2.5
Цитировать
Какого индексного файла? В Joomla на уровне компонента такого нет. Поясните.
На уровне компонента индексный файл идет под названием компонента. Например работа компонента com_content запускается с файла content.php
Мелкий ремонт. skype poisk-plus
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
На уровне компонента индексный файл идет под названием компонента. Например работа компонента com_content запускается с файла content.php
Точка входа, так бы и писали  ^-^ Только не понимаю, причем тут она? Хелперы к ней вообще не имеют отношения. Точка входа - это диспатчер.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Блин, надеюсь, уловили мою мысль ;D

По поводу хелперов - тут надо осторожно. По сути zomby6888 прав - обычно их используют как помощников представлений. А вот когда модель использует хелпер для возврата результатов - нужно задуматься об архитектуре приложения. Что-то тут не так.
Мысль уловил, спасибо. Но как тогда быть в следующей ситуации (реализация обсуждалась неоднократно выше):
вьюха выводит список операций по договору, getListQuery() в модели через состояние модели получает номер договора для формирования запроса, по сути номер договора является параметром: контроллер получает номер договора из реквеста и отсылает его в состояние модели (возможно, неправильно выразился, но ВЫ, надеюсь, меня поняли):
Код: php
class MfoControllerDocumc extends JControllerLegacy
{
  public function work()
  {
    $uri = JFactory::getURI();
    JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

    $ulogin = JFactory::getUser()->username;
    $loan = $this->input->getString('loan', '');
    $dtmin = JFactory::getDate($this->input->getString('dtfrom', ''))->format('Y-m-d');
    $dtmax = JFactory::getDate($this->input->getString('dtto', ''))->format('Y-m-d');
   
    $model = $this->getModel('raspisanie');
    $model->setState('login', $ulogin);
    $model->setState('loan', $loan);
    $model->setState('dtmin', $dtmin);
    $model->setState('dtmax', $dtmax);
   
    $view = $this->getView('Documc', 'html');
    $view->setModel($model, true);

    $this->setRedirect(JRoute::_($uri));
  }
}
В модели:
Код: php
  protected function getListQuery()
  {
    $ulogin = $this->getState('login');
    $loan = $this->getState('loan');
    $dtmin = $this->getState('dtmin');
    $dtmax = $this->getState('dtmax');

    $db = JFactory::getDBO();
    $query = $db->getQuery(true);
    $query->select('odate, docname, adebet, acredit, pdebet, pcredit, sdebet, scredit')
          ->from('#__mfo_docums')
          ->where('(client = '.$db->quote($ulogin).')')
          ->where('(loan = '.$db->quote($loan).')');
//    if ($input->getString('dtfrom', '')!== '' && $input->getString('dtfrom', '')!== '')
      $query->where('(odate between '.$db->quote($dtmin).' and '.$db->quote($dtmax).')');
    $query->order('odate, id');
    return $query;
  }
В этой же вьюхе необходимо вывести информацию по договору, чья история операция выводится:
Во вьюхе: $item_loan = $this->get('LoanData'); - далее выводим в HTML содержание $item_loan.
В модели:
Код: php
  public function getLoanData()
  {
    $ulogin = $this->getState('login');
    $loan = $this->getState('loan');
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);     
    $query->select('bdate, edate, term, prc, sm, rest, arest, prest, srest')
          ->from('#__mfo_loans')
          ->where('client = '.$db->quote($ulogin))
          ->where('num = '.$db->quote($loan));
    return $db->setQuery($query)->loadObject();
  }

Но поскольку типов договоров несколько, для каждого типа договора своя история и своя вьюха, а функция получения информации по договору для всех вьюх одна, произвожу рефакторинг:
В каждой модели, где получаются данные по операциям:
Код: php
  public function getLoanData()
  {
    $ulogin = $this->getState('login');
    $loan = $this->getState('loan');
    return MfoHelper::DocumsLoanData($ulogin, $loan);
  }
В хелпере:
Код: php
  public static function DocumsLoanData($ulogin, $loan)
  {
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);     
    $query->select('bdate, edate, term, prc, sm, rest, arest, prest, srest')
          ->from('#__mfo_loans')
          ->where('client = '.$db->quote($ulogin))
          ->where('num = '.$db->quote($loan));
    return $db->setQuery($query)->loadObject();
  }

Насколько это правильно? Иди же необходимо непосредственно из вьюхи вызывать метод в хелпере, который сам дернет параметры из реквеста?
(код не проверен, прямо сюда писал)
*

zomby6888

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Это как раз был вопрос рефакторинга
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Давайте все постепенно. Я пока не до конца понял всю ситуацию. Буду задавать наводящие вопросы, чтобы картинка сформировалась у меня в голове  ^-^

У вас используется одно и тоже представление для вывода списка операций по договору?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Нет, представлений несколько. На каждый вид договора - свое представление.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Нет, представлений несколько. На каждый вид договора - свое представление.
Для каждого типа/вида договора своя модель?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Точнее так: список договоров - один, одна модель/вьюха/контроллер.

В зависимости от типа договора открывается вьюха с историей операций по договору, для каждого типа - своя модель/вьюха.
« Последнее редактирование: 04.07.2014, 15:31:41 от AlekVolsk »
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Тогда это полиморфизм - реализуется через наследование. Одна родительская модель с общими функциями и для каждого типа своя дочерняя модель.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
ага, я тоже об этом подумал) правда если метод всего один общий то особого смысла в наследовании нету..
интернет-блог: http://websiteprog.ru
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
ага, я тоже об этом подумал) правда если метод всего один общий то особого смысла в наследовании нету..
Хмм, ну не знаю. По мне так хелпер здесь вообще не вариант.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Пример примерно понял (каламбур :) ), хотя адаптировать по J пока не возьмусь - сперва долижу согласно того, что уже усвоил, благо уже работает и почти готово, но я к этому обязательно вернусь. Замучил я вас всех наверное ? =)
Остались мелочи - онлайн-оплата по договору из вьюхи с историей операций... )))
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Да нет, не замучили. Дискуссии интересные и полезны всем, кто хочет научиться разработке для Joomla и не только.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Это общение, полезно конечно, каждый для себя что то новое узнает, но тему зафлудили нормально так)
интернет-блог: http://websiteprog.ru
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
тему зафлудили нормально так)
Я бы не считал это флудом. 3 мес. назад, на момент создания топика все, что я знал о программировании в веб - это база html/css и немного верстка шаблонов. Я готов перечитывать весь топик по нескольку раз, благо это позволяет мне лучше понимать свои ошибки. Я бы назвал это своеобразным мини-учебником по разработке компонента на j3.
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
тогда ее неплохо бы перименовать)
интернет-блог: http://websiteprog.ru
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться