【Laminas】削除機能を追加する!

Laminas

どーも!marusukeです!

今回は、前回(【Laminas】edit.phtmlを作る!)の続きで、このAlbumモジュールに特定のid, artist, titleのデータを削除する機能付けます!

deleteActionメソッドの概要

deleteActionメソッドの概要を簡単に説明します。

Get通信とPost通信で、画面遷移とデータの受け渡し、メソッドの実行を振り分けます。

  • albumページ→deleteページ(Get通信:albumページ内のdeleteボタンを押した時)
    • 画面遷移はalbumページ→deleteページの時、Get通信で遷移し、idを取得し、そのidと一致するartistとtitleを表示する。(1回目のdeleteAction実行時)
  • deleteページ→deleteページ→albumページ(Post通信:deleteページ内のYesボタンを押した時)
    • deleteページで、削除を実行する”Yes”ボタンを押すと、Post通信でdeleteページに遷移し、AlbumTableインスタンスのdeleteAlbumメソッドを実行し、albumページに遷移する。(2回目のdeleteAction実行時)

deleteActionメソッドを作る

まずはAlbumController内のdeleteActionメソッド内に以下を追記しましょう 。

ファイルの場所は、module/Album/src/Controller/AlbumController.phpです。

 public function deleteAction()
    {
       //1
        $id = (int) $this->params()->fromRoute('id', 0);
        if (!$id) {
            return $this->redirect()->toRoute('album');
        }

       //2
        $request = $this->getRequest();
        if ($request->isPost()) {
            $del = $request->getPost('del', 'No');

            if ($del == 'Yes') {
                $id = (int) $request->getPost('id');
                $this->table->deleteAlbum($id);
            }

            return $this->redirect()->toRoute('album');
        }

        //3
        return [
            'id'    => $id,
            'album' => $this->table->getAlbum($id),
        ];
    }

各ブロックごとに説明をしていきます。

  • //1について
$id = (int) $this->params()->fromRoute('id', 0);
        if (!$id) {
            return $this->redirect()->toRoute('album');
        }

以前の記事(【Laminas】editActionを追加する!)でも紹介しましたが、

$id = (int) $this->params()->fromRoute(‘id’, 0)のparams()はルートからパラメーターを取得できるコントローラープラングインです。これを用いてルートのidを取得します。

if (!$id) {…}で$idの値がない場合は、albumページに遷移します。

この部分はGet通信とPost通信どちらの場合でも使われるコードになります。

  • //2ついて
$request = $this->getRequest();
        if ($request->isPost()) {
            $del = $request->getPost('del', 'No');

            if ($del == 'Yes') {
                $id = (int) $request->getPost('id');
                $this->table->deleteAlbum($id);
            }

            return $this->redirect()->toRoute('album');
        }

この部分ではPost通信時の処理を記述しています。なので、2回目以降のdeleteAction実行です。

$request = $this->getRequest();の部分でHttpリクエストの内容を取得し、

if ($request->isPost()) {…}ということで、Post通信時はif文の処理を行なっていきます。

$del = $request->getPost(‘del’, ‘No’);の部分は、Post通信のパラメーター(viewscriptのinputタグのname=”del” を後で作ります。)取得しています。今回は、第一引数に’del’、第二引数に’No’があり、第一引数のdelパラメーターに第二引数にNoという値を入れデフォルト値を設定しています。

  • //3について
return [
            'id'    => $id,
            'album' => $this->table->getAlbum($id),
];

この部分はGet通信時の処理になります。albumページ内のdeleteボタンを押し、deleteページに遷移した時に押下したdeleteボタンのaritist, titleをviewscriptに渡します。

delete.phtmlを作る

ファイルの場所は、module/Album/view/album/album/delete.phtmlです。

<?php

$title = 'Delete album';
$url   = $this->url('album', ['action' => 'delete', 'id' => $id]);

$this->headTitle($title);
?>
<h1><?= $this->escapeHtml($title) ?></h1>

<p>
    Are you sure that you want to delete
    "<?= $this->escapeHtml($album->title) ?>" by
    "<?= $this->escapeHtml($album->artist) ?>"?
</p>

<form action="<?= $url ?>" method="post">
<div class="form-group">
    <input type="hidden" name="id" value="<?= (int) $album->id ?>" />
    <input type="submit" class="btn btn-danger" name="del" value="Yes" />
    <input type="submit" class="btn btn-success" name="del" value="No" />
</div>
</form>

詳しい説明は、以前の記事(【Laminas】add.phtmlを作る!)でしているので割愛します。

formタグのactionは、album/delete/{albumページで押下したdeleteボタンのid}となっているので、delete.phtml内のsubmitボタンを押した時は、もう一度deleteActionメソッドが呼び出されます。

これで、削除機能を実装することができました!

ホームページにAlbumページが表示されるようにする!

最後に、http://localhost:8080/でApplicationモジュールのホームページでなく、Albumページが開くようにします。

module/Application/config/module.config.phpのApplicationのルートを変更します。

開いてみると、

'home' => [
    'type' => \Laminas\Router\Http\Literal::class,
    'options' => [
        'route'    => '/',
        'defaults' => [
            'controller' => Controller\IndexController::class,
            'action'     => 'index',
        ],
    ],
],

となっています。

以下のように書き換えます。

'home' => [
    'type' => \Laminas\Router\Http\Literal::class,
    'options' => [
        'route'    => '/',
        'defaults' => [
            'controller' => AlbumController::class, // <-- ここを書き換えます。
            'action'     => 'index',
        ],
    ],
],

これでAlbumページが開くようになりました!

ここまでで、Albumモジュールのチュートリアルが終わりました!

お疲れ様でした!

次からは、さらに深掘りしたBlogモジュールチュートリアルを進めていきたいと思います!

では!

コメント

タイトルとURLをコピーしました