PEAR::Pager と Smarty でページング。

list.php

< ?php
//ライブラリとSmartyの読み込み
require_once("Pager/Pager.php");
require_once("Smarty.class.php");
$smarty=new Smarty;

//例えばDBからデータを取得して$listに入れる
//while($row=$rsList->fetchRow(DB_FETCHMODE_ASSOC)){
//$list[]=array("name"=>$row['name'],"tel"=>$row['tel']); }
//とか。そこらへんの処理は略

//ページ表示
$perPage=10;
$params=array("perPage"=>$perPage, "itemData"=>$list);
$o_page=Pager::factory($params);
foreach($o_page->getPageData() as $listData){
$listDataList[]=$listData;
}
//表示するデータをSmartyに渡す
$smarty->assign("list",$listDataList);
//ナビゲーションの作成
$navi=$o_page->getLinks();
$smarty->assign("pageNavi",$navi['all']);

//Smarty設定
$smarty->template_dir = "./templates";
$smarty->compile_dir = "./templates_c";
$smarty->cache_dir = "./cache";

//フォーム表示
$smarty->display("list.tpl");
?>

list.tpl

<html><body>
<ul>
{foreach from=$list item="list" name="listLoop"}
<li>{$list.name}{$list.tel}</li>
{/foreach}
</ul>
{$pageNavi}
</body></html>

早わかりSmarty3~PHP次世代テンプレートエンジンの予習とSmarty入門

【追記(2010/04/29)】第9回 LOCAL PHP部勉強会で発表しました

その発表の時に使ったスライド公開しました。うまく貼れなかったので、リンクでごめんなさい。


そもそもSmartyって?

 見た目の処理(ビュー)と、ロジックを分割できるテンプレートエンジンと呼ばれるものの一種。PHPでは多分一番有名。


 テンプレートエンジンを使うと、

  1. 処理が分割されるのでわかりやすくなる
  2. Webデザイナさんと分業しやすくなる

 といった利点を得られます。

Smarty3の特徴

「うまい」「はやい」「やすい」

  • 新機能が”うまい”
  • Smarty2からSmarty3に置き換えるだけで2~5倍”はやい”
  • 導入し”やすい”

無理やりすぎる。

使い方

Smarty2.6と同じ。サーバにアップロードして、Smartyを使いたいPHPファイルでSmarty.class.phpを読むだけ。


<?php
	require_once("./Smarty3/Smarty.class.php");

	$smarty = new Smarty();

	echo "<pre>";
	var_dump($smarty);
	echo "</pre>";
?>

パスなどは適宜読み替えてね。

Hello World!

Smarty2.6と同じ。

index.php

<?php
	require_once("./Smarty3/Smarty.class.php");

	$smarty = new Smarty();

	$smarty->assign("name", "Smarty3");

	$smarty->display("index.html");
?>

templates/index.tpl

Hello {$name} world!

実行結果

Hello Smarty3 world!

Smarty基本の解説1「assign」

表示するデータをassignする。

$smarty->assign("name", "Smarty3");

これで、テンプレート側でname変数が使えるように。中身は”Smarty3”という文字列。

Smarty基本の解説2「テンプレートの記述」

見た目の処理はテンプレートに書く。デフォルトでは、templatesディレクトリに配置することに。

Hello {$name} world!

{}で囲むことで、Smartyのタグ(?)を使える。{$name}で、nameという変数を表示。設定で、何で囲んだらテンプレート構文とするかは変更できます。JavaScriptと混在しても安心。


Smarty基本の解説3「templates_」

Smartyはテンプレートをコンパイルした結果をキャッシュしておく。ようは、速い!

デフォルトではtemplatesディレクトリの横にtemplates_cができます。

Smarty基本の解説4「実行」

ふたたびPHPに戻って、Smartyインスタンスのdisplayメソッドを実行。


	$smarty->display("index.html");

基本はこれだけ!

Smarty2.6と変わらないため、導入し”やすい”。ただ、実際にSmarty2.6からの置き換えには作業が発生すると思うので注意。

