Bonjour,

Un nouveau problème ce pose pour moi. La validation d'une association belongsToMany.
J'ai une table "Types": id, name, position. Et une table "Posts", qui belongsToMany "Types".
Dans PostsController j'ai une fonction edit qui récuperer tous les types, et le post à éditer avec les types associés.
Dans mon model Entity/Post j'ai:

public function __construct(array $properties = [], array $options = []) {
        $types = $this->groupTypes($properties['types']); // Groupe les types par Type.position
        unset($properties['types']);

        $properties['attribute'] = $types['attribute'][0] ?? [];
        $properties['type'] = $types['type'][0] ?? [];
        $properties['abilities'] = $types['abilities'] ?? [];

        parent::__construct($properties,$options);
}

Je reconstruit donc mon Post entity en supprimant la liaison avec les types que je dispatche dans plusieur champs.
Le champ attribute, et type ne contiennent que 1 id, alors que abilities contient un tableau ids.
Un debug de $post lors d'un save me retourne donc:

object(App\Model\Entity\Post) {
    'id' => 3,
    'name' => 'Un titre de post',
    'attribute' => [
        'id' => 2,
     ],
     'type' => [
            'id' => 67
     ],
     'abilities' => [
            '_ids => [ 5, 8,19...]
     ]
}

Puis dans PostsTable.php j'ai un beforeRules qui recréé l'entity "types" sous un format:

'types' => [
    '_ids' => [ Les ids de attribute, type et abilities reuni ]
  ]

Dans PostsTable.php j'ai également une methode _buildTypes() qui parcour les ids pour les convertir en Entité Types, et une fonction beforeSave() qui utilise _buildTypes().

Le tout fonctionne parfaitement. Les données sont bien enregistrées...
Mais j'ai besoin de vérifier que le tableau "types._ids" contiennent que des ids déjà existant dans Types avec ExistsIn(), et de vérifier qu'il n'y ai bien qu'un unique id avec une categorie "attribute", et "type", mais zéro ou plusieurs pour "abilities".
Il est très probable que je doive passer mes validation sur "attribute.id", "type.id", et "abilities._ids" ce qui me simplifierai plusieurs choses par la suite, mais aucune des régles que je passe ne semble fonctionner. Aucune erreurs n'est retourné dans $entity->errors().

PS: je précise que dans mes templates de vues j'utilise des inputs radio pour le champ attribute.id, et type.id, et un input checkbox pour abilities._ids. Il n'y a donc pas de champ types._ids (mais rien ne m'empeche de mettre un input hidden).

Quelqu'un a une idée ?
Merci pour votre aide, et d'avoir pris le temps de lire tous mon post pour ceux qui sont toujours là :)

1 réponse


Daniel68
Auteur
Réponse acceptée

Bonjour,

J'ai trouvé la solution hier, je vous fait donc un retour.
Pour faire simple, cake 2.X utilisait Validator() sur les entitées, ce qui n'est pas le cas de cake 3.X qui ne récupére que les données requêtées.
Pour effectuer la validation des entités il fallait donc que je renvois un tableau avec beforeRules de mes entités converties à buildRules qui s'occupe d'executer les fonction de vérification.
Puis j'ai créé un tableau d'erreur qui récupére chacune des erreurs retournées pour types.ids, que j'insére à la fin dans l'entité.
Résultat chaque erreur est bien attribuée à son champ (attribute, type, abilities...) et visible par le formulaire.