2

特定のブランドの製品を表示する phtml ファイルを作成したいと考えています。

URL は次のようにする必要があります。

brands/Subway
brands/Mcdonalds
brands/Lego
brands/Barbie
brands/Duplo
brands/.....

ブランドが変数である場合、この URL を機能させるにはどうすればよいですか。

モジュールを作成しようとしましたが、その場合、brands/index/brands/Subway のような URL を取得します

また、ブランドごとに書き直したくありません (100 以上)

4

2 に答える 2

5

のようなルートを処理するために、モジュール内にカスタム ルーターを作成できますbrands/Subway
これがあなたが必要とするものです。

まず、ページを書き換えずに機能させる必要があります。
この URLmysite.com/brands/index/indexにはブランド リストが
あり、URL にmysite.com/brands/index/view/id/12は ID 12 のブランドがあるとします。

<global>config.xml で、これをタグ内に追加する必要があります。

<events>
    <controller_front_init_routers>
        <observers>
            <[namespace]_[module]>
                <class>[Namespace]_[Module]_Controller_Router</class>
                <method>initControllerRouters</method>
            </[namespace]_[module]>
        </observers>
    </controller_front_init_routers>
</events>

これにより、既存のルーターに新しいルーターが追加されます。今度はルータークラスapp/code/local/[Namespace]/[Module]/Controller/Router.php:

<?php 
class [Namespace]_[Module]_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract{
    public function initControllerRouters($observer){
        $front = $observer->getEvent()->getFront();
        $front->addRouter('[module]', $this);
        return $this;
    }
    public function match(Zend_Controller_Request_Http $request){
        if (!Mage::isInstalled()) {
            Mage::app()->getFrontController()->getResponse()
                ->setRedirect(Mage::getUrl('install'))
                ->sendResponse();
            exit;
        }
        $urlKey = trim($request->getPathInfo(), '/');
        $check = array();
        $parts = explode('/', $urlKey);
        if ($parts[0] == 'brands'){//if url key starts with 'brands'
            if (!isset($parts[1])){ //if the url is just 'brands' - then redirect to brand list
                return false;//do nothing...the request will be handled by the default router and you will see `brands/index/index/`.
            }
            elseif ($parts[1] == 'index'){//if your controller is named differently change 'index' to your controller name
                return false; //do nothing...the request will be handled by the default router and you will see `brands/index/index/`.
            }
            else {
                //if a name is specified
                //get the entities with that name.
                $collection = Mage::getModel('[module]/[entity]')->getCollection()
                    //if the field is named differently change 'name' to your field name.
                    ->addAttributeToFilter('name', $parts[1]);
                $collection->getSelect()->limit(1);//limit to only one
                $itemId = (int)$collection->getFirstItem()->getId();
                //redirect to 'brands/index/view/id/$itemId'
                $request->setModuleName('brands')
                    ->setControllerName('index') //if your controller is named differently change 'index' to your controller name
                    ->setActionName('view') //if your action is named differently change 'view' to action name
                    ->setParam('id', $itemId);
                $request->setAlias(
                    Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
                    $urlKey
                );
                return true;
            }
        }
        return false;
    }
}

それでおしまい。キャッシュをクリアして、試してみてください。

于 2013-10-18T09:27:44.850 に答える
0

.htaccess (ルート ディレクトリにあるもの) に書き換えルールを作成できます。

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^brand/(.+)$ /brands/index/brands?brand=$1 [L,R=301,QSA]

あなたのURLが次の場合:

www.yoursite.com/brands/index/brands?brand=MyBrandName

わかるでしょ:

www.yoursite.com/brand/MyBrandName

それが役に立てば幸い!

于 2013-10-21T20:13:47.350 に答える