ステータス:非推奨

この記事では、サポートされなくなったバージョンのUbuntuについて説明します。 現在Ubuntu12.04を実行しているサーバーを運用している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

理由: Ubuntu 12.04は2017年4月28日に保守終了(EOL)に達し、セキュリティパッチまたはアップデートを受信しなくなりました。 このガイドはもう維持されていません。

代わりに参照してください:
このガイドは参考として役立つかもしれませんが、他のUbuntuリリースでは機能しない可能性があります。 可能な場合は、使用しているUbuntuのバージョン用に作成されたガイドを使用することを強くお勧めします。 ページ上部の検索機能を使用して、より新しいバージョンを見つけることができます。

CakePHPについて

CakePHP は、Model-View-Controller(MVC)プログラミングパラダイムを中心に構築された強力で堅牢なPHPフレームワークです。 これを使用してアプリケーションを構築するための柔軟な方法に加えて、ファイルとデータベーステーブル名を整理するための基本構造を提供し、すべての一貫性と論理性を維持します。

前回のチュートリアルでは、データベースに対していくつかの基本的なCRUD(作成、読み取り、更新、削除)操作を実行する小さなアプリケーションの作成を開始しました。 これまで、モデル( Post )を使用してデータ(投稿)を読み取り、コントローラー( PostsController )を使用してデータを要求し、情報を表示するためにいくつかのビューを作成しました。 このチュートリアルでは、他のCRUD操作、つまり作成、更新、削除を実装してアプリケーションを完成させます。 このために、主に既存のコントローラー内で作業し、作成したモデルを使用してデータにアクセスします。

このチュートリアルを実行する前に、まだ行っていない場合は、前の2つのチュートリアルを実行してください。

データの追加

表の投稿を読み取る方法を確認した後、新しい投稿を追加する方法を見てみましょう。 Controllerメソッドを作成する前に、まずControllerに必要なすべてのコンポーネントが含まれていることを確認しましょう。 前回のチュートリアルでは、Formヘルパーのみを含めました。

public $helpers = array('Form');

配列に追加して、HTMLヘルパーとSessionヘルパーも追加しましょう。

public $helpers = array('Form', 'Html', 'Session');

さらに、Sessionコンポーネントを含めましょう。 編集した行の下に、次を追加します。

public $components = array('Session');

次に、新しい投稿を追加するためのフォームを格納するビューを作成しましょう。 これは、先ほど含めたフォームヘルパーを使用して、作業をはるかに簡単にします。 したがって、 app / View / Posts/フォルダーにadd.ctpというファイルを作成します。 内部に、次のコードを貼り付けます。

<h1>Add Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save');
?>

ご覧のとおり、ビューから直接フォームヘルパーにアクセスでき、フォームをすばやく描画できます。 ここで重要なことの1つは、 create()メソッドにパラメーターが渡されない場合、フォームがそれ自体に送信されると想定することです(このビューをロードするControllerメソッド-すぐに作成します)。 ご覧のとおり、 input()メソッドは非常に自明ですが、1つの優れた点は、テーブル内のデータと一致するフォーム要素を生成することです。 それでは、ファイルを保存し、PostsControllerにメソッドを作成してこれを処理しましょう。

PostsControllerで以前に作成したview()メソッドのすぐ下に次のコードを追加します。

public function add() {
        if ($this->request->is('post')) {
            $this->Post->create();
            $post_data = $this->request->data;
            if ($this->Post->save($post_data)) {
                $this->Session->setFlash(__('New post saved successfully to the database'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Unable to save the post to the database.'));
        }
}

この関数(対応するビューと呼ばれる)は、最初に送信されたタイプPOSTの要求があるかどうかをチェックし、ある場合はPostモデルを使用して新しいデータをテーブルに挿入しようとします。 成功すると、flashdataが現在のユーザーセッションに設定され、 index()メソッド(すべての投稿を表示するメソッド)にリダイレクトされ、肯定的な確認メッセージも表示されます。 そうでない場合は、代わりにエラーメッセージが設定されます。 www.example.com/project/posts/addでテストできます。 フォームに入力すると、新しい投稿が保存され、投稿のインデックスページにリダイレクトされ、確認メッセージが表示されます。

PostsController はデフォルトのCakePHPコントローラーを拡張して作成されたため、リクエストオブジェクトなどの多くの機能にアクセスできます。 これを使用して、どのような種類のHTTPリクエストが行われているかを確認し、POSTデータにもアクセスできます。 さらに、 redirect()メソッドにアクセスできるため、ユーザーを別のメソッドまたはコントローラーにすばやくリダイレクトできます。

データの検証

情報なしで投稿を送信したくないと確信しているので、 Post モデルにクイックルールを設定して、新しい投稿を送信するときにユーザーがタイトルを設定するように強制します。 Post モデル内に、次のプロパティを追加します。

public $validate = array('title' => array('rule' => 'notEmpty'));

これにより、タイトルフィールドを空にすることはできません。 モデルファイルを保存し、タイトルフィールドに入力せずに新しい投稿を追加してみてください。 タイトルフィールドに入力する必要がありますが、必ずしも本文フィールドに入力する必要はありません。

HTMLヘルパー?

HTMLヘルパーPostsControllerに含めた理由は、CakePHPの方法でページにリンクを配置する方法を示すためです。 それでは、 app / View / Posts/フォルダーにあるindex.ctpビューを開き、H1タグの後に次のコードを追加しましょう。

<?php echo $this->Html->link(
    'Add Post',
    array('controller' => 'posts', 'action' => 'add')
); ?>

これにより、 PostsControlleradd()メソッドに移動するアンカー AddPostとのリンクが出力されます。 必要に応じて、ファイルをさらに編集し、同じ手法を使用して、このページの投稿タイトルをそれぞれのページへのリンクに変えることもできます。 したがって、代わりに:

<?php echo $post['Post']['title']; ?>

あなたが置くことができます:

<?php echo $this->Html->link($post['Post']['title'], array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>

HTMLヘルパーの詳細については、ここを参照してください。

データの編集

新しい投稿を作成する方法を見てきたので、既存の投稿を編集する方法を見てみましょう。 add.ctp ビューを配置した場所の横にビューを再度作成し、edit.ctpと呼びます。 内部に、以下を貼り付けます。

<h1>Edit Post</h1>
<?php
    echo $this->Form->create('Post');
    echo $this->Form->input('title');
    echo $this->Form->input('body', array('rows' => '3'));
    echo $this->Form->input('id', array('type' => 'hidden'));
    echo $this->Form->end('Save');
?>

edit.ctpビューとadd.ctpビューの主な違いは、前者では、CakePHPがあなたがしたいことを認識できるように、非表示の入力として投稿のIDも含めたことです。編集し、新しい投稿を追加しないでください。 ファイルを保存して終了します。 次に、PostsControllerで edit()メソッドを作成します。

public function edit($id = null) {
    if (!$id) {
        throw new NotFoundException(__('Post is not valid!'));
    }

    $post = $this->Post->findById($id);
    if (!$post) {
        throw new NotFoundException(__('Post is not valid!'));
    }

    if ($this->request->is('post') || $this->request->is('put')) {
        $this->Post->id = $id;
        $post_data = $this->request->data;
        if ($this->Post->save($post_data)) {
            $this->Session->setFlash(__('Your post has been updated.'));
            return $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash(__('Unable to update your post.'));
    }

    if (!$this->request->data) {
        $this->request->data = $post;
    }
}

このアクションでは、最初に、IDの有効性と、それがデータベースに存在するかどうかを確認することにより、ユーザーが有効な投稿にアクセスしようとしていることを確認します。 add()メソッドと同様に、リクエストがPOSTであるかどうかを確認し、POSTである場合は、データベース内の投稿を更新しようとします。 リクエストオブジェクトにデータが存在しない場合は、データベースに存在するデータがフォーム要素に入力されます。 そして、 add()アクションの場合と同様に、ユーザーを index()メソッドにリダイレクトし、確認メッセージを表示します。 さあ、試してみてください。

index.ctp ビューを変更し、個々の投稿を編集するためのリンクを追加することもできます。 Createdフィールドの後に次のコードを追加します。

<?php echo $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id'])); ?>

データの削除

最後に行う必要があるのは、ユーザーが投稿を削除できるようにすることです。 それでは、PostsControllerに次のアクションを追加しましょう。

public function delete($id) {
   if ($this->request->is('post')) {
    if ($this->Post->delete($id)) {
      $this->Session->setFlash(__('The post number %s has been deleted.', h($id)));
      return $this->redirect(array('action' => 'index'));
    }
  }
}

リクエストがGETタイプの場合、このメソッドは最初に例外をスローします。 次に、上記のアクションのように Post モデルを使用しますが、今回はリクエストで指定されたIDを持つテーブルの行を削除します。 最後に、ユーザーにメッセージを設定し、メッセージが表示される index()メソッドにリダイレクトします。

このdelete()メソッドをトリガーするには、 index.ctp ビューを編集し、 postLink()関数を使用して、POSTを送信する小さなフォームを出力します。テーブル行の削除を要求します。 javascriptを使用して確認アラートボックスを追加し、投稿を削除します。 編集リンクの後のindex.ctpファイル内に、以下を追加できます。

<?php echo $this->Form->postLink(
                'Delete',
                array('action' => 'delete', $post['Post']['id']),
                array('confirm' => 'Are you sure you want to delete this post?'));
?>

ファイルを保存して試してみてください。 これで、投稿も削除できるようになります。

少し要約すると、クラスは次のようになります。

PostsController.php-コントローラー

class PostsController extends AppController {
  public $helpers = array('Form', 'Html', 'Session');
  public $components = array('Session');
    
  public function index() {
      $this->set('posts', $this->Post->find('all'));
  }
  
  public function view($id = null) {
        $post = $this->Post->findById($id);
        $this->set('post', $post);
  }
  
  public function add() {
        if ($this->request->is('post')) {
            $this->Post->create();
            $post_data = $this->request->data;
            if ($this->Post->save($post_data)) {
                $this->Session->setFlash(__('New post saved successfully to the database'));
                return $this->redirect(array('action' => 'index'));
            }
            $this->Session->setFlash(__('Unable to save the post to the database.'));
        }
  }

  public function edit($id = null) {
    if (!$id) {
        throw new NotFoundException(__('Post is not valid!'));
    }

    $post = $this->Post->findById($id);
    if (!$post) {
        throw new NotFoundException(__('Post is not valid!'));
    }

    if ($this->request->is('post') || $this->request->is('put')) {
        $this->Post->id = $id;
        $post_data = $this->request->data;
        if ($this->Post->save($post_data)) {
            $this->Session->setFlash(__('Your post has been updated.'));
            return $this->redirect(array('action' => 'index'));
        }
        $this->Session->setFlash(__('Unable to update your post.'));
    }

    if (!$this->request->data) {
        $this->request->data = $post;
    }
  }

 public function delete($id) {
   if ($this->request->is('post')) {
    if ($this->Post->delete($id)) {
      $this->Session->setFlash(__('The post number %s has been deleted.', h($id)));
      return $this->redirect(array('action' => 'index'));
    }
   }
  }
}

Post.php-モデル

class Post extends AppModel {
  public $validate = array('title' => array('rule' => 'notEmpty'));
}

結論

この短いチュートリアルシリーズでは、CakePHPを使用してデータに対してCRUD操作を実行するのがいかに簡単であるかを見てきました。 情報の読み取りと表示の方法、情報の編集と削除の方法、新しい情報の追加の方法を学びました。 さらに、学ぶべき重要な教訓は、CakePHPによって設定された規則に従うことは、あなたの生活をはるかに楽にするので強く推奨されるということです。 作成したこの小さなアプリケーションを使用して、より大きなものを作成することをお勧めします。 これを行うには、CakePHPコンポーネントとヘルパーに関する詳細情報を読む必要があります。

投稿者: Danny