Наверх

Работа со своей таблицей в MODX. Добавляем пользовательские объекты

Давно не было новых уроков. Начнем новую серию экспериментов связанных теперь уже с дополнительными объектами в MODX. Это довольно часто используется, особенно, если вы хотите хранить в базе данных какую-то дополнительную информацию. Например, компонент Redirector хранит все редиректы в отдельной таблице. И мы научимся делать так же)

Если вы хотите хранить дополнительные данные в дополнительной таблице, вам нужно создать свое дополнение. В MODX дополнения называются компонентами или пакетами.

Начнем мы с простенького:

На сайте есть страница с картой России. На этой карте надо вывести метки в тех городах, где есть филиалы нашей организации. Карта сделана картинкой, метки имеют абсолютное позиционирование. Все бы ничего, но организация бурными темпами развивается, постоянно появляются новые филиалы, и хорошо бы упростить добавление меток на карте.

Будем считать, что MODX вы уже установили))) Ставим дополнение Console, чтобы удобнее было экспериментировать, и CMPGenerator, который поможет нам рассказать MODX'у о нашей дополнительной таблице.

Координаты меток будем хранить в отдельной таблице, так что, заходим в phpMyAdmin и создаем новую таблицу modx_map_item со следующими полями:

  • id — INT(10), AUTO_INCREMENT
  • title — VARCHAR(250), utf8_general_ci, NULL - да, По умолчанию - NULL
  • coord_x — INT(10), NULL - да, По умолчанию - NULL
  • coord_y — INT(10), NULL - да, По умолчанию - NULL

После этого заходим в админку, Компоненты->CMPGenerator. Нажимаем Create package. Заполняем поля: Package Name - Map Database Name - оставляем пустым (или пишем имя вашей базы данных) Tables - modx_map_item Prefix - modx_ Build Schema - Да Build Package - Да

и сохраняем. Все, модель сгенерирована, все данные о нашей таблице у MODX'а есть. Можете посмотреть в папке /core/components/Map/

Открываем Компонеты->Console и пробуем создать объект:

<?php
$item = $modx->newObject('MapItem');
$item->save();
Упс:

Could not load class: MapItem from mysql.mapitem.
Fatal error: Call to a member function save() on a non-object in /home/.../public_html/core/components/console/processors/exec.class.php(19) : eval()'d code on line 3

Данные у MODX'a-то есть, но он не знает, что они у него есть))

Переходим в настройки системы и создаем новый параметр (если его еще нет) extension_packages. Заполняем только "Ключ" (extension_packages) и "Значение":

[{"Map":{"path":"[[++core_path]]components/Map/model/"}}]

Если у вас в этом параметре уже что-то записано, вам надо дописать этот код в конец через запятую, вот так:

[{...здесь уже что-то есть...},{"Map":{"path":"[[++core_path]]components/Map/model/"}}]

иначе сломаются другие компоненты)))

Можно делать это не руками, а предоставить право MODX'у самому. Для этого надо в Console выполнить следующий код:

$modx->addExtensionPackage('Map', '[[++core_path]]components/Map/model/');
и системный параметр будет прописан правильно.

Теперь пробуем опять создать объект. Ошибки нет. Идем в phpMyAdmin и видим, что появилась новая строка. Поздравляю, теперь вы можете работать с этим новым объектом с помощью xPDO, как с любым другим объектом MODX.

Оригинал статьи: http://community.modx-cms.ru/blog/modx-xpdo/11035.html



