[hello world 動かない ][検索]

プログラミング関連で自分が調べた事をメモる

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 として配置する

bootstrap.phpの設定

下記を追加
app/Config\bootstrap.php

CakePlugin::load('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 安定版をダウンロードする

http://cakephp.jp/

インストール

ダウンロードしたファイルを展開し、そのディレクトリをドキュメントルートとして配置したらインストールは完了

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イベントを起動する
ファイルが変更されたらテキスト領域にファイル名を表示させる

Android Firefox geolocation maximumAge 取得できない

AndroidFirefoxでnavigator.geolocationから位置情報が取得でき無ない


機種:nexsus7 2012
OS:5.1
Firefox:37.0.2

navigator.geolocation.getCurrentPosition または watchPosition で
PositionOptions.maximumAge を設定している時だけ
位置情報が取得できない

なんでだろう