新機能をざっと見てみる

  • 変数の演算
  • Smartyタグの入れ子
  • 配列
  • 可変変数
  • メソッドチェーン
  • 新しいループ処理
  • テンプレートの継承

変数の演算

構文解析が強化されたことにより、変数の演算などがサポート

{$x = 2}
{$y = 3}
{$z = $x + $y}
<p>{$x}+{$y}={$z}</p>

{$r = 3}
<p>
半径{$r}の、<br />
円周:{2 * pi() * $r}<br />
面積:{pi() * pow($r, 2)}<br />
</p>

実行結果

2+3=5

半径3の、
円周:18.849555921539
面積:28.274333882308

PHPの関数も使える!

Smartyタグの入れ子

{$mail = "<li>{mailto address="hoge@foo.bar"}</li>"}
<ul>{$mail}</ul>

ソース

<ul><li><a href="mailto:hoge@foo.bar" >hoge@foo.bar</a></li></ul>

Smartyタグの組み合わせにより、より複雑なことができそう!

配列の定義・呼び出し

PHP風に配列を呼び出すことができる。Smartyで配列の定義ができる。

{assign var=foo value=["い","ろ","は"]}
{$foo[0]}
{$foo.1}
{$foo[1+1]}
い ろ は

可変変数

{$str1 = "a"}
{$str2 = "b"}
{$str3 = "c"}

{$x = 1}
{$str{$x}}

{$x = $x + 1}
{$str{$x}}

{$x = $x + 1}
{$str{$x}}

PHPでもあまり使わないですが・・・

メソッドチェーン

メソッドチェーンにも対応しました。

<?php
	require_once("./Smarty3/Smarty.class.php");

	$smarty = new Smarty();

	class Hoge {
		private $str;

		function addFoo() {
			$this->str .= "foo";
			return $this;
		}

		function addBar() {
			$this->str .= "bar";
			return $this;
		}

		function getStr() {
			return $this->str;
		}
	}

	$smarty->assign("obj", new Hoge);

	$smarty->display("index.html");
?>

こんなHogeクラスを用意し、assignする。

このクラスは、addFooが実行されるとfooを、addBarが実行されるとbarをインスタンス変数に追加します。そして、getStrでその変数を返してくれます。

でもって、テンプレート側ではこんなのができる。

{$obj->addFoo()->addBar()->addBar()->addFoo()->getStr()}

Fooを追加して、Barを追加して、Barをもっかい追加して、最後にFooを追加した後、その文字列を表示。

foobarbarfoo

文字列クラスとかを作れば、あるいは……。

新しいループ

forタグが追加されて、foreachタグがphpのように実行可能に。

まずは、forタグ。

{for $x = 1; $x <= 9; $x++}
{for $y = 1; $y <= 9; $y++}
{$x*$y} 
{/for}
<br />
{/for}

おなじみ、九九の表が出力されます。

そして、foreachタグ。

{$ary = array("りんご", "ごりら", "らっぱ", "ぱんだ")}
<table border="1">
	<tr>
		<th>id</th>
		<th>name</th>
		<th>first</th>
		<th>last</th>
	</tr>
	{foreach $ary as $str}
	<tr>
		<td>{$str@key}</td>
		<td>{$str}</td>
		<td>{if $str@first}○{/if}</td>
		<td>{if $str@last}○{/if}</td>
	</tr>
	{/foreach}
</table>
<table border="1"> 
	<tr> 
		<th>id</th> 
		<th>name</th> 
		<th>first</th> 
		<th>last</th> 
	</tr> 
		<tr> 
		<td>0</td> 
		<td>りんご</td> 
		<td></td> 
		<td></td> 
	</tr> 
		<tr> 
		<td>1</td> 
		<td>ごりら</td> 
		<td></td> 
		<td></td> 
	</tr> 
		<tr> 
		<td>2</td> 
		<td>らっぱ</td> 
		<td></td> 
		<td></td> 
	</tr> 
		<tr> 
		<td>3</td> 
		<td>ぱんだ</td> 
		<td></td> 
		<td></td> 
	</tr> 
