web-dev-qa-db-fra.com

Créer des URL SEF à partir d'un composant personnalisé qui ne recherche pas dans la base de données

Je crée un composant personnalisé qui va obtenir des données par JSON à partir d'une autre URL. Jusqu'à présent, cela fonctionne bien, mais j'ai du mal à appliquer une URL SEF avec un fichier router.php.

Exemple, l'URL actuelle de mon composant est la suivante: index.php? Option = com_mycomponent & id = 333

L'URL SEF souhaitée (elle ne sera pas générée par Jroute, elle doit simplement être lue par joomla) est: website.com/alias-id

Je n'ai besoin que de l'identifiant pour analyser JSON. Alias ​​est hors de propos.

Le problème est ... Je ne peux pas faire fonctionner le routeur.php du tout. Mon itinéraire ne renvoie jamais les valeurs de mon tableau $ vars. Il dit toujours: Avis: Variable non définie: vars dans [...] router.php à la ligne 30.

J'essaie tout, mais même si j'essaie de mettre une variable exacte dans la fonction ParseRoute. (Comme $ vars [] = 30;) la sortie de $ vars n'est toujours pas définie.

J'ai essayé d'innombrables exemples, j'ai même essayé d'utiliser Jumi router.php à titre d'exemple, car je sais que c'est une extension qui reconnaîtra l'alias sur l'URL frontale sans aucun lien sur Jroute ou id de menu ... mais pas de chance.

Voici mon routeur.php actuel. Puisqu'il n'y a pas de requête du tout (et je ne sais pas d'où ça vient), j'ai utilisé une variable $ query var sur la fonction BuildRoute.

function myComponentBuildRoute()
    {
    $url = JURI::getInstance();

    $myid = end(explode('-', $url)); // gets the id from a /alias-id format
    $segments = array();
    $segments[] = $myid;

    return $segments;
}

    function myComponentParseRoute($segments)
    {
       $vars = array();


    $vars['jid'] = $segments[0];

    return $vars;
}

print_r($vars);

Alors peut-être que je manque la logique sur le routeur.php du tout. Peut-être qu'il faut quelque chose de vue. Je ne sais même pas comment utiliser le tableau $ vars après son passage final. Mais alors que dois-je faire pour créer une URL SEF que Joomla comprendra et ne me donnera pas un 404?

1
user1967509

Une chose est que, si vous essayez de créer un routeur à l'ancienne, cela a changé avec le temps. Maintenant, le routeur est une classe. Deuxièmement, l'une de vos vues de composant doit être définie en tant que page de couverture pour un système. Sans cela, dans la plupart des sites Web, le routeur par défaut sera le routeur de com_content. Ainsi, toutes les URL erronées (les URL n'ayant pas d'élément de menu/d'élément parent correct) seront traitées par com_content et probablement 404. Si vous souhaitez gérer les URL SEF pour des pages qui ne possèdent pas d'élément de menu approprié, vous devez le faire.

Exemple de routeur de composant

Vous pouvez trouver un exemple de routeur approprié dans le lien ci-dessous, mais gardez à l’esprit que cela figure dans l’une des prochaines versions de Joomla! la façon dont vous construisez le routeur changera à nouveau (s’ils se débarrassent des bugs).

https://github.com/joomla-extensions/weblinks/blob/master/src/components/com_weblinks/router.php

3
Artur Stępień

Créez vos URL comme ceci:

echo JRoute::_('index.php?option=com_mycomponent&Itemid='.Itemid.'&aliasid=alias-'.$id);

Vous voudrez inclure l'élément Itemid de votre élément de menu actuel, rend les choses plus propres et vous aide à garder une trace de l'endroit où vous vous trouvez. Cela peut être trouvé avec:

$Itemid = JFactory::getApplication()->getMenu()->getActive()->id;

Essayez ceci pour votre routeur. C'est un routeur très simple qui recherche une variable d'URL d'aliasid et transmet cette valeur sous forme de segment à l'analyseur d'itinéraire. L'analyseur d'itinéraire écrit ensuite cet élément dans une variable. La variable peut ensuite être appelée à l'aide de la méthode de saisie de l'application.

function myComponentBuildRoute(&$query)
{
    $app = JFactory::getApplication();
    $segments = array();
    if(isset($query['aliasid'])){
        $segments[] = $query['aliasid'];
        unset($query['aliasid']);
    }
    return $segments;
}


function myComponentParseRoute($segments)
{
    $vars = array();
    switch(count($segments))
    {
        case '1':
            $id = end(explode('-', str_replace(':','-',$segments[0])));
            $vars['id'] = $id;
            break;
    }
    return $vars;
}

Ensuite, pour obtenir l’identifiant dans votre vue, utilisez ce qui suit:

$JInput = JFactory::getApplication()->input;
$this->id = $JInput->get('id','','int');
1
Terry Carter

Mon objectif initial était de créer un alias sur une interface sans lien utilisant Jroute ou l'identifiant de menu ...

Mais après de nombreuses recherches, il semble que Joomla ne puisse pas le faire ou, si c'est le cas, des modifications sérieuses pourraient être nécessaires sur Router. Ainsi, au lieu de jouer avec Joomla Router (j'ai en fait essayé), j'ai créé un script sur mon plugin pour créer un type de menu et enregistrer sur la base de données un nouvel élément de menu sur ce type de menu pour chaque page que je souhaitais, c'était le moyen le plus simple d'avoir une URL de travail pour chaque élément répertorié dans mon JSON.

Si quelqu'un veut des conseils sur une solution de routeur, vous pouvez vérifier ce lien: https://docs.joomla.org/Creating_a_System_Plugin_to_augment_JRouter

C’est pour j25 et je pense que le routeur lui-même a déjà beaucoup changé après cette version, mais c’est la chose la plus proche que j’ai trouvée qui suggère comment réorganiser le routeur Joomla. Vous pouvez avoir quelques idées sur la façon de procéder.

1
user1967509