2016-06-07 16 views
0

Ich habe eine user_addresses Tabelle in der Datenbank, um die Adresse des Benutzers zu speichern. Da der Benutzer viele Adressen speichern kann, wird nur eine davon Primary of Default Address sein. Um eine Adresse als Primary Address zu setzen, hat Tabelle eine Spalte default_flag, die 1 if primary else 0 for non primary ist.CakePHP 3: Einzelfeld in Datenbank ohne Formular aktualisieren

Jetzt kann ein Benutzer nur eine primäre Adresse haben, die er später jederzeit ändern kann. Um dies zu tun, habe ich alle Adressen aufgelistet, wo default_flag != 1 und eine Schaltfläche daneben, um es als primary address festlegen. Wenn der Benutzer auf die Schaltfläche klickt, wird die Adresse auf "Primär" gesetzt und die vorherige Primäradresse default_flag wird auf 0 gesetzt.

Ich habe versucht, dies zu tun.

Ich habe eine postButton mit zwei Schlüsseln erstellt, die an updatePrimaryAddress Aktion weitergeben, man ist die ID der Adresse, die als primary festgelegt wird, und als nächstes ist die ID der Adresse, die bereits primär ist.

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

In 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()); 
    } 
} 

Auf Schaltfläche anklickt, wird die Seite neu geladen, aber keine Datenänderungen in der Datenbank.

+1

Zuerst: Sie verwenden Post-Taste, aber Sie lesen nie Post-Daten in Ihrem Controller. Mein Vorschlag: Verwenden Sie einen einfachen Link anstelle eines Post-Buttons. Zweitens: Ich bin mir nicht sicher, ob deine Logik korrekt ist: $ address und $ primaryAddress sind eigentlich die gleiche Entität, da beide von $ id kommen. Drittens würde ich etwas über den Benutzer überprüfen, der die Adresse ändert, da jetzt jeder Benutzer die Standardadresse ändern kann – arilia

+0

hat es funktioniert ... aktualisierte meine Frage mit funktionierendem Code. Und danke für die Korrektur von Fehlern. –

+0

immer noch Sie Post-Taste ohne Grund verwenden, und Sie haben auch Sicherheitsprobleme, wie jeder einfach die Standardadresse eines anderen Benutzers nur durch den Besuch einer URL ändern könnte. Außerdem kann ein Benutzer mehr als eine Adresse als Standard festlegen. – arilia

Antwort

1

Warum postButton verwenden, wenn Sie nicht einmal die Daten in Ihrer Aktion lesen?

können Sie einen einfachen Link:

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

Aber Sie haben nicht einmal die Informationen über die alte Adresse senden müssen, wie Sie es bereits in Ihrer Datenbank haben.

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

Danke, arilia. +1 –