Help us understand the problem. What is going on with this article?

CakePHP3実装中の小技いろいろ

More than 1 year has passed since last update.

テンプレート側でwebrootのURLを取得する

Template/Users/index.ctp
$this->Url->build('/')

コントローラへのリンクの書き方

リンク全体を出力する

Template/Users/index.ctp
<?= $this->Html->link( 'ログアウト', ['controller' => 'Users', 'action' => 'logout'], ['class' => 'nav-link']);?>

リンクのURL部分だけ出力する

Template/Users/index.ctp
<a class="nav-link" href="<?= $this->Url->build([ "controller" => "Users", "action" => "index"]);?>">

あるテンプレートでだけ使うJavaScriptを読み込む

全てのページで読み込むJavaScriptであれば、レイアウトのデフォルトのTemplete/Layout/default.ctpに、

Templete/Layout/default.ctp
<?= $this->Html->script('bootstrap.min') ?>

というように書いておけばよいが、あるテンプレートでだけ読み込みたいJavaScriptの場合は、以下のように、そのテンプレートの上の方に書けば良い。

読み込むjsは webroot/js 以下に置いておく。

Template/Users/index.ctp
<?php $this->Html->script('users', ['block' => true]);?>

これはwebroot/js/users.js を読み込む場合である。

読み込まれる場所はレイアウトのテンプレの以下の部分になるので、

Templete/Layout/default.ctp
<?= $this->fetch('script') ?>

こちらの位置を</body>の上に移動しておくとよい。

Paginatorの見出しを日本語の見出しにする

Template/Users/index.ctp
<?= $this->Paginator->sort('username', 'メールアドレス') ?>

日付表示を日本風にする。日付を日本時間にする。

en_US を ja-JP に変える。

UTC を Asia/Tokyo に変える。

config/app.php
    'App' => [
        'namespace' => 'App',
        'encoding' => env('APP_ENCODING', 'UTF-8'),
        'defaultLocale' => env('APP_DEFAULT_LOCALE', 'ja-JP'),
        'defaultTimezone' => env('APP_DEFAULT_TIMEZONE', 'Asia/Tokyo'),
    ],

テンプレートで登録日の表示を年月日に変更する。

Template/Users/index.ctp
<?= h($user->created->format('Y年m月d日')) ?>

flashメッセージのテンプレートを自作のものに変更する

flashメッセージのテンプレートは Template/Element/Flash以下にあるので、それを元に自作のテンプレートを作成する。

Template/Element/Flash/my_success.ctp
<?php
if (!isset($params['escape']) || $params['escape'] !== false) {
    $message = h($message);
}
?>
<div class="alert alert-success" role="alert" onclick="this.classList.add('hidden')"><?= $message ?></div>

で表示したい場所のテンプレに以下を記述。

Template/Users/add.ctp
<?= $this->Flash->render('flash', ['element' => 'Flash/my_success']);?>

定数や変数の定義をまとめる

まず別ファイルでconst.phpをconfigフォルダー内に作る。

config/const.php
<?php
use Cake\Core\Configure;

return [
    // 定数の定義
    define("TEST","定数テスト"),

    // 変数の定義
    Configure::write("text1", "変数のテキスト"),

    Configure::write("auth_text", ["1" => "ユーザー","2" => "管理者"]),
];

これをbootstrap.phpで読み込む

config/bootstrap.php
try {
    Configure::config('default', new PhpConfig());
    Configure::load('app', 'default', false);
    Configure::load("const");// ここ
} catch (\Exception $e) {
    exit($e->getMessage() . "\n");
}

コントローラから使う

use Cake\Core\Configure;

を追加してから、

        $auth_text = Configure::read("auth_text");

テンプレートで画像を表示する

Template/Users/login.ctp
<?= $this->Html->image('bootstrap-solid.svg', ["width" => "72", "height" => "72"]) ?>

formにclassを追加

Template/Users/login.ctp
<?= $this->Form->create(false, ["class" => "form-signin"]) ?>

普通のインプット

    <?= $this->Form->control('name', ["type" => "text", "class" => "form-control", "required" => false, "label" => ["text" => "氏名"]]);?>

こんな感じで出力される。

<div class="input text">
    <label for="name">氏名</label>
    <input type="text" name="name" class="form-control" required="required" id="name">
</div>

validationエラーのときのメッセージのスタイルを変更

テンプレの上の方に入れておく。

<?php $myTemplates = [
    'error' => '<div class="text-danger">{{content}}</div>'
];
$this->Form->setTemplates($myTemplates);?>

ラジオボタン

<?= $this->Form->radio('sex', [['value' => '1', 'text' => '男'],['value' => '2', 'text' => '女']], ["class" => "form-check-input", "label" => ["class" => "form-check-label"]]);?>

validation

メールアドレスがユニークか

Model/Table/UsersTable.php
        $validator
            ->scalar('username')
            ->maxLength('username', 255)
            ->notEmpty('username', 'メールアドレスを入力してください。')
            ->add('username', 'validFormat', [
                'rule' => 'email',
                'message' => '正しいメールアドレスを入力してください。'
            ])
            ->add('username', 'unique', [
                'rule' => 'validateUnique',
                'provider' => 'table',
                'message' => 'このメールアドレスは既に使われています。'
            ]);

パスワード確認が一致しているか

Model/Table/UsersTable.php
        $validator
            ->scalar('password')
            ->maxLength('password', 255)
            ->notEmpty('password', 'パスワードを入力してください。')
            ->allowEmpty('password', 'update')
            ->add('password',[
                'compareWith' => [
                    'rule' => ['compareWith', 'password2'],
                    'message' => 'パスワードが一致しません'
                ]
            ]);

最初に開くページを変更する

アプリのルートディレクトリを開いた時にアクセスするページをログインページにしたい時、routes.phpの以下の部分を変更する。

config/routes.php
    //$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
    $routes->connect('/', ['controller' => 'Users', 'action' => 'login']);
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした