Ресурсы в своей таблице

Всем привет! Подскажите как из своей таблицы, которая содержит аналог стандартных ресурсов (имя, текст, автор, сформированный кастомный url) получить эту страницу. Т.е. как мне заставить modx при указании в адресной строке url хранящегося в таблице отобразить страницу с данными из таблицы соответствующими указанному url.
Андрей
26 сентября 2017, 18:28
modx.pro
2 271
0

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

Александр
26 сентября 2017, 22:54
0
аналог стандартных ресурсов (имя, текст, автор, сформированный кастомный url)
Вы её расширяли?
    Андрей
    26 сентября 2017, 23:10
    0
    нет, полностью своя
      Александр
      26 сентября 2017, 23:15
      0
      Вообще проще расширить. Непонятно зачем такая таблица =)
      Если без расширения => у modx есть событие onPageNotFound на которое можно повесить плагин и загружать, что угодно.
        Андрей
        26 сентября 2017, 23:23
        0
        Да просто каша в голове. Где можно почитать про расширение стандартных таблиц? Метод с плагином на несуществующую страницу обдумывал, что-то мне так не нравится )) Да и вообще это вопрос чисто академический, хочется понять как это реализовано стандартными средствами modx, за это какой-то процессор отвечает?
          Александр
          26 сентября 2017, 23:32
          0
          На modhost берете тестовый аккаунт, устанавливаете галочку напротив приложения CMPGeneratorPro (кстати, в магазине есть видео, лучше посмотреть). Создаете приложение и смотрите как расширяется класс, экспериментируете и т.д.)
          А вообще для общего понимания, как расширяется класс, лучше подтянуть ООП наврно, если я правильно понял
            Андрей
            26 сентября 2017, 23:40
            0
            что-то я окончательно запутался )))
            класс у меня расширяется xPDOSimpleObject
              Александр
              26 сентября 2017, 23:42
              0
              А нужно modResource наверно =)
    Павел Карелин
    27 сентября 2017, 00:27
    0
    Так вы хотите расширить существующий класс, создать свой класс или написать компонент что бы его вызывать в админке?
        Андрей
        27 сентября 2017, 10:14
        +1
        Спасибо! Делаю пока так:
        <?php
        define('MODX_API_MODE', true);
        require_once($_SERVER['DOCUMENT_ROOT'] . '/index.php');
        $modx->getService('error', 'error.modError');
        $modx->setLogLevel(modX::LOG_LEVEL_INFO);
        $modx->setLogTarget(XPDO_CLI_MODE ? 'ECHO' : 'HTML');
        if ($modx->event->name != 'OnPageNotFound') {return false;}
        $alias = $modx->context->getOption('request_param_alias', 'q');
        if (!isset($_REQUEST[$alias])) {return false;}
        $request_url = $_REQUEST[$alias];
        $modx->addPackage('requests', MODX_BASE_PATH . 'core/components/requests/model/', '2opp37_');
        $sql = "SELECT * FROM  `2opp37_requests` WHERE request_url LIKE '" . $request_url . "'";
            $q = $modx->prepare($sql);
            $q->execute(array(0));
            $arr = $q->fetchAll(PDO::FETCH_ASSOC);
             foreach ($arr as $v) {
            	$arr = $v;
                print '<pre>';
                print_r($arr);
            }
        Продолжаю разбираться, буду рад советам.
        Андрей
        27 сентября 2017, 10:44
        0
        А если пытаюсь выбрать так:
        $where = array(
            'request_url' => $request_url
        );
        $requests = $modx->getObject('Requests', $where);
         print '<pre>';
          print_r($requests->get('request_name'));
        die;
        То получаю ошибку:
        [2017-09-27 10:42:54] (ERROR @ /core/xpdo/om/xpdoobject.class.php : 240)
        Error 42S22 executing statement: 
        Array
        (
            [0] => 42S22
            [1] => 1054
            [2] => Unknown column 'Requests.id' in 'field list'
        )
        Где моя ошибка, подскажите.
          Александр
          27 сентября 2017, 10:52
          +1
          У Вас в таблице столбец ID есть?

          modx.pro/help/13030/
            Андрей
            27 сентября 2017, 10:53
            0
            нету, есть id_request
            Пойду попробую добавить)))
              Александр
              27 сентября 2017, 11:06
              0
              еще primary key на столбец с id поставьте.
                Андрей
                27 сентября 2017, 11:19
                0
                Действительно, дело было в этом, спасибо!
          Андрей
          27 сентября 2017, 11:47
          0
          Все получается как я и задумал. Теперь уперся как использовать шаблон на той странице, где формируется вывод моего «ресурса»
          Т.е. я укажу чанк оформления всего своего вывода из таблицы, но хочу еще уже имеющийся шаблон применить ко всей странице
            Иван Бондаренко
            27 сентября 2017, 12:51
            +2
            Я бы на твоем месте использовал компонент VirtualPage. Он позволяет удобно работать с виртуальными страницами. Страницам можно назначить нужный шаблон и в шаблоне запрашивать контент как тебе нужно.
              Александр
              27 сентября 2017, 13:01
              0
              Кстати да, для простоты реализации самое оно…
                Андрей
                27 сентября 2017, 13:30
                +1
                Спасибо за совет, но все же хотелось разобраться как это работает, не используя готовые дополнения.
                Андрей
                27 сентября 2017, 15:53
                0
                Пока делаю так:
                $modx->setPlaceholder('pagetitle', $requests->get('request_name'));
                $modx->setPlaceholder('content', $requests->get('request_text'));
                print $modx->getChunk('request_page');
                die;
                мои плейсхолдеры отрабатывают, в чанк засунул весь код шаблона, другие чанки тоже вызываются нормально, а вот сниппеты не хотят обрабатываться и fenom не работает…
                  Андрей
                  27 сентября 2017, 19:34
                  0
                  Интересно получается. Разместил вызов тестового сниппета, который отправляет мне письмо. Получилось следующее. На странице выводится его вызов [[!test]], но и письмо приходит. Я в замешательстве. Предполагаю, что это из-за того, что я просто печатаю этот чанк:
                  print $modx->getChunk('request_page');
                  но если я делаю:
                  return $modx->getChunk('request_page');
                  То получаю сначала кривой вывод из плагина, а потом, ниже, нормальную страницу 404 ошибки
                    Андрей
                    29 сентября 2017, 09:30
                    +1
                    Итак, добрался я опять до своего велосипеда.
                    Собственно подход с выводом чанка был естественно не верным. Внимательнее изучив заметку Василия о собственной маршрутизации сделал так:
                    define('MODX_API_MODE', true);
                    require_once($_SERVER['DOCUMENT_ROOT'] . '/index.php');
                    if ($modx->event->name != 'OnPageNotFound') {
                        return false;
                    }
                    $alias = $modx->context->getOption('request_param_alias', 'q');
                    if (!isset($_REQUEST[$alias])) {
                        return false;
                    }
                    $request_url = $_REQUEST[$alias];
                    $modx->addPackage('requests', MODX_BASE_PATH . 'core/components/requests/model/', '2opp37_');
                    $where = array(
                        'request_url' => $request_url
                    );
                    if(!$requests = $modx->getObject('Requests', $where)){return false;}
                    if (!$section = $modx->getObject('modResource',10)) {
                    		return false;
                    	}
                    
                    $id_request = $requests->get('id');
                    $_GET['my|req'] = $_REQUEST['my|req'] = $id_request;
                    $modx->sendForward(10);
                    die;
                    Соответственно создал ресурс (id=10), которому указал желаемый шалблон, в контексте этого ресурса вызываю сниппет в котором планирую обработать массив $_REQUEST и сформировать нужный мне вывод (пока не пробовал).
                    Сейчас сниппет просто выводит массив:
                    global $modx;
                    print '<pre>';
                    print_r($_REQUEST);
                      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                      22