2016-06-07 4 views
0

사용자 주소를 저장하기 위해 데이터베이스에 user_addresses 테이블이 있습니다. 사용자는 많은 주소를 저장할 수 있기 때문에 그 중 하나만 Primary of Default Address이됩니다. 주소를 Primary Address으로 설정하려면 테이블 인 1 if primary else 0 for non primary 열이 있어야합니다.CakePHP 3 : 형식이없는 데이터베이스에서 단일 필드 업데이트

이제 사용자는 나중에 언제든지 변경할 수있는 기본 주소를 하나만 가질 수 있습니다. 이렇게하려면 default_flag != 1 및 그 옆에있는 버튼을 primary address으로 설정하는 모든 주소를 나열했습니다. 사용자가 버튼을 클릭하면 주소는 기본 및 이전 주 주소로 설정되고 default_flag0으로 설정됩니다.

나는 그렇게하려고 시도했다.

두 개의 키가 updatePrimaryAddress 액션으로 전달되어 postButton을 생성했습니다. 하나는 기본으로 설정할 주소의 ID이고 다음은 이미 기본 주소 인 ID입니다. 버튼의 클릭에 UserAddressesController

<?php 
namespace App\Controller; 

use App\Controller\AppController; 
use Cake\ORM\TableRegistry; 

/** 
* UserAddresses Controller 
* 
* @property \App\Model\Table\UserAddressesTable $UserAddresses 
*/ 
class UserAddressesController extends AppController 
{ 
    public function updatePrimaryAddress($id = null, $primaryAddress = null) 
    { 
     $userAddresses = TableRegistry::get('UserAddresses'); 
     $primaryAddress = $userAddresses->get($primaryAddress); 
     $primaryAddress->default_flag = 0; 
     $userAddresses->save($primaryAddress); 
     $address = $userAddresses->get($id); 
     $address->default_flag = 1; 
     $userAddresses->save($address); 

     return $this->redirect($this->referer()); 
    } 
} 

에서

<?= $this->Form->postButton(__('Choose'), ['controller' => 'UserAddresses', 'action' => 'updatePrimaryAddress', $nonPrimaryAddress->id, $primaryAddressId], ['class' => 'btn btn-success pull-left']) ?> 

, 페이지를 다시로드되지만 데이터베이스에는 데이터가 변경됩니다.

+1

FIrst : 포스트 버튼을 사용하지만 컨트롤러에서 포스트 데이터를 읽지 않습니다. 내 제안 : 게시 버튼 대신 간단한 링크를 사용하십시오. 둘째 : 나는 당신의 논리가 확실하다고 확신하지 못한다. $ address와 $ primaryAddress는 실제로 모두 $ id에서 왔기 때문에 실제로 같은 엔티티이다. 셋째, 사용자가 다른 사용자의 기본 주소를 바꿀 수 있기 때문에 주소를 변경하는 것에 대해 몇 가지 확인을 할 것입니다. – arilia

+0

이 작동 중입니다 ... 작업 코드로 제 질문을 업데이트했습니다. 그리고 실수를 바로 잡아 주셔서 감사합니다. –

+0

아직 이유없이 게시 버튼을 사용하고 있으며 누구든지 URL을 방문하여 다른 사용자의 기본 주소를 쉽게 변경할 수 있으므로 보안 문제가 있습니다. 또한 사용자는 둘 이상의 주소를 기본값으로 설정할 수 있습니다. – arilia

답변

1

작업에서 데이터를 읽지 않는데도 왜 postButton을 사용합니까?

당신은 간단한 링크를 사용할 수 있습니다

$this->Html->link(__('Choose'), [ 
    'controller' => 'UserAddresses', 
    'action' => 'updatePrimaryAddress', 
    $nonPrimaryAddress->id, // you don't need this 
    $primaryAddressId 
], 
['class' => 'btn btn-success pull-left'] 
); 

을하지만 당신도 이미 데이터베이스에이 같은 이전 주소에 대한 정보를 보낼 필요가 없습니다.

public function updatePrimaryAddress($address_id) 
{ 
    // I suppose you have authenticated you user 
    // so let's retrieve his id 

    $user_id = $this->Auth->User('id') 

    // now I set the address as default 
    // but only if it belongs to that user 
    $rows_affected = $this->userAddresses->UpdateAll(
     ['default_flag' => 1], 
     [ 
      'user_id' => $user_id, 
      'id' => $address_id 
     ]); 

    // now I set all the other addresses as not default 
    // but only if I have successfully changed the default address 
    // and just for that one user 
    if($rows_affected > 0) 
    { 
     $this->userAddresses->UpdateAll(
     ['default_flag' => 0], 
     [ 
      'user_id' => $user_id, 
      'id !=' => $address_id 
     ]); 
    } 
    else 
    { 
     $this->Flash->warning("Seems you're trying to switch to a non existing address or to change other's user address"); 
    } 
    return $this->redirect($this->referer()); 
} 
+0

감사합니다. arilia. +1 –

관련 문제