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

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Не работает setState
« : 25.03.2019, 14:26:51 »
Подскажите в чем может быть дело...

Понадобилось часть действий перекинуть на AJAX. Была форма ее заполняли и сохранялись данные. Теперь добавилось что AJAX должен собрать данные и сохранить.

Вопрос у меня встал такой. Когда загружается форма (стандартная без AJAX) то запрашивался метод getItem и получал необходимые свойства. Данные для getItem() поступали через getState (2 параметра 'item.id' и 'item.alias') В populateState забирался input->id на две составляющих и через  setState сохранялись.

Решил в AJAX функции получить объект через функцию getItem и не могу....
довел уже функцию до смешного вида и понимаю что чего-то я не знаю...
Код
class TurismModelTour extends JModelAdmin
{

public function getItem($id = null, $alias = null)
{
var_dump(array ($id, $alias), true);
if ($id) $this->setState('item.id', $id);
if ($alias) $this->setState('item.alias', $alias);
var_dump(array ($this->getState('item.id'),$this->getState('item.id')), true); exit;

Вот результат
Код
array(2) { [0]=> string(2) "68" [1]=> string(10) "2019-05-01" } bool(true) array(2) { [0]=> string(9) "index.php" [1]=> string(9) "index.php" } bool(true)
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #1 : 25.03.2019, 14:38:03 »
Вопрос у меня встал такой. Когда загружается форма (стандартная без AJAX) то запрашивался метод getItem и получал необходимые свойства. Данные для getItem() поступали через getState (2 параметра 'item.id' и 'item.alias') В populateState забирался input->id на две составляющих и через  setState сохранялись.
Так а собственно вопрос где?
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

dmitry_stas

  • Легенда
  • 13151
  • 1234 / 8
Re: Не работает setState
« Ответ #2 : 25.03.2019, 14:40:58 »
Так а собственно вопрос где?
$id = 68;
$this->setState('item.id', $id);
var_dump($this->getState('item.id')); // string(9) "index.php"
Тут дарят бакс просто за регистрацию! Успей получить!
Все советы на форуме раздаю бесплатно, то есть даром. Индивидуально бесплатно консультирую только по вопросам стоимости индивидуальных консультаций
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #3 : 25.03.2019, 14:52:06 »
Да, странно. Попробуйте убрать условие
Код
if($id)...
чтоб была безусловная запись. И еще в самом начале функции посмотрите что уже вписано:
Код
var_dump(array ($this->getState('item.id')), true);
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #4 : 25.03.2019, 14:57:44 »
И еще в самом начале функции посмотрите что уже вписано:
В функции оставил только те строки что привел, больше ничего там нет.

If убирал - ничего не изменилось.
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #5 : 25.03.2019, 15:03:00 »
а сделайте там var_dump($this); Посмотрите какой тип у объекта - совпадает ли с классом модели. А то впечатление такое, что там $this - это не TurismModelTour...
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #6 : 25.03.2019, 15:15:41 »
Спойлер
[свернуть]
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #7 : 25.03.2019, 15:26:45 »
в $this присутствует item.id вопрос остался в получении
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #8 : 25.03.2019, 15:33:33 »
Вроде он. А как у вас AJAX отрабатывает?
в $this присутствует item.id вопрос остался в получении
Он там присутствует как parameters.menu - т.е. взят из пункта меню ссылки.

Попробуйте сделать:
Код
$params = $this->getState('parameters.menu');
$itemId = params->get('item.id');
var_dump($itemId);
Это если вам действительно нужен тот, который в ссылке. Его и по другому можно извлечь.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #9 : 25.03.2019, 15:47:01 »
Это если вам действительно нужен тот, который в ссылке. Его и по другому можно извлечь.
нет нужен не мне, а функции getItem которая берет именно $this->getState('item.id')
Т.е. все это изначально и делается чтобы заставить работать туже функцию через AJAX.

А как у вас AJAX отрабатывает?
Вот это не совсем понял. Что вы имеете ввиду?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #10 : 25.03.2019, 15:56:55 »
Приведите код AJAX. Если url имеет вид "index.php?option=com_mycom&view=myview&layout=edit&id=68", то ваш трюк не пройдет.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #11 : 25.03.2019, 15:58:47 »
Вот это не совсем понял. Что вы имеете ввиду?
Ссылку, по которой AJAX обращается и всю цепочку вызовов. Реализация кастомная или в компоненте что-то заложено? Встречал разные варианты реализации. Например, где в ссылке передается task=getAjax и имя метода. Контроллер подключает модель аякса и вызывает указанный метод (если он там есть). У вас же отрабатывает та же модель, которая и при открытии страницы на сайте. Вот и интересно - как реализовано. Простейший вариант, например, передать с обычной ссылкой на страницу товара параметр ajax=1, потом в шблоне проверить его наличие и (если есть) выдать жсон и вызвать exit. Но у вас вроде бы другой вариант.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #12 : 25.03.2019, 16:01:03 »
вот так вызывается данная часть на js
Код
jQuery.getJSON('index.php?option=com_turism&task=fastorder.frominputdata_1&format=json&'+token+'=1', {
            tour_id: tour_id,
            name: title.val(),
            phone: phone.val(),
            email: email.val(),
           
        })

Приведите код AJAX. Если url имеет вид "index.php?option=com_mycom&view=myview&layout=edit&id=68", то ваш трюк не пройдет.

Как быть? Переписывать функцию на возможное вхождение прямых переменных?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #13 : 25.03.2019, 16:03:57 »
Хм, а как TurismModelTour::getItem() вызывается в fastorder.frominputdata_1?
Если TurismModelTour::getItem() не вызывается напрямую со всеми параметрами, а в таком виде
Код
$item = $this->get('Item');
То в нее нужно добавить
Код
$id = (!empty($id)) ? $id : (int)$this->getState($this->getName() . '.id');
« Последнее редактирование: 25.03.2019, 16:13:43 от robert »
Не будь паразитом, сделай что-нибудь самостоятельно!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #14 : 25.03.2019, 16:06:56 »
Ссылку, по которой AJAX обращается и всю цепочку вызовов. Реализация кастомная или в компоненте что-то заложено? Встречал разные варианты реализации. Например, где в ссылке передается task=getAjax и имя метода. Контроллер подключает модель аякса и вызывает указанный метод (если он там есть). У вас же отрабатывает та же модель, которая и при открытии страницы на сайте. Вот и интересно - как реализовано. Простейший вариант, например, передать с обычной ссылкой на страницу товара параметр ajax=1, потом в шблоне проверить его наличие и (если есть) выдать жсон и вызвать exit. Но у вас вроде бы другой вариант.

Да мой вариант другой. я не страницу полностью выдаю по AJAX, а выдаю перестроенную логику взаимодействия с пользователем, но результат должен быть тем же - добавление заказа в таблицу.
Плюс к выше написанному
Код
 jQuery.getJSON('index.php?option=com_turism&task=fastorder.frominputdata_1&format=json&'+token+'=1', {
        tour_id: tour_id,

Вот что делает контроллер
Спойлер
[свернуть]
В коде не хватает setState... но я выше приводил. если не понятно опубликую и это...
« Последнее редактирование: 25.03.2019, 16:10:02 от platonische »
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #15 : 25.03.2019, 16:10:34 »
//$tour = $model_tour->getItem();[/b] - Вот это хочу получить объект для дальнейшей работы, но...
Так а почему параметры здесь не передаете?
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #16 : 25.03.2019, 16:11:16 »
Код
$tour = $model_tour->getItem();
Без параметров?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #17 : 25.03.2019, 16:12:00 »
То в нее нужно добавить
Код
$id = (!empty($id))? $id : (int)$this->getState($this->getName(). '.id');

Видимо под такой расклад и надо переписать getItem т.к. сейчас внутри используется только getState напрямую
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #18 : 25.03.2019, 16:13:56 »
Код
$tour = $model_tour->getItem();
Без параметров?
Так а почему параметры здесь не передаете?

Хорошо запускал так
Код
$tour = $model_tour->getItemById($tour_id);
в моделе делал доп.функцию
Код
public function getItemById($id = null){

$db = $this->getDbo();
$query = $db->getQuery( true );
$query ->select( 't.id, t.alias' );
$query ->from( '#__turism_tour AS t' );
$query ->where( 't.id=' .  $id );
$item = $db->setQuery( $query )->loadObject();
$this->setState( 'item.id', (int)$item->id );
$this->setState( 'item.alias', $item->alias );

return $this->getItem();
}
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #19 : 25.03.2019, 16:15:12 »
Видимо под такой расклад и надо переписать getItem т.к. сейчас внутри используется только getState напрямую
Или
Код
$tour = $model_tour->getItem($id, $alias);
Не будь паразитом, сделай что-нибудь самостоятельно!
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #20 : 25.03.2019, 16:15:17 »
загляните в метод populateState - как там выполняется setState('item.id) - откуда он берется?
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

sivers

  • Живу я здесь
  • 2453
  • 333 / 0
Re: Не работает setState
« Ответ #21 : 25.03.2019, 16:18:11 »
Еще попробуйте после строки:
Код
$model_tour = $this->getModel('tour');
добавить
Код
$model_tour->get('State');
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #22 : 25.03.2019, 16:18:59 »
$this->getItem();
Вот о чем я говорю. Функция подучает id через
Код
$id = (!empty($id))? $id : (int)$this->getState($this->getName(). '.id');
Посмотрите код JModelAdmin::getItem().
Не будь паразитом, сделай что-нибудь самостоятельно!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #23 : 25.03.2019, 16:56:02 »
Цитата: platonische от Сегодня в 16:13:56
$this->getItem();
Вот о чем я говорю. Функция подучает id через
Код
$id = (!empty($id))? $id : (int)$this->getState($this->getName(). '.id');
Посмотрите код JModelAdmin::getItem().
Переписал функцию с учетом вхождения параметров - по приведенному вами примеру. Все заработало.

Если можно - поясните почему setState и getState в данном случае не работают?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #24 : 25.03.2019, 17:01:02 »
Они работают, просто вы не передавали параметры в функцию, поэтому они работали с какими-то старыми значениями.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #25 : 25.03.2019, 17:04:18 »
Они работают, просто вы не передавали параметры в функцию, поэтому они работали с какими-то старыми значения

Так как же вот приводил пример Не работает setState


*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #26 : 25.03.2019, 17:19:21 »
Так как же вот приводил пример Не работает setState
Так я же несколько раз писал, что в случае отсутствия явного параметра $id getItem() берет его из
Код
$this->getName(). '.id'
, а вы его засунули в "item.id".
Не будь паразитом, сделай что-нибудь самостоятельно!
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #27 : 25.03.2019, 17:22:09 »
Так я же несколько раз писал, что в случае отсутствия явного параметра $id getItem() берет его из
Код
$this->getName(). '.id'
, а вы его засунули в "item.id".

нет. У меня установливается в item.id Так вышло, и именно item.id стоит в PopulateState
*

platonische

  • Давно я тут
  • 523
  • 2 / 1
  • Парусные экспедиции vk.com/tc670
Re: Не работает setState
« Ответ #28 : 25.03.2019, 17:23:34 »
$id = 68;
$this->setState('item.id', $id);
var_dump($this->getState('item.id')); // string(9) "index.php"
И самое главное что было
Код
$id = 68;
$this->setState('item.id', $id);
var_dump($this->getState('item.id')); // string(9) "index.php"
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Не работает setState
« Ответ #29 : 25.03.2019, 17:57:13 »
$id = 68;
$this->setState('item.id', $id);
var_dump($this->getState('item.id'));
У меня выводит int(68).
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Создаю свой компонент. Не могу понять как работает модель

Автор broadcast77

Ответов: 18
Просмотров: 1593
Последний ответ 12.09.2015, 16:17:44
от broadcast77
Не работает Pagination, - Joomla 3.4

Автор olf

Ответов: 2
Просмотров: 1300
Последний ответ 12.03.2015, 19:39:13
от olf