THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour à tous,

Je débute sur Thelia, et j'ai besoin de créer un nouveau module pour enregistrer de nouvelles tables dans la BDD sans toucher aux tables existantes.
Donc j'ai généré mon module avec la commande Thelia, ensuite remplis mon config.xml ainsi que mon schema.xml pour lancer la commande de génération de model et pour la création des tables dans la BDD.
J'ai créé mon controller, mon formulaire, mon template. Lorsque je me rends sur ma page avec le formulaire; je remplis mes champs, je clique sur le bouton submit, la page rafraichis mais rien n'est enregistré sur la BDD.
J'ai cherché mais sans succès, je m'en remet à vous !

Offline


La comme ça, sans voir le code va être difficile de t'aider.

Tu as essayer de suivre le code au debugger ? C'est la première chose à faire pour pouvoir comprendre ce qui se passe.

Voir ici : https://www.grafikart.fr/tutoriels/xdeb … kpoint-834


OpenStudio Toulouse

Offline


Merci, je ne savais pas quelle fichier était plus importants qu'un autre donc dans le doute je n'ai pas mis de code dans le poste.
Très bien je vais regarder le lien !

Offline


Bon avec xdebug je ne m'en sort pas, je travaille sur un serveur distant et rien de fonctionne.
En fait la ou j'en suis, j'ai mon template avec mon formulaire correspondant à mes différents champs de ma nouvelle table, lorsque je les remplis et que je submit, rien ne se passe, mais dans la console de mon navigateur dans l'onglet "network" j'ai bien une réponse 200 pour mon post avec comme paramètres ce que j'ai remplis dans mon formulaire.

Voici mon controller :

public function getCreationEvent()
	{
		if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'MonStock', AccessManager::UPDATE)) {
			return $response;
		}

		// Initialize the potential exception
		$ex = null;

		// Create the Form from the request
		$configurationForm = $this->createForm('fournisseurcreation.form');

		try {
			// Check the form against constraints violations
			$form = $this->validateForm($configurationForm, "POST");

			// Get the form field values
			$data = $form->getData();

			FournisseurQuery::setFournisseurName('fournisseur_name', $data['fournisseur_name']);
			FournisseurQuery::setFournisseurAdresse('fournisseur_adresse', $data['fournisseur_adresse']);
			FournisseurQuery::setFournisseurTel('fournisseur_tel', $data['fournisseur_tel']);
			FournisseurQuery::setFournisseurEmail('fournisseur_email', $data['fournisseur_email']);
			FournisseurQuery::setFournisseurContact('fournisseur_contact', $data['fournisseur_contact']);
            FournisseurQuery::setFournisseurNote('fournisseur_note', $data['fournisseur_note']);
            
            // Log configuration modification
			$this->adminLogAppend(
				"payline.configuration.message",
				AccessManager::UPDATE,
				sprintf("Payline instructions configuration updated")
			);

			// Everything is OK.
			return new RedirectResponse(URL::getInstance()->absoluteUrl('/admin/module/Monstock'));

		} catch (FormValidationException $ex) {
			// Form cannot be validated. Create the error message using
			// the BaseAdminController helper method.
			$error_msg = $this->createStandardFormValidationErrorMessage($ex);
		}
		catch (\Exception $ex) {
			// Any other error
			$error_msg = $ex->getMessage();
		}

		// At this point, the form has errors, and should be redisplayed. We don not redirect,
		// just redisplay the same template.
		// Setup the Form error context, to make error information available in the template.
		$this->setupFormErrorContext(
			$this->getTranslator()->trans("Payline instructions configuration", [], Payline::MESSAGE_DOMAIN),
			$error_msg,
			$configurationForm,
			$ex
		);

		// Do not redirect at this point, or the error context will be lost.
		// Just redisplay the current template.
		return $this->render('mon-stock/fournisseur');
	}

Offline


A la place de xdebug je fais des var_dump() die().
Autre petite question, lorsque j'ai généré mes models avec la commande generate:model, est-il normal que j'ai seulement un un fournisseur.php et un fournisseurQuery.php mais qu'ils soient vide ? Il n'y a pas de dossier "Base" ou "Map".

Last edited by DrGonzi (12-11-2019 15:49:42)

Offline


Alors si tu bosses en remote ça marche XDebug, mais la configuration côté serveur est spécifique, et il se peut que tu doivent configurer ton routeur local pour qu'il accepte les connexions entrantes. Je te laisse regarder ça.

Ton contrôleur à l'air OK. Par contre, assure toi que tu affiches bien le message d'erreur éventuel dans ton template mon-stock/fournisseur.html

{form name="..."}
...
    {if $form_error}<div class="alert alert-danger">{$form_error_message}</div>{/if}
...
{/form}

est-il normal que j'ai seulement un un fournisseur.php et un fournisseurQuery.php mais qu'ils soient vide ? Il n'y a pas de dossier "Base" ou "Map".

Avec Thelia 2.4, oui. Les classes concrètes sont générées dans le cache (cache/propel)


OpenStudio Toulouse

Offline


Merci de la réponse. Lorsque je fais des var_dumps die dans ma fonction, je vois mes var_dump mais pas quand je les place dans le try après la ligne "$form = $this->validateForm($configurationForm, "POST");" je ne les vois plus.


Je poste aussi mon Form et ma Route si ça peut aider.

le template :

{form name="fournisseurcreation.form"}
                            <form action="/admin/module/MonStock/fournisseur/create" method="post" {form_enctype form=$form}>

                            {form_field field='fournisseur_name'}
                            <div class="form-group {if $error}has-error{/if}">
                                <label for="{$label_attr.for}" class="control-label">{$label} : </label>

                                <div class="from-group">
                                    <input type="text" id="{$label_attr.for}" required="required" name="{$name}"
                                        class="form-control" value="{$value}" title="{$label}">
                                </div>
                            </div>
                            {/form_field}

                            {form_field field='fournisseur_adresse'}
                            <div class="form-group {if $error}has-error{/if}">
                                <label for="{$label_attr.for}" class="control-label">{$label} : </label>

                                <div class="from-group">
                                    <input type="text" id="{$label_attr.for}" required="required" name="{$name}"
                                        class="form-control" value="{$value}" title="{$label}">
                                </div>
                            </div>
                            {/form_field}

                            {form_field field='fournisseur_tel'}
                            <div class="form-group {if $error}has-error{/if}">
                                <label for="{$label_attr.for}" class="control-label">{$label} : </label>

                                <div class="from-group">
                                    <input type="text" id="{$label_attr.for}" required="required" name="{$name}"
                                        class="form-control" value="{$value}" title="{$label}">
                                </div>
                            </div>
                            {/form_field}

                            {form_field field='fournisseur_email'}
                            <div class="form-group {if $error}has-error{/if}">
                                <label for="{$label_attr.for}" class="control-label">{$label} : </label>

                                <div class="from-group">
                                    <input type="text" id="{$label_attr.for}" required="required" name="{$name}"
                                        class="form-control" value="{$value}" title="{$label}">
                                </div>
                            </div>
                            {/form_field}

                            {form_field field='fournisseur_contact'}
                            <div class="form-group {if $error}has-error{/if}">
                                <label for="{$label_attr.for}" class="control-label">{$label} : </label>

                                <div class="from-group">
                                    <input type="text" id="{$label_attr.for}" required="required" name="{$name}"
                                        class="form-control" value="{$value}" title="{$label}">
                                </div>
                            </div>
                            {/form_field}

                            {form_field field='fournisseur_note'}
                            <div class="form-group {if $error}has-error{/if}">
                                <label for="{$label_attr.for}" class="control-label">{$label} : </label>

                                <div class="from-group">
                                    <input type="text" id="{$label_attr.for}" required="required" name="{$name}"
                                        class="form-control" value="{$value}" title="{$label}">
                                </div>
                            </div>
                            {/form_field}

                            {if $form_error}<div class="alert alert-danger">{$form_error_message}</div>{/if}

                            <button type="submit">GO !</button>
                            </form>
                            {/form}