</table> 

これは気にいった。$~@とかの、ループ用の特殊変数もいいですね。


元からあるループ処理も、非推奨ながら一応使えます。

テンプレートの継承

追記予定

で、どうなの?

  • プログラマよりになってうれしい反面、複雑に・・・
  • 本当に速いの? (正式リリース待ち)
  • どうせ乗り換えるなら、Twigとかでもいいんじゃ・・・

結論としては様子見が妥当。速度が十分に出るなら、置き換えもあり?


テンプレートエンジンの今後に期待。ピュアPHPか、Smarty3か、Smarty2.6継続か、それともTwigか……。

MAMPにPEARをインストールする手順

テクニカルなメモを書いているブログでもないのにいきなりこういうことを書くのもどうかと思いつつ、忘れたら困るので、強引にメモ。

MacOSXのPHP開発環境「MAMP」に、PEARをインストールするときの手順です。
なんか、最初から入ってるっぽいんですが、パッケージを追加インストールすると、へんなところにインストールされちゃう?なんやかやとうざいので、MAMPからすかっとラクに使えるところにインストールされるように、いろいろ格闘しました。

いろんなところに書いてあることを参考にしましたが、自分なりに変えてみたバージョンです。(あくまでも自分流)

1. PEARのダウンロード

ターミナルで、以下を入力。
curl http://pear.php.net/go-pear> pear.php
これで、カレントディレクトリにPEARのインストーラがダウンロードされます。


2. インストール

そのまま続けて、以下を入力。
sudo php -q pear.php
すると、インストールが始まります。英語でいろんなことを聞かれますが、基本的にEnterを連打。

するとそのうち、各種パスを指定するメニューが出てきます。

1. Installation prefix ($prefix) : /Users/hoge
2. Temporary files directory  : $prefix/temp
3. Binaries directory  : $prefix/bin
4. PHP code directory ($php_dir) : $prefix/PEAR
5. Documentation base directory  : $php_dir/docs
6. Data base directory  : $php_dir/data
7. Tests base directory  : $php_dir/tests

デフォルトはこんな設定になっています。が、これだと、MAMPから参照させるのにシンボリックリンク張ったりとかがいろいろ面倒なので、MAMP配下に直接インストールすることにしました。

1. Installation prefix ($prefix) : /Applications/MAMP/bin/php5/lib/php
2. Temporary files directory  : $prefix/temp
3. Binaries directory  : /usr/bin
4. PHP code directory ($php_dir) : $prefix
5. Documentation base directory  : $php_dir/docs
6. Data base directory  : $php_dir/data
7. Tests base directory  : $php_dir/tests

変更後の設定はこれ。1,3,4を変更しています。

なお、3で、pearのバイナリファイル(っていう言い方でいいのか?)が/usr/bin/にインストールされるようにしたつもりだったのですが、何回かやり直しているうちに、なぜかインストールされなくなってしまいました。
/Applications/MAMP/bin/php5/bin/にもpearバイナリファイルがあるので、手動でそいつにシンボリックリンクを作成。

sudo ln -s /Applications/MAMP/bin/php5/bin/pear /usr/bin/pear


3. パッケージのインストール

次は、必要なパッケージのインストール。

sudo pear install DB
sudo pear install Auth

NetBeansでSmartyのtplを認識させる

PHP のフレームワークは NetBeans 6.5 では正式にサポートされているものはありませんが、以下の操作でエディタでのカラーハイライトは使えるようになります。

  1. 「ツール」>「オプション」でオプションダイアログを表示する
  2. 「その他」タブから「ファイル」を選ぶ
  3. ファイルの拡張子に「tpl」を入力して関連付けられたファイルの種類で「PHP Files」を選択

NetBeansでZendFrameWork設定する時にハマった


NetBeans
でZendFrameWork設定する時にハマった
 Add Star

Linux上でZendFrameWork使うのが色々めんどいので

WindowsNetBeansを入れてみた。

NetBeansはバージョン6.9.1からZendFrameWorkがサポートされるようになったらしい。

