Motomichi Works Blog

モトミチワークスブログです。その日学習したことについて書いている日記みたいなものです。

さくらvpsとcakephp2.6.7で開発日記 その0012 記事タグ追加フォームを作る

今日の制作について

ブログのシステムを作るので、記事投稿機能の前に記事に付けるタグ追加フォームを作る。

articletagsテーブルの作成

実行したSQLは以下の通り。

CREATE TABLE `articletags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) NOT NULL,
  `text` varchar(255) NOT NULL,
  `is_deleted` tinyint(1) NOT NULL DEFAULT '0',
  `created` datetime NOT NULL,
  `modified` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

app/Model/Articletag.phpの作成とその記述内容

例として以下の通り。

<?php
App::uses('AppModel', 'Model');

class Articletag extends AppModel{
  public $name = 'Articletag';

  public function alphaNumericDashUnderscore($valid_field) {
    // field名を取得(例えばtext)
    $fieldname = key($valid_field);
    $value = $this->data[$this->name][$fieldname];

    return preg_match('/^(?!.*[;:<>()]).*$/', $value);
  }

  /**
   * 
   * 
   * @return boolean
   */
  public function isUniqueOnThisUser($valid_field){
    // field名を取得(例えばtext)
    $fieldname = key($valid_field);
    // 下記二つの条件に一致する行をjoinしない設定で取得
    //   - $fieldnameフィールドが、フォームから送信された値である
    //   - user_idフィールドが、送信者のusersテーブルのidフィールドと同じである
    $user = $this->find(
      'first',
      array(
        'conditions' => array(
          $fieldname => $this->data[$this->name][$fieldname],
          'user_id' => $this->data[$this->name]['user_id'],
        ),
        'recursive' => -1
      )
    );
    if($user){
      // conditionsに該当する行が、既に存在する場合は、false
      return false;
    }
    return true;
  }



  public $validate = array(
    'text' => array(
      array(
        'rule' => 'notEmpty',
        'message' => '本文を入力してください。'
      ),
      array(
        'rule' => 'isUniqueOnThisUser',
        'message' => 'このタグは既に登録されています。'
      ),
      array(
        'rule' => 'alphaNumericDashUnderscore',
        'message' => 'タグとして使用できない文字が含まれています。'
      )
    )
  );
}

app/Controller/ArticletagsController.php

例として以下の通り。

<?php
App::uses('AppController', 'Controller');
class ArticletagsController extends AppController {
  // Controller名
  public $name = 'Articletags';

  public function index(){
    $this->redirect('post');
  }

  public function post(){

    //viewに渡す配列$datasを初期化
    $datas = array();

    //ログイン中のユーザの情報を取得
    $user = $this->Auth->user();

    //tagsテーブルのデータのうち、このユーザのレコードを取得
    $datas = $this->Articletag->find(
      'all',
      array(
        'conditions' => array(
          'user_id' => $user['id']
        )
      )
    );

    //viewで使う配列をsetする
    $this->set('datas',$datas);

    //postでアクセスしていない場合または、フォーム送信データが無い場合、Articletags/postを表示
    if(!$this->request->is('post') || !$this->request->data){
      $this->render('post');
      return;
    }

    //ここから下はpostでアクセスされていて、フォーム送信データがある場合の処理
    $this->request->data['Articletag']['user_id'] = $user['id'];

    //(Model/Articletag.phpでvalidatesする為にデータをset
    $this->Articletag->set($this->request->data);

    //validates実行
    if (!$this->Articletag->validates()) {
      //validatesに引っかかった場合の処理
      $this->Session->setFlash('入力に不備があります。');
      $this->render('post');
      return;
    }

    //save実行
    if(!$this->Articletag->save($this->request->data)){
      //saveに失敗したときの処理
      $this->Session->setFlash('記事の投稿に失敗しました。恐れ入りますが始めからやり直してください。');
      $this->render('post');
      return;
    }

    //save成功したときの処理
    $this->Session->setFlash('タグを追加しました。');
    $this->redirect('post');

  }//end of post action

  public function delete(){
  }

}

app/View/Articletags/post.ctpの作成

記述内容は省略しますが

さくらvpsとcakephp2.6.7で開発日記 その0001 お問い合わせフォームの作成をする - MOTOMICHI WORKS BLOG

を応用したような感じで作れます。

今回作成したページについて

今回作成したページでユーザが入力するフォームは、textフィールドだけです。

CREATE TABLE のSQLを見て頂ければわかるかと思います。

タグ登録はできるようになったので、次回以降でブログ記事にタグを付けて投稿できるようにしようと思う。

今日の開発日記はここまで。