ラベル php の投稿を表示しています。 すべての投稿を表示
ラベル php の投稿を表示しています。 すべての投稿を表示

2008/12/07

Webアプリケーション(tasklog)の作成(No.4)

今回はタスクの追加の予定でしたが、なかなか実装できないので途中経過を書いておきます。

行の追加や削除するサンプルもありますが、追加する場合に関係するプログラムが見当たらないため、そこは自分で考えて作らないといけないみたいです。

まずは、gridOptionのtoolbarContentにaddとdelを指定するとプラスとマイナスのボタンが表示されて、プラスのボタンをクリックすると行が追加されますが、Firebugのコンソールに二つのエラーが表示されます。エラーの場所はgt_grid_all.jsとjavascript:void(0); return false;なので、内部的に呼び出されているところでエラーが発生しているんだと思います。

まずは表に行を追加したときに呼び出されるコールバックを調べました。以下のコードを追加したところ、プラスのアイコンをクリックしたところ、Firebugのコンソールにinserted!と出力されたので、行を追加されたときに、このコールバックが呼び出されるようです。


taskGrid.beforeInsert = function (record) {
console.log("inserted!");
}


このコールバックのマニュアルの記述には、

Fired before: Changed data is to be posted to server side.
record: Object or Array. Record of the row added/appended by end user.
returns: Bool. Return false to prevent row from being posted to server side.

とあるので、サーバー・サイドにポストする仕掛けを組み込めそうな感じですが、どうすればいいのか、いまのところはわかっていません。

2008/11/30

Webアプリケーション(tasklog)の作成(No.3)

今回は前回のプログラムをSigma Gridを利用するように変更しました。

マニュアルサンプルを参考にして作成しましたが、細かいことが説明されていないので、ある程度は推測した結果も入っています。

まずHTMLです。


<html>
<head>
<title>TaskLog</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<link rel="stylesheet" type="text/css" href="/sigma_grid/grid/gt_grid.css" />
<link rel="stylesheet" type="text/css" href="/sigma_grid/grid/skin/vista/skinstyle.css" />
<script type="text/javascript" src="/sigma_grid/grid/gt_msg_en.js"></script>
<script type="text/javascript" src="/sigma_grid/grid/gt_const.js"></script>

<script type="text/javascript" src="/sigma_grid/grid/gt_grid_all.js"></script>


<script type="text/javascript" src="/jquery/jquery.js"></script>
<script type="text/javascript" src="tasklog.js"></script>
</head>
<body class=tundra>
<div id="taskGrid"></div>
</body>
</html>


どのcssファイルやjsファイルにリンクすればいいのか、わからなかったのでサンプルから必要なさそうなファイル以外を残しています。HTMLファイルではGridを表示した位置にdivセクションを配置します。

次はHTMLファイルからリンクされているJavascirptファイルです。

var dsOption = {
fields: [
{name : 'id', type : 'int' },
{name : 'name' },
{name : 'estimate_time', type : 'int' },
{name : 'start_time' },
{name : 'finish_time'}
],
recordType: 'object',
};


var colsOption = [
{id: 'id' , header: "ID" , width :60 },
{id: 'name' , header: "タスク名" , width :80 },
{id: 'estimate_time' , header: "見積時間" , width :70 },
{id: 'start_time' , header: "開始時間" , width :80 },
{id: 'finish_time' , header: "終了時間" , width :80}
];

var gridOption={
id : 'taskLog',
width: "100%", //"100%", // 700,
height: "100%", //"100%", // 330,
container : 'taskGrid',
replaceContainer : true,
dataset : dsOption ,
columns : colsOption,
toolbarContent : 'nav | goto | add del',
pageSize : 20
};

var taskGrid = new Sigma.Grid( gridOption );
Sigma.Util.onLoad( Sigma.Grid.render(taskGrid) );

$(function() {
jQuery.getJSON('tasklog_select.php', function(json) {
taskGrid.setContent(json.data);
})
});


サンプルではDataSetのrecordTypeにはarrayが設定されていますが、あえてobjectを指定してみました。objectを指定した場合に参考になるサンプルが見つかりませんでしたが、以下のphpファイルで出力したJSON形式の配列をセットしたところ、うまく表示されました。

<?php
$dbname = 'tasklog.sqlite';
$link = new SQLiteDatabase($dbname, 0666, $sqliteerror);
if (!$link) {
die('接続失敗です。'.$sqliteerror);
}