73 комментария

  1. Евгений Борисов 15 сентября 2013, 11:24(Комментарий был изменён) # +2
    Как ни крути, а самый лучший вариант для компонента рассматриваемой сложности:
    $modx->addPackage('Map', $modx->getOption('core_path').'components/Map/model/','modx_map_');
    В таком случае данные о компоненте будут погружаться только там, где они действительно нужны, а не на всех страницах сайта/админки. И да, для меток есть форк StoreLocator — MarkerGoogleMaps.
    1. Илья Уткин 16 сентября 2013, 09:49(Комментарий был изменён) # 0
      Да, конечно, для несложного компонента самое то, но статья направлена на обучение, потому про addPackage пока ничего и не сказал. Пытливые умы могут сами поискать информацию — даже на русском языке статей много))
      1. Александр 31 марта 2020, 08:57 # 0
        А можно ли сделать CMP для связанных таблиц со связью один к одному?
        1. Илья Уткин 31 марта 2020, 09:51 # 0
          Да, где-то была статейка, кажется. Вот раздел про CMP — ilyaut.ru/extjs/
          1. Александр 31 марта 2020, 11:43 # 0
            Илья, благодарю, довольно подробно изучил разделы Вашего сайта и курс Василия Наумкина.
            Однако у Василия есть особенность изложения материала — он не всегда указывает с каким файлом и в какой директории работает в данный момент, а это очень важно.
            К тому же я не увидел, возможно ли сделать общую таблицу для создания связей между объектами.

            Скажем у вас есть таблица ms2_products и есть сторонняя таблица в которой хранится ProductID и информация для сторонней системы, где ProductID — ключ указатель на запись в таблице.

            Как с Вами можно связаться для коммерческого сотрудничества? (консультации/заказы)
            1. Илья Уткин 31 марта 2020, 13:07 # 0
              Здравствуйте, напишите на ilyautkin@mail.ru
    2. Amir Amir 09 ноября 2013, 19:30(Комментарий был изменён) # 0
      Илья, спасибо за урок. Добавил свою таблицу. Сгенерировал классы. Добавил пакет
      есть вопрос: можно ли теперь этот объект добавить в дерево ресурсов и как?
      1. Илья Уткин 09 ноября 2013, 19:54(Комментарий был изменён) # 0
        Вам нужно было создавать свой класс на основе стандартного modResource (тогда у вас получился бы CRC). Но лучше сделать отдельную страничку в админке для управления именно вашими объектами. Для этого вам надо создать и настроить CMP. Что это и как сделать CMP в данный момент рассказывает Василий Наумкин на платных онлайн-курсах.
        1. Oleg Gabdulkhakov 09 ноября 2013, 21:34(Комментарий был изменён) # 0
          к сожалению «Первый курс обучения, на котором мы пишем свой компонент рассылки юзерам сайта» мне не совсем подходит.
          1. Илья Уткин 09 ноября 2013, 23:17(Комментарий был изменён) # 0
            На примере такого компонента мы учимся создавать СМР, редактировать свои объекты из админки и использовать их во фронтенде.
      2. Oleg Gabdulkhakov 13 ноября 2013, 16:02(Комментарий был изменён) # 0
        я ребята рад за вас) вы далеко впереди на локомотиве, и всех кто с билетами на своем поезде к знанимя. вы только для тех кто пешком по шпалам и бесплатно для себя, оставляйте временами ориентиры в каком направлении двигаться дальше: например изучить modext (MODx.grid.Grid) для написания своей таблицы в админке по своему объекту. можно еще добавить про мобильные плюхи типа HandyMan.
        1. Илья Уткин 13 ноября 2013, 16:05(Комментарий был изменён) # 0
          Я это еще не умею — сам записался к Василию на курсы и всех агитирую.
        2. Pablo Badtrip 04 декабря 2013, 19:07(Комментарий был изменён) # 0
          Сделал все четко по пунктам, сгенерировал Пакет, схему
          (в схеме почему-то нет поля с ключем id, все правильно?)

          настроил путь: extension_packages
          [{«Datearr»:{«path»:"[[++core_path]]components/Datearr/model/"]}}

          Но упорно выдает ошибку
          Could not load class: Datearr from mysql.datearr.

          Fatal error: Call to a member function save() on a non-object in /Applications/MAMP/htdocs/test/core/components/console/processors/exec.class.php(19): eval()'d code on line 3

          Уже голову сломал подключая таблицы различными методами, итог — не работает.
          Может подскажите куда смотреть хотя бы?
          1. Pablo Badtrip 04 декабря 2013, 19:17(Комментарий был изменён) # 0
            Справился, просто надо больше учиться и смотреть на названия классов.
            В моем случает класс имел название DaDatearr по названию таблицы modx_da_datearr
            хотя в префиксы я указывал modx_da_, не понимаю этого момента
            1. Павел Пустота 13 июня 2014, 13:56 # 0
              Спасибо за урок!
              У меня такой вопрос — а можно после того как модель сгенерирована удалить CMPGenerator?
              Есть у меня стойкая нелюбовь к «лишним» компонентам.
              1. Илья Уткин 13 июня 2014, 13:59 # 0
                Да, конечно. Он нужен только для того, чтобы сгенерировать модель — после этого он не используется, а при необходимости его можно будет поставить заново.
                1. Павел Пустота 13 июня 2014, 14:56(Комментарий был изменён) # 0
                  Спасибо за ответ!
                  Для потомков отмечу: если на сайте установлен AjaxManager, то после проведения всех операций, почему-то не создаются новые объекты. Причём ни в консоли, ни на сайте. Почти час бился с выскакивающей ошибкой, пока не деинсталировал AjaxManager и не повторил процесс.

                  После создания модели, вернул AjaxManager. Всё работает. Так что его нужно «выключать» только на время создания модели, почему-то.
              2. Спасибо! 23 июля 2014, 22:51 # 0
                Илья, спасибо вам за уроки.

                Странно очень, при создании пакета через CMPGenerator появляется сообщение: время действия сессии истекло, запрашивается логин и пароль, после ввода которых сообщение появляется снова. После обновления страницы в админку больше никак не зайти, после ввода логина и пароля ничего не происходит. Также появляются проблемы в работе сайта: перестают работать практически все сниппеты. Версия MODX 2.2.14
                1. Илья Уткин 24 июля 2014, 06:25 # 0
                  Вряд ли здесь виноват CMPGenerator… Попробуйте сделать то же самое на другом сайте или хостинге.
                2. Андрей Иванов 27 августа 2014, 12:31 # +1
                  Извините, внесу «пять копеек».
                  Если, после того, как пакет уже сгенерирован в CMPGenerator, в созданную таблицу были добавлены столбцы, пакет нужно перегенерировать. Это делается по щелчку правой кнопкой на названии пакета в CMPGenerator, в выпадающем меню выбирается «Build» и — «Сохранить».
                  1. Павел 29 августа 2014, 13:49 # 0
                    Здравствуйте! Подскажите, пожалуйста, работает ли CMPGenerator на 2.3.1? У меня чтото не получается настроить верно его на 3 таблицы… есть таблицы:
                    modx_mandoki_lessons
                    modx_mandoki_groups
                    modx_mandoki_users

                    надо чтобы в каждую из них создавался объект средствами модх, подскажите пожалуйста, как лучше сделать это?
                    1. Илья Уткин 29 августа 2014, 13:57 # 0
                      На 2.3.1 не пробовал, не знаю. А количество объектов не важно — таблицы прописываете через запятую в поле Tables
                      1. Павел 02 сентября 2014, 05:16 # 0
                        БлагоДарю, Илья! Всё получилось! Я указывал таблицы не через запятую, а в строчку… ))
                        1. Павел 10 сентября 2014, 11:26 # 0
                          Илья, подскажите, пожалуйста, как-то возможно удалить из своей таблицы строку? Уже всё перерыл, нигде решения не найду…
                          1. Илья Уткин 10 сентября 2014, 11:29 # 0
                            Объекты в xPDO удаляются с помощью метода remove():
                            $obj = $modx->getObject('myObject', $id);
                            $obj->remove();
                            1. Павел 10 сентября 2014, 11:31 # 0
                              Вот так делаю:
                              if($uid=='') { $uid = $_GET['uid']; }
                              if($cid=='') { $cid = $_GET['cid']; }
                              
                              // получаем объект 
                              $userParent = $modx->getObject('modUser', array('id' => $uid) );
                              if(!is_object($userParent)) { print 'Такого пользователя не найдено.'; die; }
                              
                              // Приступаем удалять..
                              if($uid != '' AND $cid != '') {
                              	$usersParentsObjsArray = $modx->getCollection('MandokiUsersParents', array('userId' => $uid, 'childId' => $cid) );
                              	
                              	foreach($usersParentsObjsArray as $i => $userObj)
                              	{
                              		$userObj->remove();
                              		//$userObj->save();
                              	}
                              }
                              Отказывается удалять. Может что-то предварительно нужно прописать?..
                              1. Павел Пустота 10 сентября 2014, 11:42 # 0
                                foreach перебирает не полученный массив, а его копию. Так уж он устроен.
                                1. Павел 10 сентября 2014, 11:50 # 0
                                  БлагоДарю! Но попытался реализовать при помощи FOR, тоже самое — не удаляет… как будто ничего не происходит…

                                  Ещё бред какой-то творится… Вот такой код ничего совершенно не выводит, хотя должен выводить id-шки строк таблицы:
                                  if($uid=='') { $uid = $_GET['uid']; }
                                  if($cid=='') { $cid = $_GET['cid']; }
                                  
                                  // получаем объект 
                                  $userParent = $modx->getObject('modUser', array('id' => $uid) );
                                  if(!is_object($userParent)) { print 'Такого пользователя не найдено.'; die; }
                                  
                                  // Приступаем удалять..
                                  if($uid != '' AND $cid != '') {
                                  	$usersParentsObjsArray = $modx->getCollection('MandokiUsersParents', array('userId' => $uid, 'childId' => $cid) );
                                  	
                                  	for($i=0; $i<count($usersParentsObjsArray); $i++)
                                  	{
                                  		print $usersParentsObjsArray[$i]->get('id');
                                  		//$usersParentsObjsArray[$i]->remove();
                                  	}
                                  	die;
                                  }
                                2. Илья Уткин 10 сентября 2014, 11:45 # 0
                                  По идее все верно. Надо уже смотреть логи, смотреть — есть ли вообще объект в этот момент (вызвать print_r($userObj->toArray()); die(); ), проверить, происходит ли вообще выполнение этого куска кода…
                                  1. Павел 10 сентября 2014, 11:52 # 0
                                    Данный код выводит вот что: «Array ( [userId] => 53 [childId] => 47 )».
                                    Хотя в этой таблице есть ещё поле id — уникальное (auto_increment)…
                                    1. Павел 10 сентября 2014, 11:54 # 0
                                      Логи чисты, как попка младенца… :)
                                      1. Павел 10 сентября 2014, 11:57 # 0
                                        Вот такой код выводит тоже самое. :(
                                        $usersParentsObj = $modx->getObject('MandokiUsersParents', array('userId' => $uid, 'childId' => $cid) );
                                        print_r($usersParentsObj->toArray()); die();
                            2. Максим 17 сентября 2014, 10:27 # 0
                              Создание своей таблицы просто идеально подходит для решения моей задачи. Но когда я создал в базе пару таблиц: «modx_order_item» и «modex_product_item», после описал как «Order» и «Product» соответственно, c префиксом «modx_», и наконец добавил путь к ним в extension_packages, посмотрел, какое наименование объекта в схеме:
                              <object class="ProductItem" ... 
                              По-идее все должно было заработать верно, но при попытке выполнения
                              $item = $modx->newObject('ProductItem');
                              $item->fromArray(array(
                                  'resource_id' => 1,
                                  'product_id' => 59,
                                  'count' => 3
                                  ));
                              $item->save();
                              
                              Вылезает ошибка:
                              «Could not load class: ProductItem from mysql.productitem.»
                              версия модекса «MODX Revolution 2.2.12-pl»
                              Как же мне убедить modx принять свои таблицы?
                              1. Илья Уткин 17 сентября 2014, 10:46 # 0
                                Видимо, в extension_packages что-то не так прописано… Покажи все, что лежит в extension_packages.
                                1. Максим 17 сентября 2014, 10:48(Комментарий был изменён) # 0
                                  [ {"gallery":{"path":"[[++core_path]]components/gallery/model/"}},{"Order":{"path":"[[++core_path]]components/Order/model/"}},{"Product":{"path":"[[++core_path]]components/Product/model/"}} ]
                                  Галерея и пара моих моделей.
                                  1. Илья Уткин 17 сентября 2014, 10:51 # 0
                                    Они как отдельные компоненты? Какие папки CMP-генератор создал в /core/components/?
                                    1. Максим 17 сентября 2014, 10:53 # 0
                                      Да, как отдельные, папки: «Product» и «Order».
                                      1. Илья Уткин 17 сентября 2014, 11:01 # 0
                                        Вроде, все правильно… Можно попробовать подключить пакет с помощью
                                        $modx->addPackage('Product', $modx->getOption('core_path').'core/components/Product/model/', 'modx_');
                                        $item = $modx->newObject('ProductItem');
                                        $item->fromArray(array(
                                            'resource_id' => 1,
                                            'product_id' => 59,
                                            'count' => 3
                                            ));
                                        $item->save();
                                        1. Максим 17 сентября 2014, 11:04 # 0
                                          Спасибо, так заработало:)
                              2. Nnearobot 18 января 2015, 16:07 # 0
                                Спасибо за статью!
                                Выяснилось, что при генерации пакетов компонентом CMPGenerator префиксы таблиц, отличных от 'modx_', не работают: не получаются данные из базы и не сохраняются.
                                xPDO в любом случае использует префикс 'modx_'.

                                То есть, например, есть у меня таблица mecha_robot_makers, я в мастере создания (в CMPGenerator) ввожу имя таблицы mecha_robot_makers и префикс mecha_. В сниппете проверяю имя используемой в классе таблицы:

                                $myRow = $modx->newObject('RobotMakers');
                                echo $myRow->_table;

                                и на странице выводится 'modx_robot_makers'.

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

                                1. Доброжелатель 05 июля 2015, 19:07 # 0
                                  Какая то ошибка с префиксом в CMP Generatorе

                                  joxi.ru/4DmBEG1uK0ejrP

                                  [2015-07-05 22:01:46] (ERROR @ /manager/components/console/connectors/console.php)
                                  Error 42S02 executing statement:
                                  INSERT INTO `fgrx_map_item` () VALUES ()
                                  Array
                                  (
                                  [0] => 42S02
                                  [1] => 1146
                                  [2] => Table 'XXXXXXXXXX.fgrx_map_item' doesn't exist
                                  )
                                  1. Илья Уткин 06 июля 2015, 07:24 # 0
                                    В названии таблиц должен быть такой же префикс, как и у всех остальных таблиц. Например, если все таблицы в базе начинаются на modx_, то и кастомная таблица должна начинатсья на modx_. Префикс нужен, насколько я понимаю, если используется несколько кастомных таблиц. но тогда префикс должен быть modx_fgrx_
                                    1. Доброжелатель 06 июля 2015, 08:25 # +1
                                      При установке modx я задал префикс для всех таблиц fgrx_ вместо modx_ народ советует для большей безопасности так делать.
                                      А таблицу я создал по вашей инструкции modx_map_item, она появилась в базе, в генераторе тоже указал modx_map_item, а при запросе <?php
                                      $item = $modx->newObject('MapItem');
                                      $item->save();
                                      почему то требует fgrx_map_item… Пришлось его удовлетворить и создать новую таблицу fgrx_map_item.
                                      Предыдущий автор тоже на похожую проблему жалуется. Скорее всего генератор некорректно работает при префиксах отличных от modx_ и берет префикс по умолчанию из системы, а не из «Prefix»
                                  2. Доброжелатель 05 июля 2015, 19:33(Комментарий был изменён) # 0
                                    Вот еще глюк. Сначала сделал префикс fgrx потом заметил и поменял на fgrx_

                                    [2015-07-05 22:27:42] (ERROR @ /manager/components/console/connectors/console.php)
                                    Error 42S02 executing statement:
                                    INSERT INTO `fgrx__exam_sheet` () VALUES ()
                                    Array
                                    (
                                    [0] => 42S02
                                    [1] => 1146
                                    [2] => Table 'XXXX.fgrx__exam_sheet' doesn't exist
                                    )

                                    В первом случае просто поменял название таблицы на fgrx_map_item, но это же не правильно. Нужно где то в настройках менять. В настройках генератора поменял обратно на fgrx, никаких изменений, та же ошибка с двойным подчеркиванием.
                                    joxi.ru/j1A59nQu8991AE
                                    Название таблицы нормальное, откуда берет «нижнее подчеркивание» лишнее.
                                    1. Kirill 28 сентября 2015, 15:23 # 0
                                      Не работает!
                                      Сделал все как написано

                                      [2015-09-28 18:23:03] (ERROR @ /manager/components/console/connectors/console.php)
                                      
                                      Could not load class: MapItem from mysql.mapitem.
                                      
                                      Fatal error: Call to a member function save() on a non-object in /home/virtwww/w3b6/http/core/components/console/processors/exec.class.php(15) : eval()'d code on line 3
                                      
                                      1. Илья Уткин 29 сентября 2015, 07:33 # 0
                                        Видимо, забыли в начале кода написать
                                        $modx->addPackage('Map', $modx->getOption('core_path').'components/Map/model/','modx_map_');
                                        1. Егор 19 апреля 2017, 21:00 # 0
                                          Доброго времени суток, Илья! Извините, что поднимаю старую тему.
                                          Пытаюсь повторить вашу инструкцию, создаю таблицу, делаю пакет в CMPGenerator. Схема делается, папка появляется. Потом в консоли делаю $modx->addPackage('Map', $modx->getOption('core_path').'components/Map/model/','modx_map_');

                                          Но когда пытаюсь вызвать $item = $modx->newObject('MapItem');
                                          $item->save();
                                          в консоли, то получаю
                                          Could not load class: MapItem from mysql.mapitem.

                                          Это я делаю что-то не так, или с времён написания статьи что-то поменялось?
                                          1. Илья Уткин 20 апреля 2017, 07:20 # 0
                                            Вроде, ничего не менялось… Так трудно понять, в чём ошибка… Надо открывать эти созданные папки, точно сверять пути, обращать внимание — где заглавная буква, где строчная. Вообще, этот файл mysql.mapitem — он существует? В нём как объект называется? Ещё возможно, у вас в базе префикс не modx_, тогда надо его указать в addPackage. Причин может быть множество
                                      2. morzzrom 01 марта 2016, 15:23 # 0
                                        Илья, добрый вечер. Спасибо большое за ваши статьи. Я уже второй день мучаюсь с cm generator. Создаю в phpmyadmin табличку по вашей инструкции выше. Запускаю generator. Папки, пути и все такое Map создается. И дальше ни тпру ни ну. К объекту не обращается. В логах пишет:
                                        ===
                                        (ERROR @ /papka/assets/components/cmpgenerator/connector.php) Schema /home/u111/site.ru/www/papka/core/components/Map/model/Map/Map.mysql.schema.xml contains no valid object elements.
                                        ===
                                        Куда копать, в чем причины? Помогите, пожалуйста. Хочу отметить, что site.ru/www/papka именно так. Modx установлен в поддиректорию papka. А файлы самого сайта (другого) лежат в папке site.ru/www.
                                        Спасибо.
                                        1. morzzrom 01 марта 2016, 17:25 # 0
                                          Прошу прощения за невнимательность. Надо было таблицу прописывать полностью! MODX_map_item. Несмотря на то, что ниже пишется префикс modx. Спасибо еще раз. Двигаюсь дальше.
                                        2. Егор Морозов 26 сентября 2016, 17:28(Комментарий был изменён) # 0
                                          Итак. Сделал Всё как было описано. Создание объекта производится на ура, то есть без проблем. В таблицу информация стабильно вставляется. А вот с полученим данных какие-то проблемы.

                                          У нас есть:
                                          таблица modx_hoststat
                                          package: HostStat

                                          Выполняем:
                                          $res = $modx->getObject('HostStat', 57);
                                          $output = $res -> toArray();
                                          
                                          В итоге:

                                          Fatal error: Call to a member function toArray() on array in…

                                          Что с этим делать — непонятно…

                                          Писать вначале $modx->addPackage('HostStat', $modx->getOption('core_path').'components/HostStat/model/','modx_'); пробовал, не помогает.
                                          1. Илья Уткин 27 сентября 2016, 15:44 # 0
                                            Посмотрите в папке core/components/HostStat/model/HostStat/mysql/ должен быть файл с расширением .map.inc.php. В нём, в самом начале будет что-то типа
                                            <?php
                                            $xpdo_meta_map['HostStatItem']= array (
                                            Вам нужно в getObject указывать именно такую формулировку, как в кавычках.
                                          2. Олег Евгеньевич 20 октября 2016, 17:02 # 0
                                            Console не выводит ничего, просто висит «Loading», ни ошибок ни результата выполнения кода, если написать «echo „1“;», то выводит нормально, если любой другой код то бесконечная загрузка
                                            1. Илья Уткин 24 октября 2016, 13:27 # 0
                                              Ну, бесконечная загрузка — обычно значит, есть какая-то ошибка, нужно построчно искать её
                                            2. Богдан 09 ноября 2016, 01:16 # 0
                                              Илья, здравствуйте, очень хорошие статейки у Вас, перечитал еще не все, но я в процессе)). Столкнулся с задачей по решению которой не могу ничего найти в сети(может плохо искал, или просто не туда копал)… Суть задачи такова — мне нужно синхронизировать 2 разных сайта на MODX revo(в частности надо синхронизировать 2 свойства у товара, что б при изменении свойств на одном сайте они менялись и на другом), сайты оба рабочие… можете подсказать хоть в какую сторону рыть, буду премного благодарен
                                              1. Илья Уткин 09 ноября 2016, 08:24 # 0
                                                Ну по идее, не нужно каталог хранить в обеих базах — надо на основном сайте, с каталогом, создать страницу, на которой выводить все товары, например, в виде JSON. А на втором сайте вывод каталога писать самостоятельно — с запросом данных от первого сайта, раскодированием JSON и оформлением в соответствии с дизайном.

                                                Но если вы уже сделали два каталога, придётся писать плагин, который при сохранении товаров будет отправлять запрос на другой сайт, а другой сайт должен на этот запрос среагировать — изменить соответствующие поля. Это сложнее, так как придётся думать ещё и над безопасностью, чтобы нельзя было с другого сайта или вручную отправить такой запрос и всё на сайтах поломать.

                                                Готового решения ни по первому варианту, ни по второму я, к сожалению, не видел. Если есть бюджет, можно попробовать составить ТЗ и дать объявление о работе на modx.pro/work/ Если оценить примерно, такой функционал может стоить от 3 800 до 7 000…
                                                1. Богдан 09 ноября 2016, 10:19 # 0
                                                  Илья, спасибо за столь скорый и развернутый ответ, к сожалению денег на заказ нету, будем пытаться самостоятельно решить. Еще раз спасибо.
                                                  1. Богдан 15 ноября 2016, 11:49(Комментарий был изменён) # 0
                                                    Илья здравствуйте, а что с вашим сайтом случилось? joxi.ru/J2b4EQpHJGe9r6
                                                    У меня появился вопросик по синхронизации, товары по свойствам у меня синхронизировать вышло а вот теперь задача стоит еще и 2 ТВшки синхронизировать.
                                                    Пишу такой код:
                                                    	$value_other = $xpdoSecondDb->query("SELECT  `value` FROM `$table_prefix_site_tmplvar_contentvalues`  WHERE `contentid` = 28 AND `tmplvarid` = 17");
                                                    	$value_other = $value_other->fetch(PDO::FETCH_ASSOC);
                                                    	$modx->log(1, var_export($value_other, true));
                                                    
                                                    в лог получаю значение то что надо с другой базы, но вот записать в нее таким кодом:
                                                    	$xpdoSecondDb->query("UPDATE `$table_prefix_site_tmplvar_contentvalues` SET `value` = '$prod_delivery_time' WHERE `$table_prefix_site_tmplvar_contentvalues` . `id`=28 AND `tmplvarid`=17");
                                                    
                                                    не выходит.
                                                    в сети ничего не могу найти(доку xPDO уже пересмотрел несколько раз) что бы помогло решить проблемму, вы не подскажете в чем косяк или куда хоть рыть?
                                                    P.S linux mint 17, Chromium 53
                                                    1. Илья Уткин 15 ноября 2016, 14:58 # 0
                                                      Нужно изменить параметр command. Конкретного примера у меня нет.

                                                      Вот статейка для изучения: Запросы на UPDATE, DELETE и т.п., а так же отладка чистых SQL-запросов, выполняемых через PDO
                                                      1. Богдан 15 ноября 2016, 15:21 # 0
                                                        Спасибо, уже разобрался, я по запарке указал не верный идентификатор. И еще маленький баг-репортик — joxi.ru/1A5ZeklC5bNMrE )
                                                        1. Илья Уткин 15 ноября 2016, 15:23 # 0
                                                          Да, какая-то беда с сертификатами на Linux… у меня mail.ru не открывается))
                                                      2. Илья Уткин 15 ноября 2016, 15:06 # 0
                                                        Вроде, сайт поправил. Проблема была с https у внешних CDN…
                                                  2. Рустам Турсунов 23 апреля 2017, 19:31 # 0
                                                    Илья, Здравствуйте! Я пытался сделать так, как вы описали, но выдает вот такую ошибку:
                                                    $modx->addPackage('Geodata', $modx->getOption('core_path').'components/GeoData/model/','modx_');
                                                    $item = $modx->newObject('GeoData');
                                                    
                                                    [2017-04-23 21:26:50] (WARN @ C:\home\htdocs.modx\core\xpdo\xpdo.class.php: 667)
                                                    Could not load metadata map geodata/mysql/geodata.map.inc.php for class GeoData from geodata.mysql.geodata

                                                    Подскажите, пожалуйста, в чем здесь проблема?
                                                    Спасибо
                                                    1. Рустам Турсунов 24 апреля 2017, 19:35 # 0
                                                      Разобрался.
                                                      нужно было в файле: C:\home\htdocs.modx\core\components\geodata\model\geodata\mysql\geodata.map.inc.php сменить регистр, т.е.:
                                                      Было так
                                                      <?php
                                                      $xpdo_meta_map['Geodata']= array (
                                                        'package' => 'geodata',
                                                        'version' => '1.1',
                                                        'table' => 'geodata',
                                                        'extends' => 'xPDOObject',
                                                        'fields' => 
                                                      
                                                      Стало так:
                                                      <?php
                                                      $xpdo_meta_map['geodata']= array (
                                                        'package' => 'geodata',
                                                        'version' => '1.1',
                                                        'table' => 'geodata',
                                                        'extends' => 'xPDOObject',
                                                        'fields' => 
                                                      
                                                      а в extension_packages нужно прописать
                                                      [{"geodata":{"path":"[[++core_path]]components/geodata/model/"]}}
                                                    2. Алексей 27 августа 2017, 16:29 # 0
                                                      Здравствуйте, Илья!

                                                      Тема довольно старая, но есть вопрос, который упорно не хочет решаться.

                                                      В phpMyAdmin создал малюсеньку тестовую табличку:
                                                      CREATE TABLE `abc_test_item` (
                                                        `id` int(10) NOT NULL,
                                                        `name` varchar(250) DEFAULT NULL,
                                                        `message` varchar(255) DEFAULT NULL
                                                      ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
                                                      Установил CMPGenerator. По вашему мануалу выше создал новый компонент. Структура со схемой создались замечательно. В консоле код:
                                                      $modx->addPackage('test', $modx->getOption('core_path').'components/test/model/');
                                                      
                                                      $item = $modx->newObject('TestItem');
                                                      $item->set('name', 'Alex');
                                                      $item->set('message', 'Test Message');
                                                      $item->save();
                                                      тоже отрабатывает и данные в таблицу вносятся.

                                                      Далее по этому мануалу установил MIGX, чтобы сохраненные данные можно было отображать в админке. Создал пункт в верхнем меню, создал конфигурацию:
                                                      {
                                                        "formtabs":[
                                                          {
                                                            "MIGX_id":3,
                                                            "caption":"info",
                                                            "print_before_tabs":"0",
                                                            "fields":[
                                                              {
                                                                "MIGX_id":9,
                                                                "field":"name",
                                                                "caption":"\u0418\u043c\u044f",
                                                                "description":"",
                                                                "description_is_code":"0",
                                                                "inputTV":"",
                                                                "inputTVtype":"",
                                                                "validation":"",
                                                                "configs":"",
                                                                "restrictive_condition":"",
                                                                "display":"",
                                                                "sourceFrom":"config",
                                                                "sources":"",
                                                                "inputOptionValues":"",
                                                                "default":"",
                                                                "useDefaultIfEmpty":"0",
                                                                "pos":1
                                                              },
                                                              {
                                                                "MIGX_id":10,
                                                                "field":"message",
                                                                "caption":"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435",
                                                                "description":"",
                                                                "description_is_code":"0",
                                                                "inputTV":"",
                                                                "inputTVtype":"textarea",
                                                                "validation":"",
                                                                "configs":"",
                                                                "restrictive_condition":"",
                                                                "display":"",
                                                                "sourceFrom":"config",
                                                                "sources":"",
                                                                "inputOptionValues":"",
                                                                "default":"",
                                                                "useDefaultIfEmpty":"0",
                                                                "pos":2
                                                              }
                                                            ],
                                                            "pos":1
                                                          }
                                                        ],
                                                        "contextmenus":"recall_remove_delete",
                                                        "actionbuttons":"addItem||toggletrash",
                                                        "columnbuttons":"recall_remove_delete",
                                                        "filters":"",
                                                        "extended":{
                                                          "migx_add":"",
                                                          "disable_add_item":"",
                                                          "add_items_directly":"",
                                                          "formcaption":"",
                                                          "update_win_title":"Test Window title",
                                                          "win_id":"test",
                                                          "maxRecords":"",
                                                          "addNewItemAt":"bottom",
                                                          "media_source_id":"",
                                                          "multiple_formtabs":"",
                                                          "multiple_formtabs_label":"",
                                                          "multiple_formtabs_field":"",
                                                          "multiple_formtabs_optionstext":"",
                                                          "multiple_formtabs_optionsvalue":"",
                                                          "actionbuttonsperrow":4,
                                                          "winbuttonslist":"",
                                                          "extrahandlers":"",
                                                          "filtersperrow":4,
                                                          "packageName":"test",
                                                          "classname":"TestItem",
                                                          "task":"",
                                                          "getlistsort":"id",
                                                          "getlistsortdir":"desc",
                                                          "sortconfig":"",
                                                          "gridpagesize":"",
                                                          "use_custom_prefix":1,
                                                          "prefix":"abc_",
                                                          "grid":"",
                                                          "gridload_mode":1,
                                                          "check_resid":1,
                                                          "check_resid_TV":"",
                                                          "join_alias":"",
                                                          "has_jointable":"yes",
                                                          "getlistwhere":"",
                                                          "joins":"",
                                                          "hooksnippets":"",
                                                          "cmpmaincaption":"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\u043c\u0438",
                                                          "cmptabcaption":"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f",
                                                          "cmptabdescription":"Tab Description",
                                                          "cmptabcontroller":"",
                                                          "winbuttons":"",
                                                          "onsubmitsuccess":"",
                                                          "submitparams":""
                                                        },
                                                        "columns":[
                                                          {
                                                            "MIGX_id":1,
                                                            "header":"id",
                                                            "dataIndex":"id",
                                                            "width":"",
                                                            "sortable":"false",
                                                            "show_in_grid":1,
                                                            "customrenderer":"",
                                                            "renderer":"",
                                                            "clickaction":"",
                                                            "selectorconfig":"",
                                                            "renderchunktpl":"",
                                                            "renderoptions":"",
                                                            "editor":""
                                                          },
                                                          {
                                                            "MIGX_id":2,
                                                            "header":"\u0418\u043c\u044f",
                                                            "dataIndex":"name",
                                                            "width":"",
                                                            "sortable":"false",
                                                            "show_in_grid":1,
                                                            "customrenderer":"",
                                                            "renderer":"",
                                                            "clickaction":"",
                                                            "selectorconfig":"",
                                                            "renderchunktpl":"",
                                                            "renderoptions":"",
                                                            "editor":""
                                                          },
                                                          {
                                                            "MIGX_id":3,
                                                            "header":"\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435",
                                                            "dataIndex":"message",
                                                            "width":"",
                                                            "sortable":"false",
                                                            "show_in_grid":1,
                                                            "customrenderer":"",
                                                            "renderer":"",
                                                            "clickaction":"",
                                                            "selectorconfig":"",
                                                            "renderchunktpl":"",
                                                            "renderoptions":"",
                                                            "editor":""
                                                          }
                                                        ]
                                                      }
                                                      по пункту меню начала отображаться болванка, но сами данные из базы никак не хотят отображаться, что только ни делал! По мануалу выше всё должно сработать с первого раза, но… Самое интересное, что при клике на кнопке «Добавить элемент», ввожу данные в поля «имя» и «сообщение» и данные успешно заносятся в базу! Т.е. связь с базой через контроллер настроена правильно. Не понию, в чем ошибка..? Кэши многократно чистил и CMS`ки и браузера — ничего. Можете подсказать?
                                                      1. Илья Уткин 28 августа 2017, 08:34 # 0
                                                        Не могу тут ничего подсказать — я сам с MIGX_db так и не разобрался. Попробуй написать на https://modx.pro/help/ — возможно, там есть знающие люди.
                                                        1. Алексей 29 августа 2017, 19:58 # 0
                                                          Очень жаль… Спасибо за ответ!
                                                      2. Павел 26 января 2018, 15:06 # 0
                                                        Все сделал по примеру получилось, но есть вопрос? Можно ли сделать таким образом несколько таблиц в БД и как к ним обращаться?
                                                        например map_item, map_user,map_control
                                                        1. Илья Уткин 01 февраля 2018, 11:57 # 0
                                                          Да, конечно, можно. Причём, если префикс для таблиц будет одинаковым (map_), то, насколько я помню, CPMGenerator сгенерирует модели для всех этих таблиц.
                                                          1. Павел 01 февраля 2018, 13:56(Комментарий был изменён) # 0
                                                            Как к ним обращаться? например map_item, map_user,map_control
                                                            1. Илья Уткин 02 февраля 2018, 08:52 # 0
                                                              После генерации модели найдите в папке /core/components/Map/ файлы, соответствующие этим таблицам. Там, внутри файлов, будут соответствующие названия классов. Скорее всего, MapItem, MapUser, MapControl.
                                                        2. Vladislav 06 июня 2018, 11:58 # 0
                                                          Здравствуйте, у меня следующая ошибка:
                                                          Error HY000 executing statement:
                                                          INSERT INTO `modx_okved_h_first` () VALUES ()
                                                          Array
                                                          (
                                                          [0] => HY000
                                                          [1] => 1364
                                                          [2] => Field 'name' doesn't have a default value
                                                          )

                                                          Делал все как в статье, модель в components появилась
                                                          1. Vladislav 10 июня 2018, 17:13 # 0
                                                            Кажется нашел косяк, нужно создавать пустую таблицу, потом проделывать все эти манипуляции и только потом загонять данные туда

                                                          Авторизация

                                                          через сервис Loginza:


                                                          Шаблоны MODX

                                                          1 2 Дальше »

                                                          Объектная
                                                          модель
                                                          MODX