magento如何知道使用哪家商店?

magento如何知道使用哪家商店?,magento,Magento,Magento何时决定使用哪个存储视图,以及何时设置当前区域设置 我想知道我应该在文件中的什么地方知道fronend中将使用哪个存储视图 要获取当前门店的详细信息,请使用以下代码 $store = Mage::app()->getStore(); $name = $store->getName(); 谢谢大家, 我想分享我的发现: Index.php调用Mage::run() 它调用app/mage.php::run() run函数有self::$\u app->run(…)行代码

Magento何时决定使用哪个存储视图,以及何时设置当前区域设置


我想知道我应该在文件中的什么地方知道fronend中将使用哪个存储视图

要获取当前门店的详细信息,请使用以下代码

$store = Mage::app()->getStore();
$name = $store->getName();
谢谢大家,

我想分享我的发现:

  • Index.php调用
    Mage::run()
  • 它调用app/mage.php::run()
  • run函数有
    self::$\u app->run(…)
    行代码,它最后一次调用
    Mage\u Core\u Model\u app::run()
    函数
  • Mage\u Core\u Model\u App::run()
    包括
    $this->\u initCurrentStore($scopeCode,$scopeType)
  • \u initCurrentStore()
    :使用
    \u initStores()
    方法将所有网站、组和存储加载到网站、组和存储对象中。此函数检查站点是否为网站、商店组或商店,如果是其中之一,则设置当前商店。如果scope是base,那么它将通过
    $this->\u checkCookieStore()
  • $this->\u checkCookieStore()
    ::从cookie获取存储类型
    $this->getCookie()->get(Mage\u Core\u Model\u store::cookie\u NAME),在那里它检查它是网站、组还是商店,并在
    $this->\u currentStore=$store中设置当前商店基于cookie返回的值
  • Mage\u Core\u Model\u App::\u checkGetStore()
    ,它使用存储url的xpath\u检查当前存储,更新cookie
  • 当前区域设置是在调用
    Mage\u Core\u Model\u App::init()
    时设置的,init()函数具有
    $this->\u initEnvironment()具有区域设置

    如果设置了“将存储代码添加到URL”设置,则 Magento还根据url中的存储代码检测存储。 e、 g.domain.com/en/ 它在Mage_Core_Controller_Request_Http::setPathInfo()中实现

    因此,按照优先级顺序(最低赢数),Magento使用以下数据检测存储:

  • 检查url是否包含商店代码->使用它
  • 检查是否设置了具有存储的cookie
  • 使用$\u服务器['MAGE\u RUN\u CODE']和$\u服务器['MAGE\u RUN\u TYPE']
  • 从默认存储组和默认存储组中获取默认存储 从默认网站

  • 我也在为magento认证考试学习,我不能100%确定现场的反应。我在网上的搜索表明,人们普遍接受的答案是:

    当前区域设置是在调用Mage_Core_Model_App::init()时设置的,init()函数有$this->_initEnvironment();其中具有区域设置

    好像有人说过,每个人都在模仿,但我不确定这是不是正确的。请参见,区域设置是在Mage_Core_Model_locale::_构造()中确定的,但在$this->_initEnvironment()中未调用此构造,因为在此方法中,Mage_Core_Model_区域设置仅用作静态类。因此,这不应使构造运行:

    protected function _initEnvironment()
    {
        $this->setErrorHandler(self::DEFAULT_ERROR_HANDLER);
        date_default_timezone_set(Mage_Core_Model_Locale::DEFAULT_TIMEZONE);
        return $this;
    }
    
    这个函数似乎只使用Mage_Core_Model_Locale中的常量来设置时区。时区与区域设置不同

    但是,在Mage_Core_Model_应用程序中,函数getLocale()确实正确实例化了区域设置,这将使构造函数运行,从而使Mage_Core_Model_locale::setLocale运行

    Mage_Core_Model_应用程序

    public function getLocale()
    {
        if (!$this->_locale) {
            $this->_locale = Mage::getSingleton('core/locale');
        }
        return $this->_locale;
    }
    
    Mage_Core_模型_区域设置

    public function __construct($locale = null)
    {
        $this->setLocale($locale);
    }
    
    public function setLocale($locale = null)
    {
        if (($locale !== null) && is_string($locale)) {
            $this->_localeCode = $locale;
        } else {
            $this->_localeCode = $this->getDefaultLocale();
        }
        Mage::dispatchEvent('core_locale_set_locale', array('locale'=>$this));
        return $this;
    }
    
    编辑:

    当我这么做的时候,我决定直接去验证我是否正确。为了做到这一点,我补充道

    mageDebugBacktrace(); die();
    
    指向Mage Core区域设置模型的setLocale()方法。 当区域设置模型在其_localeCode属性上设置值时,使用此方法。换句话说,这是设置语言环境的时候。回溯将向我们展示导致它的方法调用链

    结果是:

    [1] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Locale.php:94
    [2] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Config.php:1348
    [3] /var/www/magento/htdocs/app/Mage.php:463
    [4] /var/www/magento/htdocs/app/Mage.php:477
    [5] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App.php:1018
    [6] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Translate.php:347
    [7] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Translate.php:179
    [8] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/Translate.php:119
    [9] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App/Area.php:146
    [10] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App/Area.php:121
    [11] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App/Area.php:93
    [12] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App.php:774
    [13] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php:512
    [14] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Front/Action.php:64
    [15] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Action.php:407
    [16] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250
    [17] /var/www/magento/htdocs/app/code/core/Mage/Core/Controller/Varien/Front.php:172
    [18] /var/www/magento/htdocs/app/code/core/Mage/Core/Model/App.php:354
    [19] /var/www/magento/htdocs/app/Mage.php:684
    [20] /var/www/magento/htdocs/index.php:87
    
    您可以看到第18行App型号第354行的代码:

    $this->getFrontController()->dispatch();
    
    这在App model run()方法中。整个方法如下所示:

    public function run($params)
        {
            $options = isset($params['options']) ? $params['options'] : array();
            $this->baseInit($options);
            Mage::register('application_params', $params);
    
            if ($this->_cache->processRequest()) {
                $this->getResponse()->sendResponse();
            } else {
                $this->_initModules();
                $this->loadAreaPart(Mage_Core_Model_App_Area::AREA_GLOBAL, Mage_Core_Model_App_Area::PART_EVENTS);
    
                if ($this->_config->isLocalConfigLoaded()) {
                    $scopeCode = isset($params['scope_code']) ? $params['scope_code'] : '';
                    $scopeType = isset($params['scope_type']) ? $params['scope_type'] : 'store';
                    $this->_initCurrentStore($scopeCode, $scopeType);
                    $this->_initRequest();
                    Mage_Core_Model_Resource_Setup::applyAllDataUpdates();
                }
    
                $this->getFrontController()->dispatch();
            }
            return $this;
        }
    
    因此,在baseInit()开头调用的_initEnvironment()中设置语言环境的想法是不正确的。也许有人感到困惑,不知道“默认时区”和“语言环境”之间的区别,但这绝对不是同一回事

    $this->_initEnvironment();其中具有区域设置
    这似乎不正确。您所说的
    locale
    的参考在这里:
    date\u default\u timezone\u set(Mage\u Core\u Model\u locale::default\u timezone)将其设置为UTC时间。必须在应用程序的存储初始化中进一步设置客户端请求的当前区域设置。