Movable Type DataAPI
知らなかった。
MTをjson形式で書き出してニュース部分などを読み込ませるのは よくあることだと思う。特に企業系のサイトとかだと一つのページ上に複数の部署が更新する場合は、 json形式で吐き出して読み込む形にしておけば、部署間の更新トラブルもふさげて便利。
そんな時にインデックステンプレートをjson形式で吐き出しておいて、 getJSONで読み込ませればいいと思ってたけど、上記のDataApiで簡単に取得できる。
例: Data API v2.0 を利用して、ブログidが1の記事の一覧を取得する
http://example.com/mt-data-api.cgi/v2/sites/1/entries
バージョンはv3まであって、それぞれのURLを変えることによって好きなデータの取得が。
CMSが乗っているサーバに制限がかかってなければ、且つMTのバージョンが6以上からだと使えるので、 条件が揃っている場合は便利かと。
jsonファイルの日付でのソート
jsonファイルでの書き出した日付でのソートをしたい場合。 sort関数の第二引数のtrue,falseで昇順、降順は変更することができる。
<!doctype html> <html lang=""> <head> <meta charset="utf-8"> <title>The HTML5 Herald</title> <meta name="description" content="The HTML5 Herald"> <meta name="author" content="SitePoint"> <script src="js/jquery.min.js"></script> <script> var data = [ {"id":"news1", "publishDate":"2018/03/14 12:53:00"}, {"id":"news2", "publishDate":"2018/04/14 12:54:00"}, {"id":"news3", "publishDate":"2018/02/14 12:54:00"} ]; $.each(data,function(i,item){ var changedate = data[i].publishDate.replace(/\u002f/g,"").replace(" ","").replace(/:/g,""); data[i].publishDate = changedate; }) var sort_by = function(field, reverse, primer){ reverse = (reverse) ? -1 : 1; return function(a,b){ a = a[field]; b = b[field]; if (typeof(primer) != 'undefined'){ a = primer(a); b = primer(b); } if (a<b) return reverse * -1; if (a>b) return reverse * 1; return 0; } } $(function(){ data.sort(sort_by('publishDate', true, parseInt)); // data.sort(sort_by('id', false, function(a){return a.toUpperCase()})); for (i = 0; i < data.length; i++) { $('#resultdate').append(data[i].publishDate +':'+ data[i].id +'<br />'); } }); </script> </head> <body> <div id="resultdate"></div> <script src="js/scripts.js"></script> </body> </html>
※表示結果
20180414125400:news2
20180314125300:news1
20180214125400:news3
CakePHP bakeその1
bakeコマンドについて。
CakePHPのMVCについて基本わかれば一通り使えるようになる。 がそれぞれのファイルを生成し、ソースコードを書かなければならない。
「細かいことはいいから、取り敢えず動いてくれるものを作れればおk」そんな時はbakeコマンド。
bakeコマンド
bin/cake bake 対象 名前
基本的な対象はこちら。
「対象」
all:MVC一式を作成
controller:コントローラを生成
model:モデルを生成
template:テンプレートを生成
test:ユニットテストを生成
bin/cake bake model boards
こんな感じに実行するとBoardsTable.phpとBoard.phpを自動生成。
対象をallで実行すると
bin/cake bake all books
モデル関係
コントローラ関係
ビュー関係
ユニットテスト関係
こちらのファイル全てが生成される。
で、生成されたBooksTable.phpの中身を見ると
<?php namespace App\Model\Table; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Validation\Validator; class BooksTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->table('books'); $this->displayField('title'); $this->primaryKey('id'); } public function validationDefault(Validator $validator) { $validator ->integer('id') ->allowEmpty('id', 'create'); $validator ->allowEmpty('title'); $validator ->allowEmpty('author'); $validator ->integer('price') ->allowEmpty('price'); return $validator; } }
で、最初からinitializeとvalidationDefalutというメソッドが生成されている。
initialize:テーブル名、表示する項目、プライマリキーなどの設定 validationDefalut:値の検証に関する処理を用意。
CakePHP bakeその1
bakeコマンドについて。
CakePHPのMVCについて基本わかれば一通り使えるようになる。 がそれぞれのファイルを生成し、ソースコードを書かなければならない。
「細かいことはいいから、取り敢えず動いてくれるものを作れればおk」そんな時はbakeコマンド。
bakeコマンド
bin/cake bake 対象 名前
基本的な対象はこちら。
「対象」
all:MVC一式を作成
controller:コントローラを生成
model:モデルを生成
template:テンプレートを生成
test:ユニットテストを生成
bin/cake bake model boards
こんな感じに実行するとBoardsTable.phpとBoard.phpを自動生成。
対象をallで実行すると
bin/cake bake all books
モデル関係
コントローラ関係
ビュー関係
ユニットテスト関係
こちらのファイル全てが生成される。
で、生成されたBooksTable.phpの中身を見ると
<?php namespace App\Model\Table; use Cake\ORM\Query; use Cake\ORM\RulesChecker; use Cake\ORM\Table; use Cake\Validation\Validator; class BooksTable extends Table { public function initialize(array $config) { parent::initialize($config); $this->table('books'); $this->displayField('title'); $this->primaryKey('id'); } public function validationDefault(Validator $validator) { $validator ->integer('id') ->allowEmpty('id', 'create'); $validator ->allowEmpty('title'); $validator ->allowEmpty('author'); $validator ->integer('price') ->allowEmpty('price'); return $validator; } }
で、最初からinitializeとvalidationDefalutというメソッドが生成されている。
initialize:テーブル名、表示する項目、プライマリキーなどの設定 validationDefalut:値の検証に関する処理を用意。
HubSpot HubDBについて
仕事でHubSpotを触っていて、それらの備忘録。
HubSpotでは独自のDBを構築(HubDB)ができる機能があるのだが、 この機能を使うとDB駆動型ページに対応することができる。
「HubDB」 https://designers.hubspot.com/docs/tools/hubdb
これを使ってページを構築していると一つ詰まった箇所が。 よくあるDBカラムが表示・非表示の項目になっているパターンで 0なら表示、1なら非表示でレコードを拾ってくるパターンがあると思う。
HubDBでは https://developers.hubspot.com/docs/methods/hubdb/get_table_rows
こちらのオプションを使ってフィルターをかけれる。
なのでこちらを使ってフィルターをかけたら、なぜかうまくいかず。
上のコミュニティでの質問とやりたいことは全く同じで、 セレクト形式の項目のvalueの値を対象として表示、非表示にしたかった。 同じように設定したんだけどもうまくいかず。
仕方なく、containsのフィルターでテキスト入力のカラムにして数字を判別して フィルターをかけたのだけども(ここでもフィルターの対象を日本語にしたらうまくいかなかった)。
うーん。納得いかん。単純にHubSpot側での不具合なのか。。
→後日解決しました。不具合が起きてたカラムを決して、 もう一回カラムを作り直したら普通にできた。恐るべしHubDB。
CakePHP3 モデルその3
前回のモデル話の続き。
「コントローラ」
src/Controller/BoardsController.php
<?php namespace App\Controller; class BoardsController extends AppController { public function index(){ $data = $this->Boards->find('all'); $this->set('data',$data); } }
このコントローラで行なっていることは、Boardモデルのメソッドを呼び出し、
全レコードの情報を配列をして受け取ってビューに渡すということ。
BorardTableクラスのインスタンスからfindというメソッドを呼び出し、
テーブルにあるレコードの情報を全て取得。
「ビュー」
src/Template/Boards/index.ctp
<h1>Databaseサンプル</h1> <table> <thead> <tr> <th>ID</th> <th>NAME</th> <th>TITLE</th> <th>CONTENT</th> </tr> </thead> <tbody> <?php foreach ($data as $obj): ?> <tr> <td><?= $obj->id ?></td> <td><?= h($obj->name) ?></td> <td><?= h($obj->title) ?></td> <td><?= h($obj->content) ?></td> </tr> <?php endforeach; ?> </tbody> </table>
こちらを設定すれば、テーブルのレコードが取得できる。
CakePHP3 モデルその2
一旦モデルを使ったサンプルという事でDBに登録されているものをデータ一覧としてブラウザに表示させてみる。
こちらMAMPの機能でlocalhostにDB名mydata、テーブル名をboardにして以下のような設定設定。
フィールド:id
種別:INT
インデックス:PRIMARY
A_I:On
フィールド:name
種別:VARCHAR(長さ50)
フィールド:title
種別:VARCHAR(長さ50)
フィールド:content
種別:TEXT
このようなフィールドを作成。
それからデータベースの設定の修正として config内にあるapp.phpを開いてdefaultの値を次のように。
'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'mydata', 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => false, 'quoteIdentifiers' => false, 'url' => env('DATABASE_URL', null), ],
「モデル」エンティティクラス
src/Model/Entity/BoardsEntity.php
※エンティティとはDBから取得したレコード情報をまとめたオブジェクトに関する基本的な仕組み。
<?php namespace App\Model\Entity; use Cake\ORM\Entity; class Board extends Entity { protected $_accessible = [ '*' => true, 'id' => false ]; }
「モデル」テーブルクラス
src/Model/Table/BoardsTable.php
※取り合えずクラスだけ用意しておけば使えるようにはなる。
繋げるだけなら空でおーけー。
<?php namespace App\Model\Table; use Cake\ORM\Table; class BoardsTable extends Table { }
取り敢えず今回はモデルの設定をした。
次回はこれに基づくコントローラとビューの設定を。
次回に続く・・・・