Jump to content

SEO & URLs / module / controller


Recommended Posts

Bonjour,

 

Je devance certainement l'enrichissement de la documentation 1.5, car il n'y a rien à ce sujet la.

 

Je cherche à utiliser le système rewritecond maintenant bien présent dans la 1.5, mais à partir d'une personnalisation via un controller de module.

 

L'accès à la page du module se fait par :

domain.tld/module/lemodule/lecontroller

 

La règle dans l'AdminMeta est bien enregistrée par défaut : module/{module}{/:controller}

 

Ma question est comment faire pour ajouter de nouvelles règles personnalisées afin de les rendre fonctionnelles depuis le module controller.

Du genre :

domain.tld/module/lemodule/lecontroller/mon-rewrite-texte_id4

 

Si un dev à l'info, je suis prenneur ;)

 

A+

Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

Nous avons tous lu ton article de blog très intéressant à ce sujet :)

http://blog.dev-net.fr/2012/10/fausse-joie-pour-le-dispatcher-ou-plutot-inacheve/

 

Et tu as parfaitement raison, il manque un petit quelque chose pour que ce soit pleinement utilisable.

Il faudrait un hook spécial, qui au lieu de simplement appeler une méthode, permet d'enregistrer des routes dans un fichiers type settings.inc.php qui serait inclu dans le dispatcher (bon, plus vraiment un hook en fait ^^).

 

Ce dev t'intéresserait ? Sur une branche dédiée ?

 

Cordialement,

  • Like 1
Link to comment
Share on other sites

Je pense que passer des paramètres en config, est vraiment plus simple. L'idée actuelle dans le dispatcher était bien débutée, manque juste à la finaliser. Un serialize dans une variable de config et zou ... il est ensuite simple comme bonjour de définir l'array dans nos classes modules.

 

En tout cas je te remercie Damien de t'être intéressé au sujet.

Link to comment
Share on other sites

Hello,

 

Je suis un peu allergique aux serialize mais d'un point de vue technique cette solution fonctionne en effet.

 

Non seulement je tends la main, mais c'est quelque chose que j'ai déjà fait pour des fonctionnalités entières, comme le watermark ou l'onglet backup. Le premier n'est pas tant récupérer le développement mais plutôt assurer la maintenance derrière. Il faut donc bien concevoir le développement au préalable pour ne pas se retrouver avec du code que personne ne maintiendra.

 

C'est un peu ce qu'il s'est passé sur les produits virtuels. On peut développer très vite, mais la maintenance prend un temps considérable, et on ne peut pas se le permettre.

 

On est en train de préparer la mise en place des outils nécessaires pour ce genre de chose, mais on est toujours ouverts en attendant. Nous sommes toujours ravi de voir des tickets contenant la résolution sur la forge.

 

Cordialement,

  • Like 2
Link to comment
Share on other sites

Grâce à un override de la classe Dispatcher (ainsi que de la classe Meta pour mettre d'ajout les paramètres dans le champ), j'ai pu obtenir un résultat semblable, je pense.

 

J'ai, dans mon besoin et ma configuration actuelle un module qui se présente comme suit:

  • Nom du module: annuaire
  • Controlleur: details
  • Rewrite en SEO & URL's: /annuaire-details
  • Passage de paramètres: /annuaire-details?id=152

Suite à l'override, j'ai modifié comme suit:

  • Nom du module: annuaire
  • Controlleur: details
  • Rewrite en SEO & URL's: annuaire-details/{id}-{rewrite}
  • Passage de paramètres: annuaire-details/152-name

Actuellement, la route déclarée est analysée sur le même principe de base et intègre en $_GET les paramètres trouvés.

 

Est-ce quelque chose du genre, que tu veux, DevNet ?

 

NB: Actuellement, je garde les paramètres propres à PrestaShop (id, rewrite, id_category, ...) ; il est éventuellement possible de généraliser cela autrement pour avoir des paramètres très différents - mais cela demande plus de boulot, bien entendu.

Link to comment
Share on other sites

Depuis la classe module, pouvoir déclarer en toute simplicité les routes personnelles, qui seront prises en charge automatiquement par le dispatcher.

 

En gros, il serai intéressant de pouvoir spécifier dans notre classe de module :

public $mes_routes = array(
 'ma-route-1' => array(
  'controller' => null,
  'rule' =>  '{module}-{controller}-{id}-{url}',
  'keywords' => array(
'url'   => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
'id'   => array('regexp' => '[0-9]+', 'param' => 'id'),
'module'  => array('regexp' => 'monmodule', 'param' => 'module'),
'controller' => array('regexp' => 'moncontrollerdefault', 'param' => 'controller')
  ),
  'params' => array(
'fc' => 'module'
  )
 ),
 'ma-route-2' => array(
  'controller' => null,
  'rule' =>  '{module}-{controller}-{cat}-{id}-{url}',
  'keywords' => array(
'url'   => array('regexp' => '[_a-zA-Z0-9-\pL]*'),
'cat'   => array('regexp' => '[0-9]+', 'param' => 'cat'),
'id'   => array('regexp' => '[0-9]+', 'param' => 'id'),
'module'  => array('regexp' => 'monmodule', 'param' => 'module'),
'controller' => array('regexp' => 'moncontrollercat', 'param' => 'controller')
  ),
  'params' => array(
'fc' => 'module'
  )
 )
);

 

Ensuite, pouvoir récupérer l'instance du dispatcher afin d'y ajouter ces nouvelles routes persos à Dispatcher->default_routes (et toutes celles des autres modules actifs) avant que la méthode Dispatcher->loadRoutes() ne se traite.

 

Reste à savoir si l'instance du dispatcher est utilisable lors du chargement des classes modules, afin de pouvoir les modifiés.

J'avais pensé que passer le dispatcher dans le context pourrait être une solution, afin de l'utiliser dans le module par $this->context->dispatcher->default_routes

 

et d'y injecter les routes persos via un array_push simple depuis un hook du module. Le hook serait bien sur placé dans la classe Dispatcher.php .

 

Cette méthode, je l'ai essayé avec le hook actionDispatcher, mais ça ne marche pas. Car ce hook se lance après les Dispatcher->loadRoutes()

Link to comment
Share on other sites

Lorsque l'on se rend dans le Back-Office, dans l'onglet "SEO & URL's", il est possible de définir une route personnalisée assez basique pour le module/controller.

 

Je propose de faire quelque chose comme:

 

$meta = new Meta();
$meta->rewrite = 'lerewrite/parametres';
$meta->controller = 'controller';
$meta->module = 'module';
$meta->add();

 

Un peu tout simplement...

Link to comment
Share on other sites

Tu ne te trompes pas, mais justement: j'ai pu mettre au point (pour mon besoin et en globalisant pas trop mal actuellement) l'ajout de paramètre dynamique (tel que id, rewrite, ...).

 

Il faut donc - pour moi - implémenter cette mécanique et alors permettre l'ajout des URL's en direct ; via le module.

Link to comment
Share on other sites

Super ;)

 

