やったこと

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

【CakePHP3】Cellを使って画面表示する!

CakePHP3の「Cell機能」の使いかたです。

「Cell」を使うとテーブルを呼び出したり、いろいろデータを加工できたりして、「Element」よりもリッチな画面表示ができます。

以下手順です。

①アクション部分を作成
「/View/Cell/Hogege/」というディレクトリを新しく掘って、HogegeCell.phpというファイルを新しく作ります。

ここに一連のアクションに相当する処理を記述します。

<?php
namespace App\View\Cell;

use Cake\View\Cell;

class HogegeCell extends Cell
{
    public function test1()
    {
      $this->loadModel('Fugaga'); //テーブルを呼び出し
      $datas = $this->Fugaga->find()->all();

      $this->set('datas', $datas); //テンプレートに変数を渡す
      $this->template = 'test1'; //テンプレート名をセット
    }

    public function test2($hikisuu)
    {
      $this->loadModel('Piyoyo'); //テーブルを呼び出し
      $datas = $this->Piyoyo->find()->all();

      $this->set('datas', $datas); //テンプレートに変数を渡す
      $this->template = 'test2'; //テンプレート名をセット
    }
}


②Cell用のテンプレートを作成
「/Template/Cell/Hogege/」というディレクトリを新しく掘って、「test1.ctp」や「test2.ctp」というファイルを新しく作ります。

ここに一連のテンプレート(画面表示部分)に相当する処理を記述します。

<?php
//test1.ctpの内容
?>

<p>fugagaテーブルの内容を表示!</p>

<?php foreach ($datas as $data): ?>
<p><?= $data->my_name ?></p>
<?php endforeach; ?>
<?php
//test2.ctpの内容
?>

<p>piyoyoテーブルの内容を表示!</p>

<?php foreach ($datas as $data): ?>
<p><?= $data->my_name ?></p>
<?php endforeach; ?>


③お好きなテンプレート内でCellを呼び出して出力する
お目当てのテンプレート内で、Cellを呼び出して画面表示を出力します。

<!-- Fugagaの画面表示 -->
<?= $this->cell('Hogege::test1');?>

<!-- Piyoyoの画面表示 -->
<?= $this->cell('Hogege::test2', ['引数も渡せるよ!']);?>


もっと詳しい情報が見たい人はCakePHP3公式ページをどうぞ!
http://book.cakephp.org/3.0/en/views/cells.html


以上!

Twitter Bootstrapでボタン型のリンクを設置する!

ツイッター・ブートストラップ」で、他ページへのリンクを「ボタン」を使って行う方法です。

以下のように「<a>タグ」に「btnクラス」をセットすると、リンクがボタン状になります。

<a href="http://hogege.com" class="btn btn-default btn-sm" role="button">他のページに遷移!</a>


ボタンを中央よせにしたい場合は、以下のように「<div class="text-center">」で囲むとよいでしょう。

<div class="text-center">
  <a href="http://hogege.com" class="btn btn-default btn-sm" role="button">他のページに遷移!</a>
</div>

以上!

【CakePHP3】独自のエラーログを出力するコンポーネントを作成!

CakePHP3で、自分専用のファイルにログを出力するコンポーネントを作ってみました。
以下、その手順です。

①「app.php」を修正!
「app.php」に新しく「myerr」というオリジナルログを追加します。

    'Log' => [
        'debug' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'debug',
            'levels' => ['notice', 'info', 'debug'],
            'scopes' => false, //★これを入れないと「debug.log」にもログが出力されちゃう
        ],
        'error' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'file' => 'error',
            'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'],
        ],
        //★↓以下を新しく追加
        'myerr' => [
            'className' => 'Cake\Log\Engine\FileLog',
            'path' => LOGS,
            'levels' => [],
            'scopes' => ['myerr'],
            'file' => 'myerr.log',
        ],
    ],


②ログ出力コンポーネントを作成!
「/Controller/Component/」に新しくコンポーネント「LoggerComponent.php」を作成します。

<?php
namespace App\Controller\Component;

use Cake\Controller\Component;
use Cake\Log\Log;

class LoggerComponent extends Component {
    public function write($str) {
      Log::debug($str, ['scope' => ['myerr']]);
    }
}


③ログを出力してみる!
お好きなコントローラー内でオリジナルログを出力してみます。
ログは「/logs/myerr.log」に記録されます。

class HogegeController extends AppController
{
  public function err_occur()
  {
    //コンポーネント読み込み
    $this->loadComponent('Logger');

    //ログ出力
    $this->Logger->write("testes");
  }
}

以上!

【cakePHP3】例外発生時にテンプレートに変数を渡す!

CakePHP3の話なんですが、コントローラー内で例外処理を発生させると「error400.ctp」や「error500.ctp」といったテンプレートファイルが呼ばれてエラー画面が表示されますよね。

あのテンプレートに変数を渡す方法です。

以下のように[]の中に変数を記述すると、テンプレートファイルに変数を渡すことができます。

use Cake\Network\Exception\NotFoundException;

class HogegeController extends AppController
{
    public function _err_occur()
    {
      //コントローラーから例外発生
      throw new NotFoundException(['testes' => 'テストだよ!']);
    }
}

テンプレート内(/Template/Error/error400.ctp)では「$testes」の変数が参照可能です。

以上!

【CakePHP3】コントローラー内でURLやドメインを取得する!

CakePHP3のControllerの中で、ドメインやURLを取得する方法です。

以下「http://hogege.com/testpage/」というページ内で処理を行った例です。

use Cake\Routing\Router;

class TestpageController extends AppController
{
    public function display()
    {
      //★ http://hogege.com/testpage が出力される
      $url = Router::url(NULL,true);
      debug($url);


      //★ /hogege.com/testpage が出力される
      $url = Router::url(NULL,false);
      debug($url);

      //★ http://hogege.com/ が出力される
      $url = Router::url('/', true)
      debug($url);

    }
}

上記のように「Router」を使うといろんなURLを取得できます。
公式ページの「URL の生成」にも同じことが書いてありますね。

http://book.cakephp.org/3.0/ja/development/routing.html#id16

以上!

TwitterBoostrapで「center-block」が効かない!

cssライブラリの「ツイッター・ブートストラップ」の話ですが、ブロック要素を真ん中に寄せる「center-block」ってありますよね。

あれをセットしても全然中央寄せにならなくて困っていたのですが、理由が判明しました・・。

真ん中に寄せたい要素のcssに「margin」設定をしていたせいなんですね・・。

「center-block」を設定するんだったら「margin」は削除しないといけない、よく考えたら当たり前のことです。

なんだか超くだらないことで悩んでしまいました、はぁ~。