Je développe un composant qui a une vue en liste: index.php?option=com_mycomponent&view=listview&catid=1
J'ai publié plusieurs éléments de menu de cette composante pointant vers différentes catégories;
En tant qu’éléments de menu, les URL SEF sont:
www.myweb.com/cat1
www.myweb.com/cat2
www.myweb.com/cat3
Jusqu'ici tout va bien, comportement normal.
De plus, j'ai un cookie avec un texte de localisation. Mon client souhaite que l'URL soit différente en fonction de la valeur du cookie.
Si la valeur du cookie est "madrid", les URL doivent être
www.myweb.com/madrid/cat1
www.myweb.com/madrid/cat2
www.myweb.com/madrid/cat3
Si la valeur du cookie est "barcelone", alors ils devraient être
www.myweb.com/barcelona/cat1
www.myweb.com/barcelona/cat2
www.myweb.com/barcelona/cat3
etc.
A côté de cela, il n'y a rien, les listes sont exactement les mêmes, dans tous les cas, il ne s'agit que de changer d'URL.
Des idées comment je peux réaliser ceci?
Vérifiez le plug-in du système de filtrage du langage, vous verrez comment ils manipulent l'URL pour ajouter un préfixe de langue aux liens. Vous pouvez utiliser la même méthode pour ajouter un préfixe d’emplacement basé sur la valeur du cookie.
Voici ce que j'ai fait, mais gardez à l'esprit que j'avais une requête difficile: je devais la faire fonctionner avec le plugin Filtre de langue ET faire en sorte que le pays apparaisse avant le code de langue. Différents pays peuvent afficher le même élément et les langues sont partagées entre les pays. Cela fonctionne en paire avec un plugin de pays supplémentaire personnalisé pour K2, mais c'est sans importance pour cela. Ce que j'ai fait n'est possible qu'à partir de Joomla 3.4 et supérieur
defined('_JEXEC') or die;
use Joomla\Registry\Registry;
class PlgSystemCountryFilter extends JPlugin
{
protected $app;
public $countries = array('austria', 'belgium', 'czech-republic', 'poland', 'slovakia', 'ukraine');
public $country;
public function __construct(&$subject, $config)
{
parent::__construct($subject, $config);
$this->app = JFactory::getApplication();
}
public function onAfterInitialise()
{
if ($this->app->isSite())
{
// country/fr/menus
$path = str_replace(JUri::root(), '', JUri::current());
$parts = explode('/', $path);
if(!empty($parts[0]) && in_array($parts[0], $this->countries)) {
$this->country = $parts[0];
$router = $this->app->getRouter();
$router->attachBuildRule(array($this, 'buildRule'), JRouter::PROCESS_BEFORE);
$router->attachBuildRule(array($this, 'postprocessSEFBuildRule'), JRouter::PROCESS_AFTER);
$router->attachParseRule(array($this, 'parseRule'), JRouter::PROCESS_BEFORE);
}
}
}
public function buildRule(&$router, &$uri)
{
if(!empty($this->country)) {
$parts = explode('/', $uri->getPath());
$lang = array_shift($parts);
$uri->setPath(implode('/', $parts) . '/' . $this->country . '/' . $lang . '/');
}
}
public function postprocessSEFBuildRule(&$router, &$uri)
{
$uri->delVar('sitecountry');
}
public function parseRule(&$router, &$uri)
{
$path = $uri->getPath();
$parts = explode('/', $path);
if(!empty($parts[0]) && in_array($parts[0], $this->countries)) {
$country = $parts[0];
}
$array = array();
if(!empty($country)) {
array_shift($parts);
// if we are supposed to be on the root page /fr, then make it be like /fr/country so that per country homepage can be displayed
// for this to work hidden menu with aliases /country must be created
if(count($parts) == 1) {
$parts[] = $country;
}
$uri->setPath(implode('/', $parts));
$this->app->input->set('sitecountry', $country);
$array = array('sitecountry' => $country);
}
return $array;
}
}