Jump to content

[Prestashop] Formulaire admin


Recommended Posts

Salut,

 

J'ai un souci au niveau du développement d'un module. J'ai déjà soumis le problème sur les forums d'openclassroom.

 

=>

 

J'ai encore un souci avec Prestashop (que je découvre). Je suis en train de créer un module qui affichera des news sur la page d'accueil du site. J'ai créé deux tables en BD : ps_news et ps_news_lang. Pour l'instant j'ai réussi à afficher les news sur le panneau d'admin :

 

news1.jpg

 

 

Maintenant je veux m'attaquer à la gestion des news : modifier / supprimer celles qui existent et en ajouter. J'ai pas mal cherché mais aucun tuto n'est vraiment clair et précis à ce sujet. Je ne sais pas où mettre le code des formulaires, je ne sais pas non plus comment lier les actions. Pour l'instant si je clique sur ma news, ça me donne cette erreur :

 

 

Fatal error: Class 'News' not found in C:\wamp\www\prestashop\classes\controller\AdminController.php on line 1418

 

 

Pareil si je clique sur le bouton + pour ajouter une news. En gros, je voudrais pouvoir lier les actions (cliquer sur la news, éditer, supprimer, ajouter) à mon module, créer les formulaires et gérer le tout en BD. Pour l'affichage en front, je verrai après (et j'imagine que ce sera beaucoup plus facile). J'utilise Prestashop 1.0.6.11 (la dernière version).

 

Merci d'avance :)

 

Krap.

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

Je ne m'en sors pas. Je commence à tout mélanger...

 

Voilà la structure de mon module :

 

 

1426164148-news.jpg

 

Pour l'instant je n'ai encore rien dans les tpl. Vu que je ne sais pas comment inclure de formulaire (je ne sais même pas si je dois faire un tpl par formulaire), j'essaie d'afficher les news. Même ça ça ne fonctionne pas...

 

D'une part j'ai ce code dans news.php :

 

models/news.php

<?php
	class News extends ObjectModel
	{
	    public $id_news;
	    public $date;
	    public $active;
	
	    public static $definition = array(
	        'table' => 'news',
	        'primary' => 'id_news',
	        'multilang' => false,
	        'fields' => array(
	            'id_news' => array(
	                'type' => ObjectModel :: TYPE_INT
	            ),
	            'date' => array(
	                'type' => ObjectModel :: TYPE_DATE,
	                'required' => true
	            ),
	            'active' => array(
	                'type' => ObjectModel :: TYPE_BOOL,
	                'required' => true
	            )
	        )
	    );
	    
		public static function findAll()
		{
			/*
		    $sql = 'select * from ' . _DB_PREFIX_ . 'news where active = 1';
		    */
			
			$sql = new DbQuery();
			$sql->select('*');
			$sql->from(_DB_PREFIX_ . 'news', 'N');
			$sql->innerJoin(_DB_PREFIX_ . 'news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$id_lang);
			$sql->where('N.active = 1');
		    
		    if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql))
		    {
		        return ObjectModel :: hydrateCollection(__CLASS__, $rows);
		    }
		    return array();
		}
	}

Et ça fonctionne très bien pour afficher les news dans la partie admin :

 

controllers/admin/adminnews.php

