第1回 magento cafe plus kansai ~ magentoカスタマイズ入門

50
Veriteworks Inc. 西 宏和 Magento Cafe Plus Kansai #1

Upload: hirokazu-nishi

Post on 26-Jul-2015

105 views

Category:

Software


1 download

TRANSCRIPT

Page 1: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Veriteworks Inc. 西 宏和

Magento Cafe Plus Kansai #1

Page 2: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Agenda

• Magentoカスタマイズ入門(概論)

• Magentoカスタマイズ入門(デザインテーマ)

Page 3: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Magentoカスタマイズ入門(概論)

Page 4: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

このセッションの内容

• Magentoのディレクトリ構造

• コードプールとinclude_path

• デザインフォールバック

• 1.9以降の仕様変更

Page 5: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Magentoのディレクトリ構造

Page 6: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Magentoのディレクトリ構造app code core コアコード

community コミュニティコード

local ローカルコード

design frontend 公開側テンプレート等

adminhtml 管理側テンプレート等

etc 設定ファイル

locale ロケールファイル

lib 共通ライブラリ

js 共通javascriptファイル

skin frontend 公開側スキン

adminhtml 管理側スキン

Page 7: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

コード部分だけ拡大app code community … … … コミュニティコード

core Mage Catalog Block ブロッククラスディレクトリ

Helper ヘルパークラスディレクトリ

Model モデルクラスディレクトリ

controllers リクエスト受け付け用コントローラ

Controller 基底クラスコントローラ

etc 定義ファイル一式

sql セットアップスクリプト

data データ定義スクリプト

local … … … ローカルコード

Page 8: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

テンプレートだけ拡大app design frontend default default layout レイアウトXML

locale テーマ固有ロケール

etc 設定ファイル

template テンプレートファイル

foo bar … 以下略

adminhtml default default … 管理画面側

Page 9: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

コードプールとinclude_path

Page 10: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

コードプール

app code core コアコード

community コミュニティコード

local ローカルコード

lib 共通ライブラリ

Page 11: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

コードプールとは

• Magentoのコアコードとサードパーティ製コード、サイト独自のコードを分離するための仕組み

• Composerが市民権を得る前のアーキテクチャゆえの構造

Page 12: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

include_path

コンパイラ有効時の処理

通常の処理

Page 13: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

対象外

• エクステンションの設定ファイルはinclude_pathの対象外

• どのコードプールを見るかは、app/etc/modulesの中にあるXMLで定義されている

• Mage_Core_Model_Config::getModuleDirを参照

Page 14: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

デザインフォールバック

Page 15: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

デザインフォールバック

• 現在のテーマに存在しないファイルを、親テーマに遡って使用する仕組み

• テンプレート・レイアウトXML・スキンで利用可能

mytheme/mytheme

mytheme/default

base/default

Page 16: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

1.9系のデフォルト設定では・・・

標準テーマはrwdに変更

その他の設定は空欄だが、 rwd/defaultを使い、 ないものはbase/defaultを 自動的に使用する

Page 17: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

1.9以降の変更点

• theme.xmlの導入

• フォールバック機構の仕様変更

Page 18: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

theme.xmlによる親テーマ・子テーマ

• テーマディレクトリ下のetcに配置する

• theme.xmlを記述することで、任意のテーマを親テーマとして指定可能

<?xml version="1.0"?> <theme> <parent>rwd/default</parent> </theme>

Page 19: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

フォールバック機構の仕様変更

• 1.8までは、

• 現在テーマ → 現在テーマのデフォルト → base/default

• 1.9からは、

• 現在テーマ → 親テーマ or デフォルト → base/default

Page 20: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Varien_Object

• ArrayObjectを拡張したMagentoでよく使われるオブジェクト

• getXxx, setXxx等が既に実装されているので、データ入れとしてよく使われている

• BlockやHelper、Modelはこのクラスを継承して実装されている

Page 21: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Magentoカスタマイズ入門(デザインテーマ)

Page 22: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

このセッションの内容

• レイアウトXMLの仕様と構造

• テンプレートの書き方と親子関係

• ブロックのあれこれ

• ウィジェット

• カスタマイズ例

Page 23: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

レイアウトXMLの仕様と構造

Page 24: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

レイアウトXML

• Magento独自の画面レイアウト定義用XMLファイル

• これを知らなくちゃデザインカスタマイズは始まらない

• 定義単位はエクステンション単位

• 1ファイルに複数画面の定義を記述可能

• メールテンプレートの一部パーツもレイアウトXMLで定義されている

Page 25: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

local.xml

