11

我已经使用 Magento 1.13 代码几个小时了,但我无法理解他们对 URL 重写所做的工作。我希望对此进行研究的人可以为我指明正确的方向。

我注意到 core_url_rewrite 不再被使用(或者至少默认情况下它是空的,并且我添加的任何新产品和类别都没有反映在 core_url_rewrite 表中)。相反,它们被添加到新的 enterprise_url_rewrite 表中。

这很简单,但是,我注意到添加了很多其他表(即 enterprise_url_rewrite_category_cl、enterprise_url_rewrite_product_cl、enterprise_url_rewrite_redirect_cl、enterprise_url_rewrite_redirect_rewrite)。我使用 MySQL Workbench 对表进行了逆向工程,并得出了以下 EER 图:

在此处输入图像描述

上面的 EER 图没有显示 enterprise_url_rewrite_redirect 和 enterprise_url_rewrite 之间的联系,但是(至少我假设)在 enterprise_url_rewrite_redirect_rewrite 表中管理的两者之间存在关系。我的问题是关于其他表的作用。它们每个都有一个 version_id 作为主键和一个 redirect_id 或 entity_id 外键。我假设的 enterprise_url_rewrite_redirect_cl 外键与 enterprise_url_rewrite_redirect 主键有关。

我的第一个问题是这张桌子的目的是什么?我看不出它有什么帮助。我对该表进行了项目范围的搜索,但找不到它的创建位置,更不用说使用了。如果这个问题的答案很明显,请原谅我。

我的第二个问题与 enterprise_url_rewrite_product_cl 和 enterprise_url_rewrite_category_cl 表有关。看来这两个表都有entity_ids。我想知道是否有人知道这些 entity_ids 可能指的是什么?

我还从代码中注意到访问模型的典型方式已经改变。例如,Enterprise/AdminGws/Model/Controllers.php 的第 781 行代码更改如下:

从:

$object = Mage::getModel('core/url_rewrite')->load($id);

到:

$object = Mage::getSingleton('core/factory')->getUrlRewriteInstance()->load($id);

现在,来自 Mage_Core_Model_Factory:

const XML_PATH_URL_REWRITE_MODEL = 'global/url_rewrite/model';
. . .
public function getUrlRewriteInstance()
{
    return $this->getModel($this->getUrlRewriteClassAlias());
}
. . .
    public function getUrlRewriteClassAlias()
{
    return (string)$this->_config->getNode(self::XML_PATH_URL_REWRITE_MODEL);
}

我们看到 XML Path 是 global/url_rewrite/model。如果我们查看匹配的 Config.xml:

    <url_rewrite>
        <model>core/url_rewrite</model>
    </url_rewrite>

最后,查看Mage/Core/Model/Url/Rewrite.php,我发现了以下两个函数:

 /**
 * Implement logic of custom rewrites
 . . . 
 * @deprecated since 1.7.0.2. Refactored and moved to Mage_Core_Controller_Request_Rewrite
 */

公共函数重写(...){。. .

/**
 * Prepare and return QUERY_STRING
. . .
 * @deprecated since 1.7.0.2. Refactored and moved to Mage_Core_Controller_Request_Rewrite
 */
protected function_getQueryString() { . . .

评论似乎暗示应该存在一个 Mage_Core_Controller_Request_Rewrite 类,但在 Mage/Core/Controller/Request 中没有这样的类。我能够发现 Magento 团队可能指的是 Mage_Core_Model_Url_Rewrite_Request (我猜他们只是忘记更改评论。我试图在调试器中运行它,但由于我不知道的原因它不断崩溃。我不断收到以下日志:

a:5:{i:0;s:77:"Invalid method Mage_Core_Controller_Varien_Front::_getRequestPath(Array
(
)
)";i:1;s:611:"#0 xdebug://debug-eval(1): Varien_Object->__call('_getRequestPath', Array)
1 xdebug://debug-eval(1): Mage_Core_Controller_Varien_Front->_getRequestPath()
2 C:\user\emil\projects\magento\magento\app\code\core\Mage\Core\Controller\Varien\Front.php(1    67): Mage_Core_Controller_Varien_Front::dispatch()
3 C:\user\emil\projects\magento\magento\app\code\core\Mage\Core\Model\App.php(354): Mage_Core_Controller_Varien_Front->dispatch()
4 C:\user\emil\projects\magento\magento\app\Mage.php(683): Mage_Core_Model_App->run(Array)
5 C:\user\emil\projects\magento\magento\index.php(87): Mage::run('', 'store')
6 {main}";s:3:"url";s:14:"/magento/admin";s:11:"script_name";s:18:"/magento/index.php";s:4:"skin";s:7:"default";}

只有当我进入调试模式时才会出现上述问题。总的来说,我试图通过代码来尝试理解新的重写是如何工作的,但最终空手而归并被卡住了。我搜索了谷歌并没有想出太多。我想知道是否有人研究过 Magento EE 的新版本如何用于 URL 重写?

谢谢你。

埃米尔

4

1 回答 1

1

很难回答您的问题,因为新的企业 URL 重写模块已经并且仍在经历非常重大的变化。下一个版本(1.13.0.2)预计会有一个稳定的版本,但在此之前,Magento 核心团队之外的任何人都无法准确地告诉您重写模块的外观和工作方式。

不过,新设置的要点是 Magento 现在从 中提取重写enterprise_url_rewrite,并且您确定的所有其他表都用于在重新索引过程中重建它。

所有以 结尾的相关表_cl都是与数据库触发器相关联的更改日志。

于 2013-07-28T18:48:53.583 回答