CodeIgniter でつくる、あゆ板風何か vol.5

編集機能を実装します。

編集画面には、show ビューからパスワードを入力して遷移できるようにしています。

アクションを作成

  // controllers/items.php
  public function edit() {
    if( TRUE === $this->confirm_pw_edit() ){
      if( $this->input->post('destroy') ){
        $this->destroy( $this->input->post('id') );
      }else{
        $data = array(
          'confirm_pw_edit' => $this->input->post('confirm_pw_edit'),
          'item' => $this->Item_model->find_by_id( $this->input->post('id') ),
          'types' => $this->Type_model->get_dropdown(),
        );
        $this->load->view( 'items/edit', $data );
      }
    }else{
      $this->show( $this->input->post('id') );
    }
  }
  private function confirm_pw_edit(){
    $this->form_validation->set_rules(
      'confirm_pw_edit', '編集パスワード', 'required|alpha_numeric|callback_compare_pw_edit'
    );
    return $this->form_validation->run();
  }
  public function compare_pw_edit( $str ){
    $this->form_validation->set_message('compare_pw_edit', 'Password is not matched.');
    return $this->Item_model->compare_edit_password( $this->input->post('id'), $str );
  }

edit アクションのメソッドとパスワードチェック用のメソッドを実装です。

// views/items/edit.php
<html>
<?php echo $this->view( 'shared/head' ) ?>
<body>

<?php echo $this->view( 'shared/header' ) ?>

<div id="container">
  <?php echo $this->view( 'shared/nav' ) ?>

  <?php echo validation_errors() ?>

  <?php echo form_open( 'items/update' ) ?>
    <?php echo form_hidden( 'id', set_value('id', $item->id) ) ?>
    <?php echo form_hidden( 'confirm_pw_edit', $confirm_pw_edit) ?>

    <p>
    <?php echo form_label( 'お名前', 'provider_name' ) ?>
    <?php echo form_input( 'provider_name', set_value('provider_name', $item->provider_name) ) ?>
    </p>

    <p>
    <?php echo form_label( 'メールアドレス' , 'provider_email' ) ?>
    <?php echo form_input( 'provider_email', set_value('provider_email', $item->provider_email) ) ?>
    </p>

    <p>
    <?php echo form_label( '編集用パスワード', 'pw_edit' ) ?>
    <?php echo form_input( 'pw_edit', set_value('pw_edit', $confirm_pw_edit) ) ?>
    </p>

    <p>
    <?php echo form_label( '提供品名', 'name' ) ?>
    <?php echo form_input( 'name', set_value('name', $item->name) ) ?>
    </p>

    <p>
    <?php echo form_label( '提供品種別', 'type' ) ?>
    <?php echo form_dropdown( 'type', $types ) ?>
    </p>

    <p>
    <?php echo form_label( '提供品URL', 'uri' ) ?>
    </p>
    <p>
    <?php echo form_textarea( 'uri', set_value('uri', $item->uri) ) ?>
    </p>

    <p>
    <?php echo form_label( '強制書き込み要求', 'force_post' ) ?>
    <?php echo form_checkbox( 'force_post', 1, set_value('force_post', $item->force_post) ) ?>全員に書き込みをさせる
    </p>

    <p>
    <?php echo form_label( 'ダウンロード制限数', 'dl_limit' ) ?>
    <?php echo form_input( 'dl_limit', set_value('dl_limit', $item->dl_limit) ) ?>(制限なしの場合は「0」)
    </p>

    <p>
    <?php echo form_submit( 'add', '送信' ) ?>
    </p>
  <?php echo form_close() ?>
</div>

<?php echo $this->view( 'shared/footer' ) ?>

</body>
</html>

次いで、更新用メソッドも実装します。

  // controllers/items.php
  public function update() {
    $this->form_validation->set_rules(
      $this->Item_model->get_rules()
    );
    $data = array(
      'id' => $this->input->post('id'),
      'provider_name' => $this->input->post( 'provider_name' ),
      'provider_email' => $this->input->post( 'provider_email' ),
      'pw_edit' => $this->input->post( 'pw_edit' ),
      'name' => $this->input->post( 'name' ),
      'type' => $this->input->post( 'type' ),
      'uri' => $this->input->post( 'uri' ),
      'force_post' => $this->input->post( 'force_post' ),
      'dl_limit' => $this->input->post( 'dl_limit' ),
    );
    if(
      TRUE === $this->form_validation->run() &&
      TRUE === $this->confirm_pw_edit() &&
      $this->Item_model->update( $data )
    ){
      $this->load->view( 'items/update' );
    }else{
      $this->edit();
    }
  }

