Новости 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 Ответов
  • 30893 Просмотров
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Могут а почему нет? Я вот например, когда у меня много AJAX запросов создаю отдельный контроллер под аяксы который мне отдает json данные.
интернет-блог: http://websiteprog.ru
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
Могут а почему нет? Я вот например, когда у меня много AJAX запросов создаю отдельный контроллер под аяксы который мне отдает json данные.
А я отдельную модель под AJAX создаю))
*

zomby6888

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

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
А как ты к ней обращаешся все равно же наверное через контроллер?
Конечно через контроллер) Но запросы же должны быть в модели, а не в контроллере )
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
А я отдельную модель под AJAX создаю))
Зачем отдельную? Я в той же модели делаю метод под AJAX.
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
Зачем отдельную? Я в той же модели делаю метод под AJAX.
Что бы не путаться ) Да и бывает что в конструкторе модели базово инициализируются данные которые потом юзаются по всей модели, и бывают там же и запросы, так вот что бы лишние запросы не тянуть, да и что бы как то отделить все, и знать что раз AJAX то лезть туда )
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
О скока сразу мнений. Вот только я с аяксом ни разу даже не сталкивался.
Модуль выводит список записей, для каждой записи кнопка вызова формы и передача форме параметров из записи. Форма post, в форме action="index.php" (модуль предполагается на главной), и поля
Код: html4strict
      <input type="hidden" name="option" value="com_mfo" />
      <input type="hidden" name="task" value="smail.work" />
т.е., если я понял правильно, будет стандартным механизмом вызван контроллер smail компонента com_mfo.
Т.к. модель smail не возвращает данные, а просто отсылает почтовое сообщение с данными из формы в модуле, может, вообще обойтись без модели и все сделать в контроллере? Как правильно? AJAX - это хорошо, но но пока слабо без конкретного примера.

Возможно, можно вообще обойтись без компонента и все обрабатывать в модуле, но я не знаю, как в модуле отловить сабмит формы и вызвать функцию в хелпере.
[spoiler title=Плагин]
Код: php
<?php defined('_JEXEC') or die;

require_once __DIR__ . '/helper.php';
$moduleclass_sfx = htmlspecialchars($params->get('moduleclass_sfx'));
$items = ModMfoCreditOffersHelper::getItems((bool)JFactory::getUser()->guest);
require JModuleHelper::getLayoutPath('mod_mfo_creditoffers', $params->get('layout', 'default'));
require_once JPATH_SITE.'/components/com_content/helpers/route.php';
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_content/models', 'ContentModel');
[/spoiler]

[spoiler title=Хелпер модуля]
Код: php
<?php defined('_JEXEC') or die;

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

class ModMfoCreditOffersHelper
{
  public static function getItems($is_guest)
  {
    $status = (bool)$is_guest ? '3' : '2';
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select('id, offername, status, sm_from, sm_to, prc_from, prc_to, term_from, term_to')
          ->from('#__mfo_credit_offers')
          ->where('status != '.$status);
    try
    {
      $items = $db->setQuery($query)->loadObjectList('id');
      $query = $db->getQuery(true)->select('co_id, `condition`')->from('#__mfo_credit_offers_conditions');
      $conditions = $db->setQuery($query)->loadObjectList();
      foreach ($conditions as $condition) {
        if (isset($items[$condition->co_id]))
          $items[$condition->co_id]->conditions[] = $condition;
      }
      return $items;
    }
    catch (RuntimeException $e)
    {
      $this->setError($e->getMessage());
      return false;
    }
  }
}
[/spoiler]

