Topに戻る

PHP5 アーカイブ

PHP5でXMLのパース

仕事でデータ量の多いXMLファイルをCSVに変換する必要があったのでちょっと調べて作ってみた。
動作環境はPHP 5.0.4 OSX10.4です。

<?php
$str= <<<DATA
<?xml version="1.0"?>
<root>
	<parentnode ID="1" NAME="大カテゴリ">
		<node ID="1" NAME="中カテゴリ">
			<node ID="1" NAME="小カテゴリ">
				<hoge ID="2" NAME="さとう"/>
				<hoge ID="3" NAME="sakana"/>
				<hoge ID="4" NAME="sato"/>
				<hoge ID="5" NAME="skn"/>
			</node>
		</node>
	</parentnode>
</root>
DATA;
// ↓これがみそ。
$root = simplexml_load_string($str);
foreach($root->parentnode[0]->node as $node){
    foreach($node->node as $subnode){
        foreach($subnode->hoge as $hoge){ 
            echo $root->parentnode[0]['NAME']
            .",".$node['ID']
            .",".$node['NAME']
            .",".$subnode['NAME']
            .",".$hoge['ID']
            .",".$hoge['NAME']."\n";
        }
    }
}
?>
出力結果:
大カテゴリ,1,中カテゴリ,小カテゴリ,2,さとう
大カテゴリ,1,中カテゴリ,小カテゴリ,3,sakana
大カテゴリ,1,中カテゴリ,小カテゴリ,4,sato
大カテゴリ,1,中カテゴリ,小カテゴリ,5,skn

たったこれだけでXMLをパースできるとは。
うーむ。素晴らしい。
今日からPHP5推進派になりました。

Ningのデベロッパーアカウント

周回遅れ気味でNingのデベロッパーアカウントを取得しました。
開発者向けドキュメントを時間をみて読んでます。

PHP5推進派としましては(って何?)外せないわけです。
Ningの仕組み自体が自サーバーに欲しいと思ってるのは僕だけでないはず。

scuttleの日本語化(訂正)

ちょっと前に盛り上がりを見せていた、オープンソースのソーシャルブックマークサービスScuttle」を日本語化してみました。

よっし。と思ったら先に公開している人がいました。orz

SourceForge.net:[ 1379585 ] I made Japanese translation.

ですが、せっかくだから手順とあわせて晒しておきます。

scuttle.zip

解凍したファイルの「 ja_JP.po」というのがソースファイルです。
(訂正:ロケール名の書式が間違ってるとご指摘を受けました。ありがとうございます。)

エディタで開いて

msgid "hogehoge"
msgstr "ほげほげ"

みたいな形式でひたすら翻訳していきます。できたファイルはutf-8で保存。

次に、gettextに含まれるmsgfmtというコマンドでバイナリにコンパイルする必要があります。OSXにgettextをインストールしてやってみたのですが、上手くいきませんでした。ので、久しぶりにcygwinを使用。

cygwinのsetup.exeを立ち上げ、「devel」の下にあるgettextとgettext-devel(いらない?)をチェックしてインストール。

コマンドラインから、

# msgfmt -o ja_JP.mo ja_JP.po

でOK。
/localesディレクトリにja_JP.moファイルを配置し/config.inc.php内で以下のように書き換えると動きます。

$locale = "ja_JP";

翻訳は自身無いのでご利用は自己責任で。
geekの項目とか訳してないですし。
コミュニティへの登録はどうしよう。。。

PHPでExcelファイルの入出力

自分用メモ。
環境はOSX10.4+php5+PEARです。

■Excelファイルを出力する場合

Spreadsheet_Excel_Writer(PEAR版)を使用。PEAR版はOLEというパッケージ依存。PHP_Class版もあるらしいけど、ファイルの容量に7MBの制限あるらしい。

・インストール

php5をインストールしていると、新しく別のPEARが勝手にインストールされてしまう。なのでphp.ini内のinclude_pathを変えるか、新しい方のPEARを使用する。(ここではまりました。)

※デフォルトのPEARのパス
/usr/bin/pear
※php5のPEARのパス
/usr/local/php5/bin/pear

先にOLEをインストール。

# sudo pear install OLE

次に、Spreadsheet_Excel_Writerをインストール。

# sudo pear install Spreadsheet_Excel_Writer
# pear list

としてインストールされているのを確認。