まだちゃんとしたマニュアルがなく、以下の動画による解説のみ公式サイトで公開されている。

Zend Framework Support in NetBeans IDE for PHP

http://netbeans.org/kb/docs/php/zend-framework-screencast.html

で、設定自体は上記の動画通りにやればいいらしいんだが・・・

「プロバイダの登録」で変なハマり方をした。

本来であれば「プライバイダの登録」を実行することで

(ZendFrameWorkを置いたPath)\bin\zf.bat create configure

みたいなコマンドを呼び、zf.ini(文字通りZendFrameWork用の設定ファイル)を

作成するような処理をしていると思われるのだが(多分他にもやってると思うけど)、

何故かこんなエラーが。。。

’”php.exe”’ は、内部コマンドまたは外部コマンド、

操作可能なプログラムまたはバッチ ファイルとして認識されていません。

・・何故だ!php.exeにパスは通っているはずだ!

パスを設定し直してDOS窓再起動したりなんなりをしたのに一向に直らない。

実家PCでやった時は普通に出来たんだけどなぁ・・

仕方なくzf.batを書きなおす。

<before>

:NON_PEAR_INSTALLED

REM Assume php.exe is executable, and that zf.php will reside in the

REM same file as this one

SET PHP_BIN=php.exe ←ココ

SET PHP_DIR=%~dp0

<after>

:NON_PEAR_INSTALLED

REM Assume php.exe is executable, and that zf.php will reside in the

REM same file as this one

REM SET PHP_BIN=php.exe

SET PHP_BIN=D:\php\php.exephp.exeのある場所をフルパスで指定

SET PHP_DIR=%~dp0

んで、再度実行することで問題なく・・・

と言いたいところだが、このままではzf.iniが存在しないと怒られる。。

仕方なく手動でzf.batを実行し、zf.iniファイルを作成する。

cd (ZendFrameWorkを置いたPath)\bin\

zf create config

これでzf.iniファイルが作成される。

私の場合D:\Documents and Settings\(user名)\zf.iniが作成された。



んで、再度プロバイダ作成を実行すると、今度は別のエラーが・・orz

「すでにzf.iniファイルがあるぞ(゚Д゚)ゴルァ!!」

と怒られる・・・もう何なのこの子。もう着いていけないわ!

動作確認としてzfを使用する指定でプロジェクトを作成すると

最低限必要なフォルダ・ファイル一式(index.php, .htaccessなど)が自動で作成された。

なんか納得しないけどとりあえずこれでNetBeans上からZenfFrameWorkを使用した

アプリを作ることが出来た!

ということにしておこう!

$this->Smarty();がエラー

Smarty 3.x

新しく設定した環境に合わせ、Smarty を設定した所、エラーが発生しました。

SmartyException: Please use parent::__construct() to call parent constuctor in C:\develop\lib\Smarty-3.0.7\libs\Smarty.class.php on line 785

バージョンは最新(2011/4現在)のSmarty-3.0.7です。
手持ちの 2.x と Smarty.class.php を比較すると、記述が代わっていました。
エラーの通り、__construct() 内の $this->Smarty(); を parent::__construct(); に変更します。

smarty.phprequire_once(‘Smarty.class.php’); class view_smarty extends Smarty { public function __construct() { parent::__construct(); // $this->Smarty(); $this->template_dir = ‘C:/develop/workspace/appli/templates/’; $this->compile_dir = ‘C:/develop/var/appli/templates_c/’; $this->config_dir = ‘C:/develop/var/appli/configs/’; $this->cache_dir = ‘C:/develop/var/appli/cache/’; } }

これで正常に動作するようになりました。

バックアップをきちんと考える

世の中クラウドの時代になってはいますが、やはり動画や写真のデータを高画質で保存しておくには、クラウドだとすぐに容量がいっぱいになってしまいます。

今までローカルでのバックアップは、思い立った時に外付HDDに保存したりしていましたが、やはりきちんと定期的にやるべきだと思ってはいたがなかなか実行に移せず。。

そこでこういうソフトを導入して、定期的にバックアップしていこうと思います。

http://homepage3.nifty.com/nagatsuki/bunbackup/bunbackup.htm

動画じゃなく画像だけなら、USB2.0版の外付HDDはいまがお買い得。
2TBは若干壊れやすいと聞きますので、1TBでいいかな。。

http://www.amazon.co.jp/dp/B003Y8YPGA/ref=asc_df_B003Y8YPGA398496/?tag=coneco-ce-22&creative=9303&creativeASIN=B003Y8YPGA&linkCode=asn&me=AN1VRQENFRJN5 

mysql_get_server_info: MySQL サーバ情報を取得する

(PHP 4 >= 4.0.5, PHP 5)

mysql_get_server_infoMySQL サーバ情報を取得する

説明

string mysql_get_server_info ([ resource $link_identifier ] )

MySQL サーバのバージョンを取得します。

パラメータ

link_identifier

MySQL 接続。 指定されない場合、mysql_connect() により直近にオープンされたリンクが 指定されたと仮定されます。そのようなリンクがない場合、引数を指定せずに mysql_connect() がコールした時と同様にリンクを確立します。 リンクが見付からない、または、確立できない場合、 E_WARNING レベルのエラーが生成されます。

返り値

成功した場合に MySQL サーバのバージョン、失敗した場合に FALSE を返します。

例1 mysql_get_server_info() の例

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');
if (!
$link) {
    die(
'Could not connect: ' mysql_error());
}
printf("MySQL server version: %s\n"mysql_get_server_info());
?>

上の例の出力は、 たとえば以下のようになります。

MySQL server version: 4.0.1-alpha

Webサービス用にさくらのVPSサーバーを借りた後で役に立つ記事色々

WEBサービス用にさくらのVPSサーバーを借りた後で役に立つ記事色々
さくらVPSサーバの人気が高いということで、借りたらやる設定についての記事をまとめてみました。

さくらのvpsといっても普通のcentosと一緒なので、他のvpsサービスやec2でも使えます。レンタルサーバーと違って最初はなにも入ってないので初期設定が必要ですが、これさえみとけば大体大丈夫というものをまとめてます。

さくらのVPS


初期設定

【さくらのVPS】初期設定をしてみた | Untitled Documents.
root パスワードの変更、ユーザ追加、sudoers編集、ssh公開鍵設置、パッケージ管理ツールの設定等

CentOSをサーバーとして活用するための基本的な設定 (さくらインターネット創業日記)
sshのポート番号変更、公開鍵設定、ファイアウォール設定の他、不要サービスの停止といったさくらインターネット社長直々の設定方法紹介

さくらのVPSサーバー構築メモ vim, zsh, gitをインストール - Yuyak
開発に必要なvim, zsh, git 基本パッケージのインストール。
基本yumでインストールですが、RPMリポジトリの追加等、初心者の方は参考にできます

さくらの格安VPSをリりたらいつもやっている設定いろいろ - IDEA*IDEA 〜 百式管理人のライフハックブログ
箇条書きで必要設定について解説されています。

AKIBE - creative works
サーバ構築についてのチュートリアルが一杯。ここの記事を1からやるのもヨシ

さくらの VPS で名前解決が遅いって、なんでですか - subtech
DNSの名前解決が遅い場合の対処法。

重複も多いですがそれぞれ参考になります。

チューニング

さくらのVPS、引き続きApacheチューニング - Hinemosu
Apacheでサービスするなら初心者は読んでおこうというチューニングについて

さくらVPSで一日6万PVを処理するためにしたこと - 新卒インフラエンジニア1年目
ApacheやPHPのチューニング

セキュリティ
さくらVPSを借りたら絶対にやるべき10のタスク
セキュリティに関して見ておくとよさそう。9は関係ないですが(^^;)


月額980円で専用サーバちっくに使えるVPSは既に主流となりつつありますね。

あと、当ブログにバナーを出して頂いてるKDDI系列のCPIさんもVPSを提供しており、Linuxだとスペックが選べたり、Windows VPSが月額 1,575 円で使えたりするのでこちらもご参考まで。
Windowsでサイトのキャプチャを撮るなど、Windows用のアプリケーションをWEBサービスでも使うことが出来ます。

Faviconの設置方法

設置方法▲TOPFaviconの設置方法はとっても簡単です。
まずFaviconを作成し、Favionを表示させたいページの<head>タグの中に下記のタグを挿入してください。
準備ができたら、使用しているサーバーにアップロードしてください。

<link rel=”shortcut icon” href=”ファビコンまでのパス/favicon.ico”>


<例>
/home
index.html
├bbs
│ └bbs.html
└favicon.ico
上記のようなファイル構造のときはindex.html
<link rel=”shortcut icon” href=”favicon.ico” >
bbs.html
に表示させたいときは、
<link rel=”shortcut icon” href=”../favicon.ico” >
を挿入してください。   Internet Explorer7とFireFoxで別々のファビコンを表示させる▲TOPInternet Explorer7(IE7)では画像の形式がiconファイルでないと表示されません。
しかしFireFox(FF)の場合アニメーションGIFで作成したファビコンにも対応しています。
このときにIE7とFFで表示させる場合、以下のように記述してください。
アニメーションファビコンの拡張子はgifでかまいません。


<link rel=”shortcut icon” href=”ファビコンまでのパス/favicon.ico”>

<link rel=”icon” href=”アニメーションファビコンまでのパス” type=”image/gif” />

  Apacheでの設定(上級者向け)▲TOPApachの設定でFaviconを設定する。

ServerRootの/icon/サブディレクトリに、デフォルトのfavicon.icoを置き、サーバー設定ファイルの中でそのアイコンを使用したいスコープ(たとえば特定の<VirtualHost>コンテナ内)に対して、以下の行を追加する。

ErrorDocumentを利用する場合

AddType image/xicon .ico
<Files favicon.ico>
  ErrorDocument 404 /icons/favicon.ico
</Files>

RewitRuleを利用する場合

RewriteEngine On
RewriteCond %{REQUEST_URI} “favicon.ico$”
RewriteRule “(.*)(favicon.ico$)” “<faviconファイルまでのパス>” [N,PT]

上記の方法はともに.htaccessで設定してもよい。            RSSでFaviconを表示させる▲TOP

RSS1.0のImageモジュールを利用することでRSSにfaviconをRSSに埋め込むことができます
実際には下記のようになります。
詳しくはこちらのページを参照ください
RDF Site Summary 1.0 Modules: Image

<image:favicon rdf:about=”http://www.favicon.jp/favicon.ico” image:size=”small”> <dc:title>FaviconJapan</dc:title> </image:favicon>

参考サイト:hail2u.net - Weblog - RSSにfavicon

アニメーションGIFで作成したfaviconが表示されません?▲TOPアニメーションGIFで作成したfaviconが表示されない原因は

1.前回表示された時のものがブラウザに記憶されている。
2.GIFそのものが壊れている。
3.ブラウザのfavicon表示条件を満たしていない。

等が考えられます

1.の場合ブラウザのキャッシュ、一時ファイルを削除してから
更新してみてください。

2.の場合はファイルまでのフルパス
http://www.favicon.jp/favicon.ico
を入力し表示されるか試してみてください
問題なく表示されれば原因1.3.が原因です。

3.の場合は表示条件を満たすように、
操作してみてください。
faviconに最も対応しているブラウザはFireFoxです。 MacOSX Safariの場合▲TOPSafariの場合、ブックマークをするタイミングではなく、ブラウズするタイミングでfaviconが登録・更新されます。 Windows IEの場合▲TOPWindows版のIEはOSによって変わってきますが、ブックマークするタイミングでfaviconが付きます。 Windows Mozilla の場合▲TOPMozillaの場合はfaviconを読み込む段階で、登録・更新します。
前回アクセス時間によって現れたり、現れなかったりします。 Windows FireFoxの場合▲TOPFireFoxの場合はfaviconを読み込む段階で、登録・更新します。
前回アクセス時間によって現れたり、現れなかったりします。