<< <2010年7月       1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

投稿の詳細: [CakePHP]編集画面の作成(#003)

[CakePHP]編集画面の作成(#003)

Permalink2008/06/28 22:43:58 カテゴリ: SNS作成日記

●編集画面を作ります。


入力画面→確認画面→完了画面の流れで作りたいと思います。


モデルでバリデーションの設定

/app/models/user.php

<?php
class User extends AppModel
{
    var $name = 'User';

    // 入力チェック
    function validates($data = array())
    {
        $validate_flg = 0;

        if (empty($data)) {
            $data = $this->data;
        }

        // 独自のチェックはここから
        $name = $data['User']['name'];
        $email = $data['User']['email'];
        $pwd = $data['User']['pwd'];
        $profile = $data['User']['profile'];

        // ニックネームチェック
        if (empty($name)) {
            // 未入力チェック
            $this->invalidate('name');
            $validate_flg = 1;
        } elseif (mb_strlen($name) > 500) {
            // 入力文字数チェック
            $this->invalidate('name_mojisuu');
            $validate_flg = 1;
        }

        // メールアドレスチェック
        if (empty($email)) {
            // 未入力チェック
            $this->invalidate('email');
            $validate_flg = 1;
        } elseif (mb_strlen($email) > 500) {
            // 入力文字数チェック
            $this->invalidate('email_mojisuu');
            $validate_flg = 1;
        } elseif (!preg_match('/\\A(?:^([a-z0-9][a-z0-9_\\-\\.\\+]*)@([a-z0-9][a-z0-9\\.\\-]{0,63}\\.(com|org|net|biz|info|name|net|pro|aero|coop|museum|[a-z]{2,4}))$)\\z/i', $email)) {
            // 正規表現チェック
            $this->invalidate('email_pattern');
            $validate_flg = 1;
        }

        // パスワードチェック
        if (empty($pwd)) {
            // 未入力チェック
            $this->invalidate('pwd');
            $validate_flg = 1;
        } elseif (mb_strlen($pwd) > 10) {
            // 入力文字数チェック
            $this->invalidate('pwd_mojisuu');
            $validate_flg = 1;
        }

        // プロフィールチェック
        if (empty($profile)) {
            // 未入力チェック
            $this->invalidate('profile');
            $validate_flg = 1;
        } elseif (mb_strlen($profile) > 500) {
            // 入力文字数チェック
            $this->invalidate('profile_mojisuu');
            $validate_flg = 1;
        }

        if ($validate_flg == 0) {
            return true;
        } else {
            $this->invalidate('edit');
            return false;
        }
    }
}



コントローラーの記述

/app/controllers/users_comtroller.php

<?php
class UsersController extends AppController
{
    var $name = 'Users';
    var $uses = array('User'); // Userモデルを使用
    var $needAuth = true;      // ログイン必須のフラグ
    var $helpers = array('Javascript', 'Html', 'Form');

    /*
     * 編集入力画面
     */
    function edit()
    {
        // ページタイトルの設定
        $this->pageTitle = 'WebLocalCommunity「LocalSNS」 編集入力画面';

        // セッションから自分の情報を取得
        $auth['User'] = $this->Session->read('auth');
        // ビューに渡す
        $this->set('data', $auth['User']);
        $this->data = $auth;
    }

    /*
     * 編集確認画面
     */
    function conf()
    {
        // ページタイトルの設定
        $this->pageTitle = 'WebLocalCommunity「LocalSNS」 編集確認画面';

        // セッションから自分の情報を取得
        $auth['User'] = $this->Session->read('auth');
        // ビューに渡す
        $this->set('data', $auth['User']);

        // 入力データ整形
        $this->data['User']['name'] = trim(mb_convert_kana($this->data['User']['name'], 's'));
        $this->data['User']['email'] = trim(mb_convert_kana($this->data['User']['email'], 'as'));
        $this->data['User']['pwd'] = trim(mb_convert_kana($this->data['User']['pwd'], 'as'));
        $this->data['User']['profile'] = trim(mb_convert_kana($this->data['User']['profile'], 's'));

        // 入力チェック
        if (!$this->User->validates($this->data)) {
            // バリデーション不通過時は入力画面呼出
            $this->render('edit');
            return;
        }
        // 表示データをビューに渡す
        $this->set('value', $this->data['User']);
    }

    /*
     * 編集処理
     */
    function regist()
    {
        // セッションから自分の情報を取得
        $auth['User'] = $this->Session->read('auth');
        // ビューに渡す
        $this->set('data', $auth['User']);

        // 入力データ整形
        $this->data['User']['name'] = trim(mb_convert_kana($this->data['User']['name'], 's'));
        $this->data['User']['email'] = trim(mb_convert_kana($this->data['User']['email'], 'as'));
        $this->data['User']['pwd'] = trim(mb_convert_kana($this->data['User']['pwd'], 'as'));
        $this->data['User']['profile'] = trim(mb_convert_kana($this->data['User']['profile'], 's'));

        // 戻るボタンクリック時
        if (!empty($this->params['form']['send_back'])) {
            $this->render('edit');
            return;
        }

        // 入力チェック
        if (!$this->User->validates($this->data)) {
            $this->render('edit');
            return;
        }

        // 登録処理
        $data = array();
        // [id]を指定すると[update]
        $data['id'] = $auth['User']['id'];
        $data['name'] = $this->data['User']['name'];
        $data['email'] = $this->data['User']['email'];
        $data['pwd'] = md5($this->data['User']['pwd']);
        $data['profile'] = $this->data['User']['profile'];

        if (!$this->User->save($data, false)) {
            $this->flash("<font color='red'><b>編集できませんでした</b></font>","/users/edit/");
            exit;
        }

        // リロード防止
        $this->redirect("/users/comp/");
        exit;
    }

    /*
     * 編集完了ページ
     */
    function comp()
    {
        // ページタイトルの設定
        $this->pageTitle = 'WebLocalCommunity「LocalSNS」 編集完了画面';

        // セッションから自分の情報を取得
        $auth['User'] = $this->Session->read('auth');
        // ビューに渡す
        $this->set('data', $auth['User']);
        // メッセージをビューに渡す
        $message = "編集作業完了致しました!";
        $message2 = "再度、ログインお願い致します。";
        $this->set('message', $message);
        $this->set('message2', $message2);
    }
}


1)入力画面を作ります(ビュー)

/app/views/users/edit.thtml

<div id="body">
  <h2><?php echo $html->link(h($data['name']), '/users/home/'); ?></h2>
  <div id="contents">
    <div id="menu">
      <ul>
        <li><?php echo $html->link('ホーム', '/users/home/'); ?></li>
        <li><?php echo $html->link('日記一覧', '/users/diary/'); ?></li>
        <li><?php echo $html->link('友達一覧', '/users/friends/'); ?></li>
        <li class="on"><?php echo $html->link('編集', '/users/edit/'); ?></li>
        <li><?php echo $html->link('ログアウト', '/users/logout/'); ?></li>
      </ul>
    </div>
    <div style="clear:both; border-bottom:1px #ffb366 solid;margin-bottom:10px;"></div>
    <div id="edit_data">
      <h3>編集</h3>
      <form action="<?php echo $html->url('/users/conf/'); ?>" method="post">
      <table>
        <tr>
          <th><?php echo $form->labelTag('User/name', 'ニックネーム');?></th>
          <td>
            <?php echo $html->input('User/name', array('size' => '50', 'style' => 'color:#3E3E3E'));?><font color="red" size="2px">&nbsp;(※必須項目)</font>
            <?php echo $html->tagErrorMsg('User/name', '<span class="error">ニックネームを入力してください</span>');?>
            <?php echo $html->tagErrorMsg('User/name_mojisuu', '<span class="error">ニックネームは500文字以内で入力してください</span>');?>
          </td>
        </tr>
        <tr>
          <th><?php echo $form->labelTag('User/email', 'メールアドレス');?></th>
          <td>
            <?php echo $html->input('User/email', array('size' => '50', 'style' => 'color:#3E3E3E'));?><font color="red" size="2px">&nbsp;(※必須項目)</font>
            <?php echo $html->tagErrorMsg('User/email', '<span class="error">メールアドレスを入力してください</span>');?>
            <?php echo $html->tagErrorMsg('User/email_mojisuu', '<span class="error">メールアドレスは500文字以内で入力してください</span>');?>
            <?php echo $html->tagErrorMsg('User/email_pattern', '<span class="error">メールアドレスの入力が正しくありません</span>');?>
          </td>
        </tr>
        <tr>
          <th><?php echo $form->labelTag('User/pwd', 'パスワード');?></th>
          <td>
            <?php echo $html->password('User/pwd', array('size' => '50', 'style' => 'color:#3E3E3E'));?><font color="red" size="2px">&nbsp;(※必須項目)</font>
            <?php echo $html->tagErrorMsg('User/pwd', '<span class="error">パスワードを入力してください</span>');?>
            <?php echo $html->tagErrorMsg('User/pwd_mojisuu', '<span class="error">パスワードは10文字以内で入力してください</span>');?>
          </td>
        </tr>
        <tr>
          <th><?php echo $form->labelTag('User/profile', 'プロフィール');?><br /><font color="red" size="2px">&nbsp;(※必須項目)</font></th>
          <td>
            <?php echo $html->textarea('User/profile', array('cols' => '50', 'rows' => '4', 'style' => 'color:#3E3E3E'));?>
            <?php echo $html->tagErrorMsg('User/profile', '<span class="error">プロフィールを入力してください</span>');?>
            <?php echo $html->tagErrorMsg('User/profile_mojisuu', '<span class="error">プロフィールは500文字以内で入力してください</span>');?>
          </td>
        </tr>
      </table>
      <div style="margin-top:2px;margin-left:120px;margin-bottom:10px;">
        <?php echo $html->submit('  確認画面へ進む  ');?>
          <input name="reset" type="reset" value="  リセット  ">
      </div>
    </div>
  </div>
</div>


▼入力画面はこんな感じ。


2)確認画面を作ります(ビュー)