Est-ce que ce mécanisme ou plutôt la déclaration des paramètres personnalisés se construise tel que le dispatcher le propose ? Ou est-ce que tu innoves une construction différente de paramètres ?

 

Comme le propose Damien, il faut garder une harmonie dans les possibilités de configuration afin que la "maintenance" soit plus facile, et que ça colle à une documentation commune.

 

Impatient de tester ta modif ;)

Link to comment
Share on other sites

J'ai conservé les keywords, tels que id, rewrite, id_category et j'en passe (même si ils ne sont pas tous utile dans ce cas là). Et la construction se fait de ce type /lerewritedemonchoix/{id}-{rewrite} ; par exemple ! :)

 

Pour le test, je t'envoie dès que possible cela (je dois encore peaufiner un détails)

  • Like 1
Link to comment
Share on other sites

  • 2 weeks later...

Bonjour,

 

Nous avons tous lu ton article de blog très intéressant à ce sujet :)

http://blog.dev-net....lutot-inacheve/

 

Et tu as parfaitement raison, il manque un petit quelque chose pour que ce soit pleinement utilisable.

Il faudrait un hook spécial, qui au lieu de simplement appeler une méthode, permet d'enregistrer des routes dans un fichiers type settings.inc.php qui serait inclu dans le dispatcher (bon, plus vraiment un hook en fait ^^).

 

Ce dev t'intéresserait ? Sur une branche dédiée ?

 

Cordialement,

 

Salut Damien,

 

Comme J.Danse ou moi n'avons pas eu la branche svn, voilà pour ma part la proposition qui fonctionne et qui peut facilement être utilisée par les dev.

 

http://blog.dev-net....-prestashop-1-5

 

Dis moi ce que tu en penses

 

A+

  • Like 1
Link to comment
Share on other sites

Il semblerai que sur php 5.3 cela génère une erreur sur les techniques de namepsace .

Et donc de ce fait : $ClassName::getModuleRoutes() n'est pas pris en charge et renvoi :

 

Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM in /home/demotemp./override/classes/Dispatcher.php on line 25

 

Affaire à suivre, je poursuis dans la résolution du problème !

Link to comment
Share on other sites

  • 3 years later...

Je remonte la discussion, j'ai trouvé qu'il y a un hook function hookModuleRoutes, je l'ai utilisé comme ceci dans mon module.

	public function hookModuleRoutes()
	{
		return array(
		'article' => array(
			'controller' => 'content',
			'rule' =>  'article/{id}-{rewrite}',
			'keywords' => array(
                                'id' =>            array('regexp' => '[0-9]+', 'param' => 'id'),
				'rewrite'   => array('regexp' => '[_a-zA-Z0-9-\pL]*')				
			),
			'params' => array(
				'fc' => 'module',
				'module' => 'prestapress',
				'controller' => 'content'
			)
		),
		'articles' => array(
			'controller' => 'content',
			'rule' =>  'articles/{id}-{category}',
			'keywords' => array(
				'id'   => array('regexp' => '[0-9]+', 'param' => 'category'),
                                'category'   => array('regexp' => '[_a-zA-Z0-9-\pL]*')
				
			),
			'params' => array(
				'fc' => 'module',
				'module' => 'prestapress',
				'controller' => 'content'
			)
		),
	       );
	}

J'espère que cela aide quelqu'un, je suis preneur s'il y a des améliorations.

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...