Обработка json в компоненте modx

Решил я, что разумно и правильно хранить часть данных в строке json. Ну т.е. в таблице что-то типа
<field key="field_name" dbtype="text" phptype="string" />
И некий массив отправляется в $modx->toJSON() и сохраняется в field_name. Там список строк, состоящий из месяца, года и произвольного текста.
В json переводится что-то типа этого:
[0] => Array    
	(
                    ['time'] => 1999
                    ['mounth'] => 1
                    ['text'] => 'Текст'
                ),
[1] => Array    
	(
                    ['time'] => 2001
                    ['mounth'] => 8
                    ['text'] => 'Текст 2'
                ),
Но нужно как-то наладить управление ими в компоненте, составить гирд из json. Вроде бы ext.js берется json и отдается store и на основе его создается гирд и все дела. В modExt есть волшебные url и action, которые позволяют не писать store. Но ведь в конечном счете тоже используется json?
Я так понимаю, что гирд я должен составить из хранилища как-то так habrahabr.ru/post/108154/ а уже обработку делать через процессоры… Или…
Может в каких-то компонентах информация хранится в таком формате и можно посмотреть пример? Или кто может какую статью в тему там подкинуть? Пинните в нужном направлении.
Антон Соловьёв
28 августа 2014, 17:57
modx.pro
6 724
0

Комментарии: 5

Василий Наумкин
28 августа 2014, 22:19
0
Я тебе могу много статей подкинуть — bezumkin.ru/training/course1/
    Антон Соловьёв
    29 августа 2014, 09:54
    0
    Ну там тоже через магический url и action, которые творят необъяснимое волшебство? Коннектор отдает json-массив с данными для грида. Но всё дело в том, что одно из возвращаемых полей — тоже json и из него нужно собрать отдельный грид в окошке редактирования.
    Я проходил курс, даже заплатить успел перед тем, как он стал бесплатный )
    $array = array(
    	'success' => false,
    	'message' => 'Возника ошибка при сохранении формы',
    	'total' => 1
    	'data' => array(
    		'id' => 'alias',
    		'msg' => 'Это поле обязательно'
    	)
    );
    bezumkin.ru/training/course1/2166/
    Я так понимаю, нужно 'success' => true, и в 'data' наш массив и это все скармливать хранишищу. Но наверно сделаю по-другому, через не классный процессор.
      Василий Наумкин
      29 августа 2014, 10:32
      0
      ExtJs генерирует всё оформление самостоятельно, а от процессора получает только массив данных в определенном формате.

      В modExt есть волшебные url и action, которые позволяют не писать store.
      Url и action не делают никакой магии, они только указывают какой вызвать процессор, чтобы он отдал данные в виде JSON. Store у grid есть всегда, другое дело, что ты этого не всегда видишь.

      Все гриды MODX наследуются от одного основного и именно в нём прописан разбор данных. Вот метод, который создаёт хранилище из полученного JSON.

      В общем, от процессора особо ничего не зависит, «классный» он, не «классный» — не важно, лишь бы отдал JSON с нужной структурой данных.
        Антон Соловьёв
        29 августа 2014, 19:32
        0
        В классных процессорах нужно идти в родительский класс и что-то переопределять там. С ними удобно, когда нужно обрабатывать конкретный, описанный в модели объект, а со строчкой json как-то не очевидно, как их применять.
        Обычный нагляднее как-то и строк всего-ничего. Может это и не кошерно.
        if(empty($_REQUEST['expertID']))
            return $modx->error->failure($modx->lexicon('travel_list_no_expert_id'));
        $expert = $modx->getObject('OrderExpert',(int) $_REQUEST['expertID']);
        $arr = $modx->fromJSON($expert->get('travel_list'));
        foreach($arr as $k=>$v){
            $arr[$k]['key'] = $k;
        }
        
        if(empty($arr))
            return $modx->error->failure($modx->lexicon('travel_list_no_date'));
        
        return $this->outputArray($arr,count($arr));
        Я тут вывожу fromJSON, а потом outputArray опять в json. Ну, так как-то удобнее и более напоминает другие, легче ориентироваться.
        Только с get такой фокус не проходит. Я пробовал отправлять ему массив, подобный тому, что приходит от других get, подобный тому. Но что-то не проходит.
        В старом MS вроде вообще ошибка возвращается. В Шопкипере вроде все также, через outputArray, но я не смотрел, где там этот процессор используется. Посмотрю еще на другие компоненты, может вдохновлюсь и скопипостю. А нет — буду с классным modObjectGetProcessor извращаться, вроде хорошо получалось ).
          Василий Наумкин
          30 августа 2014, 08:04
          0
          Любой JSON делается так:
          $array = array('key1' => 'value1', 'key2' => 'value2');
          echo json_encode($array);
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5