$sql = "SELECT * FROM task";
$result = $link->query($sql, SQLITE_BOTH, $sqliteerror);
if (!$result) {
die('クエリーが失敗しました。'.$sqliteerror);
}

$all_items = array();
while ($rows = $result->fetch(SQLITE_ASSOC)) {
if ($rows['start_time'] == null) {
$start_time = "--:--";
} else {
$start_time = $rows["start_time"];
}
if ($rows["finish_time"] == null) {
$finish_time = "--:--";
} else {
$finish_time = $rows["finish_time"];
}
$item = array ( "id" => $rows['id'],
"name" => $rows['name'],
"estimate_time" => $rows["estimate_time"],
"start_time" => $start_time,
"finish_time" => $finish_time);

array_push($all_items, $item);
}
$tasks = array( "data" => $all_items);

print(json_encode($tasks));
?>


前回からはレコードが一つ増えていますが、以下のように表示されました。


DataSetやColumnなどに、いくつかオプションが設定してありますが、サンプルから抜き出しただけなので、今後いろいろと調整していくつもりです。

ここまででデータベースに格納されているデータを表示することはできるようになりましたので、次はレコードの追加を実装するつもりです。

2008/11/24

Webアプリケーション(tasklog)の作成(No.2)

今回はデータベースに入っているタスクをWebブラウザー上でテーブルとして表示します。まず、前回はデータベースにテーブルを作成しただけでデータを入力していないため、テーブルとして表示できませんので、前回インストールしたSQL Managerを利用してタスクを入力しておきます。



Dojoでテーブルを表示する場合、DataGridオブジェクトを使います。DataGridで表示するデータはDataStoreで抽象化されます。抽象化するデータ形式でさまざまなDataStoreが用意されています。ここではデータベースに入っているデータをJSON形式で引き渡されて表示するためにItemFileReadStoreを利用します。

まずJSON形式でデータを返すスクリプト(tasklog_select.php)を作成します。


<?php
$dbname = 'tasklog.sqlite';
$link = new SQLiteDatabase($dbname, 0666, $sqliteerror);
if (!$link) {
die('接続失敗です。'.$sqliteerror);
}

$sql = "SELECT * FROM task";
$result = $link->query($sql, SQLITE_BOTH, $sqliteerror);
if (!$result) {
die('クエリーが失敗しました。'.$sqliteerror);
}

$all_items = array();
while ($rows = $result->fetch(SQLITE_ASSOC)) {
$item = array ( "id" => $rows['id'],
"name" => $rows['name'],
"estimate_time" => $rows["estimate_time"],
"start_time" => $rows["start_time"],
"finish_time" => $rows["finish_time"]);

array_push($all_items, $item);
}
$tasks = array( "identifier" => 'id',
"items" => $all_items);

print(json_encode($tasks));
?>


やっていることは、selectした結果を1レコードづつ取り出して、連想配列に格納して、最後にjson形式に変換して出力しているだけです。

まずはテーブルだけを表示します。

<html>
<head>
<title>TaskLog</title>
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" type="text/css" href="/dojo/dojo/resources/dojo.css">
<link rel="stylesheet" type="text/css" href="/dojo/dojox/grid/resources/Grid.css">
<link rel="stylesheet" type="text/css" href="/dojo/dijit/themes/tundra/tundra.css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript" src="/dojo/dojo/dojo.js" djConfig="parseOnLoad:true, isDebug:false"></script>
<script type="text/javascript">
dojo.require("dojo.parser");
dojo.require("dojo.data.ItemFileReadStore");
dojo.require("dojox.grid.DataGrid");
var jsonStore = new dojo.data.ItemFileReadStore({ url: "http://localhost/tasklog/tasklog_select.php" });
</script>
</head>
<body class=tundra>
<table id="taskGrid" jsId="taskGrid" dojoType="dojox.grid.DataGrid"
store="jsonStore">
<thead>
<tr>
<th field="id">ID</th>
<th field="name">タスク</th>
<th field="estimate_time">見積時間</th>
<th field="start_time">開始時間</th>
<th field="finish_time">終了時間</th>
</tr>
</thead>
</table>
</body>
</html>


これで次のようなテーブルが表示されます。


今回はここまでです。次回はテーブルを編集できるように、と考えていたんですが、Sigma Gridとというライブラリを見つけてしまいました。これだったらテーブルの追加や削除、編集などがサポートされているみたいです。次回は、このSigma Gridを試してみたいと思います。

