Я работаю над проектом, который имеет специальный тип страницы, который проверяет одну буквенно-цифровую строку 250.
В идеале я бы хотел, чтобы структура URL работала так:
http://www.example.com/check/I1gdTVUsnezY9SDI8V0GS2mg7Y0IdG6MqjCZ8t1yejRdi0pKzyr7G28iF0fyxOW9Le9vg3op7NnuCE0unT7d09aN00Trn7xPYAjLRhqQ9k5aRlsThsTk0HaS966MCDb4aC23RW4Cl273e9YiWKFNm2STI75X1jnlZ684M7ejDpmWg1YfM32OpwX066bF5VTp5v0F5I42T2SWh8QhMc9GW9I2ZbuP7ykh710UHnLwQyA3BO7KitZWcCU0u9
Однако используя allowed_actions а также url_handlers стандартным способом я могу заставить его работать, только если я предваряю буквенно-цифровую строку «uid» — http://www.example.com/check/uid/string-goes-here
class CheckPage_Controller extends Page_Controller {
private static $allowed_actions = array(
'uid'
);
private static $url_handlers = array(
'uid/$uID' => 'uid'
);
Возможно ли, чтобы url_handlers работал только с переменной и без действий на пользовательской странице?
Вы можете определить маршрут без действий в вашем _config.php:
Director::addRules(100, array(
'check/$UID' => 'CheckPage_Controller'
));
и в вашем CheckPage_Controller Вы можете отловить запрос в функции index:
public function index() {
var_dump($this->request->allParams());die;
}
Но вы должны знать, что маршрут добавления перехватывает все запросы к / check / что угодно. Так что вам нужно определить другой URL для других вещей.
Предполагая, что у вас есть тип страницы «CheckPage» с $ URLSegment «check» и некоторые Dataobjects в отношении has_many, вы можете использовать расширение Nightjars для использования этого метода urlslug, который действительно элегантен:
https://github.com/NightJar/silverstripe-slug/
ATM — это не готовый модуль для установки, а расширение контроллера, которое вы можете настроить.
Если вам нужна дополнительная помощь, пожалуйста, предоставьте больше информации о вашей структуре кода.