[spoiler title=Вьюха модуля]
Код: php
<?php defined('_JEXEC') or die;
if (!empty($items) && count($items)) {

  JHtml::_('jquery.framework');

  $document = JFactory::getDocument();
  $document->addStyleSheet('/media/com_mfo/css/jquery-ui.min.css');
  $document->addStyleSheet('/media/mod_mfo_co/css/mod_mfo_co.css');
 
  $document->addScript('/media/com_mfo/js/jquery-ui.min.js');
  $document->addScript('/media/mod_mfo_co/js/jquery.maskedinput.js');
  $document->addScript('/media/mod_mfo_co/js/accounting.min.js');
  $document->addScript('/media/mod_mfo_co/js/mod_mfo_co.js');

  $params = JComponentHelper::getParams('com_mfo');
  $dcs = $params->get('mfo_decimal_separator', '.');
  $ths = $params->get('mfo_thousands_separator', ' ');
  if ($ths == '=') $ths = '';
  $document->addScriptDeclaration('var dcs = "'.$dcs.'";');
  $document->addScriptDeclaration('var ths = "'.$ths.'";');

  echo '<div class="mfo-co">';
  foreach ($items as $i => $item) {
    $id = $item->id;
    echo '<div class="mfo-co-item">';
    if (isset($item->conditions) && count($item->conditions)) $list = $item->conditions;
    echo '<h4>'.$item->offername.'</h4>';
    if (isset($list) && count($list)) {
      echo '<div class="conditions">';
      $list_cnt = count($list);
      $list_ii = 1;
      foreach ($list as $listitem) {
        if ($list_ii == $list_cnt)
          {echo $listitem->condition;} else
          {echo $listitem->condition.'<br />';}
        $list_ii++;
      }
      echo '</div>';
    }
    echo '<div>'.JText::sprintf('MOD_MFO_CO_SM', number_format($item->sm_from,0,$dcs,$ths), number_format($item->sm_to,0,$dcs,$ths)).'</div>';
    echo '<div>'.JText::sprintf('MOD_MFO_CO_PRC', number_format($item->prc_from,1,$dcs,$ths), number_format($item->prc_to,1,$dcs,$ths)).'</div>';
    echo '<div>'.JText::sprintf('MOD_MFO_CO_TERM', number_format($item->term_from,0), number_format($item->term_to,0)).'</div>';
    echo '<input type="hidden" name="smf'.$id.'" value="'.(int)$item->sm_from.'">';
    echo '<input type="hidden" name="smf'.$id.'" value="'.(int)$item->sm_from.'">';
    echo '<input type="hidden" name="smt'.$id.'" value="'.(int)$item->sm_to.'">';
    echo '<input type="hidden" name="prct'.$id.'" value="'.(int)$item->prc_to.'">';
    echo '<input type="hidden" name="termf'.$id.'" value="'.(int)$item->term_from.'">';
    echo '<input type="hidden" name="termt'.$id.'" value="'.(int)$item->term_to.'">';
    echo '<div><a class="btn btn-primary" href="javascript:ShowForm('.$id.')">'.JText::_('MOD_MFO_CO_DEMAND').'</a></div>';
    echo '</div>';
  }
  echo '</div>';
 
}?>

<form action="<?php echo JRoute::_('index.php'); ?>" method="post" id="co-form" class="form-inline">
  <a href="javascript:HideForm(false)" class="overlay" id="co_form"></a>
  <div class="popup">
    <a class="close" href="javascript:HideForm(false)"></a>
    <div class="mfo_co_controls">
      <div class="pretext">
        <h2><?php echo JText::_('MOD_MFO_CO_FORM_CAPTION'); ?></h2>
        <label><?php echo JText::sprintf('MOD_MFO_CO_FORM_PRETEXT', $item->offername); ?></label>
      </div>
      <div class="controls">
        <?php if ((int)$item->sm_from == (int)$item->sm_to) {?>
          <label for="amount-sm"><span><?php echo JText::_('MOD_MFO_CO_FORM_SM'); ?></span></label>
          <input class="no-brd" type="text" id="amount-sm" readonly disabled="true" value="<?php echo (int)$item->sm_to; ?>">
        <?php } else { ?>
          <label for="amount-sm"><span><?php echo JText::_('MOD_MFO_CO_FORM_SM'); ?></span></label>
          <input class="no-brd" type="text" id="amount-sm" readonly disabled="true">
          <div id="slider-sm"></div>
        <? } ?>
      </div>
      <div class="controls">
        <?php if ((int)$item->term_from == (int)$item->term_to) {?>
          <label for="amount-term"><span><?php echo JText::_('MOD_MFO_CO_FORM_TERM'); ?></span></label>
          <input class="no-brd" type="text" id="amount-term" readonly disabled="true" value="<?php echo (int)$item->term_to; ?>">
        <?php } else { ?>
          <label for="amount-term"><span><?php echo JText::_('MOD_MFO_CO_FORM_TERM'); ?></span></label>
          <input class="no-brd" type="text" id="amount-term" readonly disabled="true">
          <div id="slider-term"></div>
        <? } ?>
      </div>
      <div class="controls">
        <label for="amount-mpay"><span><?php echo JText::_('MOD_MFO_CO_FORM_MPAY'); ?></span><span class="star"> *</span></label>
        <input class="no-brd" type="text" id="amount-mpay" readonly disabled="true">
      </div>
      <div class="controls">
        <p><span class="star">* </span><?php echo JText::_('MOD_MFO_CO_FORM_PS'); ?></p>
      </div>
    </div>
    <div class="mfo_co_controls">
      <?php if ((bool)JFactory::getUser()->guest) { ?>
        <div class="controls">
          <hr />
          <label for="mod_mfo_co_name"><span><?php echo JText::_('MOD_MFO_CO_FORM_NAME'); ?></span><?php echo JText::_('MOD_MFO_CO_FORM_NAME_PH'); ?></label>
          <input id="mod_mfo_co_name" type="text" class="inputbox"/>
        </div>
        <div class="controls">
          <label for="mod_mfo_co_phone"><span><?php echo JText::_('MOD_MFO_CO_FORM_PHONE'); ?></span><?php echo JText::_('MOD_MFO_CO_FORM_PHONE_PH'); ?></label>
          <input id="mod_mfo_co_phone" type="text" class="inputbox" placeholder="+7(___)___-__-__"/>
        </div>
      <?php } else { ?>
        <div class="controls">
          <hr />
          <label><span><?php echo JText::_('MOD_MFO_CO_FORM_POSPTEXT'); ?></span></label>
        </div>
      <?php } ?>
    </div>
    <div class="mfo_co_controls">
      <div class="controls">
        <hr />
        <a class="btn btn-primary" href="javascript:HideForm(true)"><?php echo JText::_('MOD_MFO_CO_DEMAND')?></a>
      </div>
      <input type="hidden" name="option" value="com_mfo" />
      <input type="hidden" name="task" value="smail.work" />
      <input type="hidden" name="return" value="<?php echo $return; ?>" />
    </div>
  </div>
</form>
[/spoiler]
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
ну как отловить сабмит в модуле? Как и везде!
меняете  <input type="hidden" name="task" value="smail.work" /> на <input type="hidden" name="task" value="my_task" />
и в модуле в любом месте:
$input  = JFactory::getApplication()->input;
if($input->getCmd('task') === 'my_task'){
... выполняем код
}

Но лучше в модуле это не делать, а именно в компонент! Ибо если будет включено на сайте кеширования то модуль загрузится из кеша, и у вас ничего не выполнится!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Но лучше в модуле это не делать, а именно в компонент!
В компоненте отправку письма делать лучше непосредственно в контроллере или через модель?
Сообщение об успешной отправке либо ошибке выводить через JFactory::getApplication()->enqueueMessage() - нормально?
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
В компоненте отправку письма делать лучше непосредственно в контроллере или через модель?
Сообщение об успешной отправке либо ошибке выводить через JFactory::getApplication()->enqueueMessage() - нормально?
Можно и в контроллере можно и в модели!
Ну смотря как вы хотите если через AJAX то JFactory::getApplication()->enqueueMessage() не покатит..
а если у вас ещё и форма в в другом месте чем этот компонент, то ещё же и вернуться надо будет на страницу с которой была отправка!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
нет, не через AJAX однозначно, мне до него еще далеко :)
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
нет, не через AJAX однозначно, мне до него еще далеко :)
Да блин, я не понимаю, чем AJAX так страшен? Тупо вызов той-же самой функции контроллера, только через $.ajax(). Нет ничего проще =) А если пользуетесь тройкой, то вообще com_ajax Вам в помощь. Благо есть мануал.
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
Да блин, я не понимаю, чем AJAX так страшен? Тупо вызов той-же самой функции контроллера, только через $.ajax(). Нет ничего проще =) А если пользуетесь тройкой, то вообще com_ajax Вам в помощь. Благо есть мануал.
Дима знаешь чем страшен AJAX?
Вот подобным:
Спойлер
[свернуть]
;D
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Контроллер:
Код: php
class MfoControllerSMail extends JControllerLegacy
{
  public function work()
  {
    $uri = JFactory::getURI();
    JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));
    $this->setRedirect(JRoute::_($uri));
    if ((bool)SendDemain())
      {JFactory::getApplication()->enqueueMessage('Заявка на зам успешно отправлена.');} else
      {JFactory::getApplication()->enqueueMessage('Ошибка отправики заявки на займ.', 'error');}
  }
 
  protected function SendDemain()
  {
    $input = JFactory::getApplication()-input;
    print_r($input->getWord('login'));
    return true;
  }
}
Сообщение, выводимое посредством enqueueMessage(), не появляется, print_r($input->getWord('login')); - тоже тишина.

Сабмит формы вызывается в js:
Код: javascript
  HideForm = function(is_submit)
  {
    $(".overlay").toggleClass("active");
    $(".popup").toggleClass("active");
    if (is_submit) {
      alert('submit');             // сообщение появляется!
      $("co-form").submit();   // тишина ...
    }
  }

Что я не так делаю?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Попробуйте дампнуть перед
Код: php
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

Может с токеном что-то.

И еще здесь ошибка $input = JFactory::getApplication()-input; должно быть ->input;

Кстати, Вы под тройку разрабатываете?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Да, J3.
Токен закомментировал, ошибку исправил, редирект в контроллере тоже закомментировал, эффекта никакого.
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Да, J3.
Начиная с Joomla 3 при разработке компонента к объекту JInput можно обращаться не из Приложения, а как к свойству input объекта контроллера класса JControllerLegacy (если ваши контроллеры расширяют класс JControllerLegacy, а это обычная практика). То есть вместо JFactory::getApplication()->input в контроллере можно использовать просто $this->input.

http://joomlablog.ru/dokumentatsiya/dlya-razrabotchika/api/484-jinput-poluchenie-i-filtratsiya-peremennykh-zaprosa

Токен закомментировал, ошибку исправил, редирект в контроллере тоже закомментировал, эффекта никакого.
А форма вообще отправляется?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А форма вообще отправляется?
А как проверить?
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Выходит, что не отправляется форма.
Код
      <input type="hidden" name="option" value="com_mfo" />
      <input type="hidden" name="task" value="smail.work" />
Что это может быть? Чего-то не хватает?
*

b2z

  • Глобальный модератор
  • 7288
  • 778 / 0
  • Разраблю понемногу
Не в этом дело. Получается, что не срабатывает $("co-form").submit();
Только непонятно, почему.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Нашел косяк: не $("co-form").submit();, а $("#co-form").submit();
Теперь ругается на if ((bool)SendDemain()) в контроллере:  Call to undefined function SendDemain()
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Туплю: if ((bool)$this->SendDemain())
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Как в контроллере получить настройки почты J (те, что указываются в общих настройках на вкладке "Сервер")?
И как вообще отправить прочту в j3 правильно? с адреса сайта на адрес, указанный в параметрах компонента, способ отправки - smtp, отправка на яндекс
« Последнее редактирование: 03.07.2014, 16:02:55 от AlekVolsk »
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
  public function SendDemain()
  {
    
$body "Demain ".$this->input->getString('coname')."\r\n".
    
"Sum:  ".$this->input->getString('sm')."\r\n".
    
"Term:  ".$this->input->getString('term')."\r\n";
    if (
$this->input->getString('login') === 'site_guest')
    {
      
$body .= "Client:  ".$this->input->getString('login');
    } else {
      
$body .= "FIO:  ".$this->input->getString('fio')."\r\n".
      
"Phone:  ".$this->input->getString('phone');
    }

    
$mailer JFactory::getMailer();
    
$config JFactory::getConfig();
    
$mailer->setSender(array($config->get('config.mailfrom'), $config->get('config.fromname')));
    
$mailer->addRecipient('alekvolsk@yandex.ru');
    
$mailer->setSubject('Demain');
    
$mailer->setBody($body);
    
$send $mailer->Send();
    
    return (bool)
$send;
  }

Во фронт: Ошибка подключения к SMTP
При этом return == true
« Последнее редактирование: 03.07.2014, 16:40:59 от AlekVolsk »
*

b2z

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

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
$config->getValue замените на $config->get
уже, я изменил тот пост

upd:
Оказывается, денвер не отправляет через smtp, отправилось через sendmail: в папке денвер/tmp/ появился eml-файл, значит можно считать, что письмо отправлено?

После отправки сообщение, выданное во фронт через enqueueMessage() не закрывается при нажатии на крестик (как админке)
« Последнее редактирование: 03.07.2014, 16:53:16 от AlekVolsk »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Выяснил, что не отправляются в $_POST значения некоторых полей формы (выделены):
Спойлер
[свернуть]
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться