2

私は 2 つの言語ストアを持つ magento (エンタープライズ) サイトを持っています。静的ページまたは製品ページである特定のアイテムまたはリソースへの独自の専用 URL をそれぞれが持っています。

CMS 経由で URL ルールを使用して、すべてのリソースの SEF URL を管理しています。

問題は次のシナリオです。

  1. サイトのデフォルトは LANG #1 です。

  2. ユーザーが LANG#1 から LANG#2 に切り替えると、切り替えは問題なく行われます。コンテンツは特定の言語 (_store=lang">http://www.sitename.com/?_store=lang) に切り替わります。

  3. しかし、現在の言語ストアに関係なく、他の言語ストアの URL を現在の言語ストアに入力すると、404 エラーが発生します。

要求されたリソースの現在のストアをチェックするシステムが必要です。見つからない場合は、次のストアにルーティングして、そこにあるリソースを確認する必要があります。見つかった場合、store はアイテムが見つかった lang ストアに切り替えて、URL をリダイレクトする必要があります。

これを達成するためにどのクラスを拡張する必要がありますか (私はマジェントにまったく慣れていません)。

このクラスを拡張して、自分のやりたいことを実行できるかどうかを調べるところまで行きました: /app/code/core/Mage/Core/Model/Mysql4/Url/Rewrite.php

しかし、そのような要件に適した場所にいるかどうかはわかりません。

どんな助けでも大歓迎です!

ありがとう

4

2 に答える 2

1

この問題を解決することができました。/app/code/core/Mage/Core/Model/Mysql4/Url/Rewrite.phpファイルを拡張するだけでした。

そこで、loadByRequestPath関数を上書きして、現在のストアでリクエストを処理します。見つからない場合は、他のすべての使用可能なストアのリストを取得し、ループして、アイテムが存在するかどうかを確認します。見つかった場合は、製品とwholaのURLキーが存在するストアにリダイレクトします。

どのストアにもそれがない場合は、404エラーを返します。

また、静的ページの場合、ストア/言語を切り替えると、URL書き換えマネージャーが問題を解決できるようになります。

これが誰かに役立つことを願っています!

于 2013-02-06T09:11:03.707 に答える
0

私のソリューションが最もエレガントだとは思いませんが、うまくいったので投稿します。基本的には指定店舗のみではなく、探しているパスを全店舗で検索しています。どんな提案でも大歓迎です。

私のconfig.xml

<?xml version="1.0"?>
<config>
 <global>
  <modules>
    <Soipo_UrlRewrite>
        <version>0.1</version>
    </Soipo_UrlRewrite>
  </modules>
  <models>
    <soipo_urlrewrite>
        <class>Soipo_UrlRewrite_Model</class>
    </soipo_urlrewrite>
    <core_mysql4>
        <rewrite>
            <url_rewrite>Soipo_UrlRewrite_Model_Mage_Core_Model_Mysql4_Url_Rewrite</url_rewrite>
        </rewrite>
    </core_mysql4>
  </models>
 </global>
</config>

Rewrite.php

<?php
class Soipo_UrlRewrite_Model_Mage_Core_Model_Mysql4_Url_Rewrite extends Mage_Core_Model_Mysql4_Url_Rewrite{

/**
 * This function get an array of store ids, containing the Admin store.
 * @return array
 */
public function getStoreIds(){
    $allStores = Mage::app()->getStores();
    $storeIds = array();
    $storeIds[] = Mage_Core_Model_App::ADMIN_STORE_ID;
    foreach ($allStores as $_eachStoreId => $val)
    {
        $_storeId = Mage::app()->getStore($_eachStoreId)->getId();
        $storeIds[] = $_storeId;
    }
    return $storeIds;
}

/**
 * Load rewrite information for request
 * If $path is array - we must load all possible records and choose one matching earlier record in array
 *
 * @param   Mage_Core_Model_Url_Rewrite $object
 * @param   array|string $path
 * @return  Mage_Core_Model_Resource_Url_Rewrite
 */
public function loadByRequestPath(Mage_Core_Model_Url_Rewrite $object, $path)
{

    if (!is_array($path)) {
        $path = array($path);
    }

    $pathBind = array();
    foreach ($path as $key => $url) {
        $pathBind['path' . $key] = $url;
    }

    $storeIds = $this->getStoreIds();


    // Form select
    $adapter = $this->_getReadAdapter();
    $select  = $adapter->select()
        ->from($this->getMainTable())
        ->where('request_path IN (:' . implode(', :', array_flip($pathBind)) . ')')
        ->where('store_id IN(?)', $storeIds);

    $items = $adapter->fetchAll($select, $pathBind);


    // Go through all found records and choose one with lowest penalty - earlier path in array, concrete store
    $mapPenalty = array_flip(array_values($path)); // we got mapping array(path => index), lower index - better
    $currentPenalty = null;
    $foundItem = null;
    foreach ($items as $item) {
        if (!array_key_exists($item['request_path'], $mapPenalty)) {
            continue;
        }
        $penalty = $mapPenalty[$item['request_path']] << 1 + ($item['store_id'] ? 0 : 1);
        if (!$foundItem || $currentPenalty > $penalty) {
            $foundItem = $item;
            $currentPenalty = $penalty;
            if (!$currentPenalty) {

                break; // Found best matching item with zero penalty, no reason to continue
            }
        }
    }

    // Set data and finish loading
    if ($foundItem) {
        $object->setData($foundItem);
    }

    // Finish
    $this->unserializeFields($object);
    $this->_afterLoad($object);

    return $this;
}


}
于 2014-12-22T18:02:32.897 に答える