50の手習い(。_。;)Codeigniter

初心&高齢&鬱3重苦の私がCodeigniterを使っての管理画面作成に奮闘。はまりまくり、ときに思考停止に陥りながら、切り抜けていく軌跡をメモしていきます。

一覧>入力>編集>削除

まず・・これがいいというわけじゃないです、念のため。
作ってみた。これだけなのに結構大変だった。
CMVのM(Model)はなく、とりあえずC(controller内)でやってます。

controllers/tweets.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Tweets extends CI_Controller {
	public function _construct()
	{
		parent::_construct();
$this->load->helper(array('form', 'url')); //それぞれのページにつけてもよいが全部につけるならここにおく } public function index() { print("index:::::"); // TODO: tweetsテーブルの中身を取得する $data['tweets']= $this->db->get('tweets')->result_array(); //'->result_array'とつけると配列返し // TODO: ブラウザに結果を表示する $this->load->view('tweets/index', $data); } // TODO: 書き込み用のテキストフォーム public function input() { print("input:::::"); $this->load->view('tweets/input'); // ブラウザにフォームを表示する } // 編集。ここには最初に編集画面を表示するときと、登録ボタンを押下したときの2パターンでくる public function edit($tweet_id) { //print("edit:::::"); $_not_go = true; //登録ボタンが押されたと設定 if(isset($_POST['id'])){ $data['entry'] = $_POST['entry']; // テキストフォームの値を受け取りましょう $data['id'] = $_POST['id']; // テキストフォームの値を受け取りましょう }else{ $query = $this->db->query('SELECT * FROM tweets WHERE id = ?;', $tweet_id); //13行目のようなarray出力を設定してなかったらObject返しをする $datum['tweet'] = $query->row(0); $data['entry'] = $datum['tweet']->entry; $data['id'] = $datum['tweet']->id; //以下のようにPOSTに値をいれたらバリデーションチェックの対象になる //$_POST['id'] = $datum['tweet']->id; //$_POST['entry'] = $datum['tweet']->entry; $_not_go = false; // まだ最初に表示しただけなので登録ボタンはおされてない } $this->_set_validation(); // 下の関数_set_validation()を利用します if($this->form_validation->run() == TRUE && $_not_go == TRUE) { //登録ボタンを押したあとバリデーションエラーがない // tweetを更新する $this->db->query('UPDATE tweets SET entry = ? WHERE id = ?;', $data); // 結果表示ページにリダイレクト $this->load->helper('url'); // リダイレクトを使う場合はこのライブラリを呼び出します redirect('/tweets/', 'refresh'); }else{ $data['tweet_id']=$tweet_id; $this->load->view('tweets/edit',$data); // 最初の表示か、バリデーションエラー。edit画面に戻る } } // TODO: 書き込みを行う(INSERT) public function create() { //print("create:::::"); //リダイレクトに成功したらこの行はWARNINGが出るので消す $entry = $_POST['entry']; // テキストフォームの値を受け取りましょう $this->_set_validation(); // 下の関数_set_validation()を利用します if($this->form_validation->run() == TRUE) { // TODO: tweetを新規作成する $this->db->query('INSERT INTO tweets (entry) value( ?);', $entry); // tweetを新規作成する $id = $this->db->insert_id(); // AUTO_INCREMENTで自動生成された直前のINSERTのtweetsのidを取得します。 $this->load->helper(array('form', 'url')); redirect('/tweets/', 'refresh'); }else{ $this->load->view('tweets/input'); } } // 書き込みを更新する(UPDATE) // 今回はviews/edit.phpでsubmitしてもactionでeditに戻り、バリデート判定後そこでupdate処理もしたのでここが不要になった /* public function update($tweet_id) { //print("update:::::"); // フォームからパラーメータを受け取る $data['entry'] = $_POST['entry']; // テキストフォームの値を受け取りましょう $data['id'] = $_POST['id']; // テキストフォームの値を受け取りましょう $this->_set_validation(); if($this->form_validation->run() == TRUE) { // tweetを更新する $this->db->query('UPDATE tweets SET entry = ? WHERE id = ?;', $data); // 結果表示ページにリダイレクト $this->load->helper('url'); // リダイレクトを使う場合はこのライブラリを呼び出します redirect('/tweets/', 'refresh'); }else{ $data['tweet_id'] = $tweet_id; $this->load->view('tweets/edit',$data); // バリデーションエラー。edit画面に戻る } } */ // TODO: 書き込みを削除する(DELETE) public function delete($tweet_id) { $this->db->query('DELETE FROM tweets WHERE id = ?;', $tweet_id); // tweetを削除する // TODO: ブラウザに結果を表示する // 一覧にリダイレクトする $this->load->helper(array('form', 'url')); redirect('/tweets/', 'refresh'); } // バリデーションの設定 function _set_validation() { $this->load->library('form_validation'); $this->form_validation->set_rules('entry', 'テキスト', 'required|min_length[8]|max_length[12]|callback_text_check'); } // testという文字がはいっていたらエラー判定 function text_check($str) { if (strstr($str, 'test')) { $this->form_validation->set_message('text_check', 'フィールド %s に、"test"は使えません'); return FALSE; } else { return TRUE; } } function nengappi_check($str) { $_dd = explode('-',$str); // 年がdd[0],月がdd[1],日がdd[2] $flg = checkdate($_dd[1], $_dd[2], $_dd[0]); $flg = checkdate(3, 1, 2001); if (isset($_dd[2])) { return TRUE; } else { $this->form_validation->set_message('text_check', '不正な年月日です'); return FALSE; } } }

viewsに、tweetsフォルダ作成、以下の4つを用意します。

C:\xampp\htdocs\codeigniter\application\views\tweets\index.php

<meta http-equiv="Content-Type" content="text/html; charset="utf-8">
<html>
    <head>
        <title>一言掲示板</title>
    </head>
   <body>
        <h1>一言掲示板</h1>
        <a href="/codeigniter/index.php/tweets/input/">新規登録</a>
        <ul>
           <?php foreach ($tweets as $row) { ?>
                <li>
                <?php echo $row['id']; ?>:<?php echo $row['entry']; ?>
<a href="/codeigniter/index.php/tweets/edit/<?php echo $row['id']; ?>">編集</a>
        <a href="/codeigniter/index.php/tweets/delete/<?php echo $row['id']; ?>">削除</a>
               </li>
            <?php } ?>
        </ul>
    </body>
</html>

同じtweetsフォルダに、最初の登録画面設定 /tweets/input.php

<meta http-equiv="Content-Type" content="text/html; charset="utf-8">
<html>
  <head>
   <title>新規作成</title>
  </head>
  <body>
  <h1>新規作成</h1>
 <?php echo validation_errors(); ?>

    <form action="/codeigniter/index.php/tweets/create/" method="post" accept-charset="utf-8">
      bbs:<input type="text" name="entry" value="<?php echo set_value('entry'); ?>"/><br>

      <input type="submit" value="送信" />
    </form>
  </body>
</html>

次は編集、tweets/edit.php

<meta http-equiv="Content-Type" content="text/html; charset="utf-8">
<html>
    <head>
        <title>編集</title>
    </head>
    <body>
        <h1>編集</h1>
<?php echo validation_errors(); ?>
        <form action="/codeigniter/index.php/tweets/edit/<?php echo $tweet_id; ?>" method="post" accept-charset="utf-8">
            <input type="hidden" name="id" value="<?php echo $id; ?>" />
            <input type="text" name="entry" value="<?php echo $entry; ?>" />
             <input type="submit" value="送信" />
        </form>
    </body>
</html>

ありそうでないものがtweet/create.php,tweet/update.php。ないです。 DBは名前はtweet,項目はidとentry。バリデートチェックは8文字以上12文字以内。testという文字は使えません、という設定。