もともとDojoはGridを使うのが目的だったので、Sigma Gridを使うんだったらDojoはいらないことになります。素のJavascriptだとデータベースへのアクセスのための非同期通信が面倒そうなので、Dojoの代わりにjQueryにしようかと考えています。最初とはかなり構成が変わってしまいそうですが、柔軟に進めていこうと思います。

2008/11/23

Webアプリケーション(tasklog)の作成(No.1)

毎日の作業の見積時間とその実績を管理するWebアプリケーションを作成しながら、いろいろとわかったことを書いていきます。

ちなみにWebアプリケーションの開発は、いろいろと調べながら書いていますので、間違っていたり、あるいはもっと正しい方法があったりするかもしれません。

まずはWeb Applicationの構成をざっと書きます。作業の見積時間や実績を保存するデータベースをSQLiteにして、WebサーバーのApacheからPHPでアクセスします。WebブラウザのロジックはDojoベースでJavascriptで作成します。Dojoは1.2になっていますが、サンプルとかがあまりそろっていないようですので、試行錯誤を参考にしてもらえればうれしいです。

ということで以下のような環境をWindowsXP上に準備しました。

1. Apache V2.2.9のインストール
デフォルトのままC:\Program Files\Apache Software Foundation\Apache2.2にインストールしました。

2. PHP V5.2.6のインストール
これはちょっと前にしていたので、細かいことは忘れてしまいましたが、最近はApacheとの連携もインストーラーが設定してくれるみたいでした。PHPのインストールではSQLiteにアクセスできるようにするために、ExtensionsにSQLiteを追加します。Extensionsではもう一つ、Multi-Byte Stringも追加しておくと便利かもしれないです。Apacheを一度Restartさせてから、http://localhost/phpinfo.phpにアクセスして、PDOからSQLiteがアクセスできることを確認します。

3. 作業フォルダーの作成
作成するWebアプリケーションの名前をtasklogとします。C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\tasklogフォルダーを作成します。このフォルダーをプロジェクト・フォルダーと呼ぶことにします。

4. データベースの作成
最初にデータベースを作成します。SQLiteの場合、作成されていないデータベースのファイル名を指定すると自動的に作成されます。データベースのファイル名をtasklog.sqliteとします。
次に、最小限のデータを保存することにして、以下のPHPでデータベースとテーブルを作成します。


$dbname = 'tasklog.sqlite';
$link = new SQLiteDatabase($dbname, 0666, $sqliteerror);
if (!$link) {
die('接続失敗です。'.$sqliteerror);
}

$sql = "CREATE TABLE task ( id INTEGER , task_name VARCHAR, estimate_time INTEGER,
start_time DATETIME, finish_time DATETIME )";
$result = $link->queryExec($sql, $sqliteerror);
if (!$result) {
die('クエリーが失敗しました。'.$sqliteerror);
}

idはタスクのID、nameはタスク名、estimate_timeはタスク処理の見積もり時間、start_timeは開始時間、finish_timeは終了時間とします。

5. SQLite Managerのインストール
もう一つ準備としてSQLiteを操作するために、SQLite Managerを導入することにします。同じ名前のFirefoxのアドオンもあるのでややこしいですが、こちらはPHPから起動されるWebアプリケーションです。SQLiteManager-1.2.0.zipをダウンロードします。zipファイルの中には、SQLiteManager-1.2.0という階層がありますが、その下の階層をプロジェクト・フォルダーに展開します。ここでhttp://localhost/tasklog /index.phpにアクセスしてSQLite Managerを起動します。起動するとTestデータベースが一つだけ登録されています。

右のSQLite Managerの下にあるLagaugeからJapaneseを選択すると日本語で表示されるようになりますが、画面がEUC-JPなのでブラウザーの設定によって文字化けします。ブラウザーの文字エンコーディングの設定をEUC-JPに変更すれば表示されますが、データベースに入力するデータはUTF-8にする予定なので、どちらかが表示されないことになりますので、LanguageはEnglishのままにします。

作成したtasklog.sqliteデータベースを登録すると、テーブルの構成を確認できます。



本来はSQLite Managerでもデータベースの作成はできるはずですが、SQLite Managerで作成したデータベースにPHPからアクセスしてもオープンに失敗しているようなので、PHPから作成することにしました。もしかしたらSQLite Managerでデータベースを作成するときにバージョンとして3を指定したのがいけなかったのかもしれません。

まずは、ここまでにします。次は登録したデータベースをWebブラウザーで表示します。