Magento 编程和课堂利用

Posted

技术标签:

【中文标题】Magento 编程和课堂利用【英文标题】:Magento programming and class utilisation 【发布时间】:2012-11-22 09:14:33 【问题描述】:

我在这个大学假期期间承担了学习 Magento 的项目,虽然我已经弄清楚如何相当容易地创建一个主题,但我在使用 Magento 中的类结构时遇到了麻烦。

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

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

【问题讨论】:

你可能想看看***.com/questions/576908/…接受的答案 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

Magentos 结构相当混乱,我会通读 this documentation,因为它确实有助于了解所有内容的位置。

现在至于寻找具体的方法我觉得最好的方法是使用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()

狩猎愉快。

【讨论】:

非常有帮助,如果我知道使用该方法的 phtml 文件,有什么办法可以缩小范围吗?基本上toolbar.phtml 文件用它的范围选择器计算这个值。如果我可以复制它,它将很容易解决问题。虽然喜欢 grep 的东西(不是 linux 用户,但我可能会启动我的旧开发服务器) 如果你知道 .phtml 文件,设置一个像 xdebug 这样的调试器,在 .phtml 文件中设置一个断点并单步执行函数。 在 Linux 上开发也很棒,我强烈推荐它,或者在你的 windows 盒子上获得类似 cygwin 的东西。【参考方案3】:

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

然后你可以 grep 应用程序/代码目录来获取块的类声明,即grep -irn 'class Mage_Catalog_Block_Product_List_Toolbar' app/code/core

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

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

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

这意味着有时你会看到像 $this->getSomething() 这样的调用,然后你会用 grep 代码寻找 function getSomething(),但你找不到它,因为它没有在任何地方声明,它只是该模板利用了 Varien_Object 的魔术 getter 行为。

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

【讨论】:

以上是关于Magento 编程和课堂利用的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 Magento 订单标记为完整

如何以编程方式比较magento版本?

以编程方式在 Magento 中设置订阅者状态

Magento - 以编程方式添加的捆绑产品不适用于购物篮/前端

如何以编程方式在magento中为产品分配类别

以编程方式(通过信用备忘录?)清理 Magento 中的 Paypal 逆转