Phalcon

Phalconのチュートリアル2(INVOアプリ)その3

更新日:

今日は、Phalconチュートリアル2(INVOアプリ)の最終日です。最終日は、CRUDを使用した作業を中心に勉強していきたいと思います。

CRUDを使用した作業

データ(企業、製品、製品の種類)を操作するほとんどのオプションは、基本的で一般的なCRUD(作成、読み取り、更新、削除)を使用して開発されています。各CRUDは、以下のファイルが含まれています。

  • indexAction()
    開始アクションであり、検索結果のビューページでもあります。
  • searchAction()
    「インデックス」から送信された基準に基づいて、「検索」の結果のページネータを返す
  • newAction()
    新しいデータを表示するためのアクション
  • editAction()
    既存データを編集するためのアクション
  • createAction()
    新しくデータを作成するためののアクション
  • saveAction()
    更新されたデータを保存するためのアクション
  • deleteAction($id)
    既存のデータを削除するためのアクション

CRUD(クラッド)とは、作成(Create)、読み取り(Read)、更新(Update)、削除(Delete)の頭文字を取ってできた用語で、ほとんど全てのコンピュータソフトウエアが持つ永続性の4つの基本機能のことです。

検索フォーム

すべてのCRUDは、検索フォームから始まります。この形式は、任意のフィールドから検索条件を作成するユーザーを許可する、productsテーブルがあり、各フィールドを示しています。"products"テーブルは、 "products_types"テーブルとリレーションを持っています。このケースでは、以前に照会されたテーブル内のフィールドによって、そのレコードでの検索を容易にします。

<?php
/**
 * 開始アクションは、「検索」を示している
 */
public function indexAction()
{
 $this->persistent->searchParams = null;
 $this->view->productTypes = ProductTypes::find();
}

すべての「製品タイプ」は、「ローカル変数」productTypes」として照会し、ビューに渡されます。その後、ビュー(app/views/index.phtml)において、我々はそれらの結果で満たされる「select」タグを示しています。

<div>
 <label for="product_types_id">Product Type</label>
 <?php echo $this->tag->select(array(
 "product_types_id",
 $productTypes,
 "using" => array("id", "name"),
 "useDummy" => true
 )) ?>
</div>

$ productTypesはPhalcon\Tag::selectメソッドを満たすのに必要なデータが含まれていることに注意してください。フォームが送信されると、「searvh」アクションは、ユーザーが入力したデータに基づいて検索を実行するコントローラで実行されます。

検索の実行

searchアクションは二重の振る舞いを持っています。POSTでアクセスする場合は、フォームから送信されたデータに基づいて検索を実行します。GET経由でアクセスした場合は、それはページネータで現在のページへ移動します。このHTTPメソッドのいずれかを区別するためには、Requestコンポーネントを使用して確認します。

<?php
/**
 * Execute the "search" based on the criteria sent from the "index"
 * Returning a paginator for the results
 */
public function searchAction()
{
if ($this->request->isPost()) {
 //create the query conditions
 } else {
 //paginate using the existing conditions
 }
//...
}

Phalcon\Mvc\Model\Criteriaの助けを借りて、インテリジェントフォームから送信されたデータ型と値に基づいて検索条件を作成することができます。

<?php
/**
 * インデックスから送信された基準に基づいて、「検索」を実行
 * 結果のためにページネータを返す
 */
public function searchAction()
{
if ($this->request->isPost()) {
 //クエリの条件を作成
 } else {
 //既存の条件を使用してページ分割
 }
//...
}

この方法は、 ""(空文字列)とは異なるとヌルである値を確認し、検索条件を作成するために考慮に入れ、それらを取ります。

  • フィールドのデータ型がテキストまたは類似の(CHAR、VARCHAR、テキストなど)の場合には、結果をフィルタリングするためにオペレータ」のように「SQLを使用しています。
  • データ·タイプがテキストまたは類似していない場合は、「=」演算子を使用します。

さらに、「Criteria」とは、テーブル内の任意のフィールドに一致しないすべての$ _POST変数を無視します。値が自動的に「バインドされたパラメータ」を使用してエスケープされます。

今、我々は、コントローラのセッション袋で生産さのパラメータを格納します。

<?php
$this->persistent->searchParams = $query->getParams();

セッションバグは、リクエスト間で解決しないコントローラで特別な属性です。アクセスした場合には、この属性がPhalcon\Session\Bagsサービスは、各コントローラで独立していた。

その後、構築されたのparamsに基づいて我々は、クエリを実行します。

<?php
$products = Products::find($parameters);
if (count($products) == 0) {
 $this->flash->notice("The search did not found any products");
 return $this->forward("products/index");
}

searchは少しの製品も返さない場合、再びindexアクションにユーザーを転送します。我々はそれらを簡単にナビゲートするページネータを作成するために、検索された結果が返されたふりをします。

