▶ プログラム関連
PHP dfw2 Tips - dfwLib2
dfw2ライブラリ Tips
Viewを使用したくない(モジュールのみ使用)
モジュールのみで利用したい場合は、PHPモジュールで exit を実行します
// 処理終了
exit;
モジュール処理の途中でViewを呼び出す
return でモジュール処理を終了し、VIEWを呼び出すことができます。
if ($rtn === false) {
// 何らかのエラー
setTemplate('error.html');
return;
}
// 正常系処理
リダイレクトによるモジュールの呼び出し
モジュール内から他のモジュールを呼び出すときは redirectModule関数 を使用します。
redirectModule関数 を実行するとそれ以降のプログラムは実行されません。
- エラー時に「error_show」モジュールを呼び出す
if (empty($data)) {
// エラー
redirectModule( 'error_show' );
}
// エラー時はこれ以降のプログラムは実行されない
PRE処理、POST処理
下記関数を bootstrap.php に定義しておくと、モジュール処理の前後やテンプレート表示処理の前後に関数が実行されます(2013.11.03~)
function dfwPostExecModule($moduleName)
{
// モジュール実行直前で実行
}
function dfwPreExecModule($moduleName)
{
// モジュール実行直後で実行
}
function dfwPreShowTemplate($templateFileName)
{
// テンプレート表示直前で実行
}
function dfwPostShowTemplate($templateFileName)
{
// テンプレート表示直後で実行
}
MySQL Tips
インクリメント処理
ロックを取得する読み取り FOR UPDATE
http://dev.mysql.com/doc/refman/4.1/ja/innodb-locking-reads.html
SELECT COUNTER_FIELD FROM CHILD_CODES FOR UPDATE;
UPDATE CHILD_CODES SET COUNTER_FIELD = COUNTER_FIELD + 1;
インクリメント処理のみであればUPDATE文のみで可能
UPDATE table_name SET count=count+1 WHERE id=1234
カラム型の数字指定
カラムの型を int(10) と指定した場合の 10 は、「ZEROFILL」オプション指定時の桁数を明示的に指示していることを意味する。
int(10) だの int(5) だの指定は、特に理由がない限りすべきでない。
SELECT FOUND_ROWS
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
SELECT FOUND_ROWS()は、直前の SELECT SQL_CALC_FOUND_ROWS 文を LIMIT 節なしで実行した場合に返されるレコード数をが返る。
ページャの総ページ数取得に使用できる。
FIND_IN_SET()
知っておくと便利なMySQL関数 "FIND_IN_SET"
http://c-brains.jp/blog/wsg/10/05/17-175025.php
非正規化テーブルで1カラムに複数の値がカンマ区切りで収納されている場合
カラム hoge_ids に 1 が格納されている行を検索したい
SELECT * FROM table WHERE FIND_IN_SET('1', hoge_ids) ;
※ カラムに hoge_ids には 1,2,3,5,9' のように カンマ区切りの数値が格納
カラム hoge_ids に 1 か 10 が格納されている行を検索したい
SELECT * FROM table WHERE FIND_IN_SET('1', hoge_ids) OR FIND_IN_SET('10', hoge_ids);
DB class だと以下のように使用します。
$test->setSql('SELECT * FROM ipmes WHERE FIND_IN_SET(:name, name)');
$test->set('name', '1');
var_dump($test->execFetchAll());
PHPテンプレート Tips
if 構文
<?php if(isset(v("your_name"))): ?>
// HTML
<?php else: ?>
// HTML
<?php endif; ?>
foreach 構文
<?php foreach (getView("buyer_names") as $name): ?>
// HTML
<?php endforeach; ?>
for 構文
<?php for ($i = 0; $i<10; $i++): ?>
// HTML
<?php endfor; ?>
while 構文
<?php while ($row = $st_handle->fetch(PDO::FETCH_ASSOC)): ?>
// HTML
<?php endwhile; ?>
Smarty Tips
Smartyテンプレートへの CSS、JavaScript記述
{literal}
<style rtpe="text/css">
body {
background: #FFBBE8;
}
</style>
{/literal}
CSS記述やJavaScript記述は{literal}で囲まないと { 文字、} 文字がSmartyタグだと勘違いされてしまいます。
数字フォーマット
-数字に3桁区切りなどの書式
例:123,456,789
{$outData|number_format}
-数字に3桁区切りなどの書式(小数桁数2)
例:56,789.12
{$outData|number_format:2}
ヘッダテンプレートにタイトルの変数を渡す
テンプレートで「header.tpl」を使用。
「Hoge Page」という文字列をテンプレートに渡します。
{include file='header.tpl' title='Hoge Page'}
ヘッダテンプレートで $title を表示します。
<html>
<head>
<title>{$title|default:'FUGA PAGE'}</title>
</head>
<body>
……
※ setView で設定した値は、ヘッダテンプレートでも表示することが可能です。
繰り返し(foreach)
-書式
{foreach from=[配列] key=[キー] item=[アイテム] name=[このループブロックの名前]}
// 処理
{foreachelse}
// 処理
{/foreach}
-サンプル
{foreach from=$data key="key" item="value" name="list"}
<li>{$key}:{$value}</li>
{/foreach}
{$key}は 0,1,2,3……
-現在のループ回数($smarty.foreach.mainloop.iteration)
{foreach from=$outMaster key=key item=val name=mainloop}
<li>{$smarty.foreach.mainloop.iteration}</li>
{/foreach}
{$smarty.foreach.mainloop.iteration}は 1,2,3,4……
{$smarty.foreach.mainloop.index}は 0,1,2,3……
for文処理
-PHP(通常のループ)
for ($i=7; $i<10; $i++){
echo "$i;
}
-Smarty(通常のループ)
{for $i=7 to 9}
{$i}
{/for}
デフォルト表示文字
-変数が存在しない場合、デフォルトの文字列を表示する
ようこそ{$userName|default:'ゲスト'}さん
-管理画面等ではエラー表示部分に使えます
<div style="color:red;">{$errorMessage|default:''}</div>
sprintf 処理
変数の値を10進数として表示したり、文字列をフォーマットして表示します。
フォーマット文字列には sprintf() の構文を使用してください。
{$number|string_format:"%.2f"}
{$number|string_format:"%d"}
http://www.smarty.net/docsv2/ja/language.modifier.string.format.tpl
日時の表示
- dfwLib2 モジュール
setView('yesterday', strtotime('-1 day'));
- Smarty テンプレート
{$yesterday|date_format}
{$yesterday|date_format:"%A, %B %e, %Y"}
- 現在の日時表示(Smarty テンプレート)
{$smarty.now|date_format}
{$smarty.now|date_format:"%D"}
http://www.smarty.net/docsv2/ja/language.modifier.date.format.tpl
マルチバイト文字を丸める
{$description|mb_strimwidth:0:200:'…':'UTF-8'}
変数
-PHP
$data[0]
-Smarty
{$data.0}
-PHP
{$data['hoge']}
-Smarty
{$data.hoge}
-PHP
{$data['hoge']['fuga']}
-Smarty
{$data.hoge.fuga}
-PHP
$name = 'hoge';
$data[$name]
-Smarty
{$data.$name}
テンプレート継承
Twig同様、テンプレートの継承処理ができます。
http://www.smarty.net/docs/ja/advanced.features.template.inheritance.tpl
- layout.tpl(基底テンプレート)
<html>
<head>
<title>{block name="title"}My Default Title{/block}</title>
……
</head>
<body>
<div class="header">
……
</div>
<div class="body">
{block name="contents"}My Default Contents{/block}
</div>
<div class="footer">
……
</div>
</body>
</html>
オートエスケープはするけど nl2br だけは有効
- Smarty3
{{$message}|nl2br nofilter}
文字列の部分表示 substr
{$yyyymmdd|substr:0:4} 年 {$yyyymmdd|substr:4:2} 月
HTML SELECT
- モジュール
setView('myOptions', array(
1800 => 'Joe Schmoe',
9904 => 'Jack Smith',
2003 => 'Charlie Brown')
);
setView('mySelect', 9904);
- VIEW
{html_options name=foo options=$myOptions selected=$mySelect}
- HTML出力
<select name="foo">
<option label="Joe Schmoe" value="1800">Joe Schmoe</option>
<option label="Jack Smith" value="9904" selected="selected">Jack Smith</option>
<option label="Charlie Brown" value="2003">Charlie Brown</option>
</select>
デバッグ表示
Smartyテンプレートに渡ってきた情報を ポップアップWindow で表示します。
{debug}