Posts tagged Tab
scriptaculous.js を使って並び替えを行う
2JavaScript の読み込み
まず prototype.js と scriptaculous.js を読み込む
<script type="text/javascript" src="prototype.js"></script> <script type="text/javascript" src="scriptaculous.js"></script>
ソートするリストを作成する
ここでのポイントはドラッグさせたい要素に drag_1 のように「共通の名前+アンダバー+数字」を付けることです。
<ul id="sortarea"> <li id="drag_1">A1</li> <li id="drag_2">A2</li> <li id="drag_3">A3</li> <li id="drag_4">A4</li> <li id="drag_5">A5</li> <li id="drag_6">A6</li> <li id="drag_7">A7</li> <li id="drag_8">A8</li> <li id="drag_9">A9</li> </ul>
ソートする JavaScript コード
ソートするエリアとソートする要素を定義した後で実際にソートするための JavaScript コードを書く。このコードがソートさせたい要素よりも前に書くとエラーになるので注意。
<script type="text/javascript" language="javascript"> // <![CDATA[ Sortable.create("sortarea",{ onUpdate:function(){ new Ajax.Updater( 'sortarea', '/path/to/phpcode', { asynchronous:true, evalScripts:true, parameters:Sortable.serialize("sortarea") } ); } }); // ]]> </script>
onUpdate でソート結果をPHP に送りデータベースなりに反映させる。
データベースに反映などが必要なければ、onUpdate は不要です。
デモ
これを実際に使用した例が下記になります。
#sortarea { width: 350px; border: 1px solid #000; } #sortarea li { cursor: default; }
- LIST1
- LIST2
- LIST3
- LIST4
- LIST5
- LIST6
- LIST7
- LIST8
- LIST9
PostgreSQL のバックアップとリストア
1PostgreSQL のバックアップとリストア方法のメモ
postgres ユーザになる
$ su - postgres
パスワードを設定していれば聞かれるので入力する。(当然ですが)
データのバックアップ
$ pg_dump DATABASE_NAME > BACKUP_FILENAME
データのリストア
$ psql -e DATABASE_NAME < BACKUP_FILENAME
データベースの作成
$ createdb DATABASE_NAME
データベースの削除
$ dropdb DATABASE_NAME
CakePHP Security コンポーネントのまとめ
1CakePHP の Security コンポーネント の動作を調べたのでまとめておきます。
この Security コンポーネントをうまく使用すればクロスサイトリクエストフォージェリ(CSRF) を防ぐことができるでしょう。
トークンの使用
フォームにワンタイムトークンを実装する方法です。
コントローラの beforeFilter メソッドでトークンをチェックするアクションを指定
function beforeFilter() { $this->Security->requireAuth('login'); }
ビューのフォーム内にトークンを設定
<?php echo $html->formTag(); ?>
トークンが hidden 属性で生成される
トークンが一致しない場合
requireAuth で指定したアクションに POST でアクセスがあるとセションに保存したトークンとフォームから送られてきたトークンが一致するかチェックします。またそのほかにトークンの有効期間もチェックします。有効期間は CAKE_SECURITY の設定により違います。
CAKE_SECURITY | 有効期間 |
---|---|
high | 10分 |
medium | 100分 |
low | 300分 |
トークンが一致しないと SecurityComponent の blackHole メソッドが実行されます。このメソッドでは
header('HTTP/1.0 404 Not Found');
を出力して exit します。(画面は空白)
任意の処理を実行したい場合は blackHoleCallback でコールバック関数を指定します。
設定できるのは同じコントローラ内のアクションのみになります。
function beforeFilter() { $this->Security->blackHoleCallback = "securityError"; $this->Security->requireAuth('login'); } function securityError() { die("security error!"); }
トークンチェックをするアクションを複数指定するときはカンマでつなげる
$this->requireAuth('login', 'delete');
特定のコントローラからのポストのみ許可する
$this->Security->allowedControllers = array("users");
これを指定するとたとえトークンが一致しても許可のないコントローラからのポストの場合は blackHole メソッドを実行します。
特定のアクションからのポストのみ許可する
$this->Security->allowedActions = array("action");
これを指定するとトークンが一致しても許可のないアクションからのポストの場合は blackHole メソッドを実行します。
ポストのみ受け付けるようにする
$this->requirePost('login');
これはトークンとは違い、POST のみ許可して GET でのアクセスを不可にします。
/users/login/ のような URL でのアクセスも GET なので不可になります。
POST の処理だけを実行したいようなアクションに使用します。
CakePHP 環境によってデータベースを切り替える
2テストデータを入れるなどテストと環境でデータベースを切り替えたいときがあります。
CakePHP でそれをやる方法です。
モデルの $useDbConfig に app/config/database.php で定義されている $default がデフォルトで使用されます。
database.php に $test など使用したいデータベースの分だけ定義を増やし、
それをモデルで
$this->useDbConfig = 'test';
のように指定すればいいだけです。
app/app_model.php のコンストラクタで設定するのが一番簡単かもしれません。
CakePHP 環境に応じてDBの設定を変える | Shin x blog
で色々な方法が紹介されています。
“CakePHPで超簡単スケーラビリティ” フォーラム – CakePHP Users in Japan
また、この $useDbConfig を使用して
「マスターとスレーブのMYSQLサーバがあります。レプリケーション機能で、マスターからスレーブにデータが常にコピーされています。データの更新・追加はマスターに対して行い、データの検索はスレーブで、という場合にはどうすればよいでしょうか?」
というような場合のすごく簡単な方法が紹介されています。
モデルの beforeSave,afterSave,beforeDelete,afterDelete を使用してマスターとスレーブを切り替えています。
CakePHP MySQL で文字化けを防ぐ設定
4MySQL で文字化けを防ぐためには
SET NAMES utf8
のように SET NAMES を実行するのが有効なのですが、これを app/config/database.php で設定する方法です。
'encoding'=>'文字コード'
をデータベースの設定項目に追加してやるだけです。
具体的には app/config/database.php が下記のようになります。
var $default = array( 'driver' => 'mysql', 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'user', 'password' => 'password', 'database' => 'dbname', 'prefix' => '', 'encoding' => 'utf8' );
cake/libs/model/dbo/dbo_mysql.php で下記のように実行されています。
function connect() { (略) if (isset($config['encoding']) && !empty($config['encoding'])) { $this->setEncoding($config['encoding']); } return $this->connected; }
function setEncoding($enc) { return $this->_execute('SET NAMES ' . $enc) != false; }
Firefox タブを新しいウィンドウで開くTab Mix Plus のショートカット Ctrl + Shift+ N
1Going My Way: 今開いているタブを新しいウィンドウで開く、Tab Mix Plus のショートカット Ctrl + Shift+ N
Going My Way さんで紹介されていた Firefox で現在開いているタブを新しいウィンドウで開くショートカットが紹介されていました。
Tax Mix Plus が必要ですが、Ctrl + Shift + N で出来ます。
これやりたいことが多かったです。
いつもCtrl + N で新しいウィンドウを開いてから URL をコピペしてました。。。
OpenPNE 特定ページを SSL で接続する
3OpenPNE で個人情報などを送信するようなフォームや管理画面を SSL で接続する方法です。
SSL を使用するように設定を変更する
openpne/config.phpの以下の行を変更
特定ページを SSL で接続するように設定
define('OPENPNE_USE_SSL_PARAM', false);
をdefine('OPENPNE_USE_SSL_PARAM', true);
に変更
これだけで特定ページが SSL で接続されるようになります。
SSL を使用したいアクションを追加する
デフォルトで SSL 接続されるようになっているページ以外も SSL 接続にしたい場合は
$GLOBALS['_OPENPNE_SSL_REQUIRED'] = array( 'pc' => array( 'page_o_regist_prof', 'page_o_regist_prof_confirm', 'do_o_regist_prof', 'page_o_regist_intro', 'page_o_ri', 'page_o_regist_end', 'page_h_config_prof', 'page_h_config_prof_confirm', 'do_h_config_prof', 'page_h_config_ktai', 'do_h_config_ktai_send', ), 'ktai' => array( 'page_o_login', 'do_o_login', 'do_o_easy_login', 'page_o_login2', 'do_o_update_ktai_address', 'page_o_regist_pre', 'page_o_regist_input', 'do_o_insert_c_member', 'page_o_regist_end', 'page_o_password_query', 'do_o_password_query', 'page_h_config_prof', 'do_h_config_prof_update_c_member', 'page_h_config_easy_login', 'do_h_config_easy_login', 'page_h_config_mail', 'do_h_config_mail_insert_c_ktai_address_pre', 'page_h_pc_send', 'page_h_pc_send_confirm', 'do_h_pc_send_insert_c_pc_address_pre', 'page_h_config_password_query', 'do_h_config_password_query_update_password_query', 'page_h_config_password', 'do_h_config_password_update_password', ));
となっているところに SSL 接続したいアクションを追加していく。
例えば、携帯ではリマインダーは SSL 接続になりますが PC では SSL 接続ではありません。
そこで PC でも SSL にしたい場合は上の pc の配列にリマインダーのアクションの “page_o_password_query” を追加します。
これで http://www.example.com/?m=pc&a=page_o_password_query という URL は自動的に
https://www.example.com/?m=pc&a=page_o_password_query へリダイレクトされます。
注意点は上記の URL からフォームが送信される ?m=pc&a=do_o_password_query というURL も SSL にする必要があります。
これをしないとフォームの画面は SSL でも送信先が SSL ではなくなってしまいます。
PC 用のリマインダーを SSL にする場合は “page_o_password_query” と “do_o_password_query” の2つを追加する必要があるということです。
確認画面が入るフォームなどではフォーム画面表示アクション、確認画面表示アクション、実行アクションと3つ追加する必要があります。
ユーザに SSL を使用するか選択させるアクションの追加
ユーザが SSL を使用するか選択できるリストというのもあります。
$GLOBALS['_OPENPNE_SSL_SELECTABLE'] = array( 'pc' => array( 'page_h_config', 'do_h_config_1', 'do_h_config_2', 'do_h_config_3', 'page_o_login', 'page_o_tologin', 'do_o_login', ), 'ktai' => array( 'page_h_config', ));
このリストに追加するとフォームの右上やリンクの下に SSL 用のリンクが表示されユーザが SSL の使用をするか選択することができます。
北海道旅行 その4 スープカレー Massarra (マッサーラ)
0旭山動物園の帰りに札幌でスープカレーを食べました。
カリー専門店 Massarra (マッサーラ)というお店です。
女性のオーナーがやっているお店で店員さんもすごく感じのいい方でした。
スープカレーは初めて食べたのですがすごくおいしく気に入りました!
ご飯のおかわりは自由なのもうれしいサービスですね。
CakePHP findAll で INNER JOIN する方法
1開発中の CakePHP の案件でどうしても INNER JOIN する必要があり、かといって SQL を直接書くのは他のコンポーネントとの兼ね合いでできるだけ避けたい(というより無理)な状況だったので、絶対何か方法があるだろうと思いソースを調べたのでメモしておきます。
/cake/libs/model/model_php5.php の findAll メソッドに
$queryData = array('conditions' => $conditions, 'fields' => $fields, 'joins' => array(), 'limit' => $limit, 'offset' => $offset, 'order' => $order );
というのがあり、’joins’ に 空の配列を入れている。
この ‘joins’ の使い方を調べたら、
array( "type" => "INNER", "alias" => "", "table" => INNER JOIN するテーブル, "conditions" => INNER JOIN の ONに指定する条件, );
という配列を入れると INNER JOIN してくれるようです。
ただ、findAll の中で joins に空配列を入れているので、findAll を実行するときのパラメータに joins を指定しても無視されてしまう。
そこで、モデルの beforeFind メソッドを使用することにした。このメソッドは findAll の実行する前に呼ばれるメソッドです。
findAll を実行するモデルに次の beforeFind を定義
function beforeFind(&$queryData) { $queryData["joins"][] = array( "type" => "INNER", "alias" => "", "table" => "`model_name`", "conditions" => array("model_name.field=model_name2.field2"), ); return true; }
これで実行された SQL を確認すれば INNER JOIN されれいます。
OpenPNE 画像の保存、表示方法
2OpenPNE で写真のアップロード機能を作成していて調べたことをまとめておきます。
画像を保存するテーブル c_image
OpenPNE では画像をDB に保存しています。保存するテーブル名は c_image です。
このテーブルにはプロフィール写真や日記の写真、スキンの画像などが保存されるようです。
CREATE TABLE c_image ( c_image_id int(11) NOT NULL auto_increment, filename text NOT NULL, bin longblob NOT NULL, r_datetime datetime NOT NULL default '0000-00-00 00:00:00', `type` text, PRIMARY KEY (c_image_id), KEY filename (filename(100)) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
- filename
- 画像のファイル名、任意につけていいみたいですが、プロフィール写真だと
m_2_1188204858.jpg
という感じです。
最初の 「m 」はたぶんプロフィール写真を表す文字、
次の「2」はプロフィール写真のNo(2番目にアップした写真)
次の10桁の数字は多分 time() 関数で取得したアップロードした時間 - bin
- base64_encode した画像ファイルのバイナリデータ
- type
- 画像のタイプ( jpg | gif | png )
- r_datetime
- 登録日時
表示方法
c_image テーブルに格納した画像を表示するHTML
<img src="/img.php?filename=m_2_1188204858.jpg&w=180&h=180&m=pc">
Smarty のタグで書くと
<img src="({t_img_url filename=$pet.image1 w=180 h=180})">
filename に c_image.filename を指定して、
w, h に幅と高さの最大値を指定する。
幅と高さは最大値を超えると自動的にリサイズする。
その他
c_image に画像を保存しておくと管理画面からアップロードされた写真をすべて管理することができるので、SNS を運営する上で便利だと思います。