[VirtualPage] - Виртуальные страницы.
Реализует виртуальные страницы для MODx.
Планировался для modstore.pro/packages/users/userprofile, но руки дошли только сейчас.
Роутинг реализован на github.com/nikic/FastRoute

cоздание маршрута

Определены:
согласно FastRoute
например нам нужно задать страницу пользователя, пишем в маршрут
событие
Событие по наступлении которого срабатывает роутинг.

обработчик
Определены:
Все именованные параметры fastrouter можно получить в $_REQUEST. Ключ по умолчанию 'fastrouter'
при обработчике тип — ресурс, параметры также доступны в плейсходерах с префиксом vp.
Внимание
Пакет не рекомендую пока ставить на рабочие проекты. Подлежит обкатке…
ps. замечания и предложения по коду пожалуйста оставляйте тут — github.com/vgrish/virtualpage/issues
for php: ">=5.4.0"
Планировался для modstore.pro/packages/users/userprofile, но руки дошли только сейчас.
Роутинг реализован на github.com/nikic/FastRoute

cоздание маршрута

- метод запроса (GET | POST)
- маршрут (согласно FastRoute)
- событие
- обработчик
Определены:
- GET,POST
- GET
- POST
согласно FastRoute
например нам нужно задать страницу пользователя, пишем в маршрут
/users/{id:[0-9]+}.html{id:[0-9]+} именованный параметр принимающий только цифрысобытие
Событие по наступлении которого срабатывает роутинг.

обработчик
Определены:
- ресурс — задействует метод sendForward
- динамический ресурс
- сниппет — обработает указанный сниппет и отдаст через exit
- чанк — обработает указанный чанк и отдаст через exit
Все именованные параметры fastrouter можно получить в $_REQUEST. Ключ по умолчанию 'fastrouter'
при обработчике тип — ресурс, параметры также доступны в плейсходерах с префиксом vp.
Внимание
Пакет не рекомендую пока ставить на рабочие проекты. Подлежит обкатке…
ps. замечания и предложения по коду пожалуйста оставляйте тут — github.com/vgrish/virtualpage/issues
for php: ">=5.4.0"
Комментарии: 183
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Как платил — так и работает… Еще вопросы есть?
Всем спасибо за мнение, что то объяснять я не намерен.
Или заказчик, деньгами, или разработчик, своим временем.
Какова была задумка заказчика/исполнителя?
В статье есть очень наглядный пример: /users/{id:[0-9]+}.html, это страница пользователя. Вы же не будете заводить отдельную страницу для каждого пользователя.
— ресурс — задействует метод sendForward
— сниппет — обработает указанный сниппет и отдаст через exit
в первом случае это ресурс (указываете в настройках обработчика), в котором вы вызываете какой либо сниппет, и в зависимости от полученных параметров у вас выводит информацию.
во втором случае даже нет ресурса, просто отдача результата сниппета на страницу.
Версия MODX 2.3.3, PHP 5.3.29
Что я делаю не так?
Допустим, нужно вывести форму редатирования профиля пользователя (или любого кастомного объекта).
Урл страницы имеет вид:
Прописываю в vp.конфиге вот такой маршрут:
выбираю метод GET и любое из событий.
На нужном ресурсе грузится форма редактирования, в которую подставляются значения нужного объекта (который был предварительно найден и отрендерен собственным сниппетом).
Т.е. я к чему — всё работает, всё супер.
Но.
Как только я нажимаю кнопку сабмита в форме — всё, пиши пропало — отдаётся 404.
В массиве REQUEST лежат и данные из формы, и параметр q с урлом.
Метод $virtualpage->getMethod() возвращает $_SERVER['REQUEST_METHOD'].
И вот нюанс — если request-метод равен POST, то в этом массиве параметра q нету. Оно и понятно — в этот момент он спокойно лежит в $_GET. И, соответственно, VP подцепить урл уже не может.
Вот и валится на 404.
Но ведь это же не правильно!
Как же быть?
Предлагаю свой вариант решения такой ситуации.
Там добавилась константа и немного дописан метод doRoutes. По коду, в принципе, всё понятно, но, в случае чего, пишите.
Надеюсь, что коммит примите и мне не нужно будет держать свою ветку VirtualPage)
p.s. А компонент очень полезный. Так что, спасибо за него!
То есть если нам нужна еще и отправка форм — то добавить такой же обработчик с POST и все…
а вот этим
вы прерываете дальнейшую обработку возможных маршрутов…
У нас же несколько событий, не только notfound.
Спасибо огромное за обкатку!
ps. Добавил создание одинаковых маршрутов с разными методами, добавил чанк в обработчики.
Новую версию можно собрать с гитхаб.
Это было первым, что я попробовал сделать) Да только вот в тот момент получал ae-ошибку. Already exists, тобишь.
Вам спасибо)
И всё-таки мне кажется, что логичнее было бы сделать третий вариант — POST/GET, который бы реагировал на оба этих request-метода, чтобы не дублировать и не плодить одинаковые маршруты с одинаковыми обработчиками.
Т.е. исключительно POST, исключительно GET и вариант, реагирующий на всё, который бы был включён по умолчанию.
Когда у меня в компонентах по несколько десятков сущностей, с каждой из которых нужны crud-операции с фронта — конфиг сильно раздуется. Это, конечно, не смертельно. Так, просто пожелание :-)
Кстати. Мы тут недавно канонические урлы обсуждали и я там сниппет для seo-шного тега meta rel=canonical накидал. Так вот встал вопрос — а как получить сработавший маршрут из VirtualPage, чтобы подставлять их в этот тег, вместо [[~[[*id]]]]? Есть какие-нибудь варианты как это можно сделать? Может сработавший урл в плейсхолдер помещать? Имя которому задавать в настройках компонента. Тогда можно было бы делать как-то так:
Добавил POST/GET и плейсходер uri.
Новая версия пока на гитхаб. Пробуй.
p.s. если бы имя плейсхолдеру можно было бы в настройках задавать — то было бы прям ваще :)
А то ж ситуации разные бывают — мало ли где названия перекрываться смогут, всякое возможно.
Забирай с префиксами…
настройка плейсходеры
В маршруты добавлена настройка плейсходеры, запись в формате json (плейсходер: значение). Соответственно плейсходеры будут доступны в обработчике.
динамический ресурс
Добавлен новый обработчик — «динамический ресурс». Идея заимствована у Василия, подробности тут.
Добавил кэширование динамических страниц. Тестируем, отписываемся…
Parse error: syntax error, unexpected '[' in… \core\components\virtualpage\model\lib\fastroute\src\functions.php on line 12
Ваш компонент очень нужный, но, к сожалению, множество проектов стоит на PHP 5.3.
21 марта Вы говорили, что поправите код. Скажите, когда примерно ожидать этих изменений?
и вообще можно ссылки разделять на контексты, выбирать в каком они будут работать)
Объясните подробнее где и с какой целью это необходимо…
Спасибо!
К примеру, у меня два контекста:В разных контекстах работают разные правила маршрутизации.
Либо в параметр «маршрут» надо указать хост, вот так:
А для второго контекста маршруты будут прописываться так:
/page/letter-{get:[A-Za-zА-Яа-я0-9]}
не работает с рус буквой, а с англ/цифрам работает
/food/{food:(eda|cat|cat_dog)}
По поводу ссылок для разных контекстов, нет в планах?
могу сказать что у меня тоже работает…
Или давайте подробнее поясняйте. Какая регулярка, какой адрес и тд… Что не работает.
ps. Пример подробного вопроса — modx.pro/components/5035-virtualpage-virtual-page/#comment-36865
Сайт: http://s1581.h3.modhost.pro/test/letter-(ТУТ БУКВА)
регулярка: /test/letter-{get:[a-zа-пр-я0-9]}
Я не спец по регуляркам, но думаю это из за кирилицы.
Попробуйте решение в лоб
/food/{food:(eda|cat|cat_dog)}
P.S. По мимо cURL, какие-то дополнительные обновления для PHP нужно устанавливать? cURL я вчера поставил.
Скорее всего у вас этот пакет не стоит.
Или ручками создайте нужные чанки или установите Theme.Bootstrap
А вот же я скинул, все норм вроде там
Посмотрю в чем дело.
1) Надо было включить ЧПУ
2) в файл .htaccess вставил
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
Action php5.4-script /cgi-bin/php5.4.cgi
AddType php5.4-script .php
1) clip2net.com/s/3ivIc4I тут я создаю новый обработчик типа «Динамический ресурс», задаю ему имя, тип Динамический ресурс, предлагается выбрать по какому шаблону будет генерится видимо, выбираю свой шаблон, и пишу описание, которое я так понял ни где не должно во фронте фигурировать. Сохраняю
2) clip2net.com/s/3ivIo1v получаю страницу оформленную в своем шаблоне, но вместо результата работы сниппета, текст описания (?)…
3)Иду снова в обработчики, открываю свой созданный обработчик и там вижу: clip2net.com/s/3ivIyGk
где селект запись почему уже не перечень шаблонов а перечень ресурсов сайта.
Кстати пробовал с остальными типами, все так же глючат кроме типа «Ресурс», который работает корректно без проблем.
Может чтото не так делаю или не так понял?
будет время поправлю.
Вообщем глюк да только с отображением названия, то что показано на скринах.
А работы динамического ресурса получилось добиться, проставив вместо сниппета чанк в котором вызывается сниппет. И вроде заработало, только все равно зачем-то в теге h1 дополнительно выше вывода чанка на страницу вставляется содержимое «Описания».
Впринципе можно тупо не писать описания обработчику да и все :)
Parse error: syntax error, unexpected '[' in /home/aqq13706/public_html/мой сайт.ru/core/components/virtualpage/model/lib/fastroute/src/functions.php on line 12
Подскажите пожалуйста, может кто-то сталкивался? Может из-за контекстов? MODX Revolution 2.3.3-pl. Пакет пробовал переустанавливать, не помогло. А вообще цель установки VirtualPage это UserProfile.
Спасибо!
Фрагментом кода здесь не ограничишься. Нужны проверки при загрузке, ресайз после загрузки, и удаление старых автарок при обновлении.
Пробовал менять маршруты со стандартного:
на:
Хостинг modhost, Modx 2.4.0-pl
Сейчас хотел попробовать на тестовом modhost, блин, userprofile2 не ставится пишет останавливается на: Trying to install pdoTools. Please wait…
Еще остается в верхнем меню в приложениях:
Как удалить его окончательно? И связан ли компонент userprofile2 с этим? Его тоже не могу корректно удалить.
В базе таблицы остались:
— пункты меню удалите в админке /manager/?a=system/action
— userprofile2 связан с virtualpage. удалить аналогично virtualpage. Таблицы удалить руками в базе.
Удалила, но все равно пишет при обновлении кэша:
Причина удаления: устаревший плагин стал мешать отрисовке тикетов в админке. После удаления проблемы не стало, но в логах остались ошибки
Удалите плагин vpSystem от пакета.
У меня одного так?
Это если пользователь авторизован. У гостей всё нормально. Нотисы на хостинге отключены.
Откуда эта ошибка и как её исправить?
ps. поправлю в ближайшее время.
pps. А нечего с модхоста было переходить)))
Я точно то же самое заказчику твержу…
В базе этих строк не нахожу, как избавится от этого бага?
Было предложено такое решение — в сниппете при отсутствии объекта редиректить на 404
В каком именно сниппете?
создать плагин на vpOnResourceAfterCreate
в нем проверяйте актуальность своих данных и если их нет то просто отправляете пользоваетля на страницу ошибок.
то есть ваша проверка будет выглядеть примерно так
написано приблизительно, с easyComm не имел дела.
ps. можете скинуть доступ к сайту на почту, я посмотрю.
Нашёл также такой вариант вызова:
Но также приводит к циклическому редиректу.
Как правильно то перебросить на страницу 404?
Скорее всего у вас обработчик на событие OnPageNotFound и в нем же вы посылаете снова на sendErrorPage.
Смените событие на OnHandleRequest и думаю все будет ок.
На OnPageNotFound вроде своего ничего не висит. Но вариант сменить событие на OnHandleRequest сработал и теперь появляется страница 404.
Спасибо за помощь.
Я имел ввиду что у вас обработчик висел на нем. И в нем же вы вызывали sendErrorPage, а что такое sendErrorPage смотрим тут github.com/modxcms/revolution/blob/d79ec5e8c24df577cb6064f6d5468ec776207bd1/core/model/modx/modx.class.php#L1162
и что он делает вот тут github.com/modxcms/revolution/blob/d79ec5e8c24df577cb6064f6d5468ec776207bd1/core/model/modx/modx.class.php#L1174?
вызывает снова OnPageNotFound — вот вы и получали рекурсию.
Событие стоит OnHandleRequest (http://prntscr.com/a9srqd)
Плагин vpOnResourceAfterCreate не срабатывает.
Куда дальше копать?
Вот мои настройки?
Маршруты — prntscr.com/a9t2in
Обработчик — prntscr.com/a9t1xa
Плагин vpOnResourceAfterCreate
<?php
switch ($modx->event->name) {
case 'vpOnResourceAfterCreate':
$fastrouter = $modx->getOption('fastrouter', $_REQUEST, array());
$id = $modx->getOption('id', $fastrouter);
if (!$modx->getCount('easyComm', $id)) {
$modx->sendErrorPage();
}
break;
}
ps. не забывайте оформляйте код.
в $_REQUEST у вас будет массив, в fastrouter — будут лежать переменные cat и id
и вот по этим переменных можно осуществлять вывод каких то данных.
если предположить что у вас есть переменная id в маршруте плагин будет выглядеть таким образом как вы и написали
думаю у вас нет параметра id в маршруте.
ps. опять же это все предположения. Задавая вопросы подробнее описывайте проблему.
Более 1000 пустых страниц. Надо их всех на 404 переадресовать
Непосредственно в таблице строчки хорошо drug-n-drop'ятся, но вот на порядок обработки маршрутов это совсем не влияет. Приходится создавать по-новой все маршруты в порядке, в котором они должны отрабатывать (видимо порядок обработки всета-ки идет по полю ID, а не по полю RANK). Вот такие вот дела. Никто больше не сталкивался с таким странным поведением дополнения?
А также чистил кэш через «Управление» ->«Обновить сайт»
плагин vpOnResourceAfterCreate:
<?php
switch ($modx->event->name) {
case 'vpOnResourceAfterCreate':
$fastrouter = $modx->getOption('fastrouter', $_REQUEST, array());
$id = $modx->getOption('id', $fastrouter);
if (!$modx->getCount('easyComm', $id)) {
$modx->sendErrorPage();}
break;
}
Обработчик — prntscr.com/aczgxn
вот тут тестовый сайт — s4692.h2.modhost.pro/
s4692
0aDvdt5CPorB
страница 1 — s4692.h2.modhost.pro/test/1
страница 2 — s4692.h2.modhost.pro/test/2
страница 3 — s4692.h2.modhost.pro/test/3 и тд
как видите если нет ресурса то идет редирект на 404.
плагин тут — s4692.h2.modhost.pro/manager/?a=element/plugin/update&id=5
вам нужно лишь заменить modResource
Виртуальные страницы используются для easyComm (вопрос-ответ). Для каждого вопроса, своя страница ().
Страница с вопросом и ответом — Пустая страница выглядит так — ID пустой страницы нет в списке easyComm (вопросов), так же и в базе данных.
Пустые страницы появляются после удаления вопросы из easyComm —
Тоже самое только [[+page]]
В шаблоне выводим [[*content]], вижу только текст.
я же спрашивал возможно ли менять динамично, к примеру в описании страницы и заголовке использовать данные из самой страницы, на каждую же не будешь делать свой сниппет и вызывать для обозначения заголовков, ключевых слов. Понимаю что нужно в таком случае воспользоваться ресурсами, а не виртуальными страницами, но все же вопрос остается открытым)
Но есть один баг в админке, который есть довольно давно.
Проблема в графе «Запись» в обработчике. После пролистывания списка записей, данные не меняются:
Перестала работать :( 404 всегда
Еще заметил, что изменился массив. Теперь получать надо так:
Раньше достаточно было:
Так задумано?
т.е. есть услуги, их мне надо продублировать в раздел:
работаем по районам->район->url_услуга_из_раздела_услуг.
в обработчике Тип: динамический, Запись: шаблон конкретной услуги
чтобы не плодить ресурсы, как достать поля pagetitle и другие нужного документа? заранее спасибо.
если используете шаблонизатор то можно прям в нем получить ресурс и вывести нужные поля, если нет то простенький сниппет в котором получаете ресурс.
prntscr.com/d5ja79
prntscr.com/d5jak1
что мне дальше делать?
не совсем понял вот это:
т.е. в шаблоне? я не силен в php подскажите пожалуйста как получить.
id ресурса у вас будет в плейсходере [[!+vp.id]]
выводит не то что надо. у меня тут есть ее кое какие ресурсы в районе, выводит все их pagetitle.
в логах появляется:
проверил что в [[!+vp.id]] — alias района но не id нужного ресурса.
пробывал заменить маршрут на /rajon/{page}/{alias}.html перестал его выводить, вообще не чего не вывел.
структура админки у меня такая: prntscr.com/d5kt1l
значит вы где то неправильно формируете ссылку…
если вы плаваете в таких вещах то попросите кого то помочь…
спасибо. сразу не сообразил
К сожалению, не силен в пхп поэтому вынужден задавать тупые вопросы))
страницу вывожу через шаблон вот так:
создал плагин на событие: vpOnResourceAfterCreate
Спасибо.
что то выводится просто белый экран. а не 404. не отрабатывает по ходу sendErrorPage, с чем это может быть связано? Знаете? Шаблон 404 задан в сист. настройках error_page (id ресурса).
Попробуйте повторить ситуацию на тестовом сайте.
Сможете объяснить в чем может быть проблема?
У меня созданы с десяток маршрутов, обработчиков, висящих на OnHandleRequest.
Стокнулся с непонятностью, кратко:
Маршрут: /users/{user:[0-9]+}/
Т.е. страницы вида /users/1532/, на которых я показываю информацию о пользователе, метод — GET, событие — логично, что onHandleRequest.
Обработчик — Ресурс, в котором вызывается некий сниппет, получающие данные пользователя.
Делаю в сниппете простую проверку, что пользователь существует, и если его нет — то хочу показать 404
так вот это приводит к зацикливанию, скрипт или вываливается по времени или по памяти).
Как правильно 404 ошибку то показать в таком случае?.. Выше похожий случай разбирали и пришли в итоге к тому, что нужно событие поменять на OnHandleRequest, но мне не помогает это.
И MODX и VirtualPage последних версий.
по тому описанию что вы дали так же должно все работать.
Создайте тестовый сайт и продемонстрируйте проблему там.
Спасибо!
Сделал все:
s8738.h7.modhost.pro/
Админка s8738 / ZEnzfcpZMFXA
Если в шаблоне используется
то все работает, а если
то труба, не фурычит.
Можешь зайти, попробовать, постарался все максимально упростить, обработчик на странице page, сниппет — snippet.
Либо смените тип на динамический, либо делайте например
выдаст просто сообщение Page not found
Есть запись типа
а что если сменят alias — «shkola» и «treneryi»? по идее будет 404?
пробовала указать /{pagetitle}/nagradi.html — перестает работать, 404.
Спасибо!)
или как сделать первую часть динамической?
типа
Предполагаю, а вдруг изменять Alias у контейнера?
ЕДинственное, пришедшее в голову решение — писать плагин
так задайте маршрут типа
и все
как сделать хлебные крошки? а то сейчас показывает ГЛАВНАЯ
Это полностью переписывать шаблон, получать по uri id ресурса, получать его поля и выставлять их плейсхолдерами?
То есть если на странице у меня было [[*pageitle]], то будет [[+pagetitle]]?
Чанк-шаблон страницы pastebin.com/z8hJrFCy. Всё вызывается как надо, s9939.h8.modhost.pro/users/33. Элемент с комментариями #user_comments_ajax_row
При попытке подгрузить методом .get Jquery приходит всё, но на месте вызова !pdoPage пустота. s9939.h8.modhost.pro/blog-glavnogo-vracha/ клик на «запись 2», клик на пользователя.
Подскажите пожалуйста как правильно прописать в маршрут артикул товара, если он является опцией msoptionprice?
как вообще правильно организовать виртуальные страницы из опций?
Выпадает в 500 ошибку.
Нужен конкретный ресурс, чтобы привязать комментарии к реальной странице, а не к виртуальной.
Либо как виртуальной задать id, чтобы по нему выводить комментарии
Метод getUri(),
Ныне он называется «request_param_alias».
Например, пришёл параметр {par1} из маршрута как catalog, меняю его на shop и на выходе должен получится не domain/catalog/, а domain/shop/. Есть ли какой-то метод?
Можно сделать средствами MODX или веб-сервера
Есть опции: Амперы(amper), Вольты(volt), Давление(davlenie) и хотелось бы вывести
/options/amper/
/options/volt/
/options/davlenie/
Реально ли так реализовать?
Просим Володю обновить модуль ;)
Доки github.com/vanchelo/modxFastRouter
а то очень хотельбы узнать а как быть с заголовками и все такое?
можно как-то после такого кастомного роутинга вернуться к стандартному
ну чтобы в один маршрут обрабатывался и VP и modx стандартными способами