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à :)