

はじめまして！

CakePHPのedit機能を利用して、プロフィールの編集画面を実装しようとしている者です。

以下のコードを使用すると、  
①編集画面に、既に登録されている名前やメリット等の情報が出てこない。  
②保存をすると、ユーザーid(user_id)が「0」になってしまい、本来のユーザーidが格納されない。

普通のeditコードと違う点は、編集するidデータをAuthコンポーネントから利用している点のみです。

どうすれば正常に機能出来るでしょうか?  
是非ご指導のほどよろしくお願い申し上げます。

[code]

    //ProfilesController.php
       public function edit() {
    
         $user = AuthComponent::user('id');
         $this->Profile->user_id = $user;
    
         if ($this->request->is('get')) {
             $this->request->data = $this->Profile->read(); //①編集画面に、既に登録されている名前やメリット等の情報が出てこない
         } else { 
             if ($this->Profile->save($this->request->data)) {  //②保存をすると、ユーザーid(user_id)が「0」になってしまい、本来のユーザーidが格納されない。
                 $this->Session->setFlash('Success!');
                 $this->redirect(array('action'=>'index'));
             } else {
                 $this->Session->setFlash('Failed!');
             }
         }
       }
    
    //edit.ctp
    <?php
    echo $this->Form->create('Profile', array('action'=>'edit'));
    echo $this->Form->input('name');
    echo $this->Form->input('merit');
    echo $this->Form->input('career');
    echo $this->Form->end('保存');
    ?>
    
[/code]


CC BY-SA 3.0
2015-07-14T13:03:14.940
12353
2016-10-29T06:07:01.730
2015-07-14T13:32:52.663
3516
9722
question
php cakephp
CakePHPのedit機能が上手くいかない！！


はじめのProfileデータの読み込みを下記のようにすべきです。

[code]

    $profile = $this->Profile->find('first', ['Profile.user_id'=>$user_id]);
    
[/code]

そして、(1)を

[code]

    $this->request->data = $profile;
    
[/code]

とし、(2)のときは

[code]

    $this->request->data['Profile']['user_id'] = $profile['Profile']['user_id'];
    
[/code]

とすべきです。

(1)  
Model::read()では遅延読み込みは行われません。  
代わりにfalseが返ってきているのではないでしょうか。

Model::read()は必ず第1引数またはModel::$idが決まっていないと  
何もせずにfalseを返すようになっています。

$this->request->dataがfalseなので、$this->Formで使われていない状態になっています。

(2)  
Model::save()ではModel::$idが先に得られ、  
でも$this->request->data['Profile']['user_id']がないので、  
結果的に該当idの行の'user_id'が0として保存されてしまいます。

サンプルでは'hidden'か何かで$this->Formに'user_id'が分かっていたか、  
上記のようにModel::save()の直前で強制的に代入していたのではないでしょうか？


CC BY-SA 3.0
2015-08-14T12:43:28.627
14425
2015-08-14T12:43:28.627
10919
12353
answer