<?php
$paginator = new Phalcon\Paginator\Adapter\Model(array(
 "data" => $products, //Data to paginate
 "limit" => 5, //Rows per page
 "page" => $numberPage //Active page
));
//ページネーターのアクティブページを取得
$page = $paginator->getPaginate();
最後に、ビューに戻ったページを渡します。
<?php
$this->view->setVar("page", $page);

ビュー(app/views/products/search.phtml)では、現在のページに対応する結果を横断:

<?php foreach ($page->items as $product) { ?>
 <tr>
 <td><?= $product->id ?></td>
 <td><?= $product->getProductTypes()->name ?></td>
 <td><?= $product->name ?></td>
 <td><?= $product->price ?></td>
 <td><?= $product->active ?></td>
 <td><?= $this->tag->linkTo("products/edit/" . $product->id, 'Edit') ?></td>
 <td><?= $this->tag->linkTo("products/delete/" . $product->id, 'Delete') ?></td>
 </tr>
<?php } ?>

レコードの登録と更新

今度は、CRUDがレコードを作成し、更新する方法を見てみましょう。「new」と「edit」アクションに送信され、ユーザーが入力したビューからの「create」と「save」アクションによって、データをそれぞれの「creating」と「updating」アクションを実行します。

作成ケースでは、提出されたデータを回復し、新しい「products」インスタンスに割り当てます。

<?php
/**
 * Newアクションでデータのベースプロダクトを作成します
 */
public function createAction()
{
$products = new Products();
$products->id = $this->request->getPost("id", "int");
 $products->product_types_id = $this->request->getPost("product_types_id", "int");
 $products->name = $this->request->getPost("name", "striptags");
 $products->price = $this->request->getPost("price", "double");
 $products->active = $this->request->getPost("active");
//...
}

データは、オブジェクトに割り当てられる前にフィルタリングされます。このフィルタリングは、ORMは、入力データをエスケープし、列タイプに応じて追加のキャスティングを行う、オプションです。

保存するときは、データがモデル製品に実装されたビジネスルールや検証に準拠しているかどうか知っているでしょう。

<?php
/**
 * Creates a product based on the data entered in the "new" action
 */
public function createAction()
{
//...
if (!$products->create()) {
//ストアは、次のメッセージが生成された、失敗した
 foreach ($products->getMessages() as $message) {
 $this->flash->error((string) $message);
 }
 return $this->forward("products/new");
} else {
 $this->flash->success("Product was created successfully");
 return $this->forward("products/index");
 }
}

ここで、製品の更新の場合には、まず、ユーザーに編集されたレコードに現在あるデータを提示する必要があります。

<?php
/**
 * 「編集」の既存製品へのビューを示している
 */
public function editAction($id)
{
//...
$product = Products::findFirstById($id);
$this->tag->setDefault("id", $product->id);
 $this->tag->setDefault("product_types_id", $product->product_types_id);
 $this->tag->setDefault("name", $product->name);
 $this->tag->setDefault("price", $product->price);
 $this->tag->setDefault("active", $product->active);
}

「setDefault」ヘルパーは、同じ名前の属性上のフォームにデフォルト値を設定します。これのおかげで、ユーザーは任意の値を変更し、「save」アクションに通ってデータベースにそれを送ることができます。

<?php
/**
 * 既存データは、「編集」アクションに入力された値により更新します
 */
public function saveAction()
{
//...
//更新するために製品を検索
 $id = $this->request->getPost("id");
 $product = Products::findFirstById($id);
 if (!$product) {
 $this->flash->error("products does not exist " . $id);
 return $this->forward("products/index");
 }
//... オブジェクトに値を代入し、それを保存する
}

タイトルの動的な変更

あなたは一つの選択肢と他の間で参照するとき、私たちが現在作業している場所のタイトルの変更が動的に示すことがわかります。これは、各コントローラの初期化子で達成される。

<?php
class ProductsController extends ControllerBase
{
public function initialize()
 {
 //ドキュメントタイトルをセット
 $this->tag->setTitle('Manage your product types');
 parent::initialize();
 }
//...
}

メソッドの親::初期化する()がとも呼ばれていることを、注意してください、それがタイトルに多くのデータを追加しています。

<?php
class ControllerBase extends Phalcon\Mvc\Controller
{
protected function initialize()
 {
 //タイトルにアプリケーション名を付加
 $this->tag->prependTitle('INVO | ');
 }
//...
}

最後に、タイトルはメインビュー(app/views/ index.phtmlを)で出力されます:

<!DOCTYPE html>
<html>
 <head>
 <?php echo $this->tag->getTitle() ?>
 </head>
 <!-- ... -->
</html>

本日は以上です。

-Phalcon

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.