/app/views/users/conf.thtml

<div id="body">
  <h2><?php echo $html->link(h($data['name']), '/users/home/'); ?></h2>
  <div id="contents">
    <div id="menu">
      <ul>
        <li><?php echo $html->link('ホーム', '/users/home/'); ?></li>
        <li><?php echo $html->link('日記一覧', '/users/diary/'); ?></li>
        <li><?php echo $html->link('友達一覧', '/users/friends/'); ?></li>
        <li class="on"><?php echo $html->link('編集', '/users/edit/'); ?></li>
        <li><?php echo $html->link('ログアウト', '/users/logout/'); ?></li>
      </ul>
    </div>
    <div style="clear:both; border-bottom:1px #ffb366 solid;margin-bottom:10px;"></div>
    <div id="edit_data">
      <h3>編集「確認画面」</h3>
      <form action="<?php echo $html->url('/users/regist/'); ?>" method="post">
      <table>
        <tr>
          <th><?php echo $form->labelTag('User/name', 'ニックネーム');?></th>
          <td>
            <?php echo (empty($value['name'])) ? '&nbsp;' : h($value['name']); ?>
            <?php echo $html->hidden('User/name', array('value' => $value['name'])); ?>
          </td>
        </tr>
        <tr>
          <th><?php echo $form->labelTag('User/email', 'メールアドレス');?></th>
          <td>
            <?php echo (empty($value['email'])) ? '&nbsp;' : h($value['email']); ?>
            <?php echo $html->hidden('User/email', array('value' => $value['email'])); ?>
          </td>
        </tr>
        <tr>
          <th><?php echo $form->labelTag('User/pwd', 'パスワード');?></th>
          <td>
            <?php echo (empty($value['pwd'])) ? '&nbsp;' : h($value['pwd']); ?>
            <?php echo $html->hidden('User/pwd', array('value' => $value['pwd'])); ?>
          </td>
        </tr>
        <tr>
          <th><?php echo $form->labelTag('User/profile', 'プロフィール');?></th>
          <td>
            <?php echo (empty($value['profile'])) ? '&nbsp;' : nl2br(h($value['profile'])); ?>
            <?php echo $html->hidden('User/profile', array('value' => $value['profile'])); ?>
          </td>
        </tr>
      </table>
      <div style="margin-top:2px;margin-left:120px;margin-bottom:10px;">
        <?php echo $html->submit("  編集する  ", array("name" => "send_submit")); ?>
          <?php echo $html->submit(" 戻 る ", array("name" => "send_back")); ?>
      </div>
    </div>
  </div>
