製品ページからレビュー フォームを削除しました。これは、購入した製品のレビュー フォームが記載された特定の URL へのリンクが記載された電子メールを顧客に送信する拡張機能を使用しているためです。
しかし、ショップで製品を販売した場合、レビュー フォームを含む多かれ少なかれ非表示のページ (www.shop.com/productname/review) が必要です。
私はMagento1.6を使用しています
製品ページからレビュー フォームを削除しました。これは、購入した製品のレビュー フォームが記載された特定の URL へのリンクが記載された電子メールを顧客に送信する拡張機能を使用しているためです。
しかし、ショップで製品を販売した場合、レビュー フォームを含む多かれ少なかれ非表示のページ (www.shop.com/productname/review) が必要です。
私はMagento1.6を使用しています
これは間違いなく初心者向けではないので、Magentoの内部の仕組みに少し慣れていることを願っています:)。
controller_front_init_router
まず、次のようにイベントを観察することから始める必要があります。
<global>
<events>
<controller_front_init_routers>
<observers>
<controller_noroute>
<type>singleton</type>
<class>Namespace_Module_Controller_Router</class>
<method>initControllerRouters</method>
</controller_noroute>
</observers>
</controller_front_init_routers>
</events>
</global>
開発に携わったことがある方なら、コントローラーをオブザーバーとして使用するという、少し型にはまらない方法を使用していることに気付くでしょう。私にとって、それは物事を少しきれいにします。しかし、それを行うためのより良い方法があるかもしれないことを誰が知っていますか?
こちらがコントローラー。default
ご覧のとおり、ルータをルータ マッチ リストの最後に効果的に挿入しました( を参照すると、ルータの直前Mage_Core_Controller_Varien_Front
)。
class Namespace_Module_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{
public function initControllerRouters($observer)
{
/* @var $front Mage_Core_Controller_Varien_Front */
$front = $observer->getFront();
$front->addRouter('Namespace_Module', $this);
}
public function match(Zend_Controller_Request_Http $request) {
$identifier = trim($request->getPathInfo(), '/');
$parts = explode("/", $identifier);
if (count($parts) > 1) {
$productKey = $parts[0];
$action = $parts[1];
if (count($parts) > 2 && (count($parts)%2) == 0) {
for ($i = 2; $i < count($parts); $i++) {
$request->setParam($parts[$i], $parts[$i++]);
}
}
$product = Mage::getModel('catalog/product')->loadByAttribute($productKey, 'url_key');
if ($product->getId()) {
$request->setModuleName('your_module')
->setControllerName('index')
->setActionName($action);
$request->setAlias(Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS, $identifier);
return true;
} else {
// Redirect to an error.
return true;
}
}
return false;
}
}