備忘録

webの備忘録のために

Movable Type DataAPI

知らなかった。

www.movabletype.jp

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コマンドについて。

CakePHPMVCについて基本わかれば一通り使えるようになる。 がそれぞれのファイルを生成し、ソースコードを書かなければならない。

「細かいことはいいから、取り敢えず動いてくれるものを作れればお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コマンドについて。

CakePHPMVCについて基本わかれば一通り使えるようになる。 がそれぞれのファイルを生成し、ソースコードを書かなければならない。

「細かいことはいいから、取り敢えず動いてくれるものを作れればお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

こちらのオプションを使ってフィルターをかけれる。

なのでこちらを使ってフィルターをかけたら、なぜかうまくいかず。

https://community.hubspot.com/t5/Content-Design-Questions/How-to-filter-a-HubDB-query-with-a-column-value/td-p/8673

上のコミュニティでの質問とやりたいことは全く同じで、 セレクト形式の項目の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>

こちらを設定すれば、テーブルのレコードが取得できる。

f:id:the_cabs:20180307015529j:plain

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 {
}

取り敢えず今回はモデルの設定をした。
次回はこれに基づくコントローラとビューの設定を。

次回に続く・・・・