Как получить целевой URL-адрес для объекта перед перезаписью?
Вопрос
Предположим, я хочу открыть страницу контактов: {веб-сайт}/контакты, эта страница также представлена следующим образом {веб-сайт}cms/страница/просмотр/id/12.
Можно ли каким-то образом получить этот URL-адрес ({веб-сайт}cms/страница/просмотр/id/12)?Я пытаюсь получить это из объекта запроса, но безуспешно.
UPD
Может быть, я должен был абстрагироваться.Когда я нахожусь на какой-то странице:продукт, блог, cms - мне нужно какое-то уникальное значение, которое идентифицирует эту страницу, когда я ее открою.Каждый раз.Я думал, что это может быть такой URL-адрес.
Решение
Если я правильно понял ваш пост, вы хотите однозначно идентифицировать любой данный запрашиваемый ресурс, а не только страницы CMS, верно?
Как вы выяснили, в большинстве случаев это работает нормально, за исключением страниц CMS, где параметр page_id не добавляется к информации о пути запроса.
В большинстве случаев следующего должно быть достаточно, хотя вы можете захотеть настроить его для аргументов многоуровневого навигационного запроса и тому подобного.
public function getRequestIdentifier()
{
$req = $this->getRequest();
$params = array('page_id', 'id', 'category', 'p', 'limit', 'order');
$parts = array(
$req->getModuleName(), $req->getControllerName(), $req->getActionName()
);
foreach ($params as $p) {
$value = $req->getParam($p, false);
if (false !== $value) {
$parts[] = $p;
$parts[] = $value;
}
}
return implode('/', $parts);
}
Другие советы
Для страниц CMS маршрут является идентификатором.Это соответствует методу Mage_Cms_Controller_Router::match()
.Это сопоставление происходит после обычного сопоставления стандартного маршрута.Вы можете воспользоваться многими маршрутами, чтобы добраться туда:
- (канонический) http://demo.magentocommerce.com/about-magento-demo-store
- (идентификатор страницы) http://demo.magentocommerce.com/cms/page/view/page_id/about-magento-demo-store
- (идентификатор объекта страницы) http://demo.magentocommerce.com/cms/page/view/page_id/3
Эта информация хранится в cms_page
таблица.
Код (я думаю), который вам нужен, находится в Mage_Cms_Controller_Router::match()
способ.
Вот его адаптация.
Сначала вы получаете запрошенный идентификатор:
$request = Mage::app()->getRequest();//get the request: In the router class it is passed as a parameter but you can get it like this in your code
$identifier = trim($request->getPathInfo(), '/'); //the requested page identifier
Теперь проверьте, есть ли страница с запрошенным идентификатором в текущем представлении магазина.
$page = Mage::getModel('cms/page');//Mage_Cms_Model_Page instance
$pageId = $page->checkIdentifier($identifier, Mage::app()->getStore()->getId());//check for page id
if ($pageId) {
$rawUrl = 'cms/page/view/page_id/'.$pageId;
//or full url
$fullRawUrl = Mage::getUrl('cms/page/view', array('page_id'=>$pageId));
}
else{
//there is no cms page with this identifier.
}
Если вы используете корпоративный и полностраничный кэш и вам нужно получить целевой путь из пути запроса, вот некоторый код.Обратите внимание, что при этом предполагается, что вы добавляете .html к своим URL-адресам:
$app = Mage::app();
$request = $app->getRequest();
$storeId = $app->getStore()->Id();
$pathInfo = $request->getPathInfo();
if (is_numeric(strpos($pathInfo, '.html'))){
$requestPathWithHtml = substr($pathInfo, 1);
$requestPathWithoutHtml = substr($pathInfo, 1, strpos($pathInfo, '.html') - 1);
$rewriteCollection = Mage::getModel('enterprise_urlrewrite/url_rewrite')->getCollection();
$rewriteCollection->addFieldToFilter('request_path', array('in'=>array($requestPathWithHtml, $requestPathWithoutHtml)));
$rewriteCollection->addFieldToFilter('store_id', $storeId);
$size = $rewriteCollection->getSize();
if ($size>0){
$rewrite = $rewriteCollection->getFirstItem();
$pathInfo = $rewrite->getTargetPath();
}
}
$explodedPath = explode('/', $pathInfo);
foreach ($explodedPath as $i=>$part){
if ($part == 'id'){
$id = $explodedPath[$i+1];
}
}
Это произошло во время отладки корпоративного полностраничного кэша.Сначала страница генерируется нормально, но block_html имеет значение false в Mage_Core_Model_Cache::_allowedCacheOptions.Таким образом, ваш блок не сохраняется в кэше.После создания страницы, в то время как FPC заполняет контейнеры, запрос pathInfo еще не был задан (по-прежнему SEO URL, т.е.'/product-name.html').Итак, это позволяет вам найти целевой путь.