やったこと

webサービスを作るときに考えたことを垂れ流します

ツイッターの絵文字が化けてしまってうまく表示されないとき!

Twitterには絵文字を使える機能があります。

「ニコちゃんマーク」とか「ハートマーク」とか、いろいろカラフルな文字が使えます。女子高生とかがよく使っていますよね。

あの絵文字ツイート、自分のサイトで表示するときになんだか文字化け?してしまって、モノクロのそっけないマークしか表示されないことがあります。

こういうときは、ツイッターの絵文字を表示するjavascritプラグイン「twemoji.js」を入れると上手く表示できます。

Open sourcing Twitter emoji for everyone | Twitter Blogs

使い方は簡単。HTMLのhead部分でtwemojiのjsを読み込みます。

<script src="//twemoji.maxcdn.com/twemoji.min.js"></script>


そしてつぶやきテキストの要素を追加したあとに「twemoji.parse(要素);」を実行すると、テキスト中の絵文字が変換されます。静的なサイトならば下記のようにbodyの一番後ろあたりでparse()を実行すればよさそうですね。

  <script>
    twemoji.parse(document.body);
  </script>
</body>


絵文字のサイズを指定したいときは以下のようにプロパティをセットします。16px、36px、72pxなどが指定できます。

  twemoji.size = 16;//デフォルト36
  twemoji.parse(document.body);


自動で絵文字サイズをセットしたいときは、CSSに以下を記述すると勝手に良い感じに表示してくれます。

img.emoji {
   height: 1em;
   width: 1em;
   margin: 0 .05em 0 .1em;
   vertical-align: -0.1em;
}


しかしあれですね、「emoji」って外国でも通用する言葉なんですね・・。「tsunami」とか「karaoke」みたいに日本発祥の概念なんでしょうかね・・。

【CakePHP3】containによるデータ取得で主キー以外のバインド条件を指定!

CakePHP3でDBからレコードを検索するときに「contain」という命令がありますよね。

以下のような感じの命令です。

$authors = TableRegistry::get('Authors');
$records = $authors->find()->where(['Authors.author_id' => 1234])->contain(['Users']);


これを実行すると「Authors」テーブルの情報に加えて「Users」テーブルの情報も一緒に取得してくれるようになります。

「contain」を使うためには、「Authors」テーブルと「Users」テーブルに以下のような設定が必要です。

    //Authorsテーブル設定
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('authors');
        $this->displayField('author_id');
        $this->primaryKey('author_id');

        $this->hasOne('Users', [
            'joinType' => 'INNER',
            'foreignKey' => 'user_id',
            'bindingKey' => 'author_id'
        ]);
    }
    //Usersテーブル設定
    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->table('users');
        $this->displayField('user_id');
        $this->primaryKey('user_id');

        $this->hasOne('Authors', [
            'joinType' => 'INNER',
            'foreignKey' => 'author_id',
            'bindingKey' => ''user_id'
        ]);
    }

これで「Authors.author_id = Users.user_id」という条件で、Usersテーブルのレコードを引っ張ってきてくれます。

以上!

【CakePHP3】例外処理 Exception() が使えないとき!

CakePHP3で例外を発生させたいのですが「Exception()」を使おうとすると「Error: Class 'App\Controller\Exception' not found 」とエラーが表示されて使用出来ません。

「Exception()」を使うには、下記のように「use \Exception;」しないとダメなんですね~。

use \Exception;

public function rename(){
  try{
    $user = $this->Users->find()->where(['name' => 'hogetan'])->first();
    $user->name = 'fugatan';
    $ret = $this->Users->save($user);
    if (!$ret){
      throw new Exception();
    }
  } catch (Exception $ex) {
    $this->log("エラー!", "debug");
  }
}


ちなみにCakePHP3には、デフォルトでいろんな例外が用意されています。例えば「404NotFound」の例外とかは、以下のようにして発生できます。

use Cake\Network\Exception\NotFoundException;

   public function test()
    {
      //・・・
      throw new NotFoundException();
      //・・・
    }

自分で変な例外を投げるよりも、デフォルトで用意されてるものを使った方がいいかもしれませんね・・。

以上!

【CakePHP3】コンポーネントからテーブルを呼び出す!

CakePHP3でComponentの中からTableを呼び出す方法です。

以下のように「TableRegistry::get('Hogege')」といった感じで、Hogegeテーブルを呼び出します。

use Cake\ORM\TableRegistry;

class AbababaComponent extends Component {
  public function check() {
    $this->Hogege = TableRegistry::get('Hogege');

   $name = $this->Hogege->find('all')->where(['age' => 4]));
   debug($name);
  }
}

名前空間の定義「use Cake\ORM\TableRegistry;」が必要なのでお忘れなく。

以上!

【CakePHP3】コンポーネントの中からコンポーネントを呼び出す!

CakePHP3でComponentの中から他のComponentを呼び出す方法です。

例えば自分で作った「CookieChkComponent」から「CookieComponent」を呼び出すには以下のようにします。

class CookieChkComponent extends Component {
  //Cookieコンポーネント呼び出し
  public $components = ['Cookie'];

  public function check() {
    //Cookieコンポーネントを使う
    $name = $this->Cookie->read('name');
    debug($name);
  }
}

複数のコンポーネントを呼び出したい場合は「$components」にこんな感じに入れます。

   public $components = ['Cookie', 'Hogege'];

公式ヘルプにも書いてありますね。「Using Other Components in your Component」の項目です。
Components

以上!

【CakePHP3】標準クラス「stdClass」を呼びだすとエラーになる!

CakePHP3で空のオブジェクトを作りたくて「stdClass()」を呼び出したんだけどエラーになってしまった・・。

CakePHP3では以下のように「\」とグローバルの名前空間を指定しないといけないみたい。

下記のようなコードでちゃんとstdClassが使えたよ。

  $user = new \stdClass();
  $user->name = "名無しさん";
  $user->age = 3;
  $user->weight = 80;

以上

【CakePHP3】RouterでトップページのURLを取得!

CakePHP3でトップページのURLを取得する方法です。

下記のように「Router」を利用するとお目当ての階層のURLを生成できます。

第二引数をtrueにすると「FULL_BASE_URL」を付けてURLを出力します。

//「http://hogege.com/」を出力
$url = Router::url('/', true);

//「/hogege.com/」を出力
$url = Router::url('/', false);

はい、以上!