<?php
	require_once '/../../models/news_lang.php';
	
	class AdminNewsController extends ModuleAdminController {
	
	    public function __construct()
	    {
	    	$this->bootstrap = true;
	        $this->table 	= 'news';
	        $this->className 	= 'News';
	        $this->name = 'dashhomenews';
	        $this->tab = 'dashhomenews';
	        $this->lang = true;
	        
	        parent :: __construct();
	        
	        //$news = new News;
	        //print(NewsLang::findAllNewsDisplayFront());
	        $this->initList();
	        $this->renderForm();
	    }
	    
	    private function initList()
	    {
	    	$this->fields_list = array();
	    	
	    	$this->fields_list['id_news'] = array(
			        'title' 	=> 'ID',
	    			'align'		=> 'left',
	        		'width'		=> 25,
            		'type'		=> 'integer'
			);
			$this->fields_list['titre'] = array(
			        'title' 	=> $this->l('Title'),
	    			'align'		=> 'left',
	        		'width'		=> 150,
            		'type'		=> 'string'
			);
			$this->fields_list['resume'] = array(
			        'title' 	=> $this->l('Summary'),
	    			'align'		=> 'left',
	        		'width'		=> 200,
            		'type'		=> 'string'
			);
			$this->fields_list['texte'] = array(
			        'title' 	=> $this->l('Text'),
	    			'align'		=> 'left',
	        		'width'		=> 200,
            		'type'		=> 'string'
			);
			$this->fields_list['date'] = array(
			        'title' 	=> $this->l('Date'),
			    	'align'		=> 'left',
			    	'width'		=> 'auto',
            		'type'		=> 'date',
					'orderby'	=> 'true'
			);
			$this->fields_list['active'] = array(
			        'title' 	=> $this->l('Displayed'),
			    	'align'		=> 'left',
			    	'width'		=> 'auto',
			        'active' 	=> 'status'
			);
			
			$this->addRowAction('edit');
        	$this->addRowAction('delete');
	    }
	    
		public function renderForm()
		{
		    $fields_form = array(
		        'form' => array(
		            'legend' => array(
		                'title' => $this->l('Settings'),
		                'icon' => 'icon-cogs'
		            ),
		            'input' => array(
		                array(
		                    'type' => 'switch',
		                    'label' => $this->l('Ajax cart'),
		                    'name' => 'titre',
		                    'desc' => $this->l('Title of the news')
		                )
		            ),
		        'submit' => array(
		            'title' => $this->l('Save'),
		            'class' => 'btn btn-default pull-right')
		        ),
		    );
		     
		    $helper = new HelperForm();
		    $helper->show_toolbar = false;
		    $helper->table = $this->table;
		    $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
		    $helper->default_form_language = $lang->id;
		    $helper->allow_employee_form_lang =
		        Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
		    $this->fields_form = array();
		 
		    $helper->identifier = $this->identifier;
		    $helper->submit_action = 'submitBlockCart';
		    $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
		       .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
		    $helper->token = Tools::getAdminTokenLite('AdminModules');
		    $helper->tpl_vars = array(
		        'languages' => $this->context->controller->getLanguages(),
		        'id_language' => $this->context->language->id
		    );
		 
		    return $helper->generateForm(array($fields_form));
		}
	}

(la fonction renderForm ne fait rien pour l'instant, j'ai lu que cette fonction servait à afficher des formulaires)

 

 

Par contre le même code dans news_lang ne fonctionne pas...

 

models/news_lang.php

<?php
	class NewsLang extends ObjectModel
	{
	
	    public $id_news;
	    public $id_lang;
	    public $titre;
	    public $resume;
	    public $texte;
	
	    public static $definition = array(
	        'table' => 'news_lang',
	        'primary' => 'id_news',
	        'multilang' => true,
	        'fields' => array(
	            'id_news' => array(
	                'type' => ObjectModel :: TYPE_INT
	            ),
	            'id_lang' => array(
	                'type' => ObjectModel :: TYPE_INT
	            ),
	            'titre' => array(
	                'type' => ObjectModel :: TYPE_STRING,
	                'required' => true
	            ),
	            'resume' => array(
	                'type' => ObjectModel :: TYPE_STRING,
	                'required' => true
	            ),
	            'texte' => array(
	                'type' => ObjectModel :: TYPE_STRING,
	                'required' => true
	            ),
	            'date' => array(
	                'type' => ObjectModel :: TYPE_DATE,
	                'required' => true
	            ),
	            'active' => array(
	                'type' => ObjectModel :: TYPE_BOOL,
	                'required' => true
	            )
	        )
	    );
	    
		public static function findAll()
		{
			/*
		    $sql = 'select * from ' . _DB_PREFIX_ . 'news N LEFT JOIN ' . _DB_PREFIX_ . 'news_lang NL
		    where N.id_news=NL.id_news AND id_lang="$id_lang"';
		    */
			
			$sql = new DbQuery();
			$sql->select('*');
			$sql->from(_DB_PREFIX_ . 'news', 'N');
			$sql->innerJoin(_DB_PREFIX_ . 'news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$id_lang);
			$sql->where('N.active = 1');
		    
		    if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql))
		    {
		        return ObjectModel :: hydrateCollection(__CLASS__, $rows);
		    }
		    return array();
		}
		
		public static function findAllNewsDisplayFront()
		{
			$sql = new DbQuery();
			$sql->select('*');
			$sql->from(_DB_PREFIX_ . 'news', 'N');
			$sql->innerJoin(_DB_PREFIX_ . 'news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$id_lang);
			$sql->where('N.active = 1');
			$sql->limit(3);
		    
		    if ($rows = Db :: getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS($sql))
		    {
		        return ObjectModel :: hydrateCollection(__CLASS__, $rows);
		    }
		    return array();
		}
	}

