cakephpのcontain()内でのクロージャに use()を使って引数を渡す。

cakephpのcontain()内でのクロージャに use()を使って引数を渡す。

js感覚でvarスコープの変数を渡そうとすると渡せない。
use ($supplier_id)で渡す。

$supplier_id = 2;//これを渡したい。
$query = $this->Products->find();
    $query
        ->contain([
            'Suppliers' => function($q) use ($supplier_id){
                return $q->where(['Suppliers.id'=>$supplier_id]);
            }
        ]);

MacのターミナルでGoogle翻訳で翻訳

MacのターミナルでGoogle翻訳で翻訳

soimort/translate-shell ていうのがあるみたい。
https://github.com/soimort/translate-shell/

Dependencies(依存)するので、GNU Awk (gawk) 4.0 or laterに属するMacでは、gawkが必要と
brewでインスコ

$ brew install gawk

その後、ダイレクトにダウンロードした。(ほかgithubにインストール方法はいろいろ)
で、パスの通っている/usr/local/bin/に置くバージョンみながら確認。

$ wget git.io/trans
$ chmod +x ./trans
$ mv ./trans /usr/local/bin/trans
$ trans -version
Translate Shell       0.9.6.4-release

platform              Darwin
gawk (GNU Awk)        4.1.4
fribidi (GNU FriBidi) [NOT INSTALLED]
audio player          [NOT INSTALLED]
terminal pager        less
terminal type         xterm-256color
user locale           ja_JP.UTF-8 (Japanese)
home language         ja
source language       auto
target language       ja
translation engine    google
proxy                 [NONE]
user-agent            Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/602.1 (KHTML, like Gecko) Version/8.0 Safari/602.1 Epiphany/3.18.2
theme                 default
init file             [NONE]

Report bugs to:       https://github.com/soimort/translate-shell/issues

試す

% trans ja:en 眠いzzz
眠いzzz
(Nemui zzz)

Sleepy zzz

「眠いzzz」の翻訳
[ 日本語 -> English ]

眠いzzz
    Sleepy zzz

試す。