• すべてのレイアウトXMLの中で、一番最後に処理されるファイル

• テーマ固有のカスタマイズを書くために使用する

• 既成テーマをカスタマイズする際に、独自カスタム内容を分けるために使う

• ただし、幾つかできないことがあるので注意

Page 26: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

レイアウトXMLの仕様

Page 27: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

レイアウトXMLで使用するタグ• block

• reference

• action

• update

• remove

• label

• actionのパラメータタグ

Page 28: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

block

• レイアウト上にブロックを追加

• typeまたはclass属性でブロッククラスを指定

• name属性でレイアウト上のブロック名を指定(重複しないように)

• as属性でnameの別名を設定可能

• before / after 属性で追加位置を調整可能

• ネスト可

Page 29: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Blockの派生系(一部)

用途 子要素の自動表示 テンプレート

Mage_Core_Block_Template 一般的なテンプレート用 ☓ 必要

Mage_Core_Block_Text_List 子要素のリスト表示用 ◯ 不要

Mage_Core_Block_Text_Tag タグ生成用 ☓ 不要

Mage_Core_Block_Text_Link リンクリスト生成用 (ログインナビとか) ☓ 不要

Mage_Core_Block_Text テキスト表示用 ☓ 不要

Mage_Core_Block_Abstract 基底ブロック ☓ 任意

Page 30: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

reference

• 既にそのレイアウトで定義されているblockを参照する

• nameでブロック名を指定

• action、blockを記述可

Page 31: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

update

• 既に定義してあるレイアウトを読み込む

• 読み込んだ後でreferenceを使って追加・変更が可能

• handle属性にレイアウト定義名を指定する

Page 32: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

remove

• 既に定義されているブロックをレイアウト上から削除する

• name属性にブロック名を指定する

• 削除後、同名で再定義も可能

Page 33: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

action

• ブロックのクラスに定義されているpublicメソッドを実行する

• 子要素にパラメータを指定可能

• ifconfig属性を使うことで、実行の制御が可能

• blockの違いを知る

Page 34: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

レイアウトXMLの構造

Page 35: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

基本的な構造

<?xml version="1.0"?> <layout version="0.1.0"> <default> <reference name="footer"> <block type="cms/block" name="cms_footer_links" before="footer_links"> <action method="setBlockId"><block_id>footer_links</block_id></action> </block> </reference> </default> <cms_page translate="label"> <label>CMS Pages (All)</label> <reference name="content"> <block type="core/template" name="page_content_heading" template="cms/content_heading.phtml"/> <block type="page/html_wrapper" name="cms.wrapper" translate="label"> <label>CMS Content Wrapper</label> <action method="setElementClass"><value>std</value></action> <block type="cms/page" name="cms_page"/> </block> </reference> </cms_page> </layout>

Page 36: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

例 - 商品ページ<block type="core/template_facade" name="product.info.container1" as="container1"> <action method=“setDataByKey"> <key>alias_in_layout</key> <value>container1</value> </action> <action method=“setDataByKeyFromRegistry"> <key>options_container</key> <key_in_registry>product</key_in_registry> </action> <action method="append"><block>product.info.options.wrapper</block></action> <action method="append"><block>product.info.options.wrapper.bottom</block></action> </block> <block type="core/template_facade" name="product.info.container2" as="container2"> <action method=“setDataByKey"> <key>alias_in_layout</key> <value>container2</value> </action> <action method=“setDataByKeyFromRegistry"> <key>options_container</key> <key_in_registry>product</key_in_registry> </action> <action method="append"><block>product.info.options.wrapper</block></action> <action method="append"><block>product.info.options.wrapper.bottom</block></action> </block>

Page 37: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

例 - メールテンプレート<sales_email_order_items> <block type="sales/order_email_items" name="items" template="email/order/items.phtml"> <action method=“addItemRender"> <type>default</type> <block>sales/order_email_items_order_default</block> <template>email/order/items/order/default.phtml</template> </action> <action method=“addItemRender"> <type>grouped</type> <block>sales/order_email_items_order_grouped</block> <template>email/order/items/order/default.phtml</template> </action> <block type="sales/order_totals" name="order_totals" template="sales/order/totals.phtml"> <action method=“setLabelProperties"> <value>colspan="3" align="right" style="padding:3px 9px”</value> </action> <action method=“setValueProperties"> <value>align="right" style="padding:3px 9px”</value> </action> <block type="tax/sales_order_tax" name="tax" template="tax/order/tax.phtml"> <action method="setIsPlaneMode"><value>1</value></action> </block> </block> </block> <block type="core/text_list" name="additional.product.info" /></sales_email_order_items>

Page 38: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

テンプレートの書き方と 親子関係

Page 39: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

Magentoのテンプレート

• ただのPHPスクリプト

• あらゆるPHP関数・構文が利用可能

• ゴリゴリ計算式を書いてもいいが・・・それが良い実装かどうかは別問題

Page 40: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

テンプレートの例<?php if (($_products = $this->getProductCollection()) && $_products->getSize()): ?><h2 class="subtitle"><?php echo $this->__('New Products') ?></h2> <?php $_columnCount = $this->getColumnCount(); ?> <?php $i=0; foreach ($_products->getItems() as $_product): ?> <?php if ($i++%$_columnCount==0): ?> <ul class="products-grid"> <?php endif ?> <li class="item<?php if(($i-1)%$_columnCount==0): ?> first<?php elseif($i%$_columnCount==0): ?> last<?php endif; ?>"> <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->escapeHtml($_product->getName()) ?>" class="product-image"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(135) ?>" width="135" height="135" alt="<?php echo $this->escapeHtml($_product->getName()) ?>" /></a> <h3 class="product-name"><a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->escapeHtml($_product->getName()) ?>"><?php echo $this->escapeHtml($_product->getName()) ?></a></h3> <?php echo $this->getReviewsSummaryHtml($_product, 'short') ?> <?php echo $this->getPriceHtml($_product, true, '-new') ?> <div class="actions"> <?php if($_product->isSaleable()): ?> <button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button> <?php else: ?> <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p> <?php endif; ?> <ul class="add-to-links"> <?php if ($this->helper('wishlist')->isAllow()) : ?> <li><a href="<?php echo $this->getAddToWishlistUrl($_product) ?>" class="link-wishlist"><?php echo $this->__('Add to Wishlist') ?></a></li> <?php endif; ?> <?php if ($_compareUrl = $this->getAddToCompareUrl($_product)): ?> <li><span class="separator">|</span> <a href="<?php echo $_compareUrl ?>" class="link-compare"><?php echo $this->__('Add to Compare') ?></a></li> <?php endif; ?> </ul> </div> </li> <?php if ($i%$_columnCount==0 || $i==count($_products)): ?> </ul> <?php endif ?> <?php endforeach; ?> <?php endif; ?>

Page 41: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

テンプレートの親子関係

• レイアウトXML上の定義に沿って、テンプレートの親子関係も決まってくる

• どちらかと言うとブロックの階層関係と同じ

• 上位階層のテンプレートから下位階層のブロックを呼ぶ場合は、getChildHtml()などを使用する

Page 42: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

ウィジェット

Page 43: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

CMSと静的ブロック上のウィジェット

Page 44: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

CMSと静的ブロック上のウィジェット

• あらかじめ定義されたパーツをCMSや静的ブロック上に埋め込む機能

• パーツは独自エクステンションを書くことで新しく追加することが可能

Page 45: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

デザインテーマ上のウィジェット

• ある特定のテーマ上に、CMSと同様にパーツを配置する機能

• テーマ依存なので、同じテーマを使うストアビューに等しく適用される

• ウィジェットによって配置できる場所が決まっている

Page 46: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

カスタマイズ例

Page 47: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

CSSやJSの追加

page/html_headブロックの子要素で以下のような記述をすればOK

<action method=“addJs"><script>mage/cookies.js</script></action>

<action method=“addCss"><stylesheet>css/styles.css</stylesheet></action>

<action method=“addItem"><type>skin_js</type><name>js/lib/jquery-1.10.2.min.js</name></action>

<action method="addItem"><type>skin_css</type><name>css/styles-ie8.css</name><params/><if><![CDATA[ (lte IE 8) & (!IEMobile)]]></if></action>

<action method="addLinkRel"><rel>stylesheet</rel><href>//fonts.googleapis.com/css?family=Raleway:300,400,500,700,600</href></action>

Page 48: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

静的ブロックの埋め込み

<reference name="foo"> <block type="cms/block" name=“my_custom_block”> <action method=“setBlockId"> <block_id>my_custom_block</block_id> </action> <action method=“setCacheLifetime"> <cache_lifetime>86400</cache_lifetime> </action> <action method=“setCacheKey"> <cache_key>header_slogan_block</cache_key> </action> </block> </reference>

Page 49: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

レイアウトXMLを使わずにいきなりブロックを配置

$block = $this->getLayout()->createBlock(“ext_name/block_name”); echo $block->toHtml();

Page 50: 第1回 Magento Cafe Plus Kansai ~ Magentoカスタマイズ入門

おわり