CakePHP3で画像をアップロードする際に一時ファイルなどの情報の場所
開発環境は、Windows 10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.6.13。
画像などをアップロードしても、CakePHPでは、規約により$_FILESを使うことができない。その対策として、代替の方法を書いておきます。
<?php // 主にコントローラ内にてPOSTメソッドを受け取ったら $img = $this->request->getData("fileのname属性名"); echo $img['size']; // ファイルサイズ echo $img['type']; // ファイルの形式 echo $img['tmp_name']; // 一時ファイルの絶対パス echo $img['name']; // 画像のファイル名 echo $img['error']; // エラーメッセージ ?>
で、name,tmp_name,size,error,typeが連想配列の形式で取得できる。
画像を複数枚アップロードしたい場合
formタグ内にて、
<input type="file" name="file[0]"> <input type="file" name="file[1]"> <input type="file" name="file[2]">
みたいに指定して、
アクション側では、
<?php for($i = 0; $i < 3; $i++){ $img = $this->request->getData("file")[$i]; } ?>
という風にする。連番にした方が、アクション側はfor文を使って、少ないコードでかけるので便利。
参考リンク
CakePHP画像をアップロードする - Qiita
・ここに書いてあることじゃ、情報が古いのかできず、自分で方法を見つけました。
PHPのImagickで縦横比を自動的に計算してサムネイル画像を作成する
開発環境はWindows10 Pro(64bit) + PHP 7.2.12。
横幅を指定するだけで自動的に高さも計算して、サムネイルを作ってくれるプログラムが見つからなかったので自分で書いた。
PHPでは、幅の数値を割るときに、floatに型変換しなくても、float型の値として小数点以下も表示してくれる。Pythonとは違うようだ。
ImagicKで画像を読み込むためには絶対パスで指定しないとエラーになる。
サムネイル画像はPHPのプログラムと同じディレクトリに入れている。
<?php $Image = 'test.jpg'; $thumbImage = 'thumb_test.jpg'; $im = new Imagick(realpath($Image)); $width = $im->getImageWidth(); $height = $im->getImageHeight(); // 仮に横幅を400と指定 $thumb_width = 400; // 元の画像の横幅がリサイズしたい画像の横幅より大きければ if($width > $thumb_width){ $comparison = $width / $thumb_width; $thumb_height = $height / $comparison; $im->thumbnailImage($thumb_width, $thumb_height,true,true); $im->writeImage(__DIR__."\\".$saveImagePath); } ?>
参考リンク
PHPでImageMagickを使ってサムネイル画像を作成する | Unskilled?
PHP: Imagick::thumbnailImage - Manual
PHP: realpath - Manual
PHPの関数の引数への値渡しと参照渡し
開発環境はWindows10 Pro(64bit) + PHP 7.2.12。
関数の引数への値渡しの場合、関数内部で引数の値を変えても、元の変数に影響はないが、参照渡しの場合、関数内部で引数の値を変えると、元の変数も変更される。
参照渡しの場合は、関数内の引数の前に&(アンパサンド)をつける。
<?php function value($a){ $a = "modified"; } function reference(&$a){ $a = "modified"; } $a = "test"; value($a); echo $a."<br>"; reference($a); echo $a; ?>
実行結果
参考リンク
PHP: 関数の引数 - Manual
CakePHP3のクエリービルダーで詰まったところ
開発環境は、Windows 10 Pro(64bit) + PHP 7.2.12 + CakePHP 3.6.13。
SQL文を直接書く時は簡単なんですけど、それをクエリービルダーをやる場合に、詰まってしまったポイントを書いておきます。
■クエリービルダーでselect句を使う際のカラム名について
クエリービルダーでitemsテーブルから情報を取得する際に、
<?php $this->Items->find() ?>
と書くと、生成されるSQL文では、select句にて、各カラムの名前を、『頭文字が大文字のテーブル名__カラム名』というエイリアスにas句を使って自動的に変更しています。
例えば、itemsテーブルに、priceというカラムがあれば、『Items__price』という名前に自動的に変更しています。
そして、テンプレート側で取得結果を表示する場合は、
1.カラム名が頭文字が大文字のテーブル名__カラム名
(例: Items__price
2.カラム名
(例: price
のどちらかに、as句で変更していると、foreachなどでレコード1つ分を取得した際に、$item->カラム名(例えば、$item->price)のやり方で問題なく読み込んで表示しますが、それ以外の場合は、その名称で、指定しないといけませんので、ちょっと面倒。
select文でのカラム名の変更の方法は、itemsテーブルにて、Items__priceカラムをpriceカラムに変更したければ、
<?php $this->Items->find()->select(['price' => 'Items__price']); ?>
とするだけで良いです。
■タイトル、記事内容、タグの中に特定のキーワードがあれば、結果として返す場合のクエリービルダーの例
SQL関数であるconcatでタイトルと記事内容とタグを結合したものを、LIKE句を使って、検索することにします。
<?php $query = $this->Articles->find(); $concat = $query->func()->concat(['title' => 'identifier', 'article' => 'identifier','article_tag' => 'identifier']); $subquery = $query->select(['combine_string' => $concat])->select($this->Articles); $q = $this->Articles->select(['id' => 'Articles__id', 'title' => 'Articles__title', 'article' => 'Articles__article', 'article_tag' => 'Articles__article_tag'])->from(["result" => $subquery])->where(['AND' => [['result.combine_string LIKE' => '%キーワード1%'], ['result.combine_string LIKE' => '%キーワード2%']])->order(['result.id' => 'DESC']); $this->set('result', $this->paginate($q)); ?>
参考リンク
CONCAT:文字列を結合する
CakePHP3.x ORMでFrom句に仮想テーブルを追加する方法 - Qiita
クエリービルダー - 3.7
CakePHP3で画像を表示する
開発環境は、Windows 10 Professional(64bit)、CakePHP3.6.13、PHP 7.2.12。
CakePHP3で画像を表示させたい場合、
HTMLヘルパーを用いた基本
/webroot/img/ディレクトリ内に入れた画像(例えば、test.jpg)を、テンプレート内にて、
<?php echo $this->Html->image("test.jpg"); ?>
という風に入力することで表示されます。
HTMLヘルパーを用いて、/webroot/img/ディレクトリ内にディレクトリを作り、画像を振り分けたい場合
/webroot/img/ディレクトリに、例えば、fruitsという名前のディレクトリを作り、その中に、grape.jpgという画像があって、それを表示したい場合は、テンプレート内にて、
<?php echo $this->Html->image("fruits/grape.jpg"); ?>
という風に入力することで表示されます。
Htmlヘルパーを用いず、imgタグを直接書く場合
/webroot/img/ディレクトリ内に、test.jpgという画像があって表示させたい場合、テンプレート内にて、
<img src="/img/test.jpg">
と風に入力することで表示されます。
先延ばし癖のある自分の行動力を上げる方法
先延ばし癖のある自分を改善したくて、実践して有効だった方法をメモしておきます。
改善する方法を探すために、ネットで色々と検索してみたんですが、ノウハウはあるけれども、なかなか自分の頭に入ってこなくて、やる気になれませんでした。
ノウハウを数多く箇条書きで列挙している自己啓発系ブログは多いけど、その方法を何日継続して実践して、どういうことができたのか?あるいはできなかったのか?を詳細に書いているブログはほぼ見ない。
試行錯誤しているプロセスが文章から見えないのが不満。だから、頭に入ってこない。
そこで、YouTubeで検索したら、以下の動画は、不思議と頭に入ってきて、実践してみようかな?と思えるものでした。文章よりも、動画の方が頭に入ってきやすいかもしれません。
上記の方法をやってみて、自分なりに改良した方法を書いていきます。
1. 行動する内容を紙に書く。ただし、1分以内にできる行動、あるいは、1つの行動だけ書く。書き方は、「〇〇するだけ」という風に書く。やり終わったら、赤ペンで消す。いくつかやっていくと、気分がノッテくる。
例えば、
・ソースコードを1行読むだけ/書くだけ
・解決したい問題に関するキーワードで検索するだけ
・サイトへアクセスするだけ
・アクセスして、書かれている文章を一行読むだけ
・ソフトをダウンロードするだけ/インストールするだけ
・1分間、YouTubeで英語の動画を聞くだけ
・1つの単語をGoogle翻訳で翻訳するだけ
・ブログの記事を一行書くだけ
・人に聞きたいことを1つ聞くだけ
・出かける場合なら、着替えるだけ→靴を履くだけ→外に出るだけ→少し歩くだけを連続して行う
・目標を1つ書くだけ
・目標を達成するためにやらなければならないことを1つ書くだけ
など。
何もしていない状態から、行動する気分になるためには、過去に何度もやったことのある行動をリストに加えて、いくつか実践すること。今までやったことのない行動をいきなり行うとすると、仮に、1分以内にできる行動や、1つの行動だけ書いてもやらないことが多い。
行動したことのある行動の中に、行動したことのないことを混ぜること。
過去に行動したことのあることでも、しばらくやっていなければ、今までやったことのない行動と同じく、やるのが面倒くさく感じる。
ただ、この方法だけやっても、行動は前よりもやるようになるが、過去にやったことのある行動の繰り返しになりがち。そうじゃなくて、要は、目標を立てて、今までやったことのない行動をちょっとだけ毎日継続して、それを習慣化して、目標を達成すること。そうしないと、人生自体は大して変わらないし、自信が得られない。
2,行動すべき重要な行動を細分化したものを前日に書いておいて、朝一番に行うこと。朝一番だと、先延ばししようとするパワーが一番小さいと思う。
上記だけでなく、先延ばしをするためにやっている余計な行動をやめることも同時に行う。自分の場合は、
です。そのための方法として、
- 行動のハードルを徹底して上げること
・紙などにやめるべきことを書いて、やりそうになったらチラっと見ること
・パソコン上からソフトをアンインストールする
・LeechBlockなどのアドオンで一定時間サイトへアクセスできないようにする
を行いました。