今日の制作について
ブログのシステムを作るので、記事投稿機能の前に記事に付けるタグ追加フォームを作る。
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を見て頂ければわかるかと思います。
タグ登録はできるようになったので、次回以降でブログ記事にタグを付けて投稿できるようにしようと思う。
今日の開発日記はここまで。