la route :

  <route id="fournisseur.creation" path="/admin/module/MonStock/fournisseur/create" methods="post">
        <default key="_controller">MonStock\Controller\Admin\FournisseurController::getCreationEvent</default>       
    </route>

le Form :

<?php

namespace MonStock\Form;

use Thelia\Core\Translation\Translator;
use Thelia\Form\BaseForm;
use Symfony\Component\Validator\Constraints;
use Symfony\Component\Validator\Constraints\NotBlank;
use MonStock\Model\Fournisseur;
use MonStock\Model\FournisseurQuery;

class FournisseurCreationForm extends BaseForm{

    protected function buildForm(){
        $this->formBuilder
            ->add("fournisseur_name", "text", array(
                "constraints" => array(new NotBlank()),
                "label" => Translator::getInstance()->trans('Nom du fournisseur'),
                "label_attr" => array("for" => "fournisseur_name"),
            ))
            ->add("fournisseur_adresse", "text", array(
                "label" => Translator::getInstance()->trans('Adresse du fournisseur'),
                "label_attr" => array("for" => "fournisseur_adresse"),
            ))
            ->add("fournisseur_tel", "text", array(
                "label" => Translator::getInstance()->trans('Téléphone du fournisseur'),
                "label_attr" => array("for" => "fournisseur_tel"),
            ))
            ->add("fournisseur_email", "text", array(
                "label" => Translator::getInstance()->trans('Email du fournisseur'),
                "label_attr" => array("for" => "fournisseur_email"),
            ))
            ->add("fournisseur_contact", "text", array(
                "label" => Translator::getInstance()->trans('Contact du fournisseur'),
                "label_attr" => array("for" => "fournisseur_contact"),
            ))
            ->add("fournisseur_note", "text", array(
                "label" => Translator::getInstance()->trans('Note pour le fournisseur'),
                "label_attr" => array("for" => "fournisseur_note"),
            ))
        ;
    }
}

Offline


Lol, j'avais pas vu ça :

FournisseurQuery::setFournisseurName('fournisseur_name', $data['fournisseur_name']);
            FournisseurQuery::setFournisseurAdresse('fournisseur_adresse', $data['fournisseur_adresse']);
            FournisseurQuery::setFournisseurTel('fournisseur_tel', $data['fournisseur_tel']);
            FournisseurQuery::setFournisseurEmail('fournisseur_email', $data['fournisseur_email']);
            FournisseurQuery::setFournisseurContact('fournisseur_contact', $data['fournisseur_contact']);
            FournisseurQuery::setFournisseurNote('fournisseur_note', $data['fournisseur_note']);

Ce ne marche pas comme ça, Propel. La doc Propel : http://propelorm.org/documentation

Pour créer une nouvelle entrée dans la table, tu dois faire :

$fournisseur = new Fournisseur();
$fournisseur
   ->setFournisseurAdresse($data['fournisseur_adresse'])
   ->setFournisseurTel($data['fournisseur_tel'])
   ...
   ->save();

Par contre ça ne me semble pas normal que tout ça soit dans la méthode getCreationEvent().


OpenStudio Toulouse

Offline


Ah d'accord merci je vais regarder la doc de propel.
Pour getCreationEvent c'est moi qui l'ai appelé comme ça...

Et je crois que la ligne "$form = $this->validateForm($configurationForm, "POST");" génère une erreur car le var_dump ne s'affiche plus après cette ligne mais il se raffiche dans le catch...


Nouveau controller :

<?php

namespace MonStock\Controller\Admin;

use Thelia\Controller\Admin\BaseAdminController;
use Thelia\Core\Security\AccessManager;
use Thelia\Core\Security\Resource\AdminResources;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Thelia\Form\Exception\FormValidationException;
use Thelia\Tools\URL;
use MonStock\Form\FournisseurCreationForm;
use MonStock\MonStock;

class FournisseurController extends BaseAdminController{

    public function fournisseurAction(){

        return $this->render(
			'mon-stock/fournisseur'
		);

    }


    public function getCreationEvent()
	{
		
		if (null !== $response = $this->checkAuth(AdminResources::MODULE, 'MonStock', AccessManager::UPDATE)) {
			return $response;
		}

		// Initialize the potential exception
		$ex = null;

		// Create the Form from the request
		$configurationForm = $this->createForm('fournisseurcreation.form');
		
		try {
			
			// Check the form against constraints violations
			$form = $this->validateForm($configurationForm, "POST");
			
			// Get the form field values
			$data = $form->getData();

			$fournisseur = new Fournisseur();
			$fournisseur
			->setFournisseurName($data['fournisseur_name'])
			->setFournisseurAdresse($data['fournisseur_adresse'])
			->setFournisseurTel($data['fournisseur_tel'])
			->setFournisseurEmail($data['fournisseur_email'])
			->setFournisseurContact($data['fournisseur_contact'])
			->setFournisseurNote($data['fournisseur_note'])
			->save();

		} catch (FormValidationException $ex) {
			// Form cannot be validated. Create the error message using
			// the BaseAdminController helper method.
			$error_msg = $this->createStandardFormValidationErrorMessage($ex);
		}
		catch (\Exception $ex) {
			// Any other error
			$error_msg = $ex->getMessage();
		}


		// Do not redirect at this point, or the error context will be lost.
		// Just redisplay the current template.
		return $this->render('mon-stock/fournisseur');
	}

}

Last edited by DrGonzi (12-11-2019 16:51:19)

Offline


Dommage que tu aies enlevé le $this->setupFormErrorContext( ...), tu perds toute possibilité d'afficher le message d'erreur en front.

Regarde donc le message généré par l'exception, ça te donnera une idée de ce qui se passe...


OpenStudio Toulouse

Offline


Mon var_dump m'indique "Merci de vérifier votre saisie: Donnée manquante ou non valide : The CSRF token is invalid. Please try to resubmit the form."

Offline


j'avais oublié le "{form_hidden_fields form=$form}" dans mon template.

Maintenant je peux faire un var_dump de $data après la ligne "$data = $form->getData();" et je récupère bien mes données : "array(9) { ["fournisseur_name"]=> string(1) "a" ["fournisseur_adresse"]=> string(1) "a" ["fournisseur_tel"]=> string(1) "a" ["fournisseur_email"]=> string(1) "a" ["fournisseur_contact"]=> string(1) "a" ["fournisseur_note"]=> string(1) "a" ["success_url"]=> NULL ["error_url"]=> NULL ["error_message"]=> NULL } "

Mais si je fais un var_dump après le "new Fournisseur()", j'ai une erreur 500.

Offline

Offline


J'ai une page blanche et dans la console quand je regarde sur "réseau" ma requête POST est en 500.

Je pense que c'est au niveau de propel qu'il y a une erreur, peut-être qu'il est mal instancié ?

Last edited by DrGonzi (13-11-2019 14:52:06)

Offline


On dirait que tu ne travailles pas en mode développement : http://forum.thelia.net/viewtopic.php?id=11787

Ça te permet de voir en direct la cause des erreurs, avec la stack trace et tout et tout.


OpenStudio Toulouse

Offline


Pourtant si je suis bien en mode développement mais lorsque je validait mon formulaire le index_dev.php s'effaçait. Je l'ai mis en dur pour voir et j'avais simplement une erreur de namespace dans mon controller, un "r" oublié dans "fouRnisseur"...

Du coup tout fonctionne maintenant !

Merci pour ton aide !!!

Je passe à la création de ma loop maintenant !

Last edited by DrGonzi (13-11-2019 16:02:42)