% trans ja:en 'まだ翻訳で消耗してるの?'
まだ翻訳で消耗してるの?
(Mada hon'yaku de shōmō shi teru no?)

Are you still consuming in translation?

「まだ翻訳で消耗してるの?」の翻訳
[ 日本語 -> English ]

まだ翻訳で消耗してるの?
    Are you still consuming in translation?, Are you still consumed in the translation?

試す。(オートコレクトがデフォで効いてるらしい。)

% trans ja:en 起きんわ                 
Showing translation for:  (use -no-auto to disable autocorrect)
沖縄
(Okinawa)

Okinawa

「沖縄」の翻訳
[ 日本語 -> English ]

沖縄
    Okinawa

いちおういつものdashのスニペットに登録


様子

様子

いつでも ターミナルで、 trane; とタイプしたら翻訳可能で超便利。

Linux(CentOS)ディレクトリ構造メモ

Linux(CentOS)ディレクトリ構造メモ

メモ。

/ ルート
/bin 一般ユーザ、管理者用コマンド
/dev デバイスファイル
/etc システム管理、ソフト設定ファイル
/lib /bin,/sbinに置かれたPGが利用するLibrary
/modules カーネルモジュールが配置
/media CD/DVDなどのデータ
/opt Linuxインストール後追加のpkg
/proc カーネルプロセスが保持する情報
/root ルートのホーム
/sbin システム管理者が利用するコマンド
/tmp アプリケーションやユーザが利用する一時ファイル
/var システム運用中にサイズが変化するファイル配置
/log ログファイル
/boot システム起動時関連
/usr ユーザが共有するもの
/bin 一般ユーザー、管理者用コマンド
/lib 各種コマンドが利用するLibrary
/local Linuxインストール後の追加でインストールしたpkgこれ以下には、bin,sbin,libなどが配置
/sbin システム管理者のみ実行できるコマンド
/home ユーザのホームディレクトリ

cakephp3 で更新の後、2つ前のページ(=つまり編集画面に来る前)

cakephp3 で更新の後、2つ前のページ(=つまり編集画面に来る前)

A.一覧画面(もしくは他の画面) → B.編集画面(編集)更新ボタン押す → C.edit()アクションで更新、Aに戻す。

というふうなことを普通にBakeでCRUDでつくるとIndexに戻すだけでOKなのですが、別の不特定多数のペ0−字へ戻す場合の話。

A > B > Cの時点での referer()は、Bとなっていて同じページなってしまう。そこで実質2つ前に戻してたい。  解決砲。ControllerのafterFileterで2つ前のページをSessionに入れておく。

まずAppControllerにafterFileterを追加。(beforeFileterの逆で書くActionの後に実行される)

public function afterFilter(Event $event)
{
    $this->Session = $this->request->session();
    $this->Session->write('referer2',$this->referer());
    return parent::afterFilter($event);
}

とすることで、Cのedit()アクション時点では referer2が更新前で、2つ前のAのアドレスがある。
のでedit()アクションで更新の後以下のようにすればできた。

return $this->redirect($this->Session->read('referer2'));

cakephp3 データの削除(関連などの削除方法)

cakephp3 データの削除(関連などの削除方法)

  • 基本的な削除方法。エンティティーを送る。
$order = $this->Order->get(3);
$this->Order->delete($entity);
  • まとめて削除はconditionsを指定する
    ※delteAllは afterDeleteとかのCallbackが呼ばれない。
$this->Order->deleteAll(['status_id'=>3])
  • 関連テーブルを消す。
    関連元のhasManyオプションで指定。(deleteAllで消される)
        $this->hasMany('OrderDetails', [
            'foreignKey' => 'order_id',
            'dependent' => true
        ]);
  • 関連テーブルを消す。
    関連元のhasManyオプションで指定。afterDeleteとかのコールバックも呼びたい
        $this->hasMany('OrderDetails', [
            'foreignKey' => 'order_id',
            'dependent' => true,
            'cascadeCallbacks'=>true
        ]);

参考 :
https://book.cakephp.org/3.0/ja/orm/deleting-data.html

cakephp3で関連の関連(cakephp2でのrecursiveの深い所取得)

cakephp3で関連の関連(cakephp2でのrecursiveの深い所取得)

関連を取得する場合は、[‘contain’]オプションで指定。

$order = $this->Orders->get($id, [
            'contain' => [ 'OrderDetails']
]);

関連のさらに関連まで取得の場合は配列オプションをつなぐ。

$order = $this->Orders->get($id, [
            'contain' => [ 'OrderDetails' =>[
                'Products'
            ]]
]);

余分なもの取得せずに、見た目にスッキリ直感的になった。

MAMPのmySQLをコマンドラインから使うときにソケットファイルが無い場合。

MAMPのmySQLをコマンドラインから使うときにソケットファイルが無い場合。

ソケット(mysql.sock)がApplication/MAMP以下にあるのでリンク貼るある。

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock

cakephp3 でエンティティー(Entity)からエラーの取得と設定

cakephp3 でエンティティー(Entity)からエラーの取得と設定

エラーの取得

$product = $this->Products->newEntity([
    'id' => null,
    'name'=>'商品名',
    'supplier_id'=>null,
    'price'=>null
]);

$product->getErrors(); //全てのエラー
$product->getError('supplier_id');//フィールド指定

エラーの設定

$orderDetail->setError('name',[
    'hogehoge'=>'テストのエラーです。'
]);
//設定したエラー内容は以下になります。
[
    'name' => [
        'hogehoge' => 'テストのエラーです。'
    ]
]

cakephp3でExcelを読んだり書いたりするプラウグイン(robotusers/cakephp-excel)を使ってみた。

結果をいうととてもシンプル使いやすくて○。

  1. コンポーザーでインストール
$ composer require robotusers/cakephp-excel

bootstrap.php最後に追記

$ bin/cake plugin load Robotusers/Excel -b

どこか使うところでuse

use RobotusersExcelRegistry;

あとは読み込んでentityとして取得できました。

$table = $registry->get('/your/excel/path/filename.xlsx');
$rows = $table->find()->all();
foreach ($rows as $key => $row) {
    debug($row);
}
exit;

あと便利そうなオプション、
開始行を指定、開始列指定、列名(=フィールド名)を変換するマップとか。


$table = $registry->get($xls,null, []);
“`

cakephp3で画像(など)をアップロードするプラグインUpload Plugin 3.0を使ってみる。

cakephp3でプラグインいろいろ選んでいたけど一番余分なものいらなくシンプルに使えそうなUpload Plugin 3.0を使ってみました。

Upload Plugin 3.0
https://github.com/FriendsOfCake/cakephp-upload

必要環境 / ライセンス

  • CakePHP 3.x
  • PHP 5.4+
  • The MIT License (MIT)

ドキュメント

(ブログ記事シンプルで判りやすい)

使ってみた

  1. まずプロジェクトのルートでコンポーザーのコマンドでインストール
    composer require josegonzalez/cakephp-upload

  2. cakeコマンドでbootstrap.phpに追記
    bin/cake plugin load Josegonzalez/Upload

  3. テーブルに photo,dir フィールドを追加(varchar(255)

  4. モデルクラスにプラグイン利用の記述を追記

public function initialize(array $config)
{
        $this->addBehavior('Josegonzalez/Upload.Upload', [
            'photo' => [
                'path' => 'static{DS}{model}{DS}{field}{DS}'
                'nameCallback' => function ($data, $settings) {
                    return uniqid().'-'.strtolower($data['name']);
                }
            ],
            
        ]);
  1. フォームタグのcreateに ‘type’=>’file’追加。
<?= $this->Form->create($product, ['type' => 'file']) ?>
  1. inputタグを追加
<?= $this->Form->control('photo', ['type' => 'file']); ?>
  1. webroot/file ディレクトリを作成(要書き込みパーミッション)

  2. いざアップロード
    無事アップロードできました。


すこしだけハマった所。

最初ビヘイビアの記述に以下のようにフィールド名のみを書いていると

$this->addBehavior('Josegonzalez/Upload.Upload', [
        'photo'
]);

タイプがダメよとエラーが。

Invalid data type, must be an array or ArrayAccess instance. 

アップロードのファイルタイプと一瞬おもったけど。これはプラグインがオプションを拾うところで、Array を期待するがStringなのでエラーになっていた。
以下のように空のArrayにしたらOKだった。

$this->addBehavior('Josegonzalez/Upload.Upload', [
        'photo' => []
]);

オプションのpathを記述した場合に{primaryKey}がAdd(新規)で使えなく断念した

        $this->addBehavior('Josegonzalez/Upload.Upload', [
            'photo' => [
                'path' => 'static{DS}{model}{DS}{field}{DS}{primaryKey}'
            ]
        ]);

これでちゃんと写真が取得できるようになった。

object(AppModelEntityProduct) {

    'id' => (int) 1,
    'supplier_id' => '1',
    'status_id' => (int) 11,
    'name' => 'テストセット',
    'description' => 'テスト',
    'unit_price' => (int) 1304,
    'photo' => '008.jpg',
    'dir' => 'static/Products/photo/1',
    'note' => '',
    'created' => object(CakeI18nFrozenTime) {

Page 16 of 47

Powered by WordPress & Theme by Anders Norén