Новости Joomla

SW JProjects v.2.6.1 - компонент каталога расширений для веб-приложений

👩‍💻 SW JProjects v.2.6.1 - компонент каталога расширений для веб-приложений.

Компонент позволяет сделать свой мини-Joomla Extensions Directory - каталог расширений для CMS (не только для Joomla) или файлов. Есть возможность скачивания по лицензионным ключам создания кастомных схем данных для сервера обновлений.

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

  • Правки наследования схем серверов обновлений. Улучшена логика наследования схем серверов обновлений для проектов компонент - категория - проект.
  • Не стабильные релизы в сервере обновлений. Теперь в данные сервера обновлений попадают все версии (alpha, beta и т.д.), а не только stable.
  • Косметические изменения. В шаблоне по умолчанию сделаны замены некоторых CSS-классов, уточнено присвоение атрибутов loading=lazy и fetchpriority.
  • Рефакторинг и правки кода. Текущее обновление кодовой базы.
  • Исправление ошибок.

Больше спасибо за помощь в тестировании участникам нашего сообщества Александру Новикову (@pro_portal) и Александру Судьбинову (@alexrevo).

Событие Pizza, Bugs & Fun - 29-30 января 2026 года.

Событие Pizza, Bugs & Fun  - 29-30  января 2026 года.

Уже несколько лет в мире Joomla проводятся мероприятия "Pizza, Bugs & Fun" (#PBF), где каждый может посвятить несколько часов своего мозгового времени тому, чтобы наша любимая CMS стала ближе к идеалу.

Ссылки на видео и статьи из этого поста рассказывает об организационных вопросах, которые пригодятся для участия в PBF, а так же что и как делать.

В рамках события PBF все желающие могут собираться в общий онлайн чат, обсудить вопросы Joomla и приложить к их разрешению свою руку. Самый классный вариант, когда эта встреча происходит оффлайн: тогда организовывается пицца, напитки по вкусу и несколько часов совместного творчества.

Каждый помогает тем, что он умеет:

  • кто-то пишет недостающую документацию,
  • кто-то пишет код,
  • кто-то тестирует как исправлены ошибки или сделан новый функционал.

На сайте события есть карта, можно "захостить" свою локацию. Практически все движки в мире развиваются за счёт спонсирующих их компаний. Joomla одна из немногих, где развитие идёт только усилиями международного сообщества энтузиастов.

https://www.youtube.com/watch?v=a-FuVKXg_Uw 

На момент написания данного поста в репозитории Joomla 810 открытых Issue (как правило это баги) и 236 Pull request (PR, исправление багов и новый функционал). Все PR обязательно тестируются минимум двумя участниками сообщества, дабы в конечный код движка не проскочила ошибка.

Если каждый из участников только нашего сообщества сделает даже одно тестирование, то, боюсь, PR и Issue на всех не хватит 😀 И ничего не останется нашим коллегам из международных Joomla-чатов.

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

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Ну Вы должны передать скрытое поле, типа mfoload.save , которое вызовет контролле mfoload и в нем метод save. Здесь про это. А дальше в контроллере получаете вашу форму и отправляете её в модель на обработку.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А какой класс контроллера в моем случае нужно указывать? JControllerLegacy, JControllerForm? И из статьи я так и не понял, как контроллер передает что-либо в модель

Также непонятно, как из js form.submit() передать mfoload.save
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
JControllerLegacy достаточно. Контроллер передает очень просто:

Код: php
$model = $this->getModel('ModelName');
$model->someMethod($data);
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Выше рекомендованный пример из руководства по созданию компонента демонстрирует вызов контроллера посредством кнопки на тулбаре, а как вызвать контроллер из кнопки на форме, точнее из js-функции, связанной с кнопкой?
Правильно ли я понял, что при вызове из js form.submit('load.importxml'); будет вызван MfoInfoControllerLoad, а в нем функция importxml ?
И как будет передано имя xml-файла?

В com_install имеется:
Код
<input type="hidden" name="task" value="install.install" />
<?php echo JHtml::_('form.token'); ?>
Это и есть вызов InstallerControllerInstall, public function install()?

PS: я тут туплю не по-детски, уже достал всех наверное, извините, если что...
« Последнее редактирование: 28.03.2014, 11:13:54 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
И как будет передано имя xml-файла?
XML файл отлавливать нужно в $_FILES либо в
Код: php
$input = JFactory::getApplication()->input;
$files = $input->files->get( 'jform', array(), 'array' );


В com_install имеется:
Код
<input type="hidden" name="task" value="install.install" />
<?php echo JHtml::_('form.token'); ?>
Это и есть вызов InstallerControllerInstall, public function install()?
Да
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Istaan, спасибо.

JError::raiseWarning('', JText::_('msg')); - вывод сообщения об ошибки, а как вывести сообщение информационного характера?

И как после выполнения функции из модели автоматом вернуться в форму? я не понял, как это делается в com_install
« Последнее редактирование: 28.03.2014, 19:18:27 от AlekVolsk »
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Возврат (редирект) и вывод сообщения делается в контроллере:

Код: php
if ($model->importxml($file))
{
$this->setMessage(JText::_('ALL_OK'));
}
else
{
$this->setMessage(JText::_('NOT_OK'), 'error');
}

$this->setRedirect(JRoute::_('url'));

Соответственно модель должна возвращать true, если все ок или false, если все плохо.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Спасибо!

А как получить текущую дату? $date = JFactory::getDate(); ?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Вот что примерно у меня получилось, не проверял - боюсь базу запороть.
xml-файл:
Спойлер
[свернуть]

функция импорта из XML в базу:
Спойлер
[свернуть]

Знаю, что явно пахнет sql-инъекцией, и не уверен с датой, прошу поправить, что где не так.


+
ппц, попытка редактирования поста приводит к кракозябрам русских символов в коде
« Последнее редактирование: 28.03.2014, 21:08:04 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Как можно из модели после выполнения передать в контроллер свое сообщение и его тип:
$this->setMessage(JText::_($msg), $msgtype);
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Не загружает мой код данные в базу.

Fatal error: Call to undefined method JFactory::getXMLParser() in \com_mfo_info\models\load.php
« Последнее редактирование: 28.03.2014, 21:39:40 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Спасибо!

А как получить текущую дату? $date = JFactory::getDate(); ?

$date = JFactory::getDate();
echo $date->toSql(); - в текущая дата в в формате для записи в базу
echo $date->format( 'Y-m-d' ); - выведет 2014-03-28

Как можно из модели после выполнения передать в контроллер свое сообщение и его тип:
$this->setMessage(JText::_($msg), $msgtype);
Скопируйте из libraries/legacy/controller/form.php в свой контроллер метод save! И в нем можете менять все что вам угодно и переписать сообщение об успешной отправке, или не успешной отправки, или получения сообщений из модели и т.д.!
в Joomla 3.2 строка которая выводит инфо о успешном завершении выглядит так:
Код: php
$this->setMessage(
JText::_(
($lang->hasKey($this->text_prefix . ($recordId == 0 && $app->isSite()? '_SUBMIT' : ''). '_SAVE_SUCCESS')
? $this->text_prefix
: 'JLIB_APPLICATION'). ($recordId == 0 && $app->isSite()? '_SUBMIT' : ''). '_SAVE_SUCCESS'
)
);


Не загружает мой код данные в базу.

Fatal error: Call to undefined method JFactory::getXMLParser() in \com_mfo_info\models\load.php
Лучше юзайте http://www.php.net/manual/en/book.simplexml.php меньше будет геммороя!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
$xml = JFactory::getXML($xmlfile, true); делает загрузку посредством simplexml_load_file(), а дальше все по тому же руководству, только на русском, ошибка: 0 String could not be parsed as XML
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Шаблон модуля не получает параметры из хелпера и основного файла модуля.

Основной файл модуля mod_mfo_info.php:
Код: php
<?php
defined('_JEXEC') or die;

require_once __DIR__ . '/helper.php';
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
require JModuleHelper::getLayoutPath('mod_mfo_info', $params->get('layout', 'default'));

$item_id = $params->get('item_id');
$info = ModMfoInfoHelper::getInfo($item_id);

require_once JPATH_SITE.'/components/com_content/helpers/route.php';
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');

Файл хелпера helper.php:
Код: php
<?php
defined('_JEXEC') or die;

require_once JPATH_SITE.'/components/com_content/helpers/route.php';

class ModMfoInfoHelper
{
  public static function getInfo(&$item_id)
  {
    $db = JFactory::getDbo();
    $item = $db->setQuery('SELECT fullname, shortname, ogrn, inn, adr, phones, email FROM #__mfo_info WHERE id = '.(int)$item_id)->loadAssoc();
    return $item;
  }
}

Файл шаблона /tmpl/default.php:
Код: php
<?php
defined('_JEXEC') or die;
?>
<div class="mfo-info <?php echo $moduleclass_sfx; ?>">
  <?php
  //$item_id = $params->get('item_id');
  //$db = JFactory::getDbo();
  //$info = $db->setQuery('SELECT fullname, shortname, ogrn, inn, adr, phones, email FROM #__mfo_info WHERE id = '.(int)$item_id)->loadAssoc();
  if (!empty($info)) :
  ?>
    <div class="mfo-info-fullname"><span><?php echo JText::_('MOD_MFO_INFO_FULLNAME_LABEL'); ?></span><?php echo $info['fullname']; ?></div>
    <div class="mfo-info-shortname"><span><?php echo JText::_('MOD_MFO_INFO_SHORTNAME_LABEL'); ?></span><?php echo $info['shortname']; ?></div>
    <div class="mfo-info-ogrn"><span><?php echo JText::_('MOD_MFO_INFO_OGRN_LABEL'); ?></span><?php echo $info['ogrn']; ?></div>
    <div class="mfo-info-inn"><span><?php echo JText::_('MOD_MFO_INFO_INN_LABEL'); ?></span><?php echo $info['inn']; ?></div>
    <div class="mfo-info-adr"><span><?php echo JText::_('MOD_MFO_INFO_ADR_LABEL'); ?></span><?php echo $info['adr']; ?></div>
    <div class="mfo-info-phones"><span><?php echo JText::_('MOD_MFO_INFO_PHONES_LABEL'); ?></span><?php echo $info['phones']; ?></div>
    <div class="mfo-info-email"><span><?php echo JText::_('MOD_MFO_INFO_EMAIL_LABEL'); ?></span><?php echo $info['email']; ?></div>
  <?php
    endif;
    $showLastSeparator = $params->get('showLastSeparator');
    if ($showLastSeparator) echo '<hr />';
  ?>
</div>

Если в шаблоне раскоментировать 3 строчки, то все работает, иначе empty($info), empty($item_id)
Где я ошибся?
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
А что вы хотите:

require_once __DIR__ . '/helper.php';
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
require JModuleHelper::getLayoutPath('mod_mfo_info', $params->get('layout', 'default')); - вот тут вы уже  вывели шаблон!

А дальше вы получаете какие то данные из хелпера  и кто по вашему их должен получить?)
 
$item_id = $params->get('item_id');
$info = ModMfoInfoHelper::getInfo($item_id);
 
require_once JPATH_SITE.'/components/com_content/helpers/route.php';
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Istaan, спасибо, +. С выводом разобрался.

А вот с загрузкой данных по прежнему проблема: вопрос с парсингом XML остается открытым, String could not be parsed as XML
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Ну для начала нужно видеть ваш XML файл..
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Код: xml
<?xml version="1.0" encoding="utf-8"?>
<mfoinfo>
  <items>
    <item>
      <param type="fullname">"Микрофинансовая организация", общество с ограниченной ответственностью</param>
      <param type="shortname">ООО "МФО"</param>
      <param type="orgn">123456789012345</param>
      <param type="inn">123456789012</param>
      <param type="adr">Где-то на просторах нашей великой Родины</param>
      <param type="phones">(123)4567890</param>
      <param type="email">mail@mfo.info</param>
    </item>
    <item>
      <param type="fullname">"Микрофинансовая организация", открытое акционерное общество</param>
      <param type="shortname">ОАО "МФО"</param>
      <param type="orgn">543210987654321</param>
      <param type="inn">210987654321</param>
      <param type="adr">Где-то на задворках нашей великой Родины</param>
      <param type="phones">(098)7654321</param>
      <param type="email">info@mfo.mail</param>
    </item>
  </items>
</mfoinfo>
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Вот так пытаюсь читать и писать в базу:
Код: php
    $xml = JFactory::getXML($xmlfile, true);
    $mfoinfo = new SimpleXMLElement($xml);
    $db = JFactory::getDbo();
    foreach ($mfoinfo->items->item as $org)
    {
      foreach ($org->param as $param)
      {
        switch((string) $param['type'])
        {
          case 'fullname':
            $org_fullname = $param;
            break;
          case 'shortname':
            $org_shortname = $param;
            break;
          case 'orgn':
            $org_orgn = $param;
            break;
          case 'inn':
            $org_inn = $param;
            break;
          case 'adr':
            $org_adr = $param;
            break;
          case 'phones':
            $org_phones = $param;
            break;
          case 'email':
            $org_email = $param;
            break;
        }
        //echo $org_fullname;
      }
     
      $date = JFactory::getDate()->toSql();
      $query = $db->getQuery(true);
      $query->insert('#__mfo_info')
            ->columns('fullname, shortname, ogrn, inn, adr, phones, email, updated')
            ->values($db->q($org_fullname),
                     $db->q($org_shortname),
                     $db->q($org_ogrn),
                     $db->q($org_inn),
                     $db->q($org_adr),
                     $db->q($org_phones),
                     $db->q($org_email),
                     $date);
      $db->setQuery($query);
      $db->query();
    }
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
а файл не с ошибками проверяли?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Я прочитал из XML и загрузил в базу:
Код: php
    $mfoinfo = simplexml_load_file($xmlfile);
    $db = JFactory::getDbo();
    foreach ($mfoinfo->items->item as $org)
    {
      foreach ($org->param as $param)
      {
        switch((string) $param['type'])
        {
          case 'fullname':
            $org_fullname = $param;
            break;
          case 'shortname':
            $org_shortname = $param;
            break;
          case 'orgn':
            $org_orgn = $param;
            break;
          case 'inn':
            $org_inn = $param;
            break;
          case 'adr':
            $org_adr = $param;
            break;
          case 'phones':
            $org_phones = $param;
            break;
          case 'email':
            $org_email = $param;
            break;
        }
      }
      $date = JFactory::getDate()->toSql();
      
      $values = '\''.$org_fullname.'\', \''.$org_shortname.'\', \''.$org_orgn.'\', \''.$org_inn.'\', \''.$org_adr.'\', \''.$org_phones.'\', \''.$org_email.'\', \''.$date.'\'';

      $query = $db->getQuery(true);
      $query->insert('#__mfo_info')
            ->columns('fullname, shortname, ogrn, inn, adr, phones, email, updated')
            ->values($values);
      $db->setQuery($query);
      $db->query();

    }

Чтобы понять, как это работает, мне пришлось изучить практически все штатные компоненты J, перечитать более десятка обучающих ресурсов, рекомендованных здесь (не только в этом топике).

Я бесконечно благодарен b2z и Istaan, как за помощь здесь, так и в их блогах (joomlablog.ru и ссылка вырезана, так как домен распространяет вирусы).
*

Aleks.Denezh

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
а файл не с ошибками проверяли?
XML? нет, сам ручками набирал. в дальнейшем именно так он будет формироваться в 1С. Здесь понятно, что в самой 1С можно что угодно написать, а потом еще и XML ручками поправить, и от sql-инъекций код не защищен, но прямо сейчас это второстепенная задача. Хотя, если Вы мне подскажите, как защититься, буду благодарен не менее.

Значит получилось считать файл и загрузить данные в базу?
Да, последний приведенный код
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
XML? нет, сам ручками набирал. в дальнейшем именно так он будет формироваться в 1С. Здесь понятно, что в самой 1С можно что угодно написать, а потом еще и XML ручками поправить, и от sql-инъекций код не защищен, но прямо сейчас это второстепенная задача. Хотя, если Вы мне подскажите, как защититься, буду благодарен не менее.
Да, последний приведенный код
Если будет из 1с то проблем не должно быть и защищаться не надо по идее..
если код работает то все ок! Рад был помочь )
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Цитировать
Чтобы понять, как это работает, мне пришлось изучить практически все штатные компоненты J, перечитать более десятка обучающих ресурсов, рекомендованных здесь (не только в этом топике).
А без этого никак, потому что ни один обучающий ресурс не даст ответы на все вопросы. Рад, что справились.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Специально для новичков, в прилагаемом к сообщению архиве:
1. образец компонента, импортирующий данные из XML в базу сайта;
2. образец модуля, выводящего ранее импортированные данные во фронт;
3. образец используемого XML.

Все рабочее, ставится на J3.2.x (на более ранние версии не установится).
Код не комментирован (мне сейчас некогда этим заниматься).
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Как в шаблоне представления компонента получить значение параметра, объявленного в config.xml?
Для чего нужно: параметр булевого типа, от его значения зависит, какой контрол вывести на форме, тот или этот ( :) )
« Последнее редактирование: 02.04.2014, 15:50:57 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А за одно и в модели
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
В компоненте не используется хелпер, это будет работать без хелпера? Куда тогда код вставить? Или лучше создать хелпер, даже если пустой?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться