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

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

Журнал операций в компоненте (дублирование sql запроса)

 (Прочитано 468 раз)
0 Пользователей и 1 Гость смотрят эту тему.
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« : 04.03.2016, 22:00:21 »

Хочу реализовать следующее в своем компоненте:

Журнал операций - чтоб иметь четкую картину кто когда и чего делал.
Например: есть таблица №1 и все виды для работы с ней.
при создании элемента в Т1 надо чтоб запрос как текст попал в Т(log)
Структура для Т(log) создана

Подскажите куда копать? Или отговорите...
Записан
AlekVolsk
Профи
********

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

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



« Ответ #1 : 04.03.2016, 22:19:04 »

самое простое: переопределить все методы создания/сохранения/публикации/удаления/прочих_действий элементов в модели и перед вызовом родителя делать запись в лог через JLog либо организовать собственный лог (запись в отдельную таблицу компонента, просмотр и управление - только в админке и только суперюзером)
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #2 : 08.03.2016, 18:10:32 »

Блин по переопределению чет сражу не понимаю. Подкиньте ссылочку на изучение, кто богат.
Записан
robert
Профи
********

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

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


« Ответ #3 : 08.03.2016, 19:06:35 »

Показать текстовый блок
Функция test() в классе Test2 переопределена.
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #4 : 08.03.2016, 20:58:50 »

А список названий какой у функций
save? или как?
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #5 : 08.03.2016, 21:17:24 »

И еще вопрос. А как достать переменные данной записи внутри метода?
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #6 : 08.03.2016, 21:30:54 »

По переопределению save получилось
Показать текстовый блок
Подскажите какие еще есть функции полезные для работы и как они называются по англ и входные выходные данные. (можно ссылку)
Полезные например: после сохранения есть что-то, а то в момент сохранения может не быть id. Может еще какие заморочки есть?
Записан
robert
Профи
********

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

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


« Ответ #7 : 08.03.2016, 21:41:57 »

По переопределению save получилось
Показать текстовый блок
Что получилось? По приведенному коду не вижу.
Полезные например: после сохранения есть что-то, а то в момент сохранения может не быть id. Может еще какие заморочки есть?
Переведите.
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #8 : 08.03.2016, 22:18:34 »

Что получилось? По приведенному коду не вижу.Переведите.
Получилось то что достал данные $data и могу их пользовать. По поводу переведите: не могу достать id элемента который только что создается.
Для добавления нового элемента как лучше достать данные?
Записан
robert
Профи
********

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

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


« Ответ #9 : 08.03.2016, 22:34:56 »

не могу достать id элемента который только что создается.
В переопределенном методе save() сразу после успешной
Код
$table->store()
делайте
Код
$id=$table->id;
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #10 : 08.03.2016, 22:39:43 »

... сразу после успешной
вот эт оне понимаю. Что это значит?
И попутно вопрос как мне положить переформированные данные в другую таблицу?
Записан
robert
Профи
********

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

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


« Ответ #11 : 08.03.2016, 22:57:16 »

не могу достать id элемента который только что создается.
Посмотрел JModelAdmin::save(), можно сделать проще: в переопределенном методе save() после успешного сохранения
Код
$id=$this->getState($this->getName().'.id');
На этом бесплатные ответы закончились.
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #12 : 08.03.2016, 23:28:21 »

На этом бесплатные ответы закончились.
Спасибо и на этом. Дали бы ссылки на то как писать в другой table и все прочее - я готов разбираться, можно без прямых подсказок. Тем не менее спасибо!
Записан
robert
Профи
********

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

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


« Ответ #13 : 08.03.2016, 23:39:54 »

Спасибо и на этом. Дали бы ссылки на то как писать в другой table и все прочее - я готов разбираться, можно без прямых подсказок. Тем не менее спасибо!
Не знаю такой ссылки - сам учусь, разбирая код.
Записан
dmitry_stas
Профи
********

Репутация: +794/-4
Offline Offline

Сообщений: 7738



« Ответ #14 : 08.03.2016, 23:44:13 »

Не знаю такой ссылки - сам учусь, разбирая код.
platonische, это на самом деле так. нет ничего лучше в изучении чего то, чем изучение работы его исходников. имхо вы без этого не продвинетесь дальше, сколько бы умных книжек вы не прочли.
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #15 : 09.03.2016, 17:04:55 »

Подскажите в каком стандартном компоненте есть запись в две таблице?
Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

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


Разраблю понемногу


« Ответ #16 : 09.03.2016, 17:57:54 »

А в чём проблема с записью в две таблицы?

Код
public function save($data)
{
   if (!parent::save($data))
   {
      return false;
   }
 
   $id = $this->getState($this->getName(). '.id');
   $this->updateSecondTable($id, $data);
}
 
private function updateSecondTable($id, $data)
{
    // здесь пишите во вторую таблицу
}
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #17 : 09.03.2016, 19:15:14 »

Честно признаться. Я действительно немного знаю и достаточно тяжеловато.
Затык заключается не в ток как передать переменные другой функции, а в том куда передать?

Ведь все же есть готовое и можно наверное во вторую таблицу методом save записать данные или надо городить что-то вот такое?:
Показать текстовый блок

Читаю код родительского метода из файла libraries\legacy\model\admin.php буду разбираться как его заставить table сменить... пока решение в лоб - скопировать его и присвоить нужное значение $table
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #18 : 09.03.2016, 19:48:41 »

Что выходит:
в моделе добавил getLogTable
Показать текстовый блок

метод save вот такой:
Показать текстовый блок

И вторая функция сохранения вот ту прошу помочь. Все работает но не все понимаю
Показать текстовый блок
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #19 : 09.03.2016, 19:53:31 »

Ещё вопрос: А куда можно вынести функцию function updateSecondTable($data) чтоб пользоваться ей из всех моделей, что есть в компоненте?
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #20 : 09.03.2016, 23:45:41 »

Возник вопрос.

Сохранение во вторую таблицу работает отлично.

второе сохранение срабатывает после первого сохранения и вываливает в адресную строку id не элемента а id из второго сохранения (id таблицы log) как побороть?
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #21 : 10.03.2016, 00:06:03 »

Ответ на пред пост
Показать текстовый блок
Из второго сохранения надо убрать эту строку.
Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

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


Разраблю понемногу


« Ответ #22 : 10.03.2016, 11:00:49 »

А зачем Вам проверка  if ($this->associationsContext && JLanguageAssociations::isEnabled())?
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #23 : 12.03.2016, 00:04:25 »

А зачем Вам проверка  if ($this->associationsContext && JLanguageAssociations::isEnabled())?
Я не знаю - взял родительский метод под копирку.
Подскажите какие операции здесь лишние? cleanCache нужен ли и все что в catch ?
Записан
b2z
Support Team
*****

Репутация: +707/-0
Offline Offline

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


Разраблю понемногу


« Ответ #24 : 12.03.2016, 08:56:07 »

Лишняя только проверка ассоциаций.
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #25 : 14.03.2016, 21:51:52 »

Продолжаю задавать вопросы.
1. Подскажите куда засунуть функцию чтоб был к ней доступ из каждой модели?
2. Подскажите как переопределить publish и delete функции? Точнее как внутри них запустить функцию save? Суть в том что мне надо при изменении статуса published делать запись во второй таблице и соответственно вызывать методы сохранения новой записи... не выходит у меня это.
Ну и еще переопределить их где лучше? в модели или контроллере?
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #26 : 14.03.2016, 22:04:03 »

1. Подскажите куда засунуть функцию чтоб был к ней доступ из каждой модели?
Никуда не засовывать, любой метод в любой модели можно дергать из другой модели!
Код
$model = JModelLegacy::getInstance( $name = 'List', $prefix = 'TestModel' ); //то есть имя класса модели TestModelList
echo $model->getTest();// вызываем метод getTest() в модели!

2. Подскажите как переопределить publish и delete функции? Точнее как внутри них запустить функцию save? Суть в том что мне надо при изменении статуса published делать запись во второй таблице и соответственно вызывать методы сохранения новой записи... не выходит у меня это.
Ну и еще переопределить их где лучше? в модели или контроллере?
2. переопределить просто
Код
public function publish( &$pks, $value = 1 ){
if ( parent::publish( $pks, $value ) ) {
//тут ваш код
}
}
Только зачем вам вызывать внутри них метод save для изменения данных?
Получаете нужную таблицу через
$table = $this->getTable('table_name'); //вместо table_name имя вашей таблицы
$table->load(10); // загружаете запись с id=10
$table->text = 'lalala'; //меняете значение в поле text на lalal
$table->save(); // сохраняете данные!
« Последнее редактирование: 14.03.2016, 22:11:11 от Istaan » Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #27 : 14.03.2016, 22:10:53 »

Никуда не засовывать, любой метод в любой модели можно дергать из другой модели!
2. переопределить просто
Код
public function publish( &$pks, $value = 1 ){
if ( parent::publish( $pks, $value ) ) {
//тут ваш код
}
}
Только зачем вам вызывать внутри них метод save для изменения данных?
Получаете нужную таблицу через
$table = $this->getTable('table_name'); //вместо table_name имя вашей таблицы
$table->load(10); // загружаете запись с id=10
$table->text = 'lalala'; //меняете значение в поле text на lalal
$table->save(); // сохраняете данные!
По первому вопросу спасибо испробую!
По второму немного поясню: Вот сменили значение published а в таблице Log надо СОЗДАТЬ запись, тут вопрос еще один всплывает, когда берешь внутри модели somethingS то это класс JModelList а метод сохранения у меня лежит в методе SOMETHING а он расширяет класс JModelAdmin и чего-то у меня не катит функция вызванная из другого метода
Записан
Aleks.Denezh
Практически профи
*******

Репутация: +372/-4
Offline Offline

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



« Ответ #28 : 14.03.2016, 22:14:46 »

По первому вопросу спасибо испробую!
Я там выше код дополнил как модель дергать!

По второму немного поясню: Вот сменили значение published а в таблице Log надо СОЗДАТЬ запись
а вы пробовали хоть немножко документацию читать?!
Повторю код:
Код
$table = $this->getTable('table_name'); //вместо table_name имя вашей таблицы
$table->load(10); // загружаете запись с id=10
$table->text = 'lalala'; //меняете значение в поле text на lalal
$table->save(); // сохраняете данные!
Вот так вы отредактируете старую запись!

Код
$table = $this->getTable('table_name'); //вместо table_name имя вашей таблицы
$table->text = 'lalala'; //меняете значение в поле text на lalal
$table->save(); // сохраняете данные!
Вот так вы создадите новую запись!

Вам не нужно вызывать метод SAVE ибо он без контроллера, без переданных данных в $_POST, токена и установки состояний работать не будет!
И в конечном результате метод save делает сохранение в таблицу с помощью класса JTable!


тут вопрос еще один всплывает, когда берешь внутри модели somethingS то это класс JModelList а метод сохранения у меня лежит в методе SOMETHING а он расширяет класс JModelAdmin и чего-то у меня не катит функция вызванная из другого метода
Потому что вы 99.999% неправильно вызываете модель!
Если вызываете не так:
Код
$model = JModelLegacy::getInstance( $name = 'List', $prefix = 'TestModel' ); //то есть имя класса модели TestModelList
echo $model->getTest();// вызываем метод getTest() в модели!
а просто проинклудив, то неудивительно что у вас не работает!
Но и работать не будет! Вам надо сделать как я написал выше! через $table (класс JTable)
Записан
platonische
Давно я тут
****

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

Сообщений: 297


Парусные экспедиции vk.com/tc670


« Ответ #29 : 14.03.2016, 22:17:00 »

Понял! Шагаем дальше. Спасибо!
Записан
Страниц: [1] 2  Все   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

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