バッチ処理を使用して、CSVで日次データを保存する

概要

バッチ処理は時間のかかる処理や定期的に実行したい処理に使用します。
今回は、日次で記事をCSVに保存する処理を実装します。

前提条件

このチュートリアルでは以下の条件でCSVを保存します。

  • 毎日00:00にバッチ処理が動作します。
  • topics_group_id=5 に所属し、前日に更新された記事を取得します。
  • 保存する内容はコンテンツID、タイトル、本文、拡張項目1、最終更新日です。
  • 取得した記事は日毎にファイルを作成し、 /files/ltd/topics_log/topics_yyyy-mm-dd.csv に保存します。

カスタム処理を作成する

それではバッチ処理を作成します。

1. カスタム処理の一覧画面を表示する

メニューの[オペレーション] -> [バッチ処理] をクリックします。 Image from Gyazo

2. バッチ処理の編集画面を表示する

バッチ処理一覧画面の右上の [追加] をクリックします。 Image from Gyazo

すると、バッチ処理編集画面が表示されます。 Image from Gyazo

3. タイトル・識別子を記入する

それではバッチ処理を作成していきます。
まずはタイトルと識別子に記入します。今回は下記のように記入します。

  • タイトル:日次記事出力
  • 識別子:sample1_export_topics
  • バッチ: 毎日 00:00
  • メンバーID: 未指定

タイトル・識別子は他のバッチ処理と重複できません。

Image from Gyazo

4. 記事保存処理を記述する

次に、実際の処理を記述します。

エディタ内にデータを追加する処理を記述していきます。 Image from Gyazo

ヘッダーを出力する
まずはCSVのヘッダー行を一時ファイルに出力します。

エディタに下記記入します。

{assign var=empty_array value='[]'|json_decode:1}
{assign var=topics_group_id value=5}

{* 管理者として実行 *}
{login member_id=1}

{* コンテンツ定義の取得 *}
{capture name=method_params}{ldelim}
"topics_group_id": {$topics_group_id},
"ext_config_flg": true
{rdelim}
{/capture}
{assign var=method_params value=$smarty.capture.method_params|json_decode:1}
{api_method
    var=topics_group
    model="TopicsGroup"
    method="details"
    version="1"
    method_params=$method_params
}

{* ヘッダー行の作成 *}
{assign var=header_columns value=$empty_array}
{append var=header_columns index=topics_id    value="コンテンツID"}
{append var=header_columns index=subject      value="タイトル"}
{append var=header_columns index=contents     value="本文"}
{* 拡張項目 *}
{foreach from=$topics_group.ext_config item=config}
    {if $config.ext_col_nm eq 'ext_1'}
        {append var=header_columns index=$config.ext_col_nm value=$config.title}
    {/if}
{/foreach}
{append var=header_columns index=update_ymdhi value="最終更新日"}

{write_file var=path value=$header_columns}
{write_file path=$path value="\n" is_append=1}

Image from Gyazo

コンテンツを取得する処理を記述する
続いて、記事を取得してヘッダー行に続けて書き込みます。

エディタに下記記入します。

{* 昨日更新された記事の取得 *}
{assign var=from_date value="-2 day"|strtotime|date_format:"%Y-%m-%d"}
{assign var=to_date value="-1 day"|strtotime|date_format:"%Y-%m-%d"}
{capture name=method_params}{ldelim}
    "topics_group_id": [{$topics_group_id}],
    "cnt": 100,
    "filter": "update_ymdhi <= \"{$to_date}\" AND update_ymdhi > \"{$from_date}\""
{rdelim}{/capture}
{assign var=method_params value=$smarty.capture.method_params|json_decode:1}
{api_method
    var=topics_list
    model="Topics"
    method="list"
    version="1"
    method_params=$method_params
}

{if $topics_list.errors|@count eq 0 && $topics_list.pageInfo.totalPageCnt > 0}
    {section name=pager loop=$topics_list.pageInfo.totalPageCnt}
        {assign var=request_params value=$empty_array}
        {append var=request_params index=pageID value=$smarty.section.pager.iteration}
        {api_method
            var=topics_list
            model="Topics"
            method="list"
            version="1"
            method_params=$method_params
            request_params=$request_params
        }
        {foreach from=$topics_list.list item=topics}
            {assign var=row value=$empty_array}
            {foreach from=$header_columns item=_v key=index}
                {append var=row index=$index value=$topics.$index}
            {/foreach}
            {write_file path=$path value=$row is_append=1}
            {write_file path=$path value="\n" is_append=1}
        {/foreach}
    {/section}
{/if}

Image from Gyazo

バッチ処理内部であっても一度に多数の件数を取得するとメモリオーバーとなることがあります。 ページング機能を利用することを推奨します。

データを保存する
最後に、一時ファイルをアクセス可能なディレクトリに保存します。

エディタに下記記入します。

{put_file tmp_path=$path path="/files/user/topics_log/topics_"|cat:$to_date|cat:".csv"}

Image from Gyazo

6. バッチ処理を保存する

処理の記述が完了したら、[追加する] ボタンをクリックして保存します。

Image from Gyazo

以上でバッチ処理の完成です。

7. ファイルを確認する

バッチ処理の実行時刻以降、ファイルマネージャーからCSVファイルを取得できます。

Image from Gyazo

Image from Gyazo

関連ドキュメント

お探しのページは見つかりましたか?解決しない場合は、問い合わせフォームからお問い合わせいただくか、Slackコミュニティにご参加ください。