Новости Joomla

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

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

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

Веб-ассет Fancybox.js для Joomla v.6.0.9

Веб-ассет Fancybox.js для Joomla v.6.0.9.В Joomla 4 и Joomla 5 появилась концепция Web Assets и WebAssetManager, с помощью которого можно управлять подключениями css, js файлов, подключением. Все css и js файлы включаются в общий реестр ассетов, затем выстраивается граф зависимостей и в итоге на генерируемую страницу подключается только то что нужно на данной странице. Поскольку веб-ассеты можно добавлять с помощью плагинов (ссылка на статью ниже) - можно сказать, что появилось новое направление для плагинов - веб-ассеты. Вы можете устанавливать плагины, включающие веб-ассеты и использовать их как зависимости в самых разных местах Joomla: в шаблоне, в макетах модулей и плагинов. Одним из таких плагинов веб-ассетов является WT Fancybox.js. Плагин добавляет в Joomla WebAssets Registry css и js популярного скрипта галереи изображений fancybox.js, который потом легко можно использовать в коде:
use Joomla\CMS\Factory;$wa = Factory::getApplication()->getDocument()->getWebAssetManager();$wa->usePreset('wtfancybox'); // Local file $wa->usePreset('wtfancybox-remote'); // Use from CDN
Плагин использует систему обновлений Joomla, поэтому с появлением новых версий вы сможете получать их на своих сайтах естественным для Joomla путём. 👩‍💻 Спасибо за работу по упаковке ассета в плагин участнику нашего сообщества Сергею Сергевнину (
@gresserg).- Скачать WT Fancybox.js для Joomla- Статья на JPath.ru Как правильно подключать JavaScript и CSS в Joomla 4- Статья на Хабре: Использование WebAssetsManager Joomla 4 (Joomla 5) и добавление собственных пресетов с помощью плагина#joomla #расширения #webdev

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

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

  • Живу я здесь
  • 3404
  • 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

  • Живу я здесь
  • 3404
  • 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

  • Живу я здесь
  • 3404
  • 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

  • Живу я здесь
  • 3404
  • 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

  • Живу я здесь
  • 3404
  • 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

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

AlekVolsk

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

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

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 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
В компоненте не используется хелпер, это будет работать без хелпера? Куда тогда код вставить? Или лучше создать хелпер, даже если пустой?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться