Форум русской поддержки Joomla!® CMS
08.12.2016, 12:00:09 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Как запустить php-скрипт после сохранения параметров модуля?

 (Прочитано 719 раз)
0 Пользователей и 1 Гость смотрят эту тему.
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« : 20.06.2015, 16:16:17 »

Есть модуль
В модуле много настроек

Задача:
После сохранения, запустить php-скрипт, который выполняет определенные операции, используя сохраненные параметры.
Причем, это должно происходить не при стандартной процедуре сохранения, а по выбору администратора.

Что я сделал:
Создал свой тип поля, тупо вставив кнопку "Сохранить"
Код
<?php
defined('_JEXEC') or die('Restricted access');
jimport('joomla.form.formfield');
 
class JFormFieldFbr extends JFormField {
 
   public function getInput() {
 
       $str_save = 'Joomla.submitbutton(\'module.apply\')';
 
       $getButton = '<a onclick="'. $str_save .'" class="btn btn-success">Создать файл</a>';
 
           return $getButton;
   }
 
}
?>

Теперь я могу сохранять модуль собственной кнопкой! Azn
И на этом пока все ... Мозги остановились.

Подскажите, плз :

1. Тем ли путем я пошел? Если нет - куда идти?
2. Где живет Joomla.submitbutton('module.apply')?
3. Ну и сабж - куда и как прикрутить свой скрипт?

Спасибо)
« Последнее редактирование: 20.06.2015, 18:02:44 от fbr » Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #1 : 20.06.2015, 16:48:43 »

Ну вообще функционал модуля не подразумевает такие вещи изначально. Но мне приходилось делать это. Вкратце я писал AJAX запрос на другой скрипт, который будет эти параметры обрабатывать. Много подводных камней. Task может быть 'modules.apply' и 'modules.save' вместо 'module.apply' и 'module.save' на фронте и в админке они отличаются (это насколько я помню, можете проверить). Проблемы с безопасностью могут быть( потому что нельзя передать и проверить токен формы из бекенда на  фронт и наоборот т.к. разные сессии). В отдельном скрипте я делал проверку:

Код
...
 $apptype = isset($_POST['apptype'])? $_POST['apptype'] : '';
 $app = JFactory::getApplication($apptype);
 $app->initialise();
 JSession::checktoken();
...
 

Но лучше написать плагин и AJAX запрос к этому плагину через админку или фронт в зависимости от того где редактируется модуль.
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #2 : 20.06.2015, 17:00:56 »

.. Проблемы с безопасностью могут быть( потому что нельзя передать и проверить токен формы из бекенда на  фронт и наоборот т.к. разные сессии)...

Все происходит в админке. Фронта нет вообще.

Может мы Неправильно друг друга поняли. Поясню.

В настоящий момент скрипт запускается с фронта при обновлении страницы. Но когда на странице выведено 2 модуля этого типа  - возникает конфликт.
И я хочу от этого уйти, запуская скрипт из админки своей кнопкой.
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #3 : 20.06.2015, 17:23:58 »

Вот пример, из менеджера шаблонов:

Код
<button onclick="Joomla.submitbutton('template.less')" class="btn btn-small">
<span class="icon-play"></span> Компилировать LESS
</button>

Где все это живет?
Нужно нечто подобное сделать у себя в модуле: по клику Сохранить+запуск скрипта

Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3591


« Ответ #4 : 20.06.2015, 17:27:21 »

по выбору пользователя
Пользователь имеет доступ к админке?

P.S. Лучше набросить простенький компонент, который будет выполнять желаемые действия.
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #5 : 20.06.2015, 17:29:48 »

Да, именно для администратора это и делается!
Извиняюсь, что обозвал пользователями ))

Модуль тянет из com_content. Так что наверное будет лишним писать свой
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3591


« Ответ #6 : 20.06.2015, 17:35:51 »

Модуль тянет из com_content. Так что наверное будет лишним писать свой
Никаких проблем не вижу. Пока будете извращаться с AJAX и отдельным скриптом - затрата выдет такой же.
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #7 : 20.06.2015, 17:38:23 »

Мне почему-то кажется, что ключевой вопрос
Цитировать
2. Где живет Joomla.submitbutton('module.apply')?

т.е. выдернуть код сохранения, дописать свой и запускать на onclick
нет?
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3591


« Ответ #8 : 20.06.2015, 17:40:21 »

Мне почему-то кажется, что ключевой вопрос
т.е. выдернуть код сохранения, дописать свой и запускать на onclick
нет?
Хотите править ядро?
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #9 : 20.06.2015, 17:44:41 »

Хотите править ядро?
упаси Господи ...
Хочу посмотреть как работает, попытаться использовать тот же код у себя в модуле
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #10 : 20.06.2015, 17:46:31 »

Понятно, вам нужна кнопка сохранения параметров модуля на фронте. Ну вобщем похожая задача. Посмотрите этот файл \components\com_config\view\modules\tmpl\default.php и default_options.php в последних версиях Joomla 3.4.x . Они отвечают за редактирования настроек модуля на фронте. Можете написать форму по подобию но вам ведь еще эти данные надо в своем скрипте где то обрабатывать я так понимаю? Значит отсылать AJAX запрос на отдельный скрипт или плагин который эти данные будет обрабатывать.

Вобщем это все голимые костыли на самом деле и модули для этого не предназначены. Пишите компонент.
Записан
passer
Живу я здесь
******

Репутация: +69/-3
Offline Offline

Пол: Мужской
Сообщений: 829



« Ответ #11 : 20.06.2015, 17:49:02 »

Сам не делал, чистая теория. Заглянул в модели компонента com_modules. Есть там событие onExtensionAfterSave. Наверное можно плагин группы extension сделать и обработать onExtensionAfterSave.
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #12 : 20.06.2015, 17:51:43 »

Вобщем это все голимые костыли на самом деле и модули для этого не предназначены. Пишите компонент.

мда..
Надеялся что можно что-то вставить в onclick="..."
Видимо ошибался, все не так просто
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #13 : 20.06.2015, 17:52:42 »

Сам не делал, чистая теория. Заглянул в модели компонента com_modules. Есть там событие onExtensionAfterSave. Наверное можно плагин группы extension сделать и обработать onExtensionAfterSave.
А вот это уже интересно! Посмотрю
Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #14 : 20.06.2015, 17:56:37 »

О, кстатии да вариант и onExtensionBeforeSave есть событие. Не замечал, ну тогда вобще супер.  Пишите плагин.
Записан
robert
Профи
********

Репутация: +344/-11
Offline Offline

Пол: Мужской
Сообщений: 3591


« Ответ #15 : 20.06.2015, 18:01:58 »

Посмотрел. Да, думаю, что плагин решит проблему.
Записан
fbr
Живу я здесь
******

Репутация: +136/-6
Offline Offline

Сообщений: 1250


« Ответ #16 : 21.06.2015, 18:14:24 »

Ребята, спасибо всем кто помогал))
Вариант с плагином на событие onExtensionAfterSave работает.

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

Код
// Файл плагина
 
defined( '_JEXEC' ) or die;
 
class plgExtensionFbr extends JPlugin {
 
 public function __construct( & $subject, $config ) {
parent::__construct( $subject, $config );
$this->loadLanguage();
 }
 
 public function onExtensionAfterSave($data, &$table, $isNew = 0) {
   // проверка на свой модуль
   if ( $table->module === 'mod_mymodule') {
 
     $mod_id = $table->id;
     $params = json_decode($table->get('params'));
 
     // проверка параметра разрешения на перезапись
     if ($params->rewrite_on) {
       require_once JPATH_SITE.'/modules/mod_mymodule/action.php';
     }
 
   }
 
 }
}
 
// Файл mod_mymodule/action.php
 
defined( '_JEXEC' ) or die;
// достаем нужные параметры модуля
$param_1 = $params->some_param;
$param_1 = $params->some_param2;
 
// обработка параметров
 
// создаем/перезаписываем файл
$fp = file_put_contents(__DIR__.'/css/settings'. $mod_id .'.css', $result_content);
 

И все же интересно,  где живет Joomla.submitbutton('module.apply')
Посмотреть бы одним глазком, чем он там занимается ..
« Последнее редактирование: 21.06.2015, 18:26:10 от fbr » Записан
zomby6888
Живу я здесь
******

Репутация: +168/-3
Offline Offline

Пол: Мужской
Сообщений: 1538


« Ответ #17 : 21.06.2015, 23:21:29 »

Ничего интересного, просто отправляет форму с параметрами \media\system\js\core-uncompressed.js
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet