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

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

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

Александр
26 сентября 2017, 22:54
аналог стандартных ресурсов (имя, текст, автор, сформированный кастомный url)
Вы её расширяли?
    Андрей
    26 сентября 2017, 23:10
    нет, полностью своя
      Александр
      26 сентября 2017, 23:15
      Вообще проще расширить. Непонятно зачем такая таблица =)
      Если без расширения => у modx есть событие onPageNotFound на которое можно повесить плагин и загружать, что угодно.
        Андрей
        26 сентября 2017, 23:23
        Да просто каша в голове. Где можно почитать про расширение стандартных таблиц? Метод с плагином на несуществующую страницу обдумывал, что-то мне так не нравится )) Да и вообще это вопрос чисто академический, хочется понять как это реализовано стандартными средствами modx, за это какой-то процессор отвечает?
          Александр
          26 сентября 2017, 23:32
          На modhost берете тестовый аккаунт, устанавливаете галочку напротив приложения CMPGeneratorPro (кстати, в магазине есть видео, лучше посмотреть). Создаете приложение и смотрите как расширяется класс, экспериментируете и т.д.)
          А вообще для общего понимания, как расширяется класс, лучше подтянуть ООП наврно, если я правильно понял
            Андрей
            26 сентября 2017, 23:40
            что-то я окончательно запутался )))
            класс у меня расширяется xPDOSimpleObject
Павел Карелин
27 сентября 2017, 00:27
Так вы хотите расширить существующий класс, создать свой класс или написать компонент что бы его вызывать в админке?
      Андрей
      27 сентября 2017, 10:14
      Спасибо! Делаю пока так:
      <?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
      А если пытаюсь выбрать так:
      $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
        У Вас в таблице столбец ID есть?

        modx.pro/help/13030/
          Андрей
          27 сентября 2017, 10:53
          нету, есть id_request
          Пойду попробую добавить)))
            Александр
            27 сентября 2017, 11:06
            еще primary key на столбец с id поставьте.
              Андрей
              27 сентября 2017, 11:19
              Действительно, дело было в этом, спасибо!
        Андрей
        27 сентября 2017, 11:47
        Все получается как я и задумал. Теперь уперся как использовать шаблон на той странице, где формируется вывод моего «ресурса»
        Т.е. я укажу чанк оформления всего своего вывода из таблицы, но хочу еще уже имеющийся шаблон применить ко всей странице
          Иван Бондаренко
          27 сентября 2017, 12:51
          Я бы на твоем месте использовал компонент VirtualPage. Он позволяет удобно работать с виртуальными страницами. Страницам можно назначить нужный шаблон и в шаблоне запрашивать контент как тебе нужно.
            Александр
            27 сентября 2017, 13:01
            Кстати да, для простоты реализации самое оно…
              Андрей
              27 сентября 2017, 13:30
              Спасибо за совет, но все же хотелось разобраться как это работает, не используя готовые дополнения.
              Андрей
              27 сентября 2017, 15:53
              Пока делаю так:
              $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
                Интересно получается. Разместил вызов тестового сниппета, который отправляет мне письмо. Получилось следующее. На странице выводится его вызов [[!test]], но и письмо приходит. Я в замешательстве. Предполагаю, что это из-за того, что я просто печатаю этот чанк:
                print $modx->getChunk('request_page');
                но если я делаю:
                return $modx->getChunk('request_page');
                То получаю сначала кривой вывод из плагина, а потом, ниже, нормальную страницу 404 ошибки
                  Андрей
                  29 сентября 2017, 09:30
                  Итак, добрался я опять до своего велосипеда.
                  Собственно подход с выводом чанка был естественно не верным. Внимательнее изучив заметку Василия о собственной маршрутизации сделал так:
                  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