Archive_Tar              1.1     stable
Console_Getopt           1.2     stable
DB                       1.6.2   stable

      〜 中略 〜

OLE 0.5 beta
Spreadsheet_Excel_Writer 0.9.0 beta

どちらもBeta版なので注意。

・サンプル
ここに載っていたのを参考に。
『ふたつのしっぽ』

ただし、文字コードを変換する際にmb_convert_encodingを使用するとき3つ目の引数に"auto"を指定する必要があった。

<?php
//PEARクラスのインクルード
include_once 'Spreadsheet/Excel/Writer.php';
//ワークブックの生成
$workbook = new Spreadsheet_Excel_Writer();
//ワークシートの生成
$worksheet =& $workbook->addWorksheet(mb_convert_encoding("シート01","SJIS","auto"));
//列幅の設定
$worksheet->setColumn(0,0,5);    //1列目幅5
$worksheet->setColumn(1,1,10);   //2列目幅10
$worksheet->setColumn(2,5,2);    //3-6列目幅2
//書式の設定
$format1 =& $workbook->addFormat();
$format1->setColor("red");
$format1->setBold(1);
$format1->setItalic(1);
$format1->setBorder(1);
$format1->setBorderColor("blue");
//値を定義
$worksheet->write(0,0,"001");
$worksheet->writeString(0,1,mb_convert_encoding("ほげほげ","SJIS","auto"),$format1);
$worksheet->writeNumber(1,0,"001",$format1);
//式を定義
$worksheet->writeFormula(2,0,"=SUM(A1:A2)");
//HTTPヘッダー出力
$workbook->send("sample.xls");
//excel出力
$workbook->close();
exit;
?>

ファイルを出力する際はSpreadsheet_Excel_Writerをnewするときに引数にファイル名を渡すとExcelファイルが生成される。

$workbook = new Spreadsheet_Excel_Writer("sample2.xls");

その場合、sendメソッドは不要。echo文を含めるとファイルが壊れるので注意。print文はokだった。


■Excelファイルから入力する場合

Spreadsheet_Excel_Reader(SourceForge)を使用。ファイルをダウンロードしてきてphp.iniに記載されているinclude_path内にコピー。

が、Mac版のExcelファイルだとブラウザがハングアップしてしまった。
headerのフォーマットがwindows版と違うためで、"Root Entry"となっている所がMac版だと"R"になってためらしい。

Spreadsheet_Excel_Readerを解凍して/Excel/oleread.incの、204行目付近の

