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の下にあるテンプレートからレンダリングされます。 /{エリア}/{パッケージ}/{テーマ}/テンプレート/ .

ビューをデバッグするとき、テンプレート ファイル内の呼び出しをすぐに使用するとget_class($this)、関連するクラスが明らかになることがよくあります。もちろん、これはテンプレートを見つける必要があることを意味します。フロントエンドでは、テンプレート パス ヒントを使用できます。また、 XMLの数行を使用して管理画面でこれらを使用することもできます。テンプレート ブロック。

于 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 ファイルが何らかのブロック クラスのインスタンスのコンテキストで機能していることを理解することです。したがって、最初に、コメントを確認するか、 によって返された値を表示/エコー/var_dumping/etc して、現在のブロック クラスを見つけますget_class($this)

次に、ブロックのクラス宣言の app/code ディレクトリを grep できます。grep -irn 'class Mage_Catalog_Block_Product_List_Toolbar' app/code/core

*nix を使用しているかどうかに関係なく、IDE を使用している場合は、おそらく IDE にクラス ファイル/宣言にテレポートするように指示することができます。 .phtml ファイル、つまり@see Mage_Catalog_Block_Product_List_Toolbar、任意のショートカットを押すと、IDE でその機能がトリガーされます。

ところで、ゲッターメソッドに関するメモ:

ほとんどすべての Magento クラスは、 __call ()を実装するVarien_Objectクラスから継承します。思い出すと、これは、オブジェクトでアクセスできないメソッドを呼び出すときにトリガーされます。そのため、たとえば、オブジェクトで呼び出すと、Magento は勝利しません。致命的なエラーをスローしますが、代わりに、オブジェクトの内部配列にキー「バナナ」が含まれているかどうかをチェックし、その値を返すか、存在しない場合は NULL を返します。$this->getBananas()$data

これが意味することは、次のような呼び出しが表示$this->getSomething()され、コードを grep して を探しfunction getSomething()ますが、見つからないということです。どこにも宣言されていないため、魔法の getter 動作を利用するテンプレートに過ぎません。Varien_Objectの。

それでも、Magento ソースの grep非常に便利です。さらに、getter 関数を grep し、その宣言が見つからない場合は、コードがデータ属性にアクセスしているだけであることがわかります。これも非常に役立つ情報です。

于 2012-11-22T13:33:47.417 に答える