</div>


▼確認画面。

※改行を反映させるには「nl2br()」で囲みます。


3)完了画面を作ります(ビュー)

/app/views/users/comp.thtml

<div id="body">
  <h2><?php echo $html->link(h($data['name']), '/users/home/'); ?></h2>
  <div id="contents">
    <div id="menu">
      <ul>
        <li><?php echo $html->link('ホーム', '/users/home/'); ?></li>
        <li><?php echo $html->link('日記一覧', '/users/diary/'); ?></li>
        <li><?php echo $html->link('友達一覧', '/users/friends/'); ?></li>
        <li class="on"><?php echo $html->link('編集', '/users/edit/'); ?></li>
        <li><?php echo $html->link('ログアウト', '/users/logout/'); ?></li>
      </ul>
    </div>
    <div style="clear:both; border-bottom:1px #ffb366 solid;margin-bottom:10px;"></div>
    <div id="edit_data">
      <h3>編集「完了画面」</h3>
        <h1><?php echo $message; ?></h1>
        <p style="margin-left:20px;"><?php echo $html->link($message2, '/users/login/'); ?></p>
    </div>
  </div>
</div>


▼完了画面。


これで、ログインし直すと


編集されています。


画像のアップロードは後々。。。
難しそうだなぁ・・・


▼次の記事
[CakePHP]画像のアップロード機能を作る(#004)


▼前回の記事
[CakePHP]ホーム画面を作る(#002)


▼参考サイト
CakePHP修行! アーカイブ | i d e a * i d e a

この記事へのトラックバック アドレス

コメント, トラックバック:

この投稿への コメント/トラックバック はまだありません...

この投稿にはモデレーション待ちのフィードバックが 1 件あります....

コメントを残す:

頂いたメールアドレスはこのサイト上には表示されません
頂いたURLは表示されます。

許可される XHTML タグ: <p, ul, ol, li, dl, dt, dd, address, blockquote, ins, del, span, bdo, br, em, strong, dfn, code, samp, kdb, var, cite, abbr, acronym, q, sub, sup, tt, i, b, big, small>
(改行が自動で <br /> になります)
(名前、メールアドレス、URLを記憶する Cookie を発行します)
(ユーザがメッセージ・フォームを通してあなたに連絡することを許可します (あなたのメール・アドレスは表示されません))

↑ページ上部へ