We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 26194
    • 4 Posts

    Возможно ли вручную создавать и использовать свои пользовательские таблицы в базе данных MySQL, к которой подключен MODx. Пробовал делать запрос через newQuery(’mytable’), но так ничего не выходит. Я так понял, что обязательно нужно создавать объекты xPDO (модели объектов типа modUser,modAccess и др.), чтобы MODx понимал, что он делает. Прочитал справку http://rtfm.modx.com/display/revolution20/Using+Custom+Database+Tables+in+your+3rd+Party+Components, но мне показалось, что это слишком, создавать кучу файлов, схему, билдер модели и т.д., всего лишь для того, чтобы сделать обычный SQL-запрос к любой таблице в базе.
    Что я пробовал делать:

    $query = $modx->newQuery('my_table');
    $query->where(array('name:LIKE' => '%a%'));
    $array = $modx->getCollection('my_table',$query);
    echo $array;
    foreach($array as $i => $item)
    {
       echo ($i.'->'.$item.'<br />');
    }
    


    Все, что я получаю в итоге это пустой объект Array на выходе. Может я просто где-то ошибаюсь?

      • 9085
      • 630 Posts
      Quote from: saralexybk at Dec 13, 2010, 08:49 AM

      всего лишь для того, чтобы сделать обычный SQL-запрос к любой таблице в базе.
      Попробуйте "по старинке" mysql_query или mysqli_ =)
        Правильно заданный вопрос повышает вероятность получения нужного ответа.
        Что-то не работает? Загляните в лог ошибок!
        Есть проблема? "Локализуйте" её!
        Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
        • 26194
        • 4 Posts
        Мне нужен именно pconnect запрос, а не разовый, поэтому хорошо бы это сделать через xPDO.
          • 9085
          • 630 Posts
          Quote from: saralexybk at Dec 13, 2010, 09:15 AM

          Мне нужен именно pconnect запрос, а не разовый, поэтому хорошо бы это сделать через xPDO.
          А как по-вашему pconnect связан с xPDO?

          Вообще, "через" PDO можно сделать что-то вроде:
          $dbh->exec('CREATE TABLE...');


          через xPDO тоже должно работать.
            Правильно заданный вопрос повышает вероятность получения нужного ответа.
            Что-то не работает? Загляните в лог ошибок!
            Есть проблема? "Локализуйте" её!
            Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
            • 26194
            • 4 Posts
            Посмотрел страничку http://api.modxcms.com/xpdo/xPDO.html, я понял, что нужно создавать новый объект new xPDO(..), чтобы использовать эти функции, а значит подключаться к базе данных и тратить время, нагружать базу,.. мне этого не нужно,.. вот к примеру следующий код
            <?php
            $query = $modx->newQuery('modUser');
            $query->where(array('id' => 1));
            $text = $modx->getCollection('modUser',$query);
            echo $text;
            foreach($text as $i => $item)
            {
            echo ('->'.$item->username.'<br />');
            }
            

            выдает Аrray->myusername, modx обращается через класс modUser к базе данных, все работает, а напрямую к базе обратиться не получается, требуется новое подключение создавать. Я нашел скрипт, который создает эти классы для всей базы данных, но не могу также ими воспользоваться как классом modUser, к примеру. В принципе создание классов происходит достаточно быстро и легко.
            Вот ссылка на скрипт
            http://rtfm.modx.com/display/revolution20/Reverse+Engineer+xPDO+Classes+from+Existing+Database+Table#ReverseEngineerxPDOClassesfromExistingDatabaseTable-CreateReverseEngineeringScript
            Однако, не могу никак разобраться как связать новые классы с modx, чтобы обращаться к ним например $modx->newQuery(’myClass’). Классы генерируются в папку /core/components/*mycomponent*/, как сделать чтобы они работали не понятно, тот же самый запрос (см. выше) с именем одного из новых классов в этой папке ’Catalog’ вместо ’modUser’ не работает,.. при этом файлы catalog.class.php и catalog.map.inc.php соответствуют структуре таких же файлов для класса modUser. ..Как приаттачить эти новые классы?

              • 9085
              • 630 Posts
              Quote from: saralexybk at Dec 13, 2010, 12:32 PM

              Посмотрел страничку http://api.modxcms.com/xpdo/xPDO.html, я понял, что нужно создавать новый объект new xPDO(..), чтобы использовать эти функции, а значит подключаться к базе данных и тратить время, нагружать базу,.. мне этого не нужно,..
              huh
              $result = $modx->exec("CREATE TABLE IF NOT EXISTS `test_table` (
                `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
                `test` char(1) NOT NULL DEFAULT '',
                PRIMARY KEY (`id`)
              ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ");
              print_r ($result);


              А по поводу классы аттачить - в Вашем же посте ссылочка на 3d party smiley
                Правильно заданный вопрос повышает вероятность получения нужного ответа.
                Что-то не работает? Загляните в лог ошибок!
                Есть проблема? "Локализуйте" её!
                Ответы на большинство вопросов по MODx | MODx RTFM | API Evo Revo | галопом по Европам Азиям smiley wikibooks(ru) Ditto(en) | Wayfinder e-book | Заметки и о MODx
                • 26194
                • 4 Posts
                Да, спасибо, я попробывал, действительно работает все, я видимо где-то в коде ошибся $modx->exec(..), у меня почему-то сразу он не заработал,.. пока разбирался со всеми этими делами, уже привык создавать собственные классы)) из xml моделей билдером, как показано здесь
                http://rtfm.modx.com/display/revolution20/Using+Custom+Database+Tables+in+your+3rd+Party+Components
                аттачил свой пакет, как указано здесь
                http://rtfm.modx.com/display/revolution20/Extending+modUser
                все работает, можно сразу коллекцию выдавать (getCollection(’myClass’)) или объект (getObject(’myClass’)), функции добавлять, красота))