Jump to content

Problème lien vue => controller


Recommended Posts

Bonjour à tous !

 

Je suis plutôt débutant avec PS et il s'avère que je me retrouve face à un problème que je n'avais encore jamais rencontré (étant développeur java ...) :

 

Je ne comprends pas bien comment fonctionnent les appels de méthodes dans les Controller. Je m'explique : lorsque je clique sur le lien "Fournisseurs" par exemple, l'adresse appelée est :

 

http://localhost/prestashop/index.php?controller=supplier

 

J'ai compris après quelques recherches que cela signifiait que le Controller SupplierController était appelé. Cependant, je ne comprends pas bien quel est le point d'entrée dans ce controller. A la différence de Struts par exemple avec Java, on ne spécifie pas de nom de méthode dans notre url. Je suppose donc qu'il existe un seul et unique point d'entrée dans le controller, qui doit être "init()", ou "initContent()" je pense. Dans ce cas, le test pourrait se faire ici par un paramètre de type "methode=xxx" pour effectuer le bon traitement. Quelqu'un saurait-il m'expliquer un peu mieux (ou un lien vers un super tutoriel!) comment fonctionnent les liens entre la couche de présentation et le controller ?

 

J'ai besoin de comprendre ceci car je souhaite ajouter un bouton sur la page "Nos magasins" afin d'ajouter un nouveau traitement, différent de l'appel récupérant les magasins par rapport aux critères entrés. Or, je ne comprends pas comment je fais le lien :

 

Bouton sur la page "Nos magasins" ===> méthode effectuerNouveauTraitement() dans StoresController.

 

Jusqu'ici, il semble que le clic sur le bouton "Rechercher" fasse appel au Controller "StoresController" en passant par la méthode init() dans tous les cas.

 

J’espère avoir été relativement clair dans mes explications, et espère ne pas avoir posé une question maintes fois posée ! Si il existe des explications quelque part, je suis preneur !

 

Merci d'avance pour votre aide,

Anthony, qui est un petit peu perdu ...

Link to comment
Share on other sites

Si je comprends bien, tu veux dans la page magasin ajouter un bouton sur le controller stores (par exemple la validation d'un formulaire) et le traiter derrière.

 

Alors si tu veux traiter ce bouton dans le controller stores, il faut au clic recharger la page avec ce controller.

 

Ensuite, tu spécifies ta condition dans la fonction iniContent()

 

Par exemple, si dans themes/mon_theme/stores.tpl tu mets le formulaire suivant:

<form action="stores.php" method="post">
<input type="text" name="essai" />
<br /><input type="submit" name="bouton" />
</form>

 

Si dans le controller storescontroller.php, dans la fonction initContent() tu mets:

if(Tools::isSubmit('bouton'))
  {
echo 'essai';
  }

 

Quand tu vas appuyer sur le bouton en rechargeant la page il va s'afficher essai (La méthode Tools::isSubmit vérifie l'existence en GET ou POST du bouton).

 

Bien sûr dans la condition, tu fais le traitement que tu veux.

 

Je sais pas si ça réponds à ta question ?

Edited by franckm1000 (see edit history)
Link to comment
Share on other sites

Salut franckm1000, salut les autres,

 

Alors oui tu as en partie répondu à ma question. En fait je me posais une vraie question d'architecture générale de prestashop, connaitrais-tu un endroit où je pourrais avoir des informations du type :

 

on est sur la vue, clic sur un bouton, appel de "initContent" du controller, ... parce que là je me perds dans les modifications que je dois apporter.

 

Revenons-en au problème, j'ai fait ce que tu as proposé, et je passe effectivement maintenant dans ma méthode initContent après le clic sur mon bouton. Je cherche alors à récupérer les valeurs de checkbox qui étaient présentes dans mon formulaire, avec pour nom "selected".

 

Mon form :

 

<form action="stores.php" method="post" >
<table cellpadding="0" cellspacing="0" border="0" id="stores-table" class="table_block">
 <tr>
  <th>{l s='#'}</th>
  <th>{l s='Store'}</th>
  <th>{l s='Address'}</th>
  <th>{l s='Distance'}</th>
  <th> Produits </th>
  <th> Choisir ce magasin </th>
 </tr> 
</table>
    <input type="submit" class="button" name="selection" value="Valider" style="display: inline;" />
   </form>

 

La colonne "Choisir ce magasin" comprendra pour chacune des lignes une checkbox, dont le nom est le même pour toutes les lignes "selected[]".

 

Ainsi, quand je passe dans ma méthode initcontent de storesController.php, je tente de récupérer les différentes CB cochées par ce morceau de code :

 

if(Tools::isSubmit('selection')) {
 if(isset($_POST['selected'])){
	 file_put_contents('c:\\log.txt', $_POST['selected']);
		 foreach($_POST['selected'] as $chkbx){
		 file_put_contents('c:\\log.txt', 'id select = '.($chkbx), FILE_APPEND);
	 }
 } else {
	 file_put_contents('c:\\log.txt', 'valeur inconnue');
 }

} 

 

Et je passe toujours dans le else, qui me log "valeur inconnue" ... Je ne comprends pas pourquoi puisque l'url appellée par le clic sur mon bouton est bien : "index.php?controller=stores&selected[0]=7&selected[1]=9&selection=Valider"

 

Quelqu'un aurait-il une idée, je pense être passé encore une fois à côté de quelque chose, mais je ne vois pas bien quoi ...

Merci par avance de votre aide.

Link to comment
Share on other sites

Attends, tu utilises du post ou du get ?

l'URL que tu montres passe des paramètres dans l'url donc en get non ?

De toute façon n'utilises pas des post ou get mais la classe Tools

if(Tools::isSubmit('selection')) {
	 if(Tools::isSubmit('selected')){
			 file_put_contents('c:\\log.txt', Tools::getValue('selected'));
					 foreach(Tools::getValue('selected')as $chkbx){
					 file_put_contents('c:\\log.txt', 'id select = '.($chkbx), FILE_APPEND);
			 }
	 } else {
			 file_put_contents('c:\\log.txt', 'valeur inconnue');
	 }

}

Edited by franckm1000 (see edit history)
  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...