4

在这个大学假期期间,我承担了学习 Magento 的项目,虽然我已经弄清楚了如何轻松创建主题,但我在使用 Magento 的班级结构时遇到了麻烦。

对于我想做的事情,我想计算一个月至今的销售数字。在仪表板上,我希望找到$this->getTotals()创建的位置,以便我可以将此图添加到数组中。

作为一个起点,是否可以再将我引导至创建此Mage文件的文件,或者甚至可能是解释 Magento 编程结构的资源,该结构既不是那么基本以至于让人麻木,也不是那么先进以至于不可能?(这些天似乎是一项艰巨的任务,除非你知道在哪里看)

4

3 回答 3

2

Magento(特别是块和模型)在 PHP 中大量使用重载,因此grep通常会产生令人分心的结果或根本没有;参考。Varien_Object::__call()[链接]

Magento 的视图是从一个对象实例呈现的 - 块类,它们往往驻留在模块目录中的块文件夹中,例如app/code/core/Mage/Adminhtml/Block/ - 和(可选)模板,可以在app/design下找到/{area}/{package}/{theme}/template/

在调试视图时,get_class($this)在模板文件中使用调用通常会揭示所涉及的类。当然,这意味着您需要找到模板。在前端,您可以使用模板路径提示- 并且可以在管理员中通过几行 XML 使用这些提示 - 但我会推荐Fabrizio Branca高级模板提示,因为它易于使用并且能够包装非模板块。

于 2012-11-22T13:27:12.417 回答
1

Magentos 的结构非常混乱,我会通读此文档,因为它确实有助于了解所有内容的位置。

现在至于找到具体的方法,我发现最好的方法是使用grep。

在您要查找的示例中getTotals,我运行以下 grep:

grep -RTi 'function getTotals(' ./app/

它返回:

./app/code/core/Mage/Sales/Block/Order/Totals.php      :    public function getTotals($area=null)
./app/code/core/Mage/Sales/Model/Quote.php     :    public function getTotals()
./app/code/core/Mage/Sales/Model/Resource/Sale/Collection.php  :    public function getTotals()
./app/code/core/Mage/Sales/Model/Entity/Sale/Collection.php    :    public function getTotals()
./app/code/core/Mage/Sales/Model/Quote/Address.php     :    public function getTotals()
./app/code/core/Mage/Checkout/Block/Onepage/Review/Info.php    :    public function getTotals()
./app/code/core/Mage/Checkout/Block/Cart/Abstract.php  :    public function getTotals()
./app/code/core/Mage/Checkout/Block/Cart/Totals.php    :    public function getTotals()
./app/code/core/Mage/Paypal/Block/Express/Review/Details.php   :    public function getTotals()
./app/code/core/Mage/Paypal/Model/Cart.php     :    public function getTotals($mergeDiscount = false)
./app/code/core/Mage/Adminhtml/Block/Sales/Order/Create/Totals.php     :    public function getTotals()
./app/code/core/Mage/Adminhtml/Block/Sales/Order/Totalbar.php  :    protected function getTotals()
./app/code/core/Mage/Adminhtml/Block/Customer/Edit/Tab/View/Sales.php  :    public function getTotals()
./app/code/core/Mage/Adminhtml/Block/Widget/Grid.php   :    public function getTotals()
./app/code/core/Mage/Adminhtml/Block/Dashboard/Bar.php :    protected function getTotals()

哦,天哪,这似乎是一个流行的方法名称,但至少现在我们可以缩小需要哪个方法的范围。所以我猜它会在销售部分,因为你似乎在谈论销售,所以我们最终得到了一个更易于管理的列表。

./app/code/core/Mage/Sales/Block/Order/Totals.php      :    public function getTotals($area=null)
./app/code/core/Mage/Sales/Model/Quote.php     :    public function getTotals()
./app/code/core/Mage/Sales/Model/Resource/Sale/Collection.php  :    public function getTotals()
./app/code/core/Mage/Sales/Model/Entity/Sale/Collection.php    :    public function getTotals()
./app/code/core/Mage/Sales/Model/Quote/Address.php     :    public function getTotals()

狩猎愉快。

于 2012-11-22T11:04:01.897 回答
1

如果您正在查看 .phtml 文件,首先要做的是意识到每个 .phtml 文件都在某个 Block 类的某个实例的上下文中工作。因此,首先通过查看注释或打印/回显/var_dumping/etc 返回的值来找出您所在的块类get_class($this)

然后你可以为块的类声明grep app/code 目录,即grep -irn 'class Mage_Catalog_Block_Product_List_Toolbar' app/code/core

请注意,无论您是否使用 *nix,如果您使用的是 IDE,您可能只是告诉您的 IDE 将您传送到类文件/声明,方法是站在 PHP 文档注释(例如核心中的注释) .phtml 文件,即@see Mage_Catalog_Block_Product_List_Toolbar按下任何快捷方式在您的 IDE 上触发该功能。

顺便说一句,关于getter方法的说明:

几乎所有 Magento 类都继承自Varien_Object类,该类实现了__call() ——如果你记得,它是在对对象调用不可访问的方法时触发的——所以当你调用$this->getBananas()一个对象时,Magento 赢了t 抛出一个致命错误,而是检查$data对象的内部数组是否包含键“bananas”,并返回其值,如果不存在则返回 NULL。

这意味着有时你会看到一个类似的调用$this->getSomething(),然后你会用 grep 查找代码function getSomething(),但你不会找到它,因为它没有在任何地方声明,它只是使用魔法 getter 行为的模板Varien_Object的。

尽管如此,获取 Magento 源代码还是非常有用的。另外,如果您 grep 一个 getter 函数但没有找到它的声明,那么您知道代码只是在访问一个数据属性,这也是非常有用的信息。

于 2012-11-22T13:33:47.417 回答