tag:blogger.com,1999:blog-80469793207539528072024-03-13T13:46:47.979+09:00徒然なるままに -- Ennui Style --Web周りの技術や考察について、徒然なるままに書き記していきます。Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.comBlogger40125tag:blogger.com,1999:blog-8046979320753952807.post-90151805130901923412016-12-22T16:16:00.000+09:002016-12-22T16:16:02.244+09:00CakePHP3 ファイルアップロード -- file upload --<table border="1" bordercolor="#333333" cellpadding="5" cellspacing="0">
<tbody>
<tr>
<td align="right" nowrap="">PHP Ver</td>
<td align="right" nowrap="">5.6.27</td>
</tr>
<tr>
<td align="right" nowrap="">CakePHP Ver</td>
<td align="right" nowrap="">3.1.9</td>
</tr>
</tbody></table>
<br />
<br />
■ 前提<br />
自前でファイルアップロードを作りたい方向けに記述しています。<br />
CakePHP3 では、有名なファイルアップロード関連のプラグインがありますので、プラグインでもいいって方は、そちらの方が良いかもしれません。<br />
一応、一つご紹介<br />
<br />
<a href="https://github.com/dala00/cakephp-simple-upload" rel="nofollow" target="_blank">cakephp-simple-upload</a><br />
<br />
-----------------------------------------------<br />
<br />
では、本題へ。<br />
Controllerに実装することもできるのですが、それでは美しくないってことで、ModelクラスのbeforeSaveというメソッドに処理させます。<br />
beforeSaveメソッドについては、こちらを <a href="http://book.cakephp.org/3.0/ja/orm/table-objects.html#beforesave" target="_blank">参照 </a><br />
<br />
== Model ==<br />
public function beforeSave($event, $entity, $options)<br /> {<br /> // entityにファイルが指定されているかどうか<br /> if ($entity->has('upload_file')) {<br /> $upload_file = $entity->get('upload_file');<br /> // ファイルが正しくアップロードされているか<br /> if ($upload_file['error'] === UPLOAD_ERR_OK && $upload_file['size'] !== 0) {<br /> <br /> // ファイルを保存する<br /> $file = new File($upload_file['tmp_name']);<br /> $file->copy('/example/dest/upload_file');<br /> } else {<br /> // ファイルが指定されていなかった場合、上書きされてしまわないようにする<br /> $entity->unsetProperty('upload_file');<br /> }<br /> }<br /> }<br />
<br />
今回はDB保存する直前に動作するbeforeSaveで処理しましたが、インクリメントされたIDをファイル名に入れたいなど思われる方は、afterSaveメソッドで処理させると良いかもしれません。<br />
<br />
最後に問題が、この指定方法だとファイルアップロードに失敗した場合のエラーハンドリングがうまくできないんですよね。<br />
どなたかご教授頂けると幸いです。<br />
<br />
<br />
===================================================<br />
<br />
■ Premise<br /><br /> It is written for those who want to make file upload on their own.<br /><br /> In CakePHP 3, there is a famous plugin related to file uploading, so if you can plugin it may be better there.<br /><br /> Once, one introduction<br /><br /><a href="https://github.com/dala00/cakephp-simple-upload" target="_blank">cakephp-simple-upload</a><br /><br />-----------------------------------------------<br /><br />
Then, to the main subject.<br /><br /> It can also be implemented in Controller, but let's say that it is not beautiful and that it is handled by the Model class beforeSave method.<br /><br /> For the beforeSave method, <a href="http://book.cakephp.org/3.0/en/orm/table-objects.html#beforesave" target="_blank">see here</a><br /><br /> == Model ==<br /><br /> public function beforeSave($event, $entity, $options)<br /> {<br /> // Whether a file is specified for entity<br /> if ($entity->has('upload_file')) {<br /> $upload_file = $entity->get('upload_file');<br /> // Is the file uploaded correctly?<br /> if ($upload_file['error'] === UPLOAD_ERR_OK && $upload_file['size'] !== 0) {<br /> <br /> // Save the file<br /> $file = new File($upload_file['tmp_name']);<br /> $file->copy('/example/dest/upload_file');<br /> } else {<br /> // Do not overwrite if file is not specified<br /> $entity->unsetProperty('upload_file');<br /> }<br /> }<br /> }<br /><br /><br /> This time it processed with beforeSave which operates just before saving the DB, but if you think that you want to include the incremented ID in the file name, it may be better to process it with the afterSave method.<br /><br /> Finally, if the problem is this specification method, error handling can not be done well if the file upload fails, right?<br /><br /> I hope someone can take a professor.<br />
<br />
<br />
<br />
<br />
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-56658496518646581902016-10-27T16:31:00.002+09:002016-12-22T15:14:34.562+09:00cakephp3 phpunit 利用時に使える便利なmethodなどについて<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
公式ページを見れば記載があるが、少しわかりにくいのでPHPUnitで利用されるファイルやメソッドについて書いておく。<br />
<br />
<br />
<b>Fixtures:</b><br />
実際のアプリケーションに使われているデータを破壊することなく テストができる<br />
・各フィクスチャで必要なテーブルを作成します<br />
・フィクスチャにデータが存在すれば、それをテーブルに投入します<br />
・テストメソッドを実行します<br />
・フィクスチャのテーブルを空にします<br />
・データベースからフィクスチャのテーブルを削除します<br />
<br />
記述例(xxxControllerTest.php)<br />
--------------------------------------------------- <br />
public $fixtures = [
'app.user',
'app.article'
];<br />
---------------------------------------------------<br />
<br />
<br />
<b>setUp method:</b><br />
テストメソッドの前に毎回呼び出されます<br />
テストされるオブジェクトの生成や、テストのためのデータの初期化に使われます<br />
メールなどの設定はここに記述すると便利 <br />
※parent::setUp() を呼び出すことを忘れないでください<br />
<br />
記述例(xxxControllerTest.php)<br />
--------------------------------------------------- <br />
public function setUp()
{<br />
parent::setUp();<br />
<br />
Email::dropTransport('default');<br />
Email::configTransport('default', [
'className' => 'Debug',
]);<br />
}<br />
---------------------------------------------------<br />
<br />
<br />
<b>tearDown method:</b><br />
テストメソッドの後に毎回呼び出されます<br />
テストが完了した後のクリーンアップに使われます<br />
※parent::tearDown() を呼び出すことを忘れないでください<br />
<br />
記述例 (xxxControllerTest.php)<br />
--------------------------------------------------- <br />
public function tearDown()
{<br />
parent::tearDown();<br />
}<br />
---------------------------------------------------<br />
<br />
<br />
<b>setupBeforeClass method:</b><br />
クラスのテストメソッドを実行する前に一度だけ呼ばれます<br />
※このメソッドは static でなければなりません<br />
<br />
記述例 (xxxControllerTest.php)<br />
---------------------------------------------------<br />
public static function setupBeforeClass()
{<br />
parent::setupBeforeClass();<br />
}<br />
---------------------------------------------------<br />
<br />
<br />
<b>tearDownAfterClass method: </b><br />
クラスのテストメソッドをすべて実行した後に一度だけ呼ばれます<br />
※このメソッドは static でなければなりません<br />
<br />
記述例 (xxxControllerTest.php)<br />
---------------------------------------------------<br />
public static function tearDownAfterClass()
{<br />
parent::tearDownAfterClass();<br />
}<br />
--------------------------------------------------- Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-92227112754935195712016-10-13T14:45:00.003+09:002016-12-22T15:14:48.700+09:00cakephp3 pagenation & meta tag<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
ページネーション処理は、Cakephpのデフォルトで準備がされている<br />
<br />
まずは、ページネーション使いますよとAppViewのinitializeメソッドで設定<br />
<br />
---------------------------------------------------<br />
<br />
$this->loadHelper('Paginator');<br />
<br />
---------------------------------------------------<br />
<br />
<br />
Controllerのinitializeメソッド内などで、ページネーションの詳細設定を行う<br />
<br />
---------------------------------------------------<br />
<br />
$this->loadComponent('Paginator');<br />
$this->paginate = [<br />
'limit' => 10<br />
]; <br />
<br />
---------------------------------------------------<br />
<br />
<br />
limitなどはロードした後に設定<br />
<br />
では実際に使ってみる<br />
DBから取得してきたqueryをページネーションを使って表示<br />
<br />
---------------------------------------------------<br />
<br />
$this->set('articles', $this->Paginator->paginate($article->getArticlesQuery(), $this->paginate));<br />
<br />
---------------------------------------------------<br />
<br />
<br />
その後Viewでは気にせず普通にイテレーションしてあげればよい<br />
但し、以下の表示は入れてあげないとページ番号が出てこないので注意 <br />
<br />
---------------------------------------------------<br />
<br />
<?= $this->Paginator->numbers() ?><br />
<br />
---------------------------------------------------<br />
<br />
ここで記述した内容はあくまで一例で、参考程度に。<br />
<br />
詳しくは、以下参照<br />
<br />
<a href="http://book.cakephp.org/3.0/ja/controllers/components/pagination.html" rel="nofollow">http://book.cakephp.org/3.0/ja/controllers/components/pagination.html</a><br />
<br />
<br />
備考<br />
rel=prevやrel=nextも自動でやってくれる<br />
Viewファイル内で以下のようにheadタグの中に記述 <br />
<br />
---------------------------------------------------<br />
<br />
<?= $this->Paginator->meta() ?><br />
<br />
---------------------------------------------------<br />
<br />
これだけ。便利ですね~ Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-23223402621801725612016-09-30T14:31:00.001+09:002016-12-22T15:15:27.686+09:00cakephp3 Trimについて<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
入力値の前後にある全角/半角スペースを取り除きたい<br />
<br />
cakephp3 の Validation では全角スペースだけが入力された場合などは、notEmpty を指定していても、<br />
普通に通ってしまう。<br />
<br />
ということで Trim しなければならないのですが、どこのタイミングで行うか。<br />
<br />
調べた結果、公式に載っていました。<br />
(<a href="http://book.cakephp.org/3.0/ja/orm/saving-data.html#before-marshal">http://book.cakephp.org/3.0/ja/orm/saving-data.html#before-marshal</a>)<br />
<br />
<pre><span class="c1">テーブルまたはビヘイビアクラスの </span><span class="nf">beforeMarshal メソッドで行いなさいと。</span></pre>
<pre><span class="nf"> </span></pre>
<pre><span class="nf">タイミングはこれでOK。</span></pre>
<pre><span class="nf">しかし、ここに記載されている通り デフォルトのメソッド Trim だけを行ってしまうと</span></pre>
<pre><span class="nf">全角スペースは対応できない。</span></pre>
<pre><span class="nf">
</span></pre>
<pre><span class="nf">ってことで、全角スペースにも対応した Trim メソッドを作成することに。</span></pre>
<pre><span class="nf">
</span></pre>
<pre><span class="nf">----------------------------------</span></pre>
<pre><span class="nf">
</span></pre>
<pre><span class="nf"> public static function mb_trim($str) {
return trim(preg_replace('/[ ]+$/u', '', preg_replace('/^[ ]+/u', '', $str)));
}</span></pre>
<pre>
<span class="nf">----------------------------------</span></pre>
<pre><span class="nf"> </span></pre>
<pre><span class="nf">これで良いかと思いきや、半角スペース - 垂直タブ - 全角スペースみたいな入力を</span></pre>
<pre><span class="nf">されてしまうと対応できないんですね・・・</span></pre>
<pre><span class="nf">対応が難しそうなので、このメソッドは暫定でこのままにしておいて、後々考えようと</span></pre>
<pre><span class="nf">思います。 </span></pre>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-85520650314830476042016-09-23T16:39:00.001+09:002016-12-22T15:15:37.329+09:00cakephp3 開発機と本番機でDBの向き先を変える -- custom db connection --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
cakePHPでは、Unit用と通常利用するDBの設定が別々に設定されている。<br />
<br />
しかし、一般的には開発機と本番機は別なので、本番機にアップする際に、いちいち設定を変更しないといけない。<br />
そいつはミスする元凶になりそうだし、面倒だなぁ<br />
<br />
ってことで、Unit用、開発機用、本番機用の3種類設定を行い、自動的に切り替えるようにしようと思い立つ。<br />
<br />
<b>既存のdefault・test以外にDBの向き先を変える方法</b><br />
<br />
まずは、app.phpに設定を加える(ここでは開発機用の設定をdivとして追加)<br />
<b> </b><br />
<b>通常はこんな感じ </b><br />
<b>----------------------------------------------</b><br />
'Datasources' => [<b><br /></b><br />
'default' => [<br />
'className' => 'Cake\Database\Connection',<br />
'driver' => 'Cake\Database\Driver\Mysql',<br />
'persistent' => false,<br />
'host' => '本番機',<br />
'log' => false, 'quoteIdentifiers' => false,<br />
],<b></b><br />
'test' => [<br />
'className' => 'Cake\Database\Connection',<br />
'driver' => 'Cake\Database\Driver\Mysql',<br />
'persistent' => false,<br />
'host' => 'localhost',<br />
'log' => false,<br />
],<br />
], <br />
<b>----------------------------------------------</b><br />
<br />
<b>これに以下の内容を追加する</b><br />
<br />
<b>----------------------------------------------</b><br />
'div' => [<br />
'className' => 'Cake\Database\Connection',<br />
'driver' => 'Cake\Database\Driver\Mysql',<br />
'persistent' => false,<br />
'host' => '開発機',<br />
'log' => false,<br />
],<br />
<b>----------------------------------------------</b><br />
<br />
で、切り替える様にコードを改修<br />
通常Modelの各Tableクラスは<br />
<br />
Cake\ORM\Table<br />
<br />
を継承しているけど、CustomTableみたいなクラスを作成してModelの各Tableクラスはこの新しく作成したクラスを継承して、CustomTableクラスで既存のTableクラスを継承する。<br />
(要は、間に一枚かますってこと) <br />
<br />
で、切り替えを行うために、既に準備されている”defaultConnectionName”というメソッドで向き先を設定してあげる。<br />
<br />
<b><b>と、新しく作成するファイルはこんな感じになる </b></b><br />
<b>----------------------------------------------</b> <br />
class CustomTable extends Table {<br />
<br />
public static function defaultConnectionName() {<br />
if (Configure::read('debug')) {<br />
if (Unitだったら) {<br />
return 'test';<br />
} else {<br />
return 'div';<br />
}<br />
} else {<br />
return 'default';<br />
}<br />
}<br />
}<br />
<b>----------------------------------------------</b><br />
<br />
これで、設定ファイルをいちいち設定しなくても良くなる<br />
<br />
しかし、const.phpのdebug設定は都度変えないといけない。<br />
その対応は後々考えることに・・・Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-10076626149974208512016-09-15T15:03:00.000+09:002016-09-15T15:04:08.240+09:00Google Translateを使用してサイトを多言語化 -- use Google Translate For Localization --<ul>
<li>Google Translate 登録画面へアクセス(事前にGoogleアカウント取得)</li>
<ul>
<li>https://translate.google.com/manager/website/</li>
</ul>
</ul>
<ol><ol>
<li>「今すぐウェブサイトに追加」 ボタン押下</li>
<li>ウェブサイトの URLを入力</li>
<li>ウェブサイトの言語を選択</li>
<li>「次へ」 押下</li>
<li>翻訳する言語を選択</li>
<ol>
<li>すべての言語を選択すると一般的に使われない言語が多いので、言語を指定を選ぶことをおすすめ</li>
</ol>
<li>表示モード選択</li>
<li>詳細設定選択</li>
<li>「コードを取得」 ボタンを押下 </li>
<li>表示されたHTMLをWebサイトに貼り付け</li>
</ol>
</ol>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-28392668749610545592016-08-30T18:49:00.001+09:002016-12-22T15:15:58.739+09:00cakephp3 Cache<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
画像やJavascript、CSSをキャッシュしたい場合は、以下のように設定<br />
<br />
app.php<br />
-------------------------------------------<br />
'Asset' => [<br />
'timestamp' => true, // 画像,JS,CSSのキャッシュを無効にする(デバッグモードのときのみ)<br />
],<br />
<br />
-------------------------------------------<br />
デバッグモード時に限らず、常にクエリストリングを付けたい場合 : 'force'Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-30705386877156259872016-08-02T18:41:00.001+09:002016-12-22T15:16:21.323+09:00Cakephp3 での例外スロー時のPHPUnit -- cakephp3 phpunit throw Exception --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<pre>例外をスローした場合のUnitTestの比較方法を色々と調べてみたが、</pre>
<pre></pre>
<pre>------------------------------------------</pre>
<pre>setExpectedException(InvalidArgumentException)</pre>
<pre>------------------------------------------</pre>
<pre></pre>
<pre>私の環境では、この方法だとなぜか上手くいかない。</pre>
<pre></pre>
<pre>try catchでの方法も試してみたが、これも上手くいかない。</pre>
<pre></pre>
<pre>なので、少し力技ではあるが、以下のようにした。</pre>
<pre></pre>
<pre>------------------------------------------</pre>
<pre>$this->assertInstanceOf('InvalidArgumentException', $this->_exception);</pre>
<pre>$this->assertEquals('Invalid Argument', $this->_exception->getMessage());</pre>
<pre>------------------------------------------</pre>
<pre></pre>
<pre>
</pre>
<pre>注意:</pre>
<pre>NotFoundExceptionなどはフルpathで指定しないといけない。</pre>
<pre><pre>------------------------------------------</pre>
<pre>$this->assertInstanceOf('Cake\Network\Exception\NotFoundException', $this->_exception);</pre>
</pre>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-88443367268709993102016-08-02T15:21:00.000+09:002016-12-22T15:16:57.649+09:00cakephp3 多言語化 -- localization --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
文字変換用ファイル作成<br />
<br />
・src/Locale/{Lang}/default.poを作成<br />
{Lang}は日本語なら”ja_JP”、英語なら”en_US”<br />
<br />
・変換文字列を記載<br />
msgid "{変換前の文字列}"<br />
msgstr "{変換後の文字列}"<br />
<div>
<br /></div>
<div>
例:</div>
<div>
msgid "Tweet"</div>
<div>
msgstr "ツイート"</div>
<div>
<br /></div>
<div>
・ini_setで言語の指定</div>
<div>
<pre class="code lang-php" data-lang="php" data-unlink=""><span class="synIdentifier"> ini_set</span><span class="synSpecial">(</span>'<span class="synConstant">intl.default_locale</span>', '<span class="synConstant">ja_JP</span>'<span class="synSpecial">)</span>;</pre>
<pre class="code lang-php" data-lang="php" data-unlink="">
</pre>
<pre class="code lang-php" data-lang="php" data-unlink="">これで文字列が変換される。</pre>
<pre class="code lang-php" data-lang="php" data-unlink="">
</pre>
<pre class="code lang-php" data-lang="php" data-unlink="">但し、default.poファイルはキャッシュされるので、追記や変更を行った場合は、tmp/cacheディレクトリを削除するのをお忘れなく。</pre>
</div>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-64485399647716906852016-07-16T23:30:00.001+09:002016-07-16T23:30:27.880+09:00Google API Client についてGoogle API Client 1系では、Google_Auth_AssertionCredentials というクラスを利用するが、2系からは使い方が変わったらしい。<br />
<br />
資料もあまりないので、自分でドキュメント調べて、実装しようと試みたが、私の利用しているレンタルサーバーはSSLに対応していないので、そもそも利用できなかった。<br />
<br />
実装する前に、ちゃんと調べるべきだった。。。Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-58855466851407356242016-07-01T03:55:00.001+09:002016-12-22T15:17:47.609+09:00cakephp3 phpunit利用時にメールを飛ばさないようにする方法 -- do not mail send to use phpUnit --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
SetUpメソッドに以下の内容を記載<br />
<br />
------------------------------------------------<br />
public function setUp()<br />
{<br />
parent::setUp();<br />
<br />
Email::dropTransport('default');<br />
Email::configTransport('default', [ 'className' => 'Debug', ]);<br />
}<br />
------------------------------------------------<br />
※parent::setUp() を呼び出すことを忘れずに<br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-42511498447447189452016-07-01T03:36:00.002+09:002016-12-22T15:18:12.478+09:00cakephp3 get Controller Name / Action Name<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
いつも忘れちゃうので、備忘録として <br />
<br />
<ul>
<li>Controller Name</li>
<ul>
<li>ControllerまたはViewで$this->name</li>
</ul>
</ul>
<br />
<ul>
<li>Action Name</li>
<ul>
<li> ControllerまたはViewで<code class="php variable">$this</code><code class="php plain">->request->action</code></li>
</ul>
</ul>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-3407948000575797682016-06-29T14:10:00.001+09:002016-12-22T15:18:40.302+09:00cakephp3 subdirectory .htaccess edit<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<br />
レンタルサーバー等を利用した場合等にサブドメインをサブディレクトリに指定することがありますよね。<br />
その場合には、 以下の設定を変更しないとcakephp3がうまいこと動きません。<br />
ただ、これだけだけど数時間はまった・・・ <br />
<br />
<ul>
<li>レンタルサーバー利用時に変更しなければならない.htaccessのmod_rewirte設定</li>
<ul>
<li>app/.htaccess</li>
<ul>
<li>RewriteBase / を追加</li>
</ul>
<li>app/webroot/.htaccess</li>
<ul>
<li> RewriteBase / を追加</li>
</ul>
</ul>
</ul>
<br />
<br />Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-73378467024800792692016-06-28T12:02:00.000+09:002016-12-22T15:18:52.420+09:00cakephp3 sitemap plugin install<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
サイトマップを準備する<br />
<br />
cakephp3 にはサイトマップ用のプラグインが準備されているので、利用する。<br />
<br />
・インストール <br />
$ cd app/plugins/<br />
<div class="crayon-line crayon-striped-line" id="crayon-57713c4bc0360695044518-2">
<span class="crayon-e"> $ git </span><span class="crayon-r">clone</span><span class="crayon-h"> </span><span class="crayon-v">https</span><span class="crayon-o">:</span><span class="crayon-c">//github.com/fm-labs/cakephp3-sitemap Sitemap</span></div>
<div class="crayon-line crayon-striped-line" id="crayon-57713c4bc0360695044518-2">
<br />
<span class="crayon-c">・Bootstrap.phpにプラグインをロードする内容を追記</span><br />
<span class="crayon-c">--------------------------------</span><br />
<span class="crayon-c"> Plugin::load('Sitemap', ['autoload' => true, 'routes' => true]);</span><br />
<span class="crayon-c">--------------------------------</span><br />
<br />
<span class="crayon-c">・SitemapController.phpの作成</span><br />
<span class="crayon-c">--------------------------------</span><br />
<span class="crayon-c"><?php </span><br />
<span class="crayon-c">namespace App\Controller; </span><br />
<br />
<span class="crayon-c">use App\Controller\AppController; </span><br />
<br />
<span class="crayon-c">class SitemapController extends AppController</span></div>
<div class="crayon-line crayon-striped-line" id="crayon-57713c4bc0360695044518-2">
{<br />
public function initialize()<br />
{<br />
$this->loadComponent('Sitemap.Sitemap'); <br />
}<br />
<br />
public function index()<br />
{<br />
$this->Sitemap->createIndex();<br />
<br />
$this->Sitemap->create();<br />
<br />
$this->Sitemap->addLocation(<br />
['controller' => '[ControllerName]', 'action' => '[ActionName]', $id], // url<br />
1, // priority<br />
$value->modified, // last modified date<br />
'hourly' // change frequency<br />
);<br />
}<br />
}<br />
<span class="crayon-c">--------------------------------</span><br />
<br />
<span class="crayon-c">Controllerの内容はapp/plugins/Sitemap/src/Controller/SitemapController.phpに記述されているので参考になります。</span></div>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-6338785670024588552016-06-27T22:11:00.002+09:002016-07-11T21:10:41.468+09:00SEO対策 keyword 選定 toolSEO対策 KeyWord選定ツール<br />
<br />
ブログ検索<br />
Ritlweb: <a href="http://blog.ritlweb.com/">http://blog.ritlweb.com/</a> <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMwB-1baPNVt9jpQ6IE1D_b748tzhjXn2yaevqOSEaGsgY5iv2rMlveVKVengMnTtMKxrIf_GgNc-cX-pndqNrj6jXkqwSTtNA1rvFY_gdD0sebvunlTL1Cm0M0Pdk-YQXETDk8tSvV4Lc/s1600/Ritlweb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgMwB-1baPNVt9jpQ6IE1D_b748tzhjXn2yaevqOSEaGsgY5iv2rMlveVKVengMnTtMKxrIf_GgNc-cX-pndqNrj6jXkqwSTtNA1rvFY_gdD0sebvunlTL1Cm0M0Pdk-YQXETDk8tSvV4Lc/s320/Ritlweb.png" width="320" /></a></div>
<br />
<br />
キーワード検索数予測ツール <br />
Rishirikonbu: <a href="http://rishirikonbu.jp/">http://rishirikonbu.jp/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCZ9TUmznXAWXlE6n1JCYXCOzuDd2RWI4_W6g4hXy6Vfzfwekx9mvBuao7-m-2JCEkV_XV3BTffyNOhxPjP7xMabYs8FywW_sRPY-l6dDpP3hy86JZe0BADFxboeEYqDcU5XeaJM2ZZ3OR/s1600/rishirikonbu.jp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCZ9TUmznXAWXlE6n1JCYXCOzuDd2RWI4_W6g4hXy6Vfzfwekx9mvBuao7-m-2JCEkV_XV3BTffyNOhxPjP7xMabYs8FywW_sRPY-l6dDpP3hy86JZe0BADFxboeEYqDcU5XeaJM2ZZ3OR/s320/rishirikonbu.jp.png" width="320" /></a></div>
<br />
<br />
<br />
<br />
キーワードウォッチャー: <a href="https://www.keywordwatcher.jp/">https://www.keywordwatcher.jp/</a><br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<br />
Uber: <a href="https://ubersuggest.io/">https://ubersuggest.io/</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimnvwi4jILwHSdaGAOcggDoSy27JTIUIbG9QGaEebk2EWVl4HNhniXtikbb1T_S8yEh0PwDQACVL1XGU8UkaQ8vixvCvaK9bB7dkXztBOlnmASrEbGwS-JGKNteIYPMr_bu2_w3nLHTCOf/s1600/%25C3%259Cbersuggest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimnvwi4jILwHSdaGAOcggDoSy27JTIUIbG9QGaEebk2EWVl4HNhniXtikbb1T_S8yEh0PwDQACVL1XGU8UkaQ8vixvCvaK9bB7dkXztBOlnmASrEbGwS-JGKNteIYPMr_bu2_w3nLHTCOf/s320/%25C3%259Cbersuggest.png" width="320" /></a></div>
<br />
キーワード検索数調査ツール<br />
Keyword Tool: <a href="http://keywordtool.io/">http://keywordtool.io/</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmKqf_8K8pGmJ8-nr-hdODd9Hu_1ZYxJPIRTKhEHFFF9Snmn5vg-DmT_4WegHfm4HdsNQWTueyD1sYV2K2srbc_w2W_-oEz_XGzSD22hhx_uKTS5N5E4IEW-1ggev6zQNabVKMY5wwX86C/s1600/KeywordTool.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmKqf_8K8pGmJ8-nr-hdODd9Hu_1ZYxJPIRTKhEHFFF9Snmn5vg-DmT_4WegHfm4HdsNQWTueyD1sYV2K2srbc_w2W_-oEz_XGzSD22hhx_uKTS5N5E4IEW-1ggev6zQNabVKMY5wwX86C/s320/KeywordTool.png" width="320" /></a></div>
<br />
GoodKeyword: <a href="http://goodkeyword.net/">http://goodkeyword.net/</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1g3RFBXCho53a2tZNztKbx3uTI7cW2J20lV4z6SCFyPo1ryIWnGNt0M3gH_os1mZ2v4o7ukZwKoQ8UVHFlTUqKCqlIuGp2JOKJq5zg3UmxwbNYvSj7RzNy-c9iS7E71YrAnGP2b7ak9L/s1600/goodkeyword.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhD1g3RFBXCho53a2tZNztKbx3uTI7cW2J20lV4z6SCFyPo1ryIWnGNt0M3gH_os1mZ2v4o7ukZwKoQ8UVHFlTUqKCqlIuGp2JOKJq5zg3UmxwbNYvSj7RzNy-c9iS7E71YrAnGP2b7ak9L/s320/goodkeyword.png" width="320" /></a></div>
<br />
Freet+: <a href="http://tool.ferret-plus.com/">http://tool.ferret-plus.com/</a><br />
<br />
SEOチェキ: <a href="http://seocheki.net/">http://seocheki.net/</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6Qefi6P7mFi0z5xo-uR4CTN1lL1_CFAsLjZ-9vwTU0RWPMYQ2ul4Bhy4ihabxB7bVlBf3Q8AJ9-EituM4V_ayAXQmKHa7u__Wi3cyh4e7CdKY_7upSWulhGn47ZneV8T2I-EkjOTM57b8/s1600/SEOcheki.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6Qefi6P7mFi0z5xo-uR4CTN1lL1_CFAsLjZ-9vwTU0RWPMYQ2ul4Bhy4ihabxB7bVlBf3Q8AJ9-EituM4V_ayAXQmKHa7u__Wi3cyh4e7CdKY_7upSWulhGn47ZneV8T2I-EkjOTM57b8/s320/SEOcheki.png" width="320" /></a></div>
<br />
Ranking Checker: <a href="http://broadentry.com/rankingchecker/">http://broadentry.com/rankingchecker/</a><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjrWsgJl8uI7Y5kzRcP1edId-MuVig1-4WhN1l3XWhXCsT4ZBcr2Kvjz9tn_aYUcAh6B56V2lFs-wrAz-MHsG0OfutSbdqSQTH3CPY0maYcMCiYMO47R7uCgqjzzKlPcwrOV4o1cPB8mU2/s1600/rankingchecker.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjrWsgJl8uI7Y5kzRcP1edId-MuVig1-4WhN1l3XWhXCsT4ZBcr2Kvjz9tn_aYUcAh6B56V2lFs-wrAz-MHsG0OfutSbdqSQTH3CPY0maYcMCiYMO47R7uCgqjzzKlPcwrOV4o1cPB8mU2/s320/rankingchecker.png" width="320" /></a></div>
<br />
Bull: http://bullseo.jp/<br />
<br />
<br />
キーワード作成支援ツール<br />
Google Keyword Planner: <a href="https://adwords.google.com/ko/KeywordPlanner/Home">https://adwords.google.com/ko/KeywordPlanner/Home</a><br />
<br />
<br />Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-91391022886459196362016-05-27T19:11:00.001+09:002016-12-22T15:19:11.358+09:00cakephp3 admin prefix routingの罠<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<legend>
cakephp admin prefix routingの罠
</legend>
<br />
<div class="well">
<blockquote>
・管理画面を作成する場合などControllerをネストする場合は注意!<br />
<br />
http://xxx.com/admin/ はsrc/Controller/{dirName}/xxxxController.phpというような<br />
Controllerを作成するが、この{dirName}が曲者。。。<br />
<br />
例えば 'Admin' というような名前でディレクトリを作成した場合<br />
XAMPPを利用した場合等、Windows環境では正しく認識されるが、Linux環境では<br />
ディレクトリ名が小文字の 'admin' としないと動作しない<br />
原因は調べられていないが、ディレクトリ名はすべて小文字にしないといけないらしい<br />
<br />
MissingControllerエラーが発生するのだが、そのエラーメッセージでは<br />
src/Controller/Admin/xxxxController.phpを作成しろと言われる<br />
しかし、ディレクトリ名が小文字でないと動作しない<br />
バグなのかな?<br />
<br />
相当、はまった・・・
</blockquote>
</div>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-45884496763978695182016-05-27T18:47:00.000+09:002016-12-22T15:19:39.588+09:00cakephp3 how to add intl module<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<legend>
ディレクトリ作成
</legend>
<br />
<div class="well">
<blockquote>
$ mkdir -p local/src
</blockquote>
</div>
<legend>
ICUインストール
</legend>
<br />
<div class="well">
<blockquote>
intlインストール時に必要<br />
<br />
$ cd local/src/<br />
$ wget http://download.icu-project.org/files/icu4c/54.1/icu4c-54_1-src.tgz<br />
$ tar xzvf icu4c-54_1-src.tgz<br />
$ cd icu/source/<br />
$ ./configure --prefix=$HOME/local<br />
$ gmake<br />
$ gmake install
</blockquote>
</div>
<legend>
intlインストール
</legend>
<br />
<div class="well">
<blockquote>
$ wget http://pecl.php.net/get/intl-3.0.0.tgz<br />
$ tar xzvf intl-3.0.0.tgz<br />
$ cd intl-3.0.0<br />
$ phpize<br />
$ ./configure --with-icu-dir=$HOME/local<br />
$ make<br />
$ cd ~/local/<br />
$ mkdir php<br />
$ mkdir php/extension<br />
$ cd php/extension/<br />
$ cp ~/local/src/intl-3.0.0/modules/intl.so .<br />
$ php -i | grep intl<br />
<br />
make install した方が良いと思う
</blockquote>
</div>
Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-29103535524918103952016-05-05T02:23:00.000+09:002016-12-22T15:20:02.843+09:00cakephp mysql tinyintの罠<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<legend>
cakephp mysql tinyintの罠
</legend>
<div class="well">
<blockquote>
<p>
・cakephpでmysqlのtinyint型を利用するときは要注意!<br />
tinyint(1)と設定した項目はbool型として認識される。<br />
<br />
$this->request->dataでは正しくPOSTされてくる、<br />
しかし、patchEntityをするとbool型になる。<br />
何をやっても結果は一緒・・・<br />
<br />
これはbugではないのか?とcakephp側のコードを追う<br />
散々調べた結果、cakephpでのtinyint(1)はvarchar型などのbyteと違い、bitと認識されるらしい<br />
相当、はまった・・・<br />
とりあえず、tableをcreateするときに指定なしでtinyintとすることにした
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-71780221064348752462016-04-24T18:22:00.001+09:002016-12-22T15:20:23.728+09:00cakephp3 ページネーション -- Pagination method --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br /><br />
<h3>cakephp3 ページネーション (Cake\View\Helper\PaginatorHelper)</h3>
<br />
<legend>
利用できるメソッド一覧
</legend>
<div class="well">
<blockquote>
<p>
基本的には以下のように利用する。<br />
$this->Paginator->{methodName}<br />
<br />
・templates($templates = null)<br />
$templates = [<br />
'nextActive' => '< li class="next">< a rel="next" href="{{url}}">{{text}}< /a>< /li>',<br />
'nextDisabled' => '< li class="next disabled">< a href="" onclick="return false;">{{text}}< /a>< /li>',<br />
'prevActive' => '< li class="prev">< a rel="prev" href="{{url}}">{{text}}< /a>< /li>',<br />
'prevDisabled' => '< li class="prev disabled">< a href="" onclick="return false;">{{text}}< /a>< /li>',<br />
'counterRange' => '{{start}} - {{end}} of {{count}}',<br />
'counterPages' => '{{page}} of {{pages}}',<br />
'first' => '< li class="first">< a href="{{url}}">{{text}}< /a>< /li>',<br />
'last' => '< li class="last">< a href="{{url}}">{{text}}< /a>< /li>',<br />
'number' => '< li>< a href="{{url}}">{{text}}< /a>< /li>',<br />
'current' => '< li class="active">< a href="">{{text}}< /a>< /li>',<br />
'ellipsis' => '< li class="ellipsis">...< /li>',<br />
'sort' => '< a href="{{url}}">{{text}}< /a>',<br />
'sortAsc' => '< a class="asc" href="{{url}}">{{text}}< /a>',<br />
'sortDesc' => '< a class="desc" href="{{url}}">{{text}}< /a>',<br />
'sortAscLocked' => '< a class="asc locked" href="{{url}}">{{text}}< /a>',<br />
'sortDescLocked' => '< a class="desc locked" href="{{url}}">{{text}}< /a>',<br />
];<br />
<br />
・sort($key, $title = null, array $options = [])<br />
$key(string)<br />
$title(string)<br />
$options = [<br />
'url' => [],<br />
'model' => 'defaultModel',<br />
'escape' => true,<br />
];<br />
<br />・sortDir($model = null, array $options = [])<br />
$model = {modelName}<br />
$options = [<br />
'url' => [<br />
'sort' => 'email',<br />
'direction' => 'desc',<br />
'page' => 6,<br />
'lang' => 'en',<br />
]<br />
];<br />
<br />
・sortKey($model = null, array $options = [])<br />
$key(string)<br />
$options = [<br />
'url' => [<br />
'sort' => 'email',<br />
'direction' => 'desc',<br />
'page' => 6,<br />
'lang' => 'en',<br />
]<br />
];<br />
<br />
・numbers(array $options = [])<br />
$options = [<br />
'before' => {numbers},<br />
'after' => {numbers},<br />
'model' => 'defaultModel',<br />
'modulus' => 8,<br />
'first' => 'First page',<br />
'last' => 'Last page',<br />
'templates' => [<br />
'active' => 'nextActive',<br />
'disabled' => 'nextDisabled',<br />
],<br />
'url' => [],<br />
];<br />
<br />
・prev($title = '<< Previous', array $options = [])<br />
$title(string)<br />
$options = [<br />
'disabledTitle' => {title},
'url' => [],<br />
'model' => 'defaultModel',<br />
'escape' => true,<br />
'templates' => [<br />
'active' => 'nextActive',<br />
'disabled' => 'nextDisabled',<br />
]<br />
];<br />
<br />
・next($title = 'Next >>', array $options = [])<br />
$title(string)<br />
$options = [<br />
'disabledTitle' => {title},
'url' => [],<br />
'model' => 'defaultModel',<br />
'escape' => true,<br />
'templates' => [<br />
'active' => 'nextActive',<br />
'disabled' => 'nextDisabled',<br />
]<br />
];<br />
<br />
・first($first = '<< first', array $options = [])<br />
$first(string or int)<br />
$options = [<br />
'url' => [],<br />
'model' => 'defaultModel',<br />
'escape' => true,<br />
];<br />
<br />
・last($last = 'last >>', array $options = [])<br />
$last(string or int)<br />
$options = [<br />
'url' => [],<br />
'model' => 'defaultModel',<br />
'escape' => true,<br />
];<br />
<br />
・counter($options = [])<br />
$options = [<br />
'model' => 'defaultModel', // デフォルトではPaginatorHelper::defaultModelが呼ばれる<br />
'format' => 'range' or 'pages' or custom<br />
custom example: 'Page {{page}} of {{pages}}, showing {{current}} records out of <br />
{{count}} total, starting on record {{start}}, ending on {{end}}'<br />
];<br />
<br />
・current($model = null)<br />
$model = {modelName}<br />
<br />
・hasNext($model = null)<br />
$model = {modelName}<br />
<br />
・hasPage($model = null, $page = 1)<br />
$model = {modelName}<br />
$page = int
<br />
・hasPrev($model = null)<br />
$model = {modelName}<br />
<br />
・options(array $options = [])<br />
$options = [<br />
'url' => [<br />
'sort' => 'email',<br />
'direction' => 'desc',<br />
'page' => 6,<br />
'lang' => 'en',<br />
]<br />
];<br />
<br />
・generateUrl(array $options = [], $model = null, $full = false)<br />
$options = [<br />
'page' => null,<br />
'sort' => null,<br />
'direction' => null,<br />
'limit' => null,<br />
];<br />
$model = {modelName}<br />
$full = boolean<br />
<br />
・meta(array $options = [])<br />
$options = [<br />
'model' => 'defaultModel', // デフォルトではPaginatorHelper::defaultModelが呼ばれる<br />
'block' => false or {blockName},<br />
];<br />
<br />
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-74111292738395605362016-04-22T18:40:00.002+09:002016-12-22T15:20:36.438+09:00cakephp3 バリデーション(4) -- validation of cakephp3 --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<legend>
Model
</legend>
<div class="well">
<blockquote>
<p>
・バリデーションを行いたくない場合<br />
<br />
$this->newEntity()、$this->patchEntity()を行うとバリデーションが行われてしまうため、<br />
$this->patchEntity($entity, $this->request->data, ['validate' => false] )とすると<br />
バリデーションを行わない。<br />
<br />
但し、これ以外にもバリデーションが行われるメソッドがあるので、そこについては要調査
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-7177797237966021382016-04-14T16:14:00.000+09:002016-12-22T15:20:59.949+09:00cakephp3 アクセス時のメソッド呼び出し順<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<br />
<h3>cakephp3 method 呼び出し順</h3>
<br />
<legend>
アクセスした場合、以下のように呼び出される
</legend>
<div class="well">
<blockquote>
<p>
・Controllerのinitialize()<br />
・ComponentのbeforeFilter()<br />
・ControllerのbeforeFilter()<br />
・Componentのstartup()<br />
・Controllerのaction<br />
・ComponentのbeforeRender()<br />
・ControllerのbeforeRender()<br />
・Componentのshutdown()<br />
・ControllerのafterFilter()
</p>
</blockquote>
</div>
<br />
<br />
<legend>
その他(Modelで呼ばれるメソッド)
</legend>
<div class="well">
<blockquote>
<p>
・Model.initialize<br />
・Model.beforeMarshal<br />
・Model.beforeFind<br />
・Model.buildValidator<br />
・Model.buildRules<br />
・Model.beforeRules<br />
・Model.afterRules<br />
・Model.beforeSave<br />
・Model.afterSave<br />
・Model.afterSaveCommit<br />
・Model.beforeDelete<br />
・Model.afterDelete<br />
・Model.afterDeleteCommit<br />
<br />
公式HP:<a href="http://book.cakephp.org/3.0/ja/orm/saving-data.html">http://book.cakephp.org/3.0/ja/orm/saving-data.html</a>
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-55351005866029662952016-04-13T15:32:00.000+09:002016-12-22T15:21:09.840+09:00cakephp3 カスタム HTML ヘルパー -- custom html helper --<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<br />
<h3>cakephp3 カスタムHTMLヘルパーを使う</h3>
<br />
<legend>
設定(src/View/AppView.php)
</legend>
<div class="well">
<blockquote>
<p>
・ここでは例としてCustomHtmlHelperというクラスを作成<br />
initializeメソッドに追記<br /><br />
----------------------<br />
$this->loadHelper('CustomHtml');<br />
----------------------<br /><br />
ここでHelperが付かないことに注意!
</p>
</blockquote>
</div>
<br />
<br />
<legend>
クラス作成(src/View/Helper/CustomHtmlHelper.php)
</legend>
<div class="well">
<blockquote>
<p>
Cake\View\Helperクラスを継承して作成
</p>
</blockquote>
</div>
<br />
<br />
<legend>
利用方法(ctpファイルで利用)
</legend>
<div class="well">
<blockquote>
<p>
$this->CustomHtml->{MethodName}();<br />
で利用可能
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-38248440922867413602016-04-11T14:52:00.000+09:002017-12-22T18:17:30.631+09:00cakephp3 DB トランザクション -- DB transaction --<table border="1" bordercolor="#333333" cellpadding="5" cellspacing="0"><tbody>
<tr> <td align="right" nowrap="">PHP Ver</td> <td align="right" nowrap="">5.6.27</td> </tr>
<tr> <td align="right" nowrap="">CakePHP Ver</td> <td align="right" nowrap="">3.1.9</td> </tr>
</tbody></table><br />
<br />
<br />
<h3>cakephp3 DB トランザクション</h3><br />
<legend> 利用方法(※Controllerに記述を行う場合) </legend> <br />
<div class="well"><blockquote>== 単一テーブルの登録・更新 ==<br />
・begin<br />
$this->{Model}->connection()->begin();<br />
<br />
・commit<br />
$this->{Model}->connection()->commit();<br />
<br />
・rollback<br />
$this->{Model}->connection()->rollback();<br />
<br />
== 複数テーブルの登録・更新 ==<br />
use Cake\Datasource\ConnectionManager;<br />
<br />
$connection = ConnectionManager::get('default');<br />
<br />
$connection->begin();<br />
<br />
$connection->commit();<br />
<br />
$connection->rollback();<br />
<br />
<br />
ConnectionManagerで指定している「default」は、config/app.phpの「Datasources」で指定しているものになるが、<br />
固定だとdebug機能がうまく使えなくなってしまうので、以下のようにした方が良いと思われる。<br />
<br />
$this->loadModel('{Model}');<br />
$connection = ConnectionManager::get($this->{Model}->defaultConnectionName());<br />
<br />
<br />
Moelクラスに記述するのは、エラー処理などを考えると個人的に嫌いなので割愛 </blockquote></div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-87373308130936274392016-04-08T15:12:00.000+09:002016-12-22T15:21:39.927+09:00cakephp3 管理画面 ディレクトリ構成変更<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<br />
<h3>cakephp3 ディレクトリ構成 変更</h3>
<br />
<legend>
設定
</legend>
<div class="well">
<blockquote>
<p>
・config/routes.php<br />
Router::prefix('{prefixName}', function ($routes) {<br />
$routes->fallbacks('DashedRoute');<br />
});<br />
<br />
Router::scope('/{prefixName}', function ($routes) {<br />
$routes->connect('/', ['controller' => '{controllerName}', 'action' => '{actionName}', 'prefix' => '{prefixName}']);<br />
});<br />
<br />
<br />
この設定をすることで、URL: http://example.com/{prefixName} で内部的には<br />
src/Controller/{prefixName}/{ControllerName}.php {actionName} メソッドにアクセスしてくれる。<br />
<br />
その他の画面用 Controller も src/Controller/{prefixName}/ 配下に作成し、<br />
<br />
$this->Html->link(__('View'), ['controller' => '{anotherControllerName}', 'action' => '{anotherActionName}']])<br />
<br />
と記述すれば、自動的に http://example.com/{prefixName}/{anotherControllerName}/{anotherActionName} にアクセスしてくれる<br />
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0tag:blogger.com,1999:blog-8046979320753952807.post-55221656881196686492016-04-07T14:36:00.002+09:002016-12-22T15:21:49.153+09:00cakephp3 Cookie<table border="1" cellspacing="0" cellpadding="5" bordercolor="#333333">
<tr>
<td align="right" nowrap>PHP Ver</td>
<td align="right" nowrap>5.6.27</td>
</tr>
<tr>
<td align="right" nowrap>CakePHP Ver</td>
<td align="right" nowrap>3.1.9</td>
</tr>
</table>
<br /><br />
<br />
<h3>cakephp3 Cookieを使う</h3>
<br />
<legend>
設定
</legend>
<div class="well">
<blockquote>
<p>
・App/Controller/AppController.php<br />
<br />
public function initialize()<br />
{<br />
parent::initialize();<br />
<br />
$this->loadComponent('RequestHandler');<br />
$this->loadComponent('Flash');<br />
$this->loadComponent('Cookie'); ←この行を追記<br />
}<br />
<br />
<br />
$this->Cookie->config([<br />
'expires' => '+10 days',<br />
'path' => '/',<br />
'domain' => 'localhost',<br />
'secure' => true,<br />
'key' => 'Security.salt',<br />
'httpOnly' => true,<br />
'encryption' => 'aes'<br />
]);<br />
<br />
※詳細については http://book.cakephp.org/3.0/en/controllers/components/cookie.html 参照
</p>
</blockquote>
</div>
<legend>
利用方法
</legend>
<div class="well">
<blockquote>
<p>
$this->Cookie->write('cookie_name', 'info');<br />
$this->Cookie->read('cookie_name');<br />
$this->Cookie->delete('cookie_name');
</p>
</blockquote>
</div>Anonymoushttp://www.blogger.com/profile/16525020214740215014noreply@blogger.com0