cakephp ID 文字列 ランダム
CakePHPでID列にランダム文字列を設定する
バージョン
CakePHP 2.6.4
http://shim0111.hatenablog.com/entry/2015/04/30/121925
↑の様な事をCakePHPでやりたかったが
IDに既に存在する文字列のデータを入力しようとすると勝手にUpdateになってしまい
一意制約違反を捉まえられなかった
で、どうしようかと調べていたら
http://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html#id3
また、主キーをオートインクリメントとしてではなく、char(36)として使用しても構いません。 そうすると、Model::save メソッドを使って新規レコードを保存するとき、Cakeはユニークな36文字のuuid (String::uuid) を用いようとします。
と言う事で、自分でランダム文字列を作る必要も、重複した場合の処理を考えることもなく
主キーの定義をCHAR(36)に変えるだけで問題解決した。
php ランダム文字列 一意
PHPで一意のランダム文字列を生成する
DBの主キーとしたいので一意の文字列を作成したい
URLに含まれる値になるので、推測されないような文字列が良い
sha1(uniqid(rand(), true));
これで40桁の16進文字列が生成できる
完全に一意とはいかないため、DB登録前に確認するか
一意制約違反を捉まえて、再度文字列生成して登録を行うようにする
cakephp bootstrap
CakePHPでBootsrapを使う
バージョン
CakePHP 2.6.4
Bootstrap 3.3.4
BoostCakeをインストール
https://github.com/slywalker/cakephp-plugin-boost_cake
から取得
展開したらapp/Plugin/ に BoostCake として配置する
Controller に Helper を追加する
/app/Controller/AppController.php
class AppController extends Controller { public $helpers = array( 'Session', 'Html' => array('className' => 'BoostCake.BoostCakeHtml'), 'Form' => array('className' => 'BoostCake.BoostCakeForm'), 'Paginator' => array('className' => 'BoostCake.BoostCakePaginator'), ); }
LayoutでCDNからjqueryとbootstrapを読み込む
/app/View/Layouts/default.ctp
echo $this->Html->script('https://code.jquery.com/jquery-2.1.3.min.js'); echo $this->Html->css('https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css'); echo $this->Html->script('https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js');
設定はここまで、後は公式サイト見ながら組み込み
各公式サイト
http://slywalker.github.io/cakephp-plugin-boost_cake/bootstrap3.html
http://getbootstrap.com/
CakePHP インストール
CakePHPをインストールする
2.6.4 安定版をダウンロードする
インストール
ダウンロードしたファイルを展開し、そのディレクトリをドキュメントルートとして配置したらインストールは完了
tmpディレクトリの所有者変更
app/tmp 内を Webが読み書きできるように、所有者を変更しておく
データベースの設定
app/Config/database.php
public $default = array( 'datasource' => 'Database/Mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'database_name', 'prefix' => '', //'encoding' => 'utf8', );
この部分を使用するDBに合わせて変更する
Security.salt Security.cipherSeedの変更
app/Config/core.php
/** * A random string used in security hashing methods. */ Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi'); /** * A random numeric string (digits only) used to encrypt/decrypt strings. */ Configure::write('Security.cipherSeed', '76859309657453542496749683645');
Security.salt に文字列を、Security.cipherSeed に数字を入れる
デフォルトから変わっていればなんでもOKだと思う
bootstrap input file
Bootstrapでinput type="file"の見た目をきれいにする
input type="file"
がどのように表示されるか公式サイトを見たら分かると思うけど
他のフォームと比べて違和感がある
http://getbootstrap.com/css/#forms-example
のでこっちみたいにする
http://getbootstrap.com/components/#input-groups-buttons
<div class="input-group"> <input type="text" class="form-control file-text" placeholder="Image File" readonly> <span class="input-group-btn"> <button class="btn btn-default open-file-dialog" type="button">...</button> <input type="file" accept="image/*" class="form-control file" style="display: none;"> </span> </div>
$('.open-file-dialog').on('click', function() { $(this).next('input[type="file"]').trigger('click'); }); $('.file').change(function() { $(this).closest('.form-group').find('.file-text').val($(this).val()); });
input type="file"の要素を非表示にして、ボタンが押されたらclickイベントを起動する
ファイルが変更されたらテキスト領域にファイル名を表示させる
textarea focus 全選択 iPhone
textarea 要素にフォーカスが当たった時、テキストを全選択する
$('#kyabetsu-tarou').on('click', function() { this.setSelectionRange(0, this.value.length); });
onfocus だとダメ
this.select() だとダメ