Bonjour et bonne année à tous,

Je possède une relation belongsToMany classique:
Une table principale, une table de jointure, plus une table "types" qui contient un champ "position" (integer).
Selon ce champ "position" je determine si le type est un type de profondeur 1, 2, 3...

Par la suite dans ma vue, à différent endroit de la page je possède soit des selects, soit des checkboxs (avec multiple à true) soit des boutons radios (donc multiple à false), du style:

// Le format des options est $types[position_value]
<?= $this->Form->radio('types._ids', $types[11]) ?>
<?= $this->Form->input('types._ids', ['type' => 'select', 'multiple' => false, 'options' => $types[12]]) ?>
<?= $this->Form->input('types._ids', ['options' => $types[13], 'multiple' => 'checkbox']) ?>

Si je ne met qu'un champ mon de code marche et le save rempli bien la table de jointure.
Mais dés que le formulaire est "explosé" en plusieurs zone de selection $this->request->data ne retourne que le dernier champ.

Quelqu'un à t'il une idée ?
Merci pour votre aide

4 réponses


Daniel68
Auteur
Réponse acceptée

Bonjour,

Je viens de trouver la solution. Je fais donc un retour si ça peu aider.
Il faut dans l'ordre:

  • Faire un retour dans les getters de $this->_properties['fieldname']
  • Puis dans votre fichier table créer une fonction _buildRules qui aura pour rôle de convertir les champs virtuels en entité qui seront attribués à l'entité "original" (le nom du champ réél) dans un beforeSave.

Bonsoir.
En même temps, si tous tes champs se nomment pareils types._ids, ce n'est pas étonnant qu'un seul ne soit prit en compte.

Daniel68
Auteur

Merci Lartak pour ta réponse.
En effet. Je suppose que je dois donc attribuer un nom de champ differents pour chacun des selects. Puis dans mon controller je regroupe tout dans le request->data. Ou peut-être est il préférable de créer un mutateur dans l'entité de Types ?

Le problème c'est que je veux conserver la validation et le remplissage automatique des formulaires. Y a-t-il un moyen de créer un formulaire non continu ?
Je ne trouve rien dans la doc mis à part ça:

"hiddenField - boolean to indicate if you want the results of radio() to include a hidden input with a value of ‘’. This is useful for creating radio sets that are non-continuous."
Daniel68
Auteur

J'ai reussi à résoudre le problème dans mon controller, cependant je ne trouve pas ça super "propre":

$type[] =  $this->request->data['type'];
$mainSubtype[] = $this->request->data['mainsubtype'];
$subtypes = $this->request->data['subtypes'];
$this->request->data['types']['_ids'] = array_merge($type, $mainSubtype, $subtypes);

Le problème c'est que je devrais réécrire ce code partout. Je suppose qu'il faut donc que je fasse une fonction dans l'entité principale.
D'autant plus que pour le moment je ne peux pas remplir les formulaires automatiquement lors de l'edition (il considére qu'il n'y a aucun type associé, ce qui est normal car il ne connait pas les champs).

Voilà ce que j'ai essayé dans mon entité principale. Il retourne bien les "abilities" mais ne remplit pas le formulaire. De plus il renvoit autant de tableau que de données associées pour une même "position" (plusieurs fois le même tableau donc).

public function _getAbilities() {
      foreach ($this->types as $type) {
            if($type->position == 13) {
                $abilities[] = $type;
            }
        }
        $this->set('abilities', $abilities);
        return $abilities;
  }