Là il ne connait plus $id_lang et pour une raison inconnue, _DB_PREFIX_ est doublé :

 

1426164505-erreurs.jpg

 

 

Quant à la structure de mes tables :

 

ps_news :

 

id_news (int primary)

date (date)

active (boolean)

 

ps_news_lang

 

id_news (int)

id_lang (int)

titre (text)

resume (text)

texte (text)

 

 

En théorie je suis censé afficher un certain nombre de news sur la page d'accueil. Et ces news, je dois pouvoir les créer / modifier / supprimer en back office. Malheureusement, à part l'affichage sur ce dernier, je n'arrive à rien... Je ne sais pas quoi faire.

 

 

Merci d'avance.

Link to comment
Share on other sites

Changez les
$sql->from(_DB_PREFIX_ . 'news',...
$sql->innerJoin(_DB_PREFIX_ . 'news_lang',...

par

$sql->from('news',...
$sql->innerJoin('news_lang',...

Dans les bonnes pratiques de la classe Db (https://www.prestashop.com/blog/fr/les-bonnes-pratiques-de-la-classe-db-sur-prestashop-1-5/ ) on voit qu'il ne faut pas mettre _DB_PREFIX_  pour insert et delete par exemple et pour les fonctions que vous utilisez (innerJoin, from...) on voit qu'il ne faut pas le rajouter :

 

  
public function innerJoin($table, $alias = null, $on = null)
{
return $this->join('INNER JOIN `'._DB_PREFIX_.bqSQL($table).'`'.($alias ? ' '.pSQL($alias) : '').($on ? ' ON '.$on : ''));
}

Link to comment
Share on other sites

Merci pour votre réponse :)

 

Je viens de réussir à afficher les news sur la page d'accueil. Donc point de vue affichage sur le front office, c'est réglé. Il me reste donc la gestion en partie admin. J'ai vu qu'il fallait employer la méthode renderForm (que j'ai reprise) mais j'ignore comment la déclencher quand on appuye sur le bouton "+" pour ajouter une news et comment faire pour la lier à la modification d'une news existante (en choisissant "Modifier" dans la liste déroulante ou en cliquant sur la news).

 

Edit :

 

Ca avance. Je parviens à afficher le formulaire quand je clique sur "Ajouter" et quand je veux modifier la news (mais c'est le même formulaire qui est chargé). Par contre j'ai une erreur :

 

1426169710-form.jpg

 

Le code :

public function renderForm()
		{
		    $fields_form = array(
		        'form' => array(
		            'legend' => array(
		                'title' => $this->l('Add a news'),
		                'icon' => 'icon-cogs'
		            ),
		            'input' => array(
		                array(
		                    'type' => 'text',
		                    'label' => $this->l('Title'),
		                    'name' => 'titre',
		                    'desc' => $this->l('Title of the news')
		                ),
		                array(
		                    'type' => 'text',
		                    'label' => $this->l('Summary'),
		                    'name' => 'resume',
		                    'desc' => $this->l('Summary of the news')
		                ),
		                array(
		                    'type' => 'text',
		                    'label' => $this->l('Text'),
		                    'name' => 'texte',
		                    'desc' => $this->l('Text of the news')
		                )
		            ),
		        'submit' => array(
		            'title' => $this->l('Save'),
		            'class' => 'btn btn-default pull-right')
		        ),
		    );
		     
		    $helper = new HelperForm();
		    $helper->show_toolbar = false;
		    $helper->table = $this->table;
		    $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
		    $helper->default_form_language = $lang->id;
		    $helper->allow_employee_form_lang =
		        Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0;
		    $this->fields_form = array();
		 
		    $helper->identifier = $this->identifier;
		    $helper->submit_action = 'submitBlockCart';
		    $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
		       .'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
		    $helper->token = Tools::getAdminTokenLite('AdminModules');
		    $helper->tpl_vars = array(
		        'languages' => $this->context->controller->getLanguages(),
		        'id_language' => $this->context->language->id
		    );
		 
		    return $helper->generateForm(array($fields_form));
		}

Je pense que ça bug au niveau de l'attribut 'name' de mes inputs. Cependant le nom est bien attribué. Par contre je ne vois pas comment ajouter un select qui permet de choisir parmi les langues installées et faire en sorte que les textes des champs correspondent à la langue choisie ?

 

Pour la suite j'imagine que je dois utiliser une fonction "addNews", quelque chose du genre pour récupérer les données ? Qu'est-ce que je lui passe comme argument pour pouvoir manipuler les données et les mettre en BDD ?

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

Salut,

 

tu as pas un petit problème au niveau du nombre de tableau que tu ouvres et que tu fermes  là :

$fields_form = array(
    'form' => array(
        'legend' => array(
            'title' => $this->l('Add a news'),
            'icon' => 'icon-cogs'
        ),
        'input' => array(
            array(
                'type' => 'text',
                'label' => $this->l('Title'),
                'name' => 'titre',
                'desc' => $this->l('Title of the news')
            ),
            array(
                'type' => 'text',
                'label' => $this->l('Summary'),
                'name' => 'resume',
                'desc' => $this->l('Summary of the news')
            ),
            array(
                'type' => 'text',
                'label' => $this->l('Text'),
                'name' => 'texte',
                'desc' => $this->l('Text of the news')
            )
        ),
    'submit' => array(
        'title' => $this->l('Save'),
        'class' => 'btn btn-default pull-right')
    ),
);

Comme ça, ça serai pas mieux ?

$fields_form = array(
    'legend' => array(
        'title' => $this->l('Add a news'),
        'icon' => 'icon-cogs'
    ),
    'input' => array(
        array(
            'type' => 'text',
            'label' => $this->l('Title'),
            'name' => 'titre',
            'desc' => $this->l('Title of the news')
        ),
        array(
            'type' => 'text',
            'label' => $this->l('Summary'),
            'name' => 'resume',
            'desc' => $this->l('Summary of the news')
        ),
        array(
            'type' => 'text',
            'label' => $this->l('Text'),
            'name' => 'texte',
            'desc' => $this->l('Text of the news')
        )
    ),
    'submit' => array(
        'title' => $this->l('Save'),
        'class' => 'btn btn-default pull-right')
    ),
);
Link to comment
Share on other sites

Si je supprime le 'form' => array, j'obtiens ce message :

Notice à la ligne 149 du fichier C:\\wamp\\www\\prestashop\\cache\\smarty\\compile\\e7\\90\\58\\e79058cea39f59e38a5bdb059d845dbf8d6b1f8d.file.form.tpl.php
[8] Undefined index: form

Et le formulaire ne s'affiche plus.

Link to comment
Share on other sites

Pour les langues, normalement ça se fait tout seul si tu as bien tout configuré

 

peut etre ajouter à tes champs multilangue :

array(
      'type' => 'text',
      'label' => $this->l('Title'),
      'name' => 'titre',
      'lang' => true,
      'desc' => $this->l('Title of the news')
),
  • Like 1
Link to comment
Share on other sites

Bien vu pour la langue, ça fonctionne :)

 

Edit : Par contre j'ai toujours mes undefined index.

 

Re-édit : J'ai réglé le problème :)

 

Au lieu d'utiliser $this->fields_form pour mon formulaire, j'utilisais une variable $fields_form... Je rédéfinissais aussi le helper (et sans doute d'une mauvaise manière) alors qu'il me suffisait de faire un return parent::renderForm().

 

Bref, plus qu'à trouver le moyen pour mettre les infos en BDD.

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

Probablement, oui. Mais je débute dans la création de module Prestashop, donc il risque d'y avoir des erreurs de débutant ou des trucs pas très catholiques dans le code.

 

Quoi qu'il en soit, j'ai réussi à gérer l'ajout en BDD, avec la gestion des multi langues :)

 

Reste plus qu'à gérer la suppression et la modification.

Link to comment
Share on other sites

En fait normalement, quand c'est des traitements classiques comme ça à l'air d'être ton cas, il se fait tout seul mais je pense que tu as peut être un problème au niveau de tes models et de tes tables

 

Comme table tu devrais avoir (si j'ai bien compris)

ta table news =

'id_news' 'date' 'active' 

et news_lang

'id_news' 'id_lang'  'titre' 'resume'  'texte' 

 

et tu as besoin que du model News, pas de news_lang

 

qui devrait ressembler à un truc du style :

<?php
class News extends ObjectModel
{
 	public $titre;
	public $resume;
	public $texte;
	public $date;
	public $active;
	
	public static $definition = array(
		'table'       => 'news',
		'primary'     => 'id_news',
		'multilang'   => true,
		'fields'      => array(
            'titre'      => array('type' => self::TYPE_STRING, 'lang' => true, 'validate'=> 'isString', 'required' => true ),
			'resume'     => array('type' => self::TYPE_STRING, 'lang' => true, 'validate'=> 'isString', 'required' => true ),
			'texte'      => array('type' => self::TYPE_STRING, 'lang' => true, 'validate'=> 'isString', 'required' => true ),
			'date'       => array('type' => self::TYPE_DATE,'required' => true),
        'active'         => array('type' => self::TYPE_BOOL,'required' => true),	
		)
	);
}

ensuite si tu as des traitements spécifiques comme rajouter le contenu des deux champs obligatoires qui te manque c'est dans postProcess de ton controller que ça se passe, comme par exemple :

public function postProcess()
{
    // tu ajoutes une valeur à active
    $_POST["active"] = 1;
    // tu executes le traitement par défaut
    return parent::postProcess();
}
  • Like 1
Link to comment
Share on other sites

J'ai essayé et plus rien ne fonctionne. Mes champs 'date' et 'active' ont une valeur par défaut en BDD quand je crée une news donc logiquement ils ne devraient pas être modifiables par le formulaire d'ajout.

 

Voilà le code de renderForm :

public function renderForm()
		{
		    $this->fields_form = array(
		            'legend' => array(
		                'title' => $this->l('Add a news'),
		                'icon' => 'icon-cogs'
		            ),
		            'input' => array(
		                array(
		                    'type' => 'text',
		                    'label' => $this->l('Title'),
		                    'name' => 'titre',
		                	'lang' => true,
		                    'desc' => $this->l('Title of the news')
		                ),
		                array(
		                    'type' => 'text',
		                    'label' => $this->l('Summary'),
		                    'name' => 'resume',
		                	'lang' => true,
		                    'desc' => $this->l('Summary of the news')
		                ),
		                array(
		                    'type' => 'text',
		                    'label' => $this->l('Text'),
		                    'name' => 'texte',
		                	'lang' => true,
		                    'desc' => $this->l('Text of the news')
		                )
		            ),
			        'submit' => array(
			            'title' => $this->l('Save'),
			            'class' => 'btn btn-default pull-right'
		            )
			    
		    );
		     
		    return parent::renderForm();
		}
Edited by Krapoutchniek (see edit history)
Link to comment
Share on other sites

Ca ne fonctionne pas non plus. Et quand je veux modifier une news, les champs ne se remplissent pas. Je ne sais pas comment fonctionne Prestashop au niveau des jointures mais si je ne réécris pas la fonction postProcess, la jointure entre 'news' et 'news_lang' n'est indiquée nulle part.

 

Quand je veux supprimer une news, j'ai cette erreur :

 

 

Une erreur s'est produite pendant la suppression de l'objet. news (impossible de charger l'objet)

 

 

Edit : Il y a du nouveau !

 

J'ai modifié un truc dans mon contrôleur. J'ai inclus le fichier de la classe News et j'ai défini un classname dans le contrôleur. Depuis lors ça fonctionne comme avant, sans redéfinir postProcess :)

 

Seuls bémols : maintenant quand je crée une news, la date prend la valeur 0000 0000 etc. et le champ active prend la valeur 0 au lieu de 1 (comme défini en BDD).

 

Et les champs du formulaire de modification ne prennent toujours pas les valeurs de l'enregistrement à modifier.

 

Re-édit : L'ajout et la suppression fonctionnent sans le moindre problème ! :D

 

Il ne me reste plus que la modification. Note qu'elle s'effectue correctement en BDD. Le seul souci réside dans le fait que les champs du formulaire ne se remplissent pas avec les données existantes. C'est là mon dernier problème.

 

En tout cas merci de m'aider. Ca fait plaisir :)

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

J'ai trouvé ! Effectivement il y avait un léger problème de configuration.

 

Il se trouve que j'avais bêtement fait un $this->renderForm() dans le constructeur. Et visiblement ça empêchait le formulaire de prendre les données. Tout fonctionne bien. Plus qu'à mettre une couche CSS :)

 

J'en profite pour poser des questions, parce que le module pourrait évoluer en ce sens :

 

Pour l'instant j'affiche les trois dernières news sur la page d'accueil, de la plus récente à la plus ancienne :

 

1) Quand je modifie une news, ça met à jour sa date par la date actuelle. Je peux empêcher ça ? (si je ne veux pas faire remonter en page d'accueil une vieille news que j'update)

2) Que dois-je faire pour pouvoir consulter chaque news sur une page qui lui est dédiée ? Un peu comme les catégories qui ont une page dédiée.

 

=> Pour ce deuxième point, j'ai par exemple une catégorie "Alain Navarre". Quand je clique dessus, j'arrive sur la page prestashop/fr/16-alain-navarre. J'aimerais pouvoir faire la même chose avec une news et avoir une page du style prestashop/fr/2-ceci-est-une-news en admettant que la news de l'id soit le 2.

 

Merci à toi de m'avoir aidé. J'y vois maintenant plus clair pour la création de modules :)

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

pour ta date, si tu en mis par défaut CURRENT_TIMESTAMP direct dans ta BDD ça doit pas la modifier sur un update il me semble

 

pour accéder à une page de ton module ça va être dans les controllers de front que tu pouvoir géré tout ça 

par exemple dans controllers/front/mapage.php tu peux avoir un truc du style :

<?php
class monmodulemapageModuleFrontController extends ModuleFrontController
{
	public function initContent()
	{
        $this->context->controller->addCSS(_MODULE_DIR_.'/monmodule/css/monmodule.css');
        $this->context->controller->addJS(_MODULE_DIR_.'/monmodule/js/monmodule.js');
        $this->context->smarty->assign('mavar', 'mon texte');
        parent::initContent();
        $this->setTemplate('mapage.tpl');
    }
}

là c'est un truc basique, il faut que tu rajoutes des variables en post ou get à récupérer pour détecter de quelle news il sagit et du coup récupéré les infos dont tu as besoin ...

 

et ensuite dans views/templates/front/mapage.tpl tu as ton html avec smarty pour les variables

 

et pour accéder à ta page ça sera plus un truc comme : prestashop/module/monmodule/mapage

 

voilà en gros :)

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

Salut,

 

J'essaie de faire ce que tu as dit l'autre jour mais j'ai un problème :

 

Notice: Undefined index: controller in C:\wamp\www\prestashop\classes\Dispatcher.php on line 763

 

Et ma news ne s'affiche pas car il y a des erreurs similaires (Undefined index: titre et Undefined index: texte - mais j'imagine que c'est dû à la première erreur)

 

Voilà le code de mon contrôleur :

 

modules/dashhomenews/controllers/front/default.php

<?php
	class dashhomenewsdefaultModuleFrontController extends ModuleFrontController {
	
		public function initContent()
		{
			//$this->context->controller->addCSS(_MODULE_DIR_.'/dashhomenews/css/news.css');
			
			if(Tools::getValue('id'))
			{
				global $smarty;
	    	
		    	$sql = new DbQuery();
				$sql->select('*');
				$sql->from('news', 'N');
				$sql->innerJoin('news_lang', 'NL', 'N.id_news = NL.id_news AND NL.id_lang = ' . (int)$this->context->language->id);
				$sql->where('N.active = 1 AND N.id_news = ' . Tools::getValue('id'));
				
				$news = Db::getInstance()->ExecuteS($sql);
				
				$this->context->smarty->assign('news', $news);
			}
			
	        parent::initContent();
			
			$this->setTemplate('news.tpl');
		}
	}

Et le tpl :

 

modules/dashhomenews/views/templates/front/news.tpl

<div id="news">
	{if $news}
		<h4>{$news.titre}</h4>
		<p>{$news.texte}</p>
	{else}
		<p>Il n'y a pas de news.</p>
	{/if}
</div>

Sachant que la page est appelée en cliquant sur un résumé de news qui se trouve sur la page d'accueil :

 

modules/dashhomenews/views/templates/hook/home.tpl

<h3>News !</h3>
{if $tab_news}
	{foreach from=$tab_news item=news}
		<a href="module/dashhomenews?id={$news.id_news}">
			<h4>{$news.titre}</h4>
			<p>{$news.resume}</p>
		</a>
		<hr />
	{/foreach}
{else}
	<p>Il n'y a pas de news.</p>
{/if}

J'ai l'impression que le contrôleur du front n'est pas chargé. Et du coup, forcément ma news ne peut pas s'afficher. Le lien de la news ressemble bien à ce que tu as dit : prestashop/fr/module/dashhomenews?id=2.

 

Tiens j'en profite aussi pour demander un truc. Pour les produits, catégories, etc. on peut définir un autre lien, du style /produit/2-ceci-est-un-produit, comme je le disais plus haut. Comment peut-on le faire pour un module ?

 

Merci d'avance.

 

Edit :

 

J'ai trouvé l'erreur, c'était tout con ^^

 

J'ai construit mes liens de telle sorte : /prestashop/module/dashhomenews?id=2 alors que c'était /prestashop/module/dashhomenews/default?id=2  ^_^  (reste plus qu'à trouver un nom plus explicite que "default" par contre...).

 

Le bug est réglé. Par contre je suis toujours intéressé pour savoir comment faire des liens plus propres.

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

Je remonte.

 

Je tente d'intégrer des url simplifiées pour mes news, pour avoir quelque chose du style /news-champagne/1-ceci-est-une-news.

 

Première étape : /news-champagne/1. Je verrai pour ajouter le titre quand ça fonctionnera.

 

Je fais un override de la classe Dispatcher :

<?php
        class Dispatcher extends DispatcherCore
	{
	    public $news_routes = array(
	        'news_rules' => array(
	            'controller' =>  'newschampagne',
	            'rule' =>        'news-champagne/{id}',
	            'keywords' => array(
	                'id'        =>   array('regexp' => '[0-9]+', 'param' => 'id_news'),
	                'rewrite'   =>   array('regexp' => '[_a-zA-Z0-9-\pL]*'),
	    			'meta_keywords' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
					'meta_title' => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
	            )
	        )
	    );
	 
	    protected function loadRoutes()
	    {
	        foreach($this->news_routes As $Routes)
	            array_push($this->default_routes, $Routes);
 
                parent::loadRoutes();
            }
        }

Le paramètre rewrite n'est pas (encore) utilisé. C'est ce qui correspondra au titre.

 

Ca ne fonctionne pas. J'ai l'impression que la règle ne se crée pas dans le htaccess. J'ai déjà vidé le cache, ça n'a rien changé.

 

Après je ne sais pas si je dois faire un truc spécial pour que cette règle se crée ?

Edited by Krapoutchniek (see edit history)
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...