Новости Joomla

Вышел плагин AllVideos v.7.0 от JoomlaWorks

Вышел плагин AllVideos v.7.0 от JoomlaWorks

Вышел плагин AllVideos v.7.0 от JoomlaWorks.Этот контент-плагин - одно из старейших расширений для Joomla. Его задача - преобразовывать шорт-коды вида

{YOUTUBE}...{/YOUTUBE},
{MP3}parth/to/file.mp3{/MP3} и подобные во встроенные видео или аудио.👩‍💻 v.7.0.0. Что нового?- Добавлена поддержка Youtube Shorts. Просто скопируйте полный url видео и вставьте его внутри тегов
{YOUTUBE}...{/YOUTUBE}.- Поддержка Joomla 5.x без плагина обратной совместимости. PHP 5, PHP 7, PHP 8. - Индексация умным поиском в CLI. В Joomla 5 плагин перестал вызывать ошибку при индексации контента умным поиском через CLI,Заметьте, что этот один и тот же пакет для всех версий Joomla, начиная с 1.5.x и заканчивая 5.x. Технически "под капотом" код плагина по сути не менялся, а для поддержки следующих версий Joomla авторы вставляют "заплатки". Плагин всё ещё использует старую архитектуру файлов и классов Joomla, что, к сожалению, заставляет прибавлять к его описанию слова "пока ещё" - "пока ещё работает".
Страница расширенияGitHub расширенияJoomla Extensions Directory👩‍💻 За ссылку спасибо самому внимательному участнику нашего сообщества - Ринату Кажетову (@rkazhet).@joomlafeed#joomla #расширения

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

b2z

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

AlekVolsk

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

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

b2z

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

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

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

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

AlekVolsk

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