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.
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
hat es funktioniert ... aktualisierte meine Frage mit funktionierendem Code. Und danke für die Korrektur von Fehlern. –
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