if ($name == "Root Entry") {

if ($name == "Root Entry" || $name == "R"){

とする。(参考

サンプルソースはこんな感じ。

<?php
require_once 'Excel/reader.php';
$data = new Spreadsheet_Excel_Reader();
   // エンコーディングの設定(shift-jis)
   // mb_convert_encodingを使用iconvも使用可
$data->setUTFEncoder('mb');
$data->setOutputEncoding('sjis');
$data->read('sample.xls');
error_reporting(E_ALL ^ E_NOTICE);
for ($i = 1; $i <= $data->sheets[0]['numRows']; $i++) {
	for ($j = 1; $j <= $data->sheets[0]['numCols']; $j++) {
		echo "¥"".$data->sheets[0]['cells'][$i][$j]."¥"¥t";
	}
	echo "<br />¥n";
}
?>


これでも、大量の日本語テキストがあると、あんまし上手くいかなくて、excelのシートの右下のセルにダミーで数字を入れたらなぜか動いた。
セルのフォーマット指定の読み込みとかも挙動がおかしい。

やはり、素直にCSVに変換してテキストファイルとして読み込むのが吉みたい。

PHPのフレームワークSymfonyでWebアプリ作成(1)

前回、Ruby on Railsで敗退&放棄してたのですが、今度はsymfonyにチャレンジしてみました。

関連エントリー:Ruby on Rails を試してみた。

環境は自宅のG5です。

symfonyはPHP5で言う所のRailsみたいなwebアプリケーション・フレームワークです。プロジェクトサイトには以下のような特徴が列挙されていました。

* シンプルテンプレートとヘルパー
* キャッシュ管理
* スマートURL
* スカッフォルディング
* 他言語対応とI18Nサポート
* オブジェクトモデルとMVC
* Ajaxサポート
* 企業向けも大丈夫

ほほう。

PHPのフレームワークは他にも

* Mojavi
* Agavi
* Cake
* Symfony
* maple
* Seagull

などがあって、実はそのうち上の4つをすでに試してます。以下雑感。

Mojaviはとりあえずインストール、チュートリアルアプリ制作までは上手く言って、Pearライブラリとかsmartyとかを組み込めたのですが、手作業が多くてなんか嫌で×。(すみません、あくまで好みです。)

Mojaviの派生であるAgaviはMojaviにヘルパーがくっついたみたいので、Smartyもサポートしてると書いてあり、かなり良さげ。と思ったのですが、インストール、チュートリアルアプリ制作とすすめて、smartyの組み込みでつまずいてダメ。もうちょっとねばれば動いたかもしれないのですが、とりあえず保留。

Cakeはチュートリアルの途中で面倒になって放棄。へたれです。というか、このてのフレームワークはやっぱり独特のドライブ感というか、ヘルパーとかの魔法っぽさ(あれ?もうできちゃったの?みたいなの)が肝なのではないでしょうか。チュートリアルのみたく空のクラスをいっぱい書いてというのは、どうかなあと。

で、最後のSymfonyです。

結論から言うと、僕にもフレームワークでアプリ作れたよ。10分どころかその30倍くらいかかったけど。(号泣
OSX独特と思われるトラップもいくつかあったのでそれもあわせて、次のエントリーでレポートしたいとおもいます。

PHPのフレームワークSymfonyでWebアプリ作成(2)インストール

間があいてしまいましたが、インストール編です。
以下の環境でインストールをしてみました。

OSX10.4.4
PHP 5.0.4(アップデートせなば。)
PEAR

SymfonyはPEARライブラリとして提供されているPHPのフレームワークです。インストールするには、PEAR 1.4.6が必要なので、既にインストールしている場合は

# pear list

でバージョンを確認し必要であれはアップグレードします。

# sudo pear upgrade --alldeps PEAR

次に、symfonyはphingというライブラリに依存関係にあるためインストールします。

# pear install http://phing.info/pear/phing-current.tgz

いよいよsymfonyインストールのインストールです。
まず、ライブラリが置いてあるサイトをpearに登録します。

# pear channel-discover pear.symfony-project.com

で、インストール。

# sudo pear install symfony/symfony

これで完了といきたい所なのですが、OSXでPHP5をインストーラーからインストールした場合にはトラップがあります。

ためしにコマンドラインからsymfonyでプロジェクトをイニシャライズしてみます。

# mkdir testProject
# cd testProject/
# symfony symfony init-project testProject

で、以下のようなエラーが出ます。

Parse error: parse error, expecting `'('' in /usr/local/php5/lib/php/symfony.php on line 19

これは、コマンドラインのphpのバージョンが5で動いてないからだそうです。php5をOSXにインストーラーからインストールすると旧バージョンと平行してインストールされるためのようです。

# php -v 
PHP 4.3.11 (cli) (built: May 31 2005 23:41:02)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

こんな感じ。
参考:リンク

なので、/usr/bin/以下にphp5をコピーするか、ハードリンクを張る必要があります。

# sudo mv /usr/bin/php /usr/bin/php4bkup
# sudo cp /usr/local/php5/bin/php /usr/bin/php

と、とりあえず。

#  php -v                                      
PHP 5.0.4 (cli) (built: Apr  4 2005 17:32:28)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies
Oppenheim:~/Sites/phptest/sfbookmark tSato$ 

も一度。

# symfony init-project testProject

で、ドドドドッとファイルとフォルダが生成されます。
インストールはこんな感じです。

つづきます。(たぶん。。。)

PHPのフレームワークSymfonyでWebアプリ作成(3)単純なWebアプリ作成

ずいぶん間があいてしまいました。

そのあいだ、世の中いろいろと騒々しい感じだったですが、ひとりこもってSymfonyであれこれ作ってました。
ここで書いておこうと思ったTipsとかもいろいろあるにはあったのですけど。

調べているうちに、基本的な使い方等は他にもblogで書かれている方が結構いる事が分かったのですが、書く事で自分が覚えるという事と、自分用メモのため続けます。

手始めに、ブックマークアプリの作り方から。

まず、ウェブ共有のrootディレクトリにフォルダ作成。

# mkdir bookmark
# cd bookmark

で、プロジェクトのイニシャライズ

# symfony init-project bookmark

で、ドドドドッとファイルとフォルダが生成されます。

# symfony init-app myapp

という感じにアプリケーション部分のファイルとフォルダを用意。
ブラウザで以下のURLにアクセスすると「Congratulations!」の文字が!

http://localhost/~myuser/bookmark/web/

apachのmod_rewriteモジュールを使用するので該当のコメントを外します。
OSX10.4だと、httpd.confはここにあります。

# vi /private/etc/httpd/httpd.conf  

AddModule mod_rewrite.c
LoadModule rewrite_module modules/mod_rewrite.so
↑コメントを外す。

で、各ユーザー向けの.confを修正

# sudo vi /private/etc/httpd/users/myuser.conf 

でファイルを開いて以下の設定を追加。

<VirtualHost *:80>
  DocumentRoot "/Users/myuser/Sites/bookmark/web"
  DirectoryIndex index.php

Alias /sfbookmark /Users/myuser/Sites/bookmark/web/app

<Directory "/Users/myuser/Sites/bookmark/web">
AllowOverride All
</Directory>
</VirtualHost>

apachを再起動すると以下のURLでデフォルト画面にアクセスできるようになります。

http://localhost/

参考:サブディレクトリにインストールするやり方(英語)

次に、使用するデータベースのスキーマを作ります。MySQLを使用。

テンプレートをコピーし、

# cp config/schema.xml.sample config/schema.xml

以下のXMLを張り付け。

<?xml version="1.0" encoding="UTF-8"?>
 <database name="symfony" defaultIdMethod="native">
   <table name="bookmark_items" phpName="Items">
     <column name="id" type="integer" required="true" primaryKey="true" autoincrement="true" />
     <column name="title" type="varchar" size="255" />
	 <column name="url" type="varchar" size="255" />
   </table>
 </database>

で、モデルの作成。

# symfony build-model

sqlファイルを作成。

# symfony build-sql

ディレクトリを移動すると

# cd data/sql
# ls

schema.sql sqldb.map

といった感じでsqlファイルが作成されている。
DBを用意し、

# mysql admin -u youruser -p create bookmark
# mysql -u youruser -p bookmark < data/sql/schema.sql

と言った感じにテーブルを作成。

次にorm.ymlファイルを修正

# vi app/config/orm.yml
all:
  adapter:  mysql
  host:     localhost
  database: bookmark
  username: youruser
  password: yourpass

次にアプリケーションのscaffoldingを作ります。
これは、データベースのやり取り・CRUD(Create Read Update Delete)のテンプレートを自動的に作成してくれる機能です。この機能のおかげでSQL文をやこまかい処理を意識する事無くデータベースとやり取りするページのベースを作成してくれます。

まずはこんな感じに。

# symfony generate-propelcrud app items items

http://localhost/items

にアクセスすると、一覧が取得でき、編集できるページができています!

全体の見栄えをいじるのは

app/templates/layout.php

今作ったアクションの見栄えをいじるのは

app/modules/items/templates/以下

またアクションをいじってモジュールの動作を変える事もできます。

app/modules/items/actions/actions.class.php

注意するべきはそれぞれのファイルに命名規約があり

モジュールのクラス名は

モジュール名Actions

となり、アクションは

actions/actions.class.php

内のメソッド名に

executeアクション名(最初の文字は大文字)

と言った具合に書いていきます。なので、たとえば、itemsというモジュールにlistというアクションを追加するなら

class itemsActions extends sfActions
{
	public function executeList()
	{
		// ここにコードを書いていく
	}
}

の用な形式になります。

また、テンプレートはtemplatesフォルダ以下に

アクション名Success.php

のかたちでファイルを作成していきます。

空のメソッドとHTMLだけのテンプレートを用意すると、何の処理も加えずテンプレートに記述したまま表示します。

と言った具合で、単純ではありますが、初めてのウェブアプリができました!

簡単に試したい人はsandboxも最近公開されてるみたいです。
(いろいろバグがあるみたいですけど。。。)

symfonyは個人的にかなり面白いと思ったので、なにか技を発見したら随時公開していこうかと思います。

symfony 0.6が今週金曜にでるらしい。

要チェックです。

symfony 0.6 will be released on Friday
What's new in 0.6?
upgrade instructions

taskpad.jp みたいなのをホゲホゲで作ってみる

はてなブックマーク経由で知ったチュートリアルあれこれ。
taskpad.jpを作ろう。

taskpad.jp みたいなのを Catalyst で作ってみる
task*pad.jp Imitation with Ruby on Rails

あとで、symfony版も作ってみますかな。とか言ってみるテスト。

Ruby on Rails(挫折)もCatalyst(なにそれ?爆)もさわった事無いけど、まあ、大体同じ感じで作れるみたいですし。

Scuttle 0.6.0 Released

オープンソースのソーシャル・ブックマークのScuttleが0.6.0にバージョンアップされてます。ついでにFirefoxのプラグインも公開されてます。

Scuttle 0.6.0 Released
Scuttle Extension for Firefox 0.1

ローカルにさくっとインストールしてみて少し試用してみましたが、タグクラウドが追加されていたり、Ajaxを使ったUIが追加されていたり、とりあえずは、いい感じ。

アップグレードの仕方はこちらに書いてありました。

Upgrading[Scuttle Wiki]

しかし、この手のプロジェクトってビジュアルデザインもこなれてるなあ。ドキュメントのページもしかり。

PEAR::Services_Hatena

はてなのAPIに外部からアクセスするPEARのライブラリが承認されたみたいです。

Services_Hatena

あるURLがブックマークに登録されている数や、キーワードリンクを作ったりという事ができるみたい。よさげ。

Symfonyで画像のアップロード

久しぶりにSymfonyの使い方メモ。画像のアップロードの基礎編。

まずはさくっと、プロジェクトのイニシャライズと、アプリケーション、モジュールの用意。

$ mkdir myproject
$ cd myproject
$ symfony init-project myproject
$ symfony init-app frontend
$ symfony init-module uploadfile

ファイルをアップロードするフォルダと作る。

$ cd web/uploads
$ mkdir web/uploads/files
$ chmod 0777 web/uploads/files

で、actionを書く。

$ vi apps/frontend/modules/uploadfile/actions/actions.class.php
<?php
class uploadfileActions extends sfActions
{
    
/*
        indexはとりあえず放置。
    */
    
public function executeIndex()
    {
    }

    
/*
        update用のアクションを追加。
    */
    
public function executeUpdate()
    {
        
/*
        sfWebRequestクラスのgetFileNameメソッドで
        myfileという名前でファイルを受け取って、
        */
        
if ($file $this->getRequest()->getFileName('myfile'))
        {
            if (!empty(
$file))
            {
            
$file explode("."$file);
            
            
// さっき作ったフォルダに放り込む。
            
$this->getRequest()->moveFile('myfile',
                
'uploads/files/' .$file[0].'.'.$file[1] );
            
            
// 保存したファイルのURLをセッションに放り込む。
            
$this->getUser()->setAttribute('fileurl',
                
$this->getRequest()->getRelativeUrlRoot().'/uploads/img/'.$file[0].'.'.$file[1]);
        }
    }
}
?>

ファイル選択ページとアップロード後ページのビューを用意する。

$ vi apps/frontend/modules/uploadfile/templates/indexSuccess.php
<h1>file uploadのテスト</h1>
<p>以下のフォームから画像ファイルをアップロードしてください。</p>
<?php echo form_tag('uploadfile/update', array('multipart' => true)) ?>
ファイルの選択:<?php echo input_file_tag('myfile'''?>
<?php 
echo submit_tag('アップロード'?>
</form>

アップロード後のビューはこんな感じ。

$ vi apps/frontend/modules/uploadfile/templates/updateSuccess.php
<?php if(!empty($sf_user->getAttribute('fileurl'))) : ?>
uploaded image is ...
<br />
<img src="<?php echo $sf_user->getAttribute('fileurl'?>" />
<br />
タグ
<br /.
<?php echo textarea_tag('introduction' ,'<img src="'.$sf_user->getAttribute('fileurl').'" />', array (
  
'size' => '40x10',
)) 
?>
<?php 
endif ?>


でおしまい。これだけ。

sfWebRequestクラスのgetFileType(string $name)でファイルのmime-typeがとれ、getFileSize (string $name)でファイル容量がとれます。

参考

簡単だー。

あ、でもSymfony使わなくてもmove_uploaded_file関数だけで一発か。

この後の例外処理とかセキュリティ対策とかが意外とちまちましてて面倒ですよね。
そのあたりが楽できないかな。

次回は認証まわりを探ってみます。

About PHP5

ブログ「minfish.jp/blog」のカテゴリ「PHP5」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはOSXです。

次のカテゴリはbusinessです。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35