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}