今日もtwigのお話を書いていこうと思います。
※今日は、大好きなEventSubscriberの出番はありません※
前置き
例えば、商品CSV登録画面の「公開ステータス(ID)」は、messages.ja.yamlが空文字になっているので、説明欄には何も出力されていないですよね?
商品の公開ステータスは、mtb_product_statusはデフォルトの状態で3レコードしかないので、messages.ja.yamlに直接記載する方法でもそんなに手間ではないかもしれません。
ですが、これが
「mtb_pref(都道府県のマスタテーブル)のIDと名称を全部出力してください。」
なんて依頼が来ると、47レコード分をmessages.ja.yamlに記載するのは正直手間だなー。。。と思ってしまいました。
そこで、テーブルからidとnameを抜き出して、文字列化するServiceを作ったので、そのご紹介になります。
テーブル構造によっては、mtbでもdtbでも使えるので、試してみてください。
前提条件
- primary keyがIDであること
- 出力する値のカラム名がnameであること
Serviceを作成する
まずは、Serviceを作っていきましょう。
<?php
namespace Customize\Service;
class CsvViewDiscriptionService
{
/**
* CSV登録画面でマスターデータから選択肢を表示させる文字列を返却
* 例)1:北海道 2:青森県 3:岩手県
*
* @param array $data
* @return string|null
*/
public function getDiscriptionTextData(array $data)
{
$text = null;
foreach ($data as $key => $datum) {
if ($key !== 0 && $key % 5 === 0) {
$text .= '<br>';
}
$text .= $datum->getId() . ':' . $datum->getName() . ' ';
}
return $text;
}
}
ServiceはこれだけでOKです。
引数をforeachで回して、文字列に変換しているだけですね!
Controllerで呼び出す
次にControllerの方で、このServiceを呼び出してみましょう。
必要箇所のみ抜粋して記載してみます。
trans('admin.product.product_csv.display_status_col') => [
'id' => 'status',
'description' => 'admin.product.product_csv.select_id_description',
'required' => true,
'data' => $this->csvViewDiscriptionService->getDiscriptionTextData($this->productStatusRepository->findAll())
],
今回は商品ステータスを出力させたいので、productStatusRepositoryから全件取得を行なっています。
もちろん、ここは条件付きでも問題ありません。
要は、twigで描画したいレコードが取得できれば良いのです。
twig側の修正
<div id="ex-csv_product-format" class="card-body">
<table class="table table-striped table-bordered">
<tbody>
{% for header, key in headers %}
<tr>
<th class="w-25 align-middle table-ec-lightGray" id="file_format_box__header--{{ loop.index }}">{{ header }}
{% if key.required %}
<span class="badge badge-primary ml-1">{{ 'admin.common.required'|trans }}</span>
{% endif %}
</th>
<td class="align-middle">
{% if key.description %}
{{ key.description|trans|raw }}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
こうなっている箇所を
<div id="ex-csv_product-format" class="card-body">
<table class="table table-striped table-bordered">
<tbody>
{% for header, key in headers %}
<tr>
<th class="w-25 align-middle table-ec-lightGray"
id="file_format_box__header--{{ loop.index }}">{{ header }}
{% if key.required %}
<span class="badge badge-primary ml-1">{{ 'admin.common.required'|trans }}</span>
{% endif %}
</th>
<td class="align-middle">
{% if key.description %}
{{ key.description|trans|raw }}
{% endif %}
{% if key.data is defined %}
<hr>{{ key.data | raw }}
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
こんな感じで修正します。
discriptionを出力している箇所に
{% if key.data is defined %}
<hr>{{ key.data | raw }}
{% endif %}
が追加されただけですね。
動作確認
最後に動作確認をしてみましょう。
商品ステータス(ID)の箇所が以下のように出力されていると思います。
1:公開 2:非公開 3:廃止
これで、テーブルから取得してきた値をtwigにStringで渡すServiceの完成です、とっても簡単ですね!
最後に
前提条件で、「primary keyがIDであること」と「出力する値のカラム名がnameであること」と記載しましたが、自由にカスタマイズ可能だと思います。
(文章があまり上手くないので、説明しやすくしたかったのです)
こんなServiceを1つ作っておくだけで、簡単に管理画面のCSV登録画面での文言出力が簡単になります。
この機会に、CSV登録画面にテーブルの値を出力してユーザービリティーを向上させてみませんか?
