Craft CMS の Element API プラグインで Super Table のデータを取得する

Element API プラグインは、Craft CMS から任意の形の JSON を取得できるようになるプラグインです。つまり、エンドポイントを自分で定義することで、好みの URL で、好きな形(項目)の JSON を取得できるようになります。

今回は、この Element API で Super Table タイプのデータを取得する方法を紹介します。

elementapi.php

先に最終的な形を言ってしまうと、 elementapi.php の定義は下記のようになります。

この例では company セクションの一覧と、 company セクションの個別エントリーのデータを取得しています。また、 Super Table のフィールドハンドルは companyStaff です。

その companyStaff の Super Table には、 staffName staffEmail staffMobile staffKey という項目が定義してあります。

<?php
namespace Craft;    
return [
  'endpoints' => [
    'company.json' => [
      'elementType' => ElementType::Entry,
      'criteria' => ['section' => 'company'],
      'transformer' => function(EntryModel $entry) {
        return [
          'title' => $entry->title,
          'jsonUrl' => UrlHelper::getUrl("company/{$entry->id}.json"),
        ];
      },
    ],
    'company/<entryId:\d+>.json' => function($entryId) {
      return [
        'elementType' => ElementType::Entry,
        'criteria' => ['id' => $entryId],
        'first' => true,
        'transformer' => function(EntryModel $entry) {
          $staff = [];
          if (count($entry->companyStaff)) {
            foreach ($entry->companyStaff as $row) {
              $staff[] = array(
                'staffName' => $row->staffName,
                'staffEmail' => $row->staffEmail,
                'staffMobile' => $row->staffMobile,
                'staffKey' => $row->staffKey,
                'staffId' => $row->id,
              );
            }
          }
          return [
            'title' => $entry->title,
            'url' => $entry->url,
            'staff' => $staff,
          ];
        },
      ];
    },
  ]
];

Super Table のデータを取得

Super Table のデータを取得するとき、 'staff' => $entry->companyStaff, のように単純には取得できません。

したがって、事前に下記のようにループして $staff という配列に情報をセットして、それを return する必要があります。

          $staff = [];
          if (count($entry->companyStaff)) {
            foreach ($entry->companyStaff as $row) {
              $staff[] = array(
                'staffName' => $row->staffName,
                'staffEmail' => $row->staffEmail,
                'staffMobile' => $row->staffMobile,
                'staffKey' => $row->staffKey,
                'staffId' => $row->id,
              );
            }
          }

以上です。

  • このエントリーをはてなブックマークに追加
Just a second...