08.で DirectStore でのサーバー更新について調べましたが,それでは実際にサーバー側のルーチンはどう書いたらいいのでしょうか。ここでは,PHPとxFrameworkPXを使った場合を例示します。xFrameworkPXでは,ExtDirectコントローラーを使えば,モジュールのメソッドがそのままExtDirectで使えるという便利な機能があります。ここでは,そのモジュールのメソッドの記述例を示してExtDirectでのサーバー側の実装を示します。ただ,他のフレームワークを使った場合でも,API周りの処理に違いがあるとは思いますが,実際に処理するメソッド自体は大同小異だと思いますので,参考にはなると思います。
クライアント側 JavaScript
DirectStore の定義
次のような DirectStore を定義して,このストアの save メソッドをコールしたときに,ちゃんとサーバー側で更新がかかるようにします。例では autoSave を false にして自動保存されないようにしていますが,自動保存する場合でもほぼ同じです。この例では,保存するときの beforewrite イベントでローディングマスクを表示する処理を加えて, write イベントでマスクを解除しています。API コンフィグで指定しているのは,ExtDirect で公開されているメソッドです。Ext.remote というネームスペースに定義されるようになっています。CRUDそれぞれのメソッドが定義されています。
- Create = insertDataメソッド
- Read = readDataメソッド
- Update = updateData メソッド
- Delete = deleteData メソッド
Store へのレコードの追加
ここでは参考までに Store にデータを追加するコードを紹介します。
var newRec; newRec = new me.store.recordType(obj, null); me.store.add( newRec );
このように,recordType でレコードを作り,add メソッドで追加します。上記の例ではobjに追加したいレコードのデータが入っているという前提です。レコードの id プロパティが空の時に ExtJS はそれが追加されたレコードであると判断します。
サーバー側 PHP(xFrameworkPX)
次にサーバー側のコードを書いていきます。
ExtDirect コントローラー
.extdirect.php を webapp フォルダに作成します。
class extdirect extends xFrameworkPX_Controller_ExtDirect { public $direct = array( 'namespace' => 'Ext.remote' ); public $modules = array( 'employee' => array( 'conn' => 'default' ) ); }
ネームスペースを設定して,利用するモジュール(employee)をuseしています。これだけで xFrameworkPX がいろいろと世話をしてくれるので, employee モジュールのメソッドを ExtDirect から利用可能になります。
employee モジュール
class employee extends xFrameworkPX_Model { public $usetable = 'employee'; // メソッドを記述 }
xFrameworkPX でのモジュールは,modules ディレクトリに配置します。
readData メソッド
データを読み出すための readData メソッドを実装します。
public function readData() { $fields = array( 'id', 'name_kanji', 'name_kana', 'birth_date' ); $order = array( 'id' ); $result = $this->get( 'all', array( 'fields' => $fields, 'order' => $order ) ); return array( 'success' => true, 'total' => count( $result ), 'items' => $result ); }
データベースから従業員データをとってきて,その一覧を返しています。返却するデータは最後の return 文のような形式で返します。
この中の items というキー名は任意ですが,このキー名を Store の root コンフィグにセットしなければなりません。他のキー名にした場合には,Store の root コンフィグにその名前をセットします。
deleteData メソッド
destroy アクションが発行された場合に実行されます。この場合,サーバに渡されるオブジェクトの items プロパティに削除すべきレコードの id が渡されます。削除するレコードが複数ある場合には items は配列になります。この例での items となっている要素ですが,この items というキーは前述の通り, root コンフィグに設定されている値になります。root コンフィグの値が違っていればこのキー名も変わります。(この点については他のメソッドでも同様です)
実際の deleteData メソッドのコードです。
<div>
public function deleteData( $pData )
{
$data = $pData-&amp;gt;items;
if( ! is_array($data) ){
$data = array($data);
}
$result = true;
foreach( $data as $id ){
$result = $result &amp;gt;&amp;gt; $this-&amp;gt;_deleteOne( $id );
}
return array(
'success' =&amp;gt; $result,
'items' =&amp;gt; $data
);
}
</code></pre>
<p> private function _deleteOne( $id )
{</p>
<pre><code> $where = array(
'id = :id'
);
$bind = array(
'id' =&amp;gt; $id
);
$result = $this-&amp;gt;delete(
array(
'where' =&amp;gt; $where,
'bind' =&amp;gt; $bind
)
);
return $result;
}
</code></pre>
<p>