完了画面にはメッセージを出すだけです。

<html>
<?php echo $this->view( 'shared/head' ) ?>
<body>

<?php echo $this->view( 'shared/header' ) ?>

<div id="container">
  <?php echo $this->view( 'shared/nav' ) ?>
  <p>編集完了</p>
</div>

<?php echo $this->view( 'shared/footer' ) ?>

</body>
</html>

ほとんど登録と同じです。パスワードのチェックを追加したくらいです。

お礼投稿機能の作成

強制書き込みが有効な投稿では、お礼コメントを書き込まないと提供品URLが表示されない仕様です。

  // controllers/items.php
  public function comment(){
    $this->load->model( 'Thank_model' );
    $this->form_validation->set_rules(
      $this->Thank_model->get_rules()
    );
    $data = array(
      'item_id' => $this->input->post( 'id' ),
      'name' => $this->input->post( 'name' ),
      'email' => $this->input->post( 'email' ),
      'comment' => $this->input->post( 'comment' ),
    );
    if(
      TRUE === $this->form_validation->run() &&
      $this->Thank_model->create( $data )
    ){
      if( ! $this->Item_model->is_closed( $this->input->post( 'id' ) ) ){
        $this->save_got_item( $this->input->post( 'id' ) );
      }
      redirect( "items/show/{$this->input->post( 'id' )}" );
    }else{
      $this->show( $this->input->post( 'id' ) );
    }
  }

Thank モデルも実装します。

// models/thank_model.php
class Thank_model extends CI_Model {
  public function find_all( $item_id ){
    $res = $this->db
      ->select( 'thanks.*' )
      ->join( 'items', 'items.id = thanks.item_id' )
      ->where( 'thanks.item_id', $item_id)
      ->get( 'thanks' );
    return $res->result();
  }
  public function create( $data ){
    $this->db->set( 'created_at', 'NOW()', FALSE );
    $res = $this->db->insert( 'thanks', $data );
    return $res;
  }
  public function get_rules(){
    return array(
     array(
       'field'   => 'name',
       'label'   => 'お名前',
       'rules'   => 'required'
      ),
      array(
       'field'   => 'email',
       'label'   => 'メールアドレス',
       'rules'   => 'required|valid_email'
      ),
      array(
       'field'   => 'comment',
       'label'   => '発言',
       'rules'   => 'required|callback_confirm_comment_rows'
      ),
    );
  }
}

強制書き込みを有効にして登録した提供品はコメントを書き込むことで、提供品URLが表示されるようになりました。

削除機能の作成

削除機能は、編集画面に遷移する際に、パスワードが正しく、削除チェックボックスが有効な場合に動作するように実装していたので、削除だけ行うメソッドを作成します。

// controllers/items.php
private function destroy( $id ) {
  $this->Item_model->destroy_by_id( $id );
  redirect( "items/index" );
}
// models/item_model.php
public function destroy_by_id( $id ){
  $res = $this->db->delete( 'items', array( 'id' => $id ) );
  return $res;
}

指定 ID レコードを削除します。

CloudControl にデプロイ

最後に(作業中に行っていてもかまいませんが) git にコミットして cc にデプロイしましょう。

git add .
git ci -m'complete'
cctrlapp ayuitaclone/default push
cctrlapp ayuitaclone/default deploy

すでにコミットして動作確認は行っているので、ローカルでの変更が反映されるだけですね。

一通りの機能は実装できたかと思います。後半につれて解説がいい加減になって、モチベーションが下がっているのが見え見えですね…w。

しかも cc 上で URL に index.php が挟まるので css のパスが狂ってスタイル効かないんですがめどくなって放置です。酷い記事棚こりゃあ。余裕があったら加筆修正予定。

まだ vip モードや過去ログ、ページネーションなども実装したいところですが、この企画は今回をもって打ち切りです。

次期バージョンのライセンスが変更になるとのことで、商用で使いにくくなるかもしれないというのが理由です。

いままでライセンスに無頓着だった分、きちんと理解しようという良いきっかけにはなったのですが、ci が利用しにくい状況は残念です。

いや、きちんと理解した上でどうかをはっきりと判断出来ればよいのですが、勉強不足&大事なことなのでネットで言われていることを簡単に鵜呑みにしたくないというのも理由です。

という訳で、突き詰めるのはちょっとペンディングしようかと。

シンプルで気軽に使えて、でもパワーのある ci はとても優秀なので、ライセンス問題もありますが、今後にも期待したいところです。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする