题
假设我想打开联系页面: {网站}/联系人, ,此页面也像 {网站} cms/page/view/id/12.
是否有可能以某种方式获取此URL({网站} cms/page/view/id/12)?我试图从请求对象中获取它,但没有成功。
UPD
也许我是抽象的。当我在某个页面上:产品,博客,CMS时,我需要一些唯一的值,这些价值将在我打开时标识此页面。每次。我认为这可能是这样的URL。
解决方案
如果我正确理解您的帖子,您希望唯一地识别任何给定的请求资源,而不仅仅是CMS页面,对吗?
正如您发现的那样,在大多数情况下工作正常,除了对于page_id param未添加到请求路径信息的CMS页面。
在大多数情况下,以下内容应足够,尽管您可能需要将其自定义用于分层导航查询参数等。
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
- (页面实体ID) 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在mage_core_model_cache :: _允许cacheoptions中设置为false。因此,您的块没有保存在缓存中。生成页面后,FPC填充容器时,尚未设置请求Pathinfo(仍然是SEO URL,即'/profoduct-name.html')。因此,这使您可以查找目标路径。