在ajax调用中,我看到这个url是通过控制台调用的。
http://example.net/index.php/checkout/cart/add/uenc/random-key/product/527/form_key/random-key/
我的问题是我应该在哪里寻找这个?我在模板checkout/cart
和app/design/frontend/default/mytheme/template/
中找到了app/code/core/mage/
。
答案 0 :(得分:2)
虽然这里有两个非常好的答案,但是对Magento的URL有广泛的了解
注意:http://www.example.com/[index.php]/是您的Magento网址。根据您的Magento配置,您可能会或可能不会在URL中找到index.php。 {text}是一个可以变化的文本,具体取决于上下文。 [text]是一个可以出现或不出现的文本,具体取决于上下文。
http://www.example.com/[index.php]/{module_frontname}/{[controller]}/{[action]}/{[parameter_name_1]}/{[value_of_parameter_name_1]}/{[parameter_name_2]}/{[value_of_parameter_name_2]}/ (...) /{[parameter_name_n]}/{[value_of_parameter_name_n]}
所以,从我们的Magento基地URL开始,这里是部分及其含义,以及您可以在哪里找到它们。
第1部分:module_frontname:模块的“前端名称”。该值可在app/code/{codePool}/{NamespaceOfModule}/{ModuleName}/etc/config.xml
中找到。
在这些文件中,您将找到一个或多个<frontName>
节点,用于定义模块前端名称。
在您的情况下 ,这是一个核心模块,'Mage_Checkout',因此它位于codePool核心。 (如果你想了解更多关于codePool的内容,我可以写更多关于它的内容,但是我们可以坚持下去对这里的内容进行抽样)。
如果您查看文件app/code/core/Mage/Checkout/etc/config.xml
,您确实会找到这些代码行
<frontend>
<routers>
<checkout>
<use>standard</use>
<args>
<module>Mage_Checkout</module>
<frontName>checkout</frontName>
</args>
</checkout>
</routers>
</frontend>
其中定义了使用http://www.example.com/[index.php]/checkout/
对此Magento执行的所有请求都将由模块Mage_Checkout及其控制器处理。
第2部分:控制器。控制器很容易在Magento上发现。它们位于app/code/{codePool}/{NamespaceOfModule}/{ModuleName}/controllers/
的文件夹和子文件夹中。文件的名称和文件中的类对应于URL的控制器部分。因此,如果您发现此URL http://www.example.com/[index.php]/module_frontname/controller/
,则控制器文件将命名为ControllerController.php,类名称为NamespaceOfModule_ModuleName_ControllerController
。因此,url的部分将以大写形式显示第一个字母,并以Controller为后缀。
http://www.example.com/[index.php]/module_frontname/something/
- &gt; SomethingController.php / NamespaceOfModule_ModuleName_SomethingController
http://www.example.com/[index.php]/module_frontname/else/
- &gt; ElseController.php / NamespaceOfModule_ModuleName_ElseController
。
请注意:每个默认值都有一个控制器。该控制器是控制器IndexController。因此,如果您找到类似http://www.example.com/[index.php]/module_frontname/
的URL,这意味着它隐式调用控制器IndexController,这就是为什么在我的第一个url示例中将此部分设置为可选的原因。
在您的情况下 :您确实会在app/code/core/Mage/Checkout/controller/CartController.php
中找到一个类Mage_Core_CartController
的文件。
第3部分:行动。这个也很容易被发现。在给定的控制器类中,动作是一个以“Action”为后缀的函数。
这一部分对案例是明智的,请注意aCtionAction将处理网址http://www.example.com/[index.php]/module_frontname/controller/aCtion/
(请注意他的资本C)。
因此,此URL http://www.example.com/[index.php]/module_frontname/controller/action/
将在控制器controllerController中调用名为actionAction的函数。
同样的方式:http://www.example.com/[index.php]/module_frontname/controller/some/
- &gt;将由someAction函数处理。
请注意:相同的默认行为适用于操作而不是控制器。然后是indexAction()中的默认操作。所以当你调用http://www.example.com/[index.php]/module_frontname/
时,你正在到达控制器IndexController,还有它的indexAction。如果你调用url http://www.example.com/[index.php]/module_frontname/controller
,你将到达控制器controllerController的indexAction。
请注意:3个第一部分的顺序和含义永远不会改变。
因此,如果您想调用默认控制器IndexController的特定操作,则必须在您的网址中指定控制器http://www.example.com/[index.php]/module_frontname/index/some
,因为如果您尝试以http://www.example.com/[index.php]/module_frontname/some
的方式访问它,您将获得动作indexAction控制器SomeController而不是动作someAction的控制器IndexController!
在你的情况下 :如果你打开文件app/code/core/Mage/Checkout/controller/CartController.php
,你确实会在第191行找到一个函数addAction。
public function addAction()
{
// (... lots of code come here which I'm not going to reproduce)
}
第4部分到n :这些基本上是在Zend Framework酱获取参数。
http://www.example.com/[index.php]/module_frontname/controller/action/param1/value1
严格等于http://www.example.com/[index.php]/module_frontname/controller/action?param1=value1
。 http://www.example.com/[index.php]/module_frontname/controller/action/param1/value1/param2/value2
的方式与http://www.example.com/[index.php]/module_frontname/controller/action?param1=value1¶m2=value2
相同。这将始终通过pair parameter_name / parameter_value
请注意:关于默认操作/控制器的第二个注释中的说明也适用于此处。因此,如果你想在控制器IndexController中的actionAction中有一个参数,那么你必须在完整的http://www.example.com/[index.php]/module_frontname/index/index/param1/value1
中写入url,因为这个url http://www.example.com/[index.php]/module_frontname/param1/value1
将匹配控制器Param1Controller和action1Action而不是控制器IndexController和带有请求参数的动作indexAction!
在您的情况下 :uenc / random-key / product / 527 / form_key / random-key / 意味着你有那个
$_GET['uenc'] == 'random-key'
$_GET['product'] == '527'
$_GET['form_key'] == 'random-key'
确实在上面提到的文件中,你会在函数cartAction()中找到那些代码行:
$params = $this->getRequest()->getParams();
try {
if (isset($params['qty'])) {
// (... lots of code come here which I'm not going to reproduce)
}
} catch(Mage_Core_Exception $e) {
// (... lots of code come here which I'm not going to reproduce)
}
// (... lots of code come here which I'm not going to reproduce)
在您的情况下 (这是最后一个,我保证):您的假设几乎完全是在尝试查找模板。但遗憾的是,这不是一个视觉动作,所以它不会显示任何内容,只是处理一个请求将产品添加到购物车,然后重定向到另一个URL,如第251行的cartAction状态的最后一行
$url = $this->_getSession()->getRedirectUrl(true);
if ($url) {
$this->getResponse()->setRedirect($url);
} else {
$this->_redirectReferer(Mage::helper('checkout/cart')->getCartUrl());
}
希望这个完整的Magento URL解释能够帮助某人:)
答案 1 :(得分:1)
这应该是app/code/core/Mage/Checkout/controllers/CartController.php
,addAction
方法。
答案 2 :(得分:1)
http://example.net/index.php/checkout/cart/add/uenc/random-key/product/527/form_key/random-key/
你可以在Mage / Checkout / controllers / CartController.php中找到它 在给定的文件中,您将找到addAction()
所以你的网址会是这样的 结帐 - 模块名称 购物车 - 控制器名称 添加 - 功能名称和其他参数。
答案 3 :(得分:1)
http://example.net/index.php/checkout/cart/add/uenc/random-key/product/527/form_key/random-key/
结帐:模块名称(使用此名称查找模块)
购物车:购物车控制器(目标模块内部寻找Controllers文件夹&gt; CartController.php文件)
添加:添加动作方法(并在上面的控制器类中查找addAction()方法)