Bonjour,

J'essaie en vain de rajouter un champ "Commentary" pour mes "Customers". Cependant, Il ne sauvegarde pas ce dernier en base de données alors que le reste oui.

Mon "Commentary" est bien présent si je printf/vardump "$this->request->data".

Cependant, lorsque je save le "Customer", aucun commentaire ne s'ajoute dans la base.

Voici quelques parcelles de codes directement en lien avec ceci :

Controller:

if($this->request->is(['post', 'put'])){
$this->SalesCustomers->patchEntity($customer, $this->request->data);
$result = $this->SalesCustomers->save($customer);

Formulaire:

  <div class="form-group">
      <label class="control-label col-md-3"><?= __('Commentaires'); ?></label>
        <div class="col-md-8">
            <?= $this->Form->text('commentary', ['class' => 'form-control']); ?>
              <span class="help-block"><?= __("Indiquez le commentaire du client"); ?> </span>
        </div>
    </div>

Affichage

    <div class="portlet box green-seagreen">
               <div class="portlet-title">
                        <div class="caption">
                              <i class="fa fa-phone font-white-sharp"></i>
                              <span class="profile-usertitle-name"><?= __('Commentaires'); ?></span>
                        </div>
               </div>
               <div class="portlet-body">
                   <?= $customer->commentary; ?>
               </div>
        </div>

Auriez-vous une idée de ce qui bloque l'enregistrement d'un champ spécifique? Ou une chose que j'ai omise ?

Merci d'avance.
DR

13 réponses


Xeta
Réponse acceptée

Hey,

Si tu as rajouté le champ dans ta BDD après avoir déjà créer ta table et après avoir déjà fait des tests, alors vide tout simplement le cache des tables. (src/tmp/cache/models)

ciramor
Auteur

Oui, j'ai déclaré ceci !

 <?= $this->Form->create($customer, ['class' => 'form-horizontal form-row-seperated']); ?>
<?= $this->Form->end(); ?>

Avec bien sûr mes Form Group à l'intérieur. (J'ai précisé dans mon post que les autres champs se sauvegardaient. Mais pas ce dernier, du coup... :] )

Bonjour.
Est-ce que le champ est accessible ?
Peut-être que le format du champ en table et dans le formulaire sont différents entre eux ?
Une règle de validation pour ce champ à t'elle était définie ?
Si tu ne donnes pas plus de précisions nous ne pourrons pas t'aider efficacement.
Au passage, tu aurais pu préciser que cela concerne la V3 de CakePHP, en préfixant par exemple le titre de ton sujet de cette manière : [V3] Mon Save n'enregistre pas mon nouveau Field

as tu ajouté 'commentary' => truedans le tableau $_accessible de ton entité Cutomers.

ciramor
Auteur

Bonjour Lartak & antograssiot,

Je n'ai jamais du manipuler le tableau "$accessible" pour récupérer/ajouter des valeurs. Aucun règle de validation n'est définie pour ce champ. Et oui, cela concerne la version 3 de CakePHP.
Je vais quand même regardé du côté de ce "accessible".

Merci pour vos réponses!
Cdlt,
DR

ciramor
Auteur

J'ai beau ajouter "$customer->accessible('commentary', true);", toujours aucune sauvegarde de ce champ précis en base de données. Je reprécise que le reste des champs de la même entité se sauvegarde.

$customer = $this->SalesCustomers->patchEntity($customer, $this->request->data);
$this->SalesCustomers->save($customer);
ciramor
Auteur

Je ne comprends pas ce que tu essaies de faire Amethyste. Faut-il vraiment créer une variable qui va stocker le "patchage" du customer afin de sauvegarder ce dernier.

oui. Sinon $customer est rempli par la base c'est bien ça ? Il faudrait voir ce qu'il y a avant dans ton controller.

ciramor
Auteur

Malheureusement ta solution n'a pas résolu le problème. Quelquechose me dit qu'on est à côté de la plaque ! Car le reste des données se sauvegarde bien, donc à mon avis, c'est pas sur la fonction d'enregistrement que ça coince. Que ça soit dans mon Entity ou dans les données POST, je retrouve bien mon commentaire.

Merci toutefois de tes lumières!
Cdlt,
DR

ciramor
Auteur

Bonjour zkiller,

J'ai déjà regardé du côté des champs accessibles ou non.
Encore une fois, oui, le champ "commentary" est accessible.

Merci!
Cdlt,
DR

Reprend le code de amethyste, car il faut bien enregistrer l'entité patché et non celle généré, à partir de la debug la valeur de ton customer voir si ton commentary est toujours présent.

$customer = $this->SalesCustomers->patchEntity($customer, $this->request->data);
debug($customer);
$this->SalesCustomers->save($customer);

As tu des Behaviors sur ton model SalesCustomers et peut tu me montrer ton SalesCustomersTable + SalesCustomerEntity histoire de voir si rien ne cloche la dedans. Le champs dans ta base de donnée pour sauvegarder le commentaire est bien nommée : commentary de type LONGTEXT/TEXT ?