Новости 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 Гость просматривают эту тему.
  • 504 Ответов
  • 39393 Просмотров
*

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