We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 39274
    • 4 Posts
    Приветствую.
    Прочел статью http://habrahabr.ru/post/123072/ и решил делать сохранение данных в отдельной таблице.
    С горем пополам сгенерил xml и php'шники.
    Дальше затык

    $result = $modx->getCollection('Announcements');
    не пашет, то ли файлы на так лежат то ли... не понятно.... 2 дня потерял, помогите!

    $modx->addPackage( 'announce', '/mytable/', 'rich_usera_');
    
    
    $result = $modx->getCollection('Announcements');
    
    
    foreach($result as $row){
    echo '
    Next:'.$row->get('columnName');


    в mytable лежит xml и папка в которой php и папка mysql.

    PS: Modx Revo последняя [ed. note: borisovich last edited this post 12 years ago.]
    • Пробежался я по вышеуказанному уроку, ......
      Вообще, когда я начал изучать xPDO мне помог вот этот топик
      http://community.modx-cms.ru/blog/documentation/401.html
      http://community.modx-cms.ru/blog/documentation/448.html

      Расскажу немного от себя, так как мне приходиться расставлять связи в схеме, то всё делаю в ручную, по времени занимает пару минут.
      1) Есть таблица или несколько таблиц к примеру modx_mytable_name и пакет назовем mytable
      2) Создаем снипет SnipMytable и подключаем генератор
      <?php
      $manager = $modx->getManager();
      $generator= $manager->getGenerator();

      3) Генерируем xml файл, для этого в папке core/components/ создаём папку mytable/model/schema
      далее в наш снипет SnipMytable поместим такой код
      <?php
      $manager = $modx->getManager();
      $generator= $manager->getGenerator();
      $xml= $generator->writeSchema(MODX_BASE_PATH.'core/components/mytable/model/schema/mytable.mysql.schema.xml', 'mytable', 'xPDOObject', 'modx_');

      Создадим тестовый ресурс, сделаем вызов нашего снипета SnipMytable
      [[!SnipMytable]] 
      , и откроем наш ресурс в браузере.
      Если действия у нас все правильные были, мы должны увидеть в папке core/components/mytable/model/schema/ наш с генерированный файл mytable.mysql.schema.xml
      4) Открываем наш с генерированный файл mytable.mysql.schema.xml и удаляем всё не нужно, оставляя только свою или свои таблицы, выставляем связи если это нужно. Должно примерно остаться такого плана
      <?xml version="1.0" encoding="UTF-8"?>
      <model package="mytable" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">	
      	<object class="MytableName" table="mytable_name" extends="xPDOSimpleObject">
      .......
      ......
      </object>	
      </model>

      5) Теперь можно с генерировать сам пакет для работы, содержимое снипета SnipMytable
      <?php
      $manager = $modx->getManager();
      $generator= $manager->getGenerator();
      $generator->parseSchema(MODX_BASE_PATH.'core/components/mytable/model/schema/mytable.mysql.schema.xml',MODX_BASE_PATH.'core/components/mytable/model/');

      6) Открываем снова наш ресурс в браузере, для того, чтобы запустить снипет, и если у нас все пути правильные, то мы должны увидеть в папке core/components/mytable/model/ папку mytable
      7) Теперь осталось подключить наш пакет для работы, наш снипет SnipMytable
      <?php
      $mytab = $modx->getService('mytable','Mytable',$modx->getOption('mytable.core_path',null,$modx->getOption('core_path').'components/mytable/').'model/mytable/',$scriptProperties);
      if (!($mytab instanceof Mytable)) return 'no connect'; 

      8) Всё, можно работать с нашей таблицей
      к примеру далее в снипете пишем
      $myres = $modx->getIterator('MytableName');
      $out = '';
      foreach ($myres as $myr) {
         $out .= $myr->columnName;
      }
      return $out;
        Valentin Rasulov - Industrial design (Hobbies - Web Development)
        Development not standard projects on CMF MODx Revolution.
        Small sample of extensions
        • 39274
        • 4 Posts
        Спасибо за помощь. У меня пробелы с новым Revo, я в процессе изучения....
        Опять я заблудился в трех березах =)

        вот xml
        <?xml version="1.0" encoding="UTF-8"?>
        <model package="announcements" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
        	<object class="CustomUserAnnouncements" table="custom_user_announcements" extends="xPDOSimpleObject">
        		<field key="user_id" dbtype="int" precision="11" phptype="integer" null="false" />
        		<field key="date_pub" dbtype="datetime" phptype="datetime" null="false" />
        		<field key="type_deal" dbtype="varchar" precision="10" phptype="string" null="false" />
        		<field key="place" dbtype="text" phptype="string" null="false" />
        		<field key="object" dbtype="text" phptype="string" null="false" />
        		<field key="content" dbtype="text" phptype="string" null="false" />
        	</object>
        </model>


        структура папок:



        смотрел справку вроде все нормально но к базе не конектит....

        $mytab = $modx->getService('custom_user_announcements','CustomUserAnnouncements',
                                    $modx->getOption('announcements.core_path',
        							null,
        							$modx->getOption('core_path').'components/announcements/').'model/announcements/',$scriptProperties);
        							
        							
        if (!($mytab instanceof Mytable)) return 'no connect';
        
        $myres = $modx->getIterator('CustomUserAnnouncements');
        $out = '';
        foreach ($myres as $myr) {
           $out .= $myr->columnName;
        }
        return $out;



        • 1) у Вас таблица custom_user_announcements или modx_custom_user_announcements ?
          2) В примере, который я вам привёл, там упущенны некоторые детали, для нача давайте определимся для чего вам эта таблица? Т.е. вам не нужно её админить в админке? если просто работать с БД, то можно немного проще подключиться.
          3) Всавьте код Дампа вашей таблицы, я попробую у себя воспроизвести, чтобы более правильно вас курировать.
            Valentin Rasulov - Industrial design (Hobbies - Web Development)
            Development not standard projects on CMF MODx Revolution.
            Small sample of extensions
            • 39274
            • 4 Posts
            Да именно modx_custom_user_announcements =)) я что то упустил это из виду

            работать с ней и из админки тоже, ну или я просто права дам через контекст web
            суть в том что там будут объявления. С ними опрерации как добавление так и удаление самими пользователями .. админ тоже должен иметь такую возможность =))

            дамп прикрепляю
            • оки, создал я таблицу. правда у вас стоит кодировка cp1251 huh?
              Дамп таблицы
              CREATE TABLE IF NOT EXISTS `modx_custom_user_announcements` (
                `id` int(11) NOT NULL AUTO_INCREMENT,
                `user_id` int(11) NOT NULL,
                `date_pub` datetime NOT NULL,
                `type_deal` varchar(10) NOT NULL,
                `place` text NOT NULL,
                `object` text NOT NULL,
                `content` text NOT NULL,
                PRIMARY KEY (`id`)
              ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

              далее. как я говорил уже выше, создал тестовый ресурс и вывзвал снипет.
              Назовем наш пакет Cua, (не люблю километровые названия), создали в папке core/components/ папку cua/model/schema/
              В снипете, сначало генерирую схему, код снипета
              $manager = $modx->getManager();
              $generator= $manager->getGenerator();
              $xml= $generator->writeSchema(MODX_BASE_PATH.'core/components/cua/model/schema/cua.mysql.schema.xml', 'cua', 'xPDOObject', 'modx_');

              Запускаю тестовую страницу, в папку появился файл cua.mysql.schema.xml, открываю его, удаляю всё не нужное, кроме созданной таблицы.
              Файл core/components/cua/model/schema/cua.mysql.schema.xml
              <?xml version="1.0" encoding="UTF-8"?>
              <model package="cua" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">	
              	<object class="CustomUserAnnouncements" table="custom_user_announcements" extends="xPDOSimpleObject">
              		<field key="user_id" dbtype="int" precision="11" phptype="integer" null="false" />
              		<field key="date_pub" dbtype="datetime" phptype="datetime" null="false" />
              		<field key="type_deal" dbtype="varchar" precision="10" phptype="string" null="false" />
              		<field key="place" dbtype="text" phptype="string" null="false" />
              		<field key="object" dbtype="text" phptype="string" null="false" />
              		<field key="content" dbtype="text" phptype="string" null="false" />
              	</object>
              </model>

              далее генерирую xPDO и создаем класс для работы
              код снипета меняем на такой
              $manager = $modx->getManager();
              $generator= $manager->getGenerator();
              $generator->parseSchema(MODX_BASE_PATH.'core/components/cua/model/schema/cua.mysql.schema.xml',MODX_BASE_PATH.'core/components/cua/model/');

              Снова запускаем ресурс, в папке core/components/cua/model/ появилась папка cua с схемой.

              Теперь в снипете (в предыдущем топике, я подключение делал для работы с процессами и админкой и там нужно было ещё делать пару действий, так как вам этого не нужно, остановимся на минимуме - работа с таблицей)
              подключаем наш класс
              $modx->addPackage('Cua',MODX_BASE_PATH.'core/components/cua/model/','modx_');
              и делаем тест, полный код тестового снипета
              <?php
              /**
               * @package CustomUserAnnouncements
               */
              //$manager = $modx->getManager();
              //$generator= $manager->getGenerator();
              //$xml= $generator->writeSchema(MODX_BASE_PATH.'core/components/cua/model/schema/cua.mysql.schema.xml', 'cua', 'xPDOObject', 'modx_');
              //$generator->parseSchema(MODX_BASE_PATH.'core/components/cua/model/schema/cua.mysql.schema.xml',MODX_BASE_PATH.'core/components/cua/model/');
              
              $modx->addPackage('Cua',MODX_BASE_PATH.'core/components/cua/model/','modx_');
              
              $newItem = $modx->newObject('CustomUserAnnouncements');
              $newItem->set('user_id',5);
              $newItem->set('date_pub',strtotime("now"));
              $newItem->set('content','Tra-lya-lya');
              if(!$newItem->save()){
                return 'Error save';
              }
              return 'Ok, save!';

              Запускаем нашу тестовую страницу и видим Ok, save!
              Открываем БД, и смотри - YES!
              Вот и всё.
                Valentin Rasulov - Industrial design (Hobbies - Web Development)
                Development not standard projects on CMF MODx Revolution.
                Small sample of extensions
                • 39274
                • 4 Posts
                Огромное спасибо! все работает! теперь все встало на свои места=)
                  • 44161
                  • 1 Posts
                  Может быть зря поднимаю старую тему, но.

                  При попытке повторить вышеуказанные действия для создания собственных таблиц получаю:

                  City::load() is not a valid static method.

                  $tablename = "City";
                  $modx->addPackage( "MK", MODX_CORE_PATH ."components/MK/model", "mk_");
                  $result = $modx->getObject($tablename,1);


                  файл схемы

                  <?xml version="1.0" encoding="UTF-8"?>
                  <model package="MK" baseClass="xPDOObject" platform="mysql" defaultEngine="MyISAM" version="1.1">
                  	<object class="City" table="city" extends="xPDOObject">
                  		<field key="city_id" dbtype="int" precision="11" phptype="integer" null="false" index="pk"  generated="native" />
                  		<field key="name" dbtype="varchar" precision="1024" phptype="string" null="false" />
                  		<field key="deleted" dbtype="tinyint" precision="4" phptype="integer" null="false" default="0" />
                  
                  		<index alias="PRIMARY" name="PRIMARY" primary="true" unique="true" type="BTREE" >
                  			<column key="city_id" length="" collation="A" null="false" />
                  		</index>
                  	</object>
                  	<object class="Guide" table="guide" extends="xPDOObject">
                  		<field key="guid_id" dbtype="int" precision="11" phptype="integer" null="false" index="pk"  generated="native" />
                  		<field key="name" dbtype="varchar" precision="1024" phptype="string" null="false" />
                  		<field key="langkey" dbtype="varchar" precision="1024" phptype="string" null="false" />
                  
                  		<index alias="PRIMARY" name="PRIMARY" primary="true" unique="true" type="BTREE" >
                  			<column key="guid_id" length="" collation="A" null="false" />
                  		</index>
                  	</object>
                  	<object class="LngCity" table="lng_city" extends="xPDOObject">
                  		<field key="lang" dbtype="varchar" precision="2" phptype="string" null="false" />
                  		<field key="id" dbtype="int" precision="11" phptype="integer" null="false" index="index" />
                  		<field key="name" dbtype="varchar" precision="1024" phptype="string" null="false" />
                  
                  		<index alias="id" name="id" primary="false" unique="false" type="BTREE" >
                  			<column key="id" length="" collation="A" null="false" />
                  		</index>
                  	</object>
                  </model>