| layout | default |
|---|---|
| title | リストを編集しよう |
-
本章では以下を行います。
-
FrontControllerProviderに編集用のルーティングを設定します。
-
ルーティングでURLパラメーターを取得します。
-
コントローラーに編集用のメソッドを追記します。
-
フォームビルダーで既存フォーム項目の削除・追加を行います。
-
フォームビルダーの追加時の設定項目でhtmlタグのオプションを設定します。
-
エンティティマネージャーで登録・編集処理が共通で行われている事を確認します。
-
編集用の画面を作成します。
-
リダイレクトを利用します。
-
-
前章では、レポジトリを用いた、検索・登録について学びました。
-
本章では、ここまで学んだ事を応用して、更新処理を実装します。
- まずはFrontControllerProviderにルーティングを定義します。
-
FrontControllerServiceProviderを開きます。
- /src/Eccube/ControllerProvider/FrontControllerProvider.php
-
以下を追記します。
- FrontControllerProvider.php
-
上記の説明を行います。
-
まず「Tutorial」を検索します。
-
以前追記した、チュートリアル登録画面用のルーティングが記述されています。
-
その下に編集画面用のルーティングを追記します。
-
今回のルーティングには、コントローラー・メソッド名のほか、URLパラメーター名 + URLパラメーターバリデートが追記されています。
-
以下で詳細を説明します。
-
$c->match('/[Twigで設定したルーティング名]/{id}', '[コントローラー名]::[メソッド名]')->bind('[ルーティング名(twigのurlで呼び出す値)]')->assert('[URLパラメーターキー名称]', '[バリデーション(正規表現)]');
- matchメソッドの第二引数、bindメソッドのルーティング名は、以前と同じです。
- matchメソッドの第一引数の最後に**{id}**と記述しています。
- これは、URLパラメーターのキーの設定で、ここでView側で付与した値を受け取る事を示しています。
- ルーティング定義したコントローラーメソッド内で、今回の例であれば、$idでURLパラメーター値を利用します。
- 今回新たにassertメソッドが記述されています。
- assertメソッドは、URLパラメーターに対して、バリデーション設定を行います。
- 今回は正規表現で、0以外で始まる正の整数のみ受け付ける様にしています。
-
crud_top.twigに編集ボタンを追加し、先程定義したルーティング名を設定します。
-
以下のファイルを確認します。
- /src/Eccube/Resource/template/default/Tutorial/crud_top.twig
-
ファイルを開いて以下の様に修正します。
- crud_top.twig
- 上記説明を行います。
-
テーブルの見出しに編集の項目を追記します。
- 本例ではテーブルタグを用いず、divタグにtdクラスを追加する事で、テーブル形式の表示を行なっています。
-
テーブル項目の最後に編集ボタンを追記します。
- 「a」タグを用い、CSSでボタン形状に成形しています。
-
先程追加した**「a」タグのリンク部URLですが、以前利用したTwig関数のurl()**でを用いています。
-
今回のルーティング先で編集処理を行うため、レコードの特定が行えるIDを、URLパラメーターとして付与しています。
-
構文は以下の通りです。
url([ル-ティング名, ['キー(ルーティングで定義した内容)' : [実際のID]])-
以前は第一引数のみの記述でしたが、今回は第二引数に、URLパラメーターである対象レコードのIDを渡しています。
-
IDはキーと値を「:(コロン)」で区切り、第二引数全体をブラケットで囲みます。
-
- CrudController.phpに編集処理用メソッドを定義します。
- CrudController.phpを開きます。
-
/src/Eccube/Controller/CrudController.php
- indexメソッドの下に以下を追記します。
- CrudController.php
-
-
上記を説明します。
-
メソッド名をルーティングで設定した「edit」とします。
-
引数は「$app・$request」に加え、「id」を追記します。
- 遷移元のViewからURLパラメーターとして、渡ってきた値です。
- 今回の編集対象レコードの、idを保持しています。
-
処理冒頭で、渡されたidを条件に編集対象レコードを取得しています。
- レポジトリのメソッドは後で追記、説明します。
-
取得値のエラーハンドリングとして、レコードが取得出来なかった際は、不正なアクセス及びエラーとみなし、登録画面へ強制遷移します。
-
取得レコード、フォームタイプをもとに、フォームを生成します。
- レコード情報がフォーム項目に紐付き、値が保持された状態となります。
-
登録時とボタンの文言を変えたいために、以下メソッドで、登録ボタンをフォームビルダーから削除します。
[フォームビルダー]->remove([削除対象項目name属性]); -
次にaddメソッドを用い、編集登録用のボタンと、戻るボタンを追加しています。
- addメソッドで以下の新しい、オプションが追加されています。
'attr' => array( [htmlオプション名] => [設定値], 'onClick' => 'javascript:history.back();' )- 上記のattrオプションでhtmlのオプション属性を設定します。
- htmlのオプションであれば、「id・class」など自由に設定可能です。
- 今回は戻るボタンのイベントとして、「onClick」属性を指定しています。
- ※通常はJavaScriptのイベントをフォームビルダーで記述しません、あくまで参考としてください。
-
フォームビルダーで項目の削除・追加を終えた後で、フォームオブジェクトを生成しています。
- フォームタイプで定義した内容を、この様に動的に変更する事も可能です。
- サブミット値・入力値判定後の成功処理内で、登録処理を行なっていましたが、今回の更新でも処理は同一です。
- これは前述した通り、エンティティマネージャーが今回のフォームに紐付いたエンティティが更新対象と自動で判断したからです。
- エンティティマネージャーが、登録か更新か判断する基準は、「プライマリキー」に値が設定されているかどうかで判断されます。
-
レンダリングでは、更新処理用のtwigをレンダリングしています。
-
レンダリングメソッドの第二引数に、取得レコードを渡しています 。
-
更新処理成功時に、登録画面に画面遷移しています。
- 画面遷移をさせるためには、以下メソッドを利用します。
return $app->redirect($app->url([ルーティング名]));- $appからredirectメソッドの引数にurlを指定すると、指定URLに遷移が行われます。
- redirectメソッドの前には必ずreturnを記述してください。
- もう一つのメソッドとしてurlメソッドが利用されています。
- これは、Twig内で利用してたものと同様で、ルーティング名を引数として渡すと、該当URLが返却されます。
-
- コントローラーメソッドのレンダリングで呼び出しているTwigを作成します。
-
crud_top.twigをコピー・リネームします
-
/src/Eccube/Resource/template/default/Tutorial/crud_top.twig
- リネームしたcrud_edit.twigに以下を追記しています。
- crud_edit.twig
- 上記を説明します。
-
基本的な内容は、crud_top.twigと同様です。
- 違いは、一覧表示がない事です。
-
Formのaction属性値は編集画面に遷移する様に設定しています。
- urlメソッドを利用していますが、第二引数にはURLパラメーターを設定しています。
- URLパラメーターで値を渡すため、コントローラーから受け取ったレコードのオブジェクトのidを書き出しています。
- idをもとにdtb_crudからレコードを取得するメソッドを追記します。
- CrudRepository.phpを開きます。
-
/src/Eccube/Repository/CrudRepository.php
- getAllDataSortByUpdateDateメソッドの下に以下の様にメソッドを追記します。
- CrudRepository.php
-
- 上記説明を行います。
-
メソッドの引数として取得レコードのidを定義します。
- ここで受け取るidはURLパラメーターから渡されてきた編集対象レコードのidです
- idのデフォルト値として、nullを指定しています。
- nullの指定はエラーハンドリングのために設定しています。
-
引数のデフォルト値を利用して、エラーハンドリングを行なっています。
- コントローラー側で判断するため、falseを返却するだけとしています。
-
次にクエリビルダーでSQLを構築しています。
- 今回新たに記述されている内容として、以下があります
->where('dc.id = :Id') ->setParameter('Id', $id);- 上記は通常のSQLのwhere構文と同義です。
- カラムに対して条件判定を行なっています。
- 今回は、dtb_crudのカラムidに対して、引数のidが同じレコードを取得する条件を記述しています。
- またクエリビルダーの条件指定では、プリペアドステートメントが用いられており、以下の用に記述します。
->where('[エイリアス + カラム名] = :[任意の名称]') ->setParameter('[where句で設定した任意の名称]', [条件とする値(変数でも可)]);- もうひとつ新たな記述があります。
return $qb->getQuery()->getSingleResult();- 上記ですが、以前の章で説明した通りDQLでの結果取得には複数のメソッドが用意されています。
- 今回のメソッド「getSingleResult()」では、レコード取得時は、**該当レコードオブジェクトのみ(オブジェクト配列ではない)**が返却されます。
- またレコードが見つからない際は、NoResultExceptionがスローされます。
- そのために try ~ catch を用い、レコードがない際は、falseを返却する様にしています。
- 最後に確認のためにブラウザにアクセスしてみましょう。
-
ブラウザのURLに「http://[ドメイン + インストールディレクトリ]/tutorial/crud」を入力してください。
-
登録画面の一覧リストに「編集ボタン」が表示されています。
- レコードは必ず一件以上ある状態で確認してください。
-
初期画面で表示されている、「編集ボタン」をクリックしてください。
-
編集画面が表示され、フォームに値が保持されています。
-
フォーム項目値を適当に編集してみてください。
-
「編集を確定するボタン」をクリックすると、登録画面に画面遷移します。
-
該当レコードに編集内容が反映されています。
- ルーティングでURLパラメーターを渡す方法を説明しました。
- ルーティングでURLパラメーターのバリデーションを行う方法を説明しました。
- Twigのurl関数の第二引数の設定でURLパラメーター付きリンクが作成出来る事を説明しました。
- 編集処理用のコントローラーメソッドを追記しました。
- 編集処理用コントローラーメソッドの引数で、URLパラメーターを取得する方法を説明しました。
- ridirectの方法を説明しました。
- コントローラーでもurl関数が利用出来る事を説明しました。
- テーブルから取得したデータモデルオブジェクトをフォームビルダーと紐付ける方法を説明しました。
- フォームビルダーで動的にフォーム項目を変更できる事を説明しました。
- フォーム項目のオプション値にattrでhtmlオプション属性を設定出来る事を説明しました。
- レポジトリの登録処理にプライマリーキーがセットされたデーターモデルオブジェクトを渡すだけで自動で更新処理が行われる事を説明しました。
- 編集画面用のTwigを作成しました。
- レポジトリに追加したメソッドでwhere句を用いたDQLの構築方法を説明しました。
- DQLの結果取得にgetSingleResultを用いました。
- getSingleResultでは、データーモデルオブジェクト単体が返却される事を説明しました。
- getSingleResultでは、該当レコードが存在しない場合NoResultExceptionがスローされる事を説明しました。
- クエリビルダーのwhere句ではプリアドステートメントが用いられていることを説明しました。


