Ресурсы в своей таблице
Всем привет! Подскажите как из своей таблицы, которая содержит аналог стандартных ресурсов (имя, текст, автор, сформированный кастомный url) получить эту страницу. Т.е. как мне заставить modx при указании в адресной строке url хранящегося в таблице отобразить страницу с данными из таблицы соответствующими указанному url.
Комментарии: 22
аналог стандартных ресурсов (имя, текст, автор, сформированный кастомный url)Вы её расширяли?
нет, полностью своя
Вообще проще расширить. Непонятно зачем такая таблица =)
Если без расширения => у modx есть событие onPageNotFound на которое можно повесить плагин и загружать, что угодно.
Если без расширения => у modx есть событие onPageNotFound на которое можно повесить плагин и загружать, что угодно.
Да просто каша в голове. Где можно почитать про расширение стандартных таблиц? Метод с плагином на несуществующую страницу обдумывал, что-то мне так не нравится )) Да и вообще это вопрос чисто академический, хочется понять как это реализовано стандартными средствами modx, за это какой-то процессор отвечает?
На modhost берете тестовый аккаунт, устанавливаете галочку напротив приложения CMPGeneratorPro (кстати, в магазине есть видео, лучше посмотреть). Создаете приложение и смотрите как расширяется класс, экспериментируете и т.д.)
А вообще для общего понимания, как расширяется класс, лучше подтянуть ООП наврно, если я правильно понял
А вообще для общего понимания, как расширяется класс, лучше подтянуть ООП наврно, если я правильно понял
что-то я окончательно запутался )))
класс у меня расширяется xPDOSimpleObject
класс у меня расширяется xPDOSimpleObject
А нужно modResource наверно =)
Так вы хотите расширить существующий класс, создать свой класс или написать компонент что бы его вызывать в админке?
Спасибо! Делаю пока так:
<?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);
}
Продолжаю разбираться, буду рад советам.
А если пытаюсь выбрать так:
$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'
)
Где моя ошибка, подскажите.
нету, есть id_request
Пойду попробую добавить)))
Пойду попробую добавить)))
еще primary key на столбец с id поставьте.
Действительно, дело было в этом, спасибо!
Все получается как я и задумал. Теперь уперся как использовать шаблон на той странице, где формируется вывод моего «ресурса»
Т.е. я укажу чанк оформления всего своего вывода из таблицы, но хочу еще уже имеющийся шаблон применить ко всей странице
Т.е. я укажу чанк оформления всего своего вывода из таблицы, но хочу еще уже имеющийся шаблон применить ко всей странице
Я бы на твоем месте использовал компонент VirtualPage. Он позволяет удобно работать с виртуальными страницами. Страницам можно назначить нужный шаблон и в шаблоне запрашивать контент как тебе нужно.
Кстати да, для простоты реализации самое оно…
Спасибо за совет, но все же хотелось разобраться как это работает, не используя готовые дополнения.
Пока делаю так:
$modx->setPlaceholder('pagetitle', $requests->get('request_name'));
$modx->setPlaceholder('content', $requests->get('request_text'));
print $modx->getChunk('request_page');
die;
мои плейсхолдеры отрабатывают, в чанк засунул весь код шаблона, другие чанки тоже вызываются нормально, а вот сниппеты не хотят обрабатываться и fenom не работает…
Интересно получается. Разместил вызов тестового сниппета, который отправляет мне письмо. Получилось следующее. На странице выводится его вызов [[!test]], но и письмо приходит. Я в замешательстве. Предполагаю, что это из-за того, что я просто печатаю этот чанк:
print $modx->getChunk('request_page');
но если я делаю:return $modx->getChunk('request_page');
То получаю сначала кривой вывод из плагина, а потом, ниже, нормальную страницу 404 ошибки
Итак, добрался я опять до своего велосипеда.
Собственно подход с выводом чанка был естественно не верным. Внимательнее изучив заметку Василия о собственной маршрутизации сделал так:
Сейчас сниппет просто выводит массив:
Собственно подход с выводом чанка был естественно не верным. Внимательнее изучив заметку Василия о собственной маршрутизации сделал так:
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);
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.