Magentoの初期バージョンから付属しているデータフロー機能は、インポート・エクスポートするCSV・Excelファイルの列定義をすることができます。普段サイトを運営していて、よく更新するものはやはり商品データなので、必要最小限のデータだけを更新するために、データフロー機能を活用しましょう。

このエントリでは、データフロープロファイル機能そのものではなく、データフロープロファイルのバグについて解説します。

データフロー機能を使う前に知っておいてほしいこと

データフロー機能には重大なバグがあります。
ずっと修正されないまま放置されている不具合なので、おそらくMagentoでは直す気がないのでしょう。
とはいえ、使い勝手に直結する部分なのでどういう現象なのか説明します。

列を指定してプロファイルを作ると、列が1つ必ず増える

データフロープロファイルを作ると、不可解なことに列が1つ必ず増えます。
図を見てください。

プロファイルの作成

ここでは

  • SKU
  • Description
  • Short Description

だけを更新するインポートプロファイルを作成しようとしています。
保存して、インポートするファイルをアップロードしようとすると、フィールド定義が登録前と変わっています。

登録していない列定義が増える

追加した覚えのない「activation_information」という列定義が増えていますね。
この列は商品属性をアルファベット順に並べたリストの、先頭が選ばれます。そのため、「activation_information」より前に来る属性が登録された場合は違うものが入ってきます。

さて、この列はインポートする対象に入れていないので邪魔です。当然削除することになるのですが、なぜか削除しても一向に消えてくれません。

なぜ、列定義が勝手に増えるのか

ここでブラウザの開発者ツールをすこし使って、画面を構成しているHTMLを確認します。
画面上の「フィールド定義」の付近のHTMLタグを調べていくと、非表示になっているdivタグがあることに気がつきます。

タグを調べると見えないdivタグがいる

この中を更に調べていくと、selectタグがあることがわかります。

見えないdivタグの中にはselectタグがいる

つまり、勝手に列定義が増えるのは、この非表示のselectタグがあるからなのです。

列定義が勝手に増えないように対策をする

このままでは使い勝手が悪すぎるので、対策をしましょう。
とはいえ、このselectタグは、列定義を追加するための入力項目を作るためのひな形なので、テンプレート上から削除するわけには行きません。
多少不本意ですが、サーバ側に送信されたデータから、この余分なデータを取り除く処理を追加します。

app/code/core/Mage/Dataflow/Model/Profile.phpをapp/code/local/Mage/Dataflow/Model/Profile.phpとしてコピーします。
こうしておけば、バージョンアップの際に上書きされることがなくなります。Magento本体をバージョンアップした時は、バージョンアップ後のcoreファイルとの差分を取るだけで何が変わったのかを知ることができるので、なにかあったときの確認が楽です。

次に先ほどコピーしたファイルをエディタなどで開きます。301行目付近に、以下のような記述があります。

foreach ($fields['db'] as $i=>$k) {
if ($k=='' || $k=='0') {
unset($p['map'][$side]['db'][$i]);
unset($p['map'][$side]['file'][$i]);
}
}

このforeach文の中では、ブラウザから送信されてきた列定義の中にある、データベース側の値が空または0の列を取り除く処理をしています。
勝手に追加される列定義は常に0番の添字で送られてくるので、ここで削除してしまいましょう。
以下のように書くことで暫定的ではありますが、勝手に追加される列を削除することができます。

foreach ($fields['db'] as $i=>$k) {
if($i == 0){
unset($p['map'][$side]['db'][$i]);
unset($p['map'][$side]['file'][$i]);
}
if ($k=='' || $k=='0') {
unset($p['map'][$side]['db'][$i]);
unset($p['map'][$side]['file'][$i]);
}
}

記述できたらファイルを保存して、データフロープロファイルを編集してみてください。
きっと余計な列定義は現れなくなるはずです。