書き換える前にエンティティのターゲットURLを取得する方法は?
質問
連絡先ページを開きたいとします: {website}/連絡先, 、このページも次のように表されています {website} cms/page/view/id/12.
どういうわけかこのURLを取得することは可能ですか({website} 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.
}
エンタープライズとフルページキャッシュを使用しており、リクエストパスからターゲットパスを取得する必要がある場合は、ここにコードがあります。これにより、URLに.htmlを追加することに注意してください。
$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::_ aoptorcacheoptionsでfalseとして設定されます。したがって、ブロックはキャッシュに保存されません。ページが生成された後、FPCがコンテナを埋めている間、要求PathInfoはまだ設定されていません(SEO URL、つまり '/product-name.html')。したがって、これにより、ターゲットパスを調べることができます。