拡張プロファイルを使ってCSVエクスポートをカスタマイズする
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
Magentoには2種類のデータエクスポート機能が用意されています。初期バージョンから用意されている「データフロー」とCommunity Edition 1.5から用意された「エクスポート」です。
それぞれ出力されるCSVフォーマットが異なる上、「エクスポート」についてはフォーマットのカスタマイズが出来ないかわりに処理が速いというような違いがあります。
このエントリでは「データフロー」のなかにある「拡張プロファイル」について解説し、拡張プロファイルを使うことでオリジナルフォーマットのCSVエクスポートを管理画面から設定する方法を解説します。
拡張プロファイルとは
拡張プロファイルとは、データフローに用意されている機能の一つです。
通常のデータフロープロファイルでは、
- 顧客
- 商品
のみが対象になっているのですが、拡張プロファイルを使い、サードパーティ製のエクステンションを組み合わせることで、注文データなどをエクスポート・インポートすることができるようになります。
ただ、通常のプロファイルはブラウザ上のマウス操作で作成可能なのに対し、拡張プロファイルはXMLを記述しなければならないため、初心者の方にはかなりハードルが高い機能になっています。
拡張プロファイルの作成
拡張プロファイルを作成するには、「システム>インポート・エクスポート>データフロー - 拡張プロファイル」を選択します。
初期状態ではプロファイルは何も登録されていないので、新規作成を選びます。
そうすると大きな入力欄のある画面が表示されます。
プロファイル名を入力し、プロファイルの内容を入力していきます。
XMLの定義
さて、拡張プロファイルではエクスポートするための定義を自分で書かなければなりません。
XMLの定義は最初はほんとうにわからないと思います。
とりあえずで使うのであれば、通常の「データフロー - プロファイル」で作成したものを流用するのが手っ取り早いでしょう。
今回の例では、在庫エクスポートのプロファイルXMLを流用してみます。
「データフロー - プロファイル」で「Export Product Stocks」を選び、「アクションのXML」タブを開くと、以下のようなXMLが書かれています。
<action type="catalog/convert_adapter_product" method="load">
<var name="store"><![CDATA[0]]></var>
</action>
<action type="catalog/convert_parser_product" method="unparse">
<var name="store"><![CDATA[0]]></var>
<var name="url_field"><![CDATA[0]]></var>
</action>
<action type="dataflow/convert_mapper_column" method="map">
<var name="map">
<map name="activation_information"><![CDATA[]]></map>
<map name="store"><![CDATA[store]]></map>
<map name="sku"><![CDATA[sku]]></map>
<map name="qty"><![CDATA[qty]]></map>
<map name="is_in_stock"><![CDATA[is_in_stock]]></map>
</var>
<var name="_only_specified">true</var>
</action>
<action type="dataflow/convert_parser_csv" method="unparse">
<var name="delimiter"><![CDATA[,]]></var>
<var name="enclose"><![CDATA["]]></var>
<var name="fieldnames">true</var>
</action>
<action type="dataflow/convert_adapter_io" method="save">
<var name="type">file</var>
<var name="path">var/export</var>
<var name="filename"><![CDATA[export_product_stocks.csv]]></var>
</action>
このXMLではCSV上に表示する列を
<action type="dataflow/convert_mapper_column" method="map">
以下に定義しています。これは商品に関するエクスポートでは全て同じです。
個々の列の内容を変えることで、様々な用途に特化したCSVを作ることができます。
ちなみに、
<map name="activation_information"><![CDATA[]]></map>
という行はなくても構わないので削除してください。
XML定義の解説
データフローのXMLはいくつかの要素からできています。
役割が少しずつ違うので、理解しておく必要があります。
actionタグ
actionタグは属性にtypeとmethodをとります。
typeには処理を担当するクラスの別名(ここはレイアウトXMLでブロッククラスを呼び出すのと同じ書き方です) を指定します。
methodには実際に処理を行わせるメソッド名を書きます。
つまりはここで書いた内容に基づいて処理が行われるわけです。
varタグ
varタグはactionタグのmethod属性で指定したメソッドに対して与える値を指定します。
XML文書の解釈間違いを防ぐ意味で、CDATAをつけて記述するのがよいでしょう。
ここで指定した値は、実際に処理をするメソッドの中で利用することができるので、拡張プロファイルの動きを設定パラメータで変えたい場合に活用します。
mapタグ
mapタグはvarタグの子要素として定義します。
例では、
<var name="map">
<map name="activation_information"><![CDATA[]]></map>
<map name="store"><![CDATA[store]]></map>
...
</var>
のように書いていますが、これはmapという配列データにMagentoの属性コードとCSV上の列名をマッピングする設定を書いています。
mapタグのname属性に書いているのがMagentoの属性コード。タグの値として書いているのがCSVの列名です。
_only_specifiedを指定して、余計な列を無視する
varタグで設定できるパラメータに、「_only_specified」というものがあります。
このパラメータにtrueを与えると、mapタグで指定した列・属性だけが処理の対象になります。
余計な列がたくさん含まれているCSVを読み込みたい場合などには指定したほうがよいでしょう。
エクスポートしたファイルをダウンロードするには
データをエクスポートする際、拡張プロファイルではファイルをダウンロードしないようになっています。
つまりはエクスポートが終わっても、そのデータが入ったファイルはすぐにはダウンロードされず、サーバにFTPなどをつかって接続してダウンロードしなければなりません。
すぐにブラウザでダウンロードしたい場合は、dataflow/convert_adaptor_ioを書いているactionタグに、1行以下のように追記します。
<var name="link"><![CDATA[http://www.example.com/var/export/<作成したファイル名>]]></var>
このように定義すると、エクスポート完了時に、エクスポート結果に続いてダウンロード用リンクが出てきます。
そのリンクをクリックすると、エクスポートしたファイルをダウンロードできます。
注意点
ただし、標準状態ではMagentoはvar以下のディレクトリに対してアクセス制限をかけています。
apacheを使っている場合は、.htaccessかhttpd.confなどで、var/exportディレクトリに対してIPアドレスやBASIC認証でのアクセス制限をかけておくとよいでしょう。
Nginxの場合は.htaccessが使えないので、あらかじめ設定ファイルに記述しておく必要があります。