Newbie help loadModel to fetchTable

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 ?

Calling $this->Produits->get() is implicitly assuming that $this->Produits is a table object. $this->loadModel('Produits'); will set that, but $this->fetchTable('Produits'); will not. Instead, it just returns the table object. If you assign it, like $this->Produits = $this->fetchTable('Produits');, then it’s set as a property in the controller, and you can use the get call as you previously have.

1 Like

Thank you, my problem is solved, I know I need to take course for php object oriented.

Have a good night (its 19:25 in france)