CakePHPでデータを複製する方法

// id指定でデータ取得
$article = $this->Articles->get($id);

// エンティティ生成にコピー元データをセットする
$newArticle = $this->Articles->newEntity();
$newArticle = $this->Articles->patchEntity(newArticle, $article->toArray());

// データ保存
$this->Articles->save($newArticle);

idを削除したり変更したりすると、エラーとなってしまう。これだとコード量も少なくて良い。

Google Chrome のフォームで入力内容の自動補完を個別に削除する方法

Windowsの場合

フォームで該当の値が表示されているとき、そこにマウスカーソルを乗せて、以下のキーボードショートカットを実行すると削除できます。

Shift + Delete

Macの場合

Windowsとはキーボードショートカットキーが異なります。
以下を実行することで、特定の値を削除することができます。

shift + fn + delete

Bakeコマンドで作成されるファイルをカスタマイズする

bin/cake bake template Articles

このコマンドを実行した時に作成されるテンプレートファイル(*.ctp)は、vendor/cakephp/bake/src/Template/Bake の配下にあるtwigファイルを元に作成されている。

出力されるファイルを常に変更したい場合は、以下を行う。

① src/Template/Bakeフォルダを作成する。
②元となるtwigファイルをコピーして、①で作成したフォルダーにコピーする(階層がずれないように注意)
③twigファイルの内容を書き換える。

これでBakeコマンドを実行した時に出力されるphpファイルやctpファイルが変更される。

Paginatorの出力テンプレートを変更する

CakePHPのpaginatorを使用する時に、ヘルパーで出力されるHTMLをカスタマイズしたい場合は、configフォルダにpaginator-templates.php を作成する。(任意の名前で良い)
ちなみに、paginatorテンプレートの元となるコードは、vendor/cakephp/cakephp/src/View/Helper/PaginatorHelper.php の $_defaultConfig[‘templates’] にある。

下記では、それぞれのリンクに「#search_list」というページ内アンカーを付けるようにしている。

<?php
return [
    'first' => '<li class="first"><a href="{{url}}#search_list">{{text}}</a></li>',
    'last' => '<li class="last"><a href="{{url}}#search_list">{{text}}</a></li>',
    'nextActive' => '<li class="next"><a rel="next" href="{{url}}#search_list">{{text}}</a></li>',
    'prevActive' => '<li class="prev"><a rel="prev" href="{{url}}#search_list">{{text}}</a></li>',
    'number' => '<li><a href="{{url}}#search_list">{{text}}</a></li>',
];

次に、使用するコントローラーに以下の3〜5行目を追加する。
‘templates’ で指定する値は、上で作成したファイル名を入れる。

class ArticlesController extends AppController
{
    public $helpers = [
        'Paginator' => ['templates' => 'paginator-templates'],
    ];

    // 〜〜省略〜〜
}

Formヘルパーで生成されるフォームタグを常時変更する方法

Formヘルパーを使ってフォームを生成する時に、自動生成されるタグのデフォルトを変更したい場合は、5〜7行目を追加する。

class AppView extends View
{
    public function initialize()
    {
        $this->loadHelper('Form', [
            'templates' => 'app_form',
        ]);
    }
}

configフォルダにapp_form.php(上記の6行目で指定した名前)というファイルを作成し、中に生成されるtemplateのコードを記述する。templateコードの元になっているコードは、vendor/cakephp/cakephp/src/View/Helper/FormHelper.php の$_defaultConfigのところにある。

<?php
return [
    'checkboxFormGroup' => '<label class="control control--checkbox">{{label}}</label>',
    'checkboxWrapper' => '<div class="checkbox"><label{{attrs}} class="control control--checkbox">{{label}}</label></div>',
    'nestingLabel' => '{{hidden}}{{input}}{{text}}<div class="control__indicator"></div>',
    'radioWrapper' => '<div class="radio"><label{{attrs}} class="control control--radio">{{label}}</label></div>',
    // 'radioWrapper' => '<div class="radio">{{label}}</div>',
    // 'textarea' => '<textarea name="{{name}}"{{attrs}}>{{value}}</textarea>',
];

日付のフォーマットチェック

日付のフォーマットチェックを行うなら、この書き方が良い。融通も利くし可読性も良い。
date関数のフォーマット部分を変更すれば、指定のフォーマットに対してチェックができる。

// 日付+時間
if ($datetime === date("Y-m-d H:i:s", strtotime($datetime)) ) {
    // フォーマットが正しい時
}

// 日付
if ($datetime === date("Y-m-d", strtotime($datetime)) ) {
    // フォーマットが正しい時
}