Hello,
I’m french, I’m starting to learn Cake 4 on Udemy Course
It’s an old course and I don’t have help from the professor, since a lot of change had been made between 4.x to 4.3.
I’m stuck with a loadModel deprecated function. I can’t convert it to fetchtable
class CommandesController extends AppController
{
public function beforeFilter($event)
{
parent::beforeFilter($event);
// 'checkout'et 'confirmation' dans les droits d'accès
$this->Authentication->addUnauthenticatedActions(['checkout', 'confirmation']);
}
public function checkout()
{
// Parcourir les produits du panier
$this->loadModel('Produits');
$listeProduits = [];
if (!empty($this->getRequest()->getSession()->read('panier'))) {
foreach ($this->getRequest()->getSession()->read('panier') as $idProduit => $quantite) {
$listeProduits[] = [
'produit' => $this->Produits->get($idProduit),
'quantite' => $quantite
];
}
}
$commande = $this->Commandes->newEmptyEntity();
// si on envoi le form du checkout on traite la commande
if ($this->getRequest()->is('post')) {
$datas = $this->getRequest()->getData();// je veux le tableau de données envoyées dans le form
$datas['commande_lignes'] = [];
foreach ($this->getRequest()->getSession()->read('panier') as $idProduit => $quantite) {
$datas['commande_lignes'][] = [
'produit_id' => $idProduit,
'quantite' => $quantite
];
}
// on sauvegarde les commandes lignes
$commande = $this->Commandes->patchEntity(
$commande,
$datas,
['associated' => ['CommandeLignes']]
);
// si je sauvegare ma commande je redirige vers la confirmation
if ($this->Commandes->save($commande)) {
// Suppression du panier en session
$this->getRequest()->getSession()->delete('panier');
// Récupération de la commande avec ses lignes et les produits associés
$commande = $this->Commandes->get($commande->id, ['contain' => ['CommandeLignes.Produits']]);
// Envoi de mail
$mailer = new Mailer();
$mailer
->setEmailFormat('html')
->setTo($commande->email)
->setSubject('Confirmation de commande')
->setFrom('contact@smartphone-sore.com')
->setViewVars(compact('commande'))
->viewBuilder()
->setTemplate('confirmation_commande');
$mailer->deliver();
return $this->redirect(['action' => 'confirmation']);
}
}
$this->set(compact('commande', 'listeProduits'));
}
public function confirmation()
{
}
}
I’ve tried to change
$this->loadModel('Produits');
to
$this->fetchTable('Produits')->find()->all();
or
$produits = $this->fetchTable('Produits')->find()->all();
or
$this->getTableLocator()->get(‘Produits’);
I always get
Call to a member function get() on null
Undefined property: CommandesController::$Produits in D:\laragon\www\cakephp\udemy\src\Controller\CommandesController.php on line 43 [CORE\src\Controller\Controller.php, line 329]
$listeProduits = [];
if (!empty($this->getRequest()->getSession()->read('panier'))) {
foreach ($this->getRequest()->getSession()->read('panier') as $idProduit => $quantite) {
$listeProduits[] = [
'produit' => $this->Produits->get($idProduit),
'quantite' => $quantite|
];
}
}
Precisly here
'produit' => $this->Produits->get($idProduit),
also I know if i use
$this->loadModel('Produits');
it work but I want to use 4.3+ new fetchtable for good practise.
Can you help me please ?