Blog

concrete5にCSVからコンテンツをインポートするアドオンを作ってる

Posted by admin at 6:07 日時 2014/12/05

作った。と過去形じゃないのは、まだ問題があるからです。その辺りも含めてさらっとご紹介。

この記事の内容はバージョン5.6系を対象にしています。

CSV to XML Converter

CSVファイルを、concrete5にインポート可能なXMLファイルに変換するアドオンです。concrete5のコアにはもともと、XMLファイルからコンテンツをインポートする機能が備わっています。どんなXMLでもOKと言うわけではなく、concrete5 CIF(Content Import Format)という形式のXMLである必要があります。インストール時に選択できるサンプルコンテンツがこの形式のXMLファイルで用意されています。

例えば、こんなCSVファイルが

"page_name","page_path","page_pagetype","attr_meta_keywords","attr_exclude_sitemapxml","attr_select_tags","block_Main/content"  "Lorem","/lorem","right_sidebar","Lorem, Ipsum",0,"hello//world","Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."  "Ipsum","/about/ipsum","left_sidebar",,1,"hello",  "Dolor","/lorem/dolor","full",,0,"world",

こんなXMLファイルに変換されます。

<?xml version="1.0"?>  <concrete5-cif version="1.0">      <pages>          <page name="Lorem" path="/lorem" pagetype="right_sidebar">              <attributes>                  <attributekey handle="meta_keywords">                      <value><![CDATA[Lorem, Ipsum]]></value>                  </attributekey>                  <attributekey handle="exclude_sitemapxml">                      <value><![CDATA[0]]></value>                  </attributekey>                  <attributekey handle="tags">                      <value>                          <option>hello</option>                          <option>world</option>                      </value>                  </attributekey>              </attributes>              <area name="Main">                  <block type="content">                      <data table="btContentLocal">                          <record>                              <content><![CDATA[Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.]]></content>                          </record>                      </data>                  </block>              </area>          </page>          <page name="Ipsum" path="/about/ipsum" pagetype="left_sidebar">              <attributes>                  <attributekey handle="meta_keywords">                      <value><![CDATA[]]></value>                  </attributekey>                  <attributekey handle="exclude_sitemapxml">                      <value><![CDATA[1]]></value>                  </attributekey>                  <attributekey handle="tags">                      <value>                          <option>hello</option>                      </value>                  </attributekey>              </attributes>          </page>          <page name="Dolor" path="/lorem/dolor" pagetype="full">              <attributes>                  <attributekey handle="meta_keywords">                      <value><![CDATA[]]></value>                  </attributekey>                  <attributekey handle="exclude_sitemapxml">                      <value><![CDATA[0]]></value>                  </attributekey>                  <attributekey handle="tags">                      <value>                          <option>world</option>                      </value>                  </attributekey>              </attributes>          </page>      </pages>  </concrete5-cif>

concrete5 CIF形式のXMLファイルを作成するというだけの用途ならSample Content Generatorというアドオンで、concrete5サイトのデータをそのままXMLファイルに変換でき、コンテンツの中身も含めた完全なデータになります。

CSV to XML Converter は、今のところページそのもののデータ(ページ名やURL、ページ属性)と、記事ブロックのみインポート可能ですが、その他のブロックのデータに対応できていません。そもそも、concrete5はページ内にブロックを何個でも自由に置けて順番も入れ替えられるという方式のため、CSVの様な表形式で並び順も固定というデータと相性が悪いのです…。また、記事ブロック以外はconcrete5のブロックならではの選択肢を埋めなければならず、CSVファイルの作り方が複雑になってしまいます。とはいえ、ページの属性を一括でインポートできるだけでも便利かなと思います。

CIF Importer

こちらは上記のアドオンか、または他の手段で作成したCIF形式のXMLファイルをインポートするアドオンです。ソースを見ていただければ分かると思いますが

$path = $f->getPath();  $ci = new ContentImporter();  $ci->importContentFile($path);

と言う風にコアのContentImporterクラスにxmlを食わせているだけです。特別なことは一切していません。この仕組みのおかげで、定期的にconcrete5にコンテンツを自動で追加する自動実行ジョブなどがかんたんに作れるのですが、その話はいずれ別の機会に。


Share this entry