Как получить целевой URL-адрес для объекта перед перезаписью?

magento.stackexchange https://magento.stackexchange.com/questions/4633

  •  16-10-2019
  •  | 
  •  

Вопрос

Предположим, я хочу открыть страницу контактов: {веб-сайт}/контакты, эта страница также представлена следующим образом {веб-сайт}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().Это сопоставление происходит после обычного сопоставления стандартного маршрута.Вы можете воспользоваться многими маршрутами, чтобы добраться туда:

Эта информация хранится в 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').Итак, это позволяет вам найти целевой путь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top