Bonjour,
Je rencontre quelques difficultés pour associer mon formulaire avec mes conditions de validation.
public function settings($applicationId = null) {
if(!is_null($applicationId)) {
$applicationsTable = TableRegistry::get('Applications');
$applicationEntity = $applicationsTable->newEntity();
// Si une modification a été réalisé
if($this->request->is('post')) {
$validation = $applicationsTable->newEntity($this->request->data);
// On vérifie que les données remplies par le visiteur respect les conditions de validation
if(empty($validation->errors())) {
$query = $applicationsTable->query();
$query->update()
->set([
'name' => $this->request->data['name'],
'website' => $this->request->data['website'],
'mode' => $this->request->data['mode']
])
->where([
'appkey' => $applicationId,
'user_id' => 1
])
->execute();
// TODO message flash
$this->Flash->set('Les modifications ont été sauvegardées avec succès.', ['element' => 'success']);
}
}
// On récupère l'application dans la base de données
$application = $applicationsTable->find()
->select(['appkey', 'name', 'website', 'mode'])
->where(['appkey' => $applicationId, 'user_id' => 1])
->first();
// Aucune application correspond à cette key.
if(is_null($application)) $this->redirect(['action' => 'index']);
$this->set(compact('application','applicationEntity'));
return;
}
// Erreur aucune KEY d'application transmis
return $this->redirect(['action' => 'index']);
}
/**
* Définition des différentes règles de modification des champs d'un formulaire
* dans la base de données
*/
public function validationDefault(Validator $validator) {
$validator = new Validator();
$validator
// Nom de l'application
->add('name', [
'notBlank' => [
'rule' => 'notBlank',
'message' => __('Le nom de l\'application ne peut pas être vide.'),
'last' => true
],
'minLength' => [
'rule' => ['minLength', 4],
'message' => __('Le nom de l\'application est trop court, il doit faire minimum 4 caractères.'),
'last' => true
],
'maxLength' => [
'rule' => ['maxLength', 50],
'message' => __('Le nom de l\'application est trop long, il doit faire maximum 50 caractères.')
]
])
// Lien du site internet
->add('website', [
'notBlank' => [
'rule' => 'notBlank',
'message' => __('Le lien de votre site internet ne peut pas être vide.'),
'last' => true
],
'valid-url' => [
'rule' => 'url',
'message' => __('Le lien vers votre site est invalide.')
]
]);
return $validator;
}
<div class="column grey">
<?= $this->Flash->render() ?>
<?= $this->Form->create($applicationEntity); ?>
<div class="item clear">
<?= $this->Form->label('name', 'Nom de votre application'); ?>
<small>Le nom de votre application vous permet de facilement la retrouver dans la liste de vos applications. Celle-ci ne sera pas affiché à vos visiteurs.</small>
<?= $this->Form->text('name', ['value' => $application->name]); ?>
</div>
<div class="item clear">
<?= $this->Form->label('website', 'Lien de votre site internet'); ?>
<small>Le nom de domaine sur lequel vous souhaitez installer l'application.</small>
<?= $this->Form->text('website', ['value' => $application->website]); ?>
</div>
<div class="item clear">
<?= $this->Form->label('mode', 'Mode de fonctionnement'); ?>
<small>Par defaut l'application est en mode développement, il est impératif de connaître les caractéristiques des deux modes pour que l'application fonctionne correctement. <a href="#" class="blue">En savoir plus sur les modes de fonctionnement.</a></small>
<select name="mode" value="<?= $application->mode; ?>" required="required">
<option <?php if($application->mode == "Developpement") echo 'selected="selected"'; ?> value="Developpement">Développement</option>
<option <?php if($application->mode == "Production") echo 'selected="selected"'; ?> value="Production">Production</option>
</select>
</div>
<div class="item clear">
<?= $this->Form->button('<i class="fa fa-pencil" aria-hidden="true"></i> Sauvegarder les modifications', ['type' => 'submit', 'class' => 'flat green right']); ?>
</div>
<?= $this->Form->end(); ?>
</div>
En modifiant par exemple ma configuration de mon application sur mon site, lorsque je soumets le formulaire avec le champs "name" vide, le navigateur réagit avec un required="required".
Mais lorsque je soumets au champs "name" un mot de 3 caractères, la modification ne se prend pas en compte mais dans la vue le formulaire ne retourne aucune erreur, alors qu'il est bien associé avec l'entité Applications.
Pourriez-vous m'aider?
Merci d'avance
J'ai trouvé le problème, pour ceux qui rencontreraient le même problème à l'avenir il faut mettre des <?= $this->Form->input(); ?>
et non pas des <?= $this->Form->text(); ?>
Merci de ton aide Lartak !
Bonjour.
Je crois bien que tu n'as pas bien compris comment utiliser le framework CakePHP.
Je te recommande fortement de consulter la documentation et tu ferais mieux pour l'ORM du Framework, de ne pas confondre entre son utilisation avec le Framework et son utilisation sans le Framework.
Bonjour,
Peux-tu m'aiguiller vers une piste? Parce que je ne sais pas vraiment où regarder pour pallier à mon problème,
merci de ton aide
Pour commencer, si je comprend bien, c'est pour l'édition d'un enregistrement existant.
Si c'est bien le cas, il te faut faire comme ceci :
$applicationsTable = TableRegistry::get('Applications');
$applicationEntity = $applicationsTable->get($applicationId);
if($this->request->is('post') {
$applicationsTable->patchEntity($applicationEntity, $this->request->data);
if($applicationsTable->save($applicationEntity)) {
$this->Flash->success('Les modifications ont été sauvegardées avec succès.');
/* Puis tu peux rediriger l'utilisateur où tu veux */
} else {
$this->Flash->error(/* Ton message d'erreur */);
}
}
$this->set(compact('applicationEntity'));
Dans ApplicationsTable, dans la méthode de validation, enlèves $validator = new Validator();
.
Puis pour ton formulaire :
<?= $this->Form->create($applicationEntity); ?>
<div class="item clear">
<?= $this->Form->label('name', 'Nom de votre application'); ?>
<small>Le nom de votre application vous permet de facilement la retrouver dans la liste de vos applications. Celle-ci ne sera pas affiché à vos visiteurs.</small>
<?= $this->Form->text('name'); ?>
</div>
<div class="item clear">
<?= $this->Form->label('website', 'Lien de votre site internet'); ?>
<small>Le nom de domaine sur lequel vous souhaitez installer l'application.</small>
<?= $this->Form->text('website'); ?>
</div>
/* Suite du formulaire */
Il est inutile de définir les valeurs du formulaire, vu que l'entité est passé dans la méthode create
du Helper Form, elles seront remplie automatiquement.
Bonjour,
Ah oui en effet, j'ai vraiment mal saisi le principe de l'ORM.
J'ai en effet mis en place tes suggestions et ça marche correctement
public function settings($applicationId = null) {
if(is_null($applicationId)) {
// TODO Redirection
}
$application = $this->Applications->get($applicationId);
if($this->request->is('put')) {
$this->Applications->patchEntity($application, $this->request->data());
if($this->Applications->save($application)) {
$this->Flash->set('Les modifications ont été réalisées avec succès.', ['element' => 'success']);
} else {
$this->Flash->set('Une erreur est survenue', ['element' => 'error']);
}
}
$this->set(compact('application'));
}
Mais je me retrouve au même endroit, comment est-il possible d'afficher les erreurs qu'on a définit lors des validations dans le message d'erreur ? Normalement ça ce fait automatiquement avec le FormHelper non?
Merci de ton aide !
Mais je me retrouve au même endroit, comment est-il possible d'afficher les erreurs qu'on a définit lors des validations dans le message d'erreur ? Normalement ça ce fait automatiquement avec le FormHelper non?
Pour les messages d'erreurs de validations, si tu respectes les conventions de CakePHP, elles s'afficheront effectivement automatiquement via le Helper Form.
Par contre, tu sembles être récalcitrant à utiliser la méthode set
au lieu d''utiliser les méthodes de type success
et error
du composant Flash.
En effet oui j'ai corriger ça ce matin :p,
Ben dans mon cas, les conventions de cakephp sont respectés pour le formulaire et pourtant sa n'affiche rien du tout..
J'ai trouvé le problème, pour ceux qui rencontreraient le même problème à l'avenir il faut mettre des <?= $this->Form->input(); ?>
et non pas des <?= $this->Form->text(); ?>
À vrai dire, j'avais pensé à ça, mais comme je n'utilise jamais le helper Form avec ces méthodes là, que je considères comme des raccourcis, je n'ai pas voulu t'induire en erreur, je ne t'en ai donc pas parlé, mais tu confirmes ce que je pensais. :)
De rien pour l'aide.