web-dev-qa-db-fra.com

Comment supprimer les identifiants de l'URL SEF dans Joomla?

J'écris un composant personnalisé et j'ai déjà terminé le fichier router.php:

defined('_JEXEC') or die;
function empresaBuildRoute(&$query) //Esta función divide la url y se trae las variables.
{
    $segments = array();
    if (isset($query['view']))
    {
        $segments[] = $query['view'];
        unset($query['view']);
    }
    if (isset($query['padre']))
    {
        $segments[] = $query['padre'];
        unset($query['padre']);
    };
    if (isset($query['id']))
    {
        $segments[] = $query['id'];
        unset($query['id']);
    };
    if (isset($query['categoria']))
    {
        $segments[] = $query['categoria'];
        unset($query['categoria']);
    };
    if (isset($query['empresa']))
    {
        $segments[] = $query['empresa'];
        unset($query['empresa']);
    };

    return $segments;
}
function empresaParseRoute($segments) //Esta función reconoce las variables y las reacomoda.
{   

    //print_r($segments); //Si deseas verificar el contenido de la Array "segments".

    $vars = array();
    switch($segments[0])
    {
        case 'actividad': //Verifica las View y según cada una del componente, ordena las variables.
            $vars['view'] = 'actividad';
            $id = explode(':', $segments[2]); //Los segmentos son una array que contiene otra array
            $vars['id'] = (int) $id[0]; //La posicion 0 de la array contenida en la posicion 2 de la array anterior
        break;

        case 'empresa':
            $vars['view'] = 'empresa';
            print_r($segments);
            $categoria = explode(':', $segments[1]);
            $vars['categoria'] = (int) $categoria[0];
            $empresa = explode(':', $segments[2]);
            $vars['empresa'] = (int) $empresa[0];
        break;
    }
    return $vars;
}

Il fait son travail mais l'url ressemble à

/ actividad/10-hosteleria-y-restaurantes/11-cervecerias

J'ai beaucoup lu, mais il n'y a que des informations sur la suppression d'identifiant dans les articles (c'est vieux, joomla 3.x le fait par défaut), rien à ce sujet. Quelqu'un peut il m'aider avec ça?

2
Ignacio Salcedo

J'ai trouvé la solution à l'aide de @ Farahmand, la voici:

<?php

defined('_JEXEC') or die;
function empresaBuildRoute(&$query) //Esta función divide la url y se trae las variables.
{
    $segments = array();

    if (isset($query['view']))
    {
        $segments[] = $query['view'];
        unset($query['view']);
    }
    if (isset($query['padre']))
    {
        $segments[] = $query['padre'];
        unset($query['padre']);
    };
    if (isset($query['id']))
    {
        $segments[] = $query['id'];
        unset($query['id']);
    };
    if (isset($query['categoria']))
    {   
        $cat = explode(':', $query['categoria']); //Variable temporal para guardar solo el alias de la categoria
        if (count($cat) == 2) { //Contar los valores, si son dos es porque existe ID y Alias
            $segments[] = $cat[1];
        } else { //Caso contrario, seleccionar la categoría pues esta contendría solo el ID
            $segments[] = $query['categoria'];
        }
        unset($query['categoria']);
    };

    if (isset($query['empresa']))
    {
        $segments[] = $query['empresa'];
        unset($query['empresa']);
    };
    return $segments;
}

function empresaParseRoute($segments) //Esta función reconoce las variables y las reacomoda.
{   

    print_r($segments); //Si deseas verificar el contenido de la Array "segments".
    $vars = array();
    switch($segments[0])
    {

        case 'actividad': //Verifica las View y según cada una del componente, ordena las variables.
        $vars['view'] = 'actividad';
            $id = explode(':', $segments[2]); //Los segmentos son una array que contiene otra array
            $vars['id'] = (int) $id[0]; //La posicion 0 de la array contenida en la posicion 2 de la array anterior
            break;

        case 'empresa':
            $vars['view'] = 'empresa';

            $db = JFactory::getDbo();
            $query = $db->getQuery(true);
            $query->select('id');
            $query->from($db->quoteName('#__categories'));
            $query->where($db->quoteName('alias')." = ".$db->quote($segments[1]));

            $db->setQuery($query);
            $result = $db->loadResult();

            $vars['categoria'] = (int) $result;

            $empresa_alias = str_replace(":","-",$segments[2]);
            $db = JFactory::getDbo();
            $query = $db->getQuery(true);
            $query->select('id');
            $query->from($db->quoteName('#__viviren_empresa'));
            $query->where($db->quoteName('alias')." = ".$db->quote($empresa_alias));

            $db->setQuery($query);
            $empresa = $db->loadResult();

            $vars['empresa'] = (int) $empresa;
        break;
    }
    return $vars;
}
?>
  1. En construisant la route, j'ai écrit une variable temporelle pour faire éclater la requête par ':' appelé $ cat . Si la requête a un slug, l'explose fera un tableau comme ceci: array([0]=> id, [1]=> alias) sinon sera array([0]=> id)
  2. Ensuite, je fais une condition avec un compte pour savoir si le tableau a réellement un id et un alias : if (count($cat) == 2) { si cela est vrai, le segment ne contient que le contenu de l'alias à l'intérieur de $ cat [1] : $segments[] = $cat[1]; Sinon il va remplir avec $ query ['categoria'] : else { $segments[] = $query['categoria']; }
  3. À l'intérieur du parse () dans le cas 'empresa', qui est mon point de vue, j'ai lancé un appel d'informations à la base de données dans lequel j'essaie de trouver l'identifiant quand l'alias est celui indiqué à l'intérieur de $ segments [1] :

$db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select('id'); $query->from($db->quoteName('#__categories')); $query->where($db->quoteName('alias')." = ".$db->quote($segments[1])); $db->setQuery($query); $result = $db->loadResult();

Et stockez cela à l'intérieur de $ vars ['categoria'] : $vars['categoria'] = (int) $result; pour l'identifiant de la catégorie.

  1. Pour l'identifiant "empresa", je constate (et je ne sais pas pourquoi) que BuildRoute () ou ParseRoute () modifie le premier "-" en un alias pour un ":" et rompt l'appel de la base de données. Pour résoudre ce problème, j’écrivais $empresa_alias = str_replace(":","-",$segments[2]); then à la place d’utilisation des $ segments [1] J'ai utilisé la variable $ empresa_alias .
  2. Enfin, l'URL ressemble maintenant à ...com/actividades/empresa/cervecerias/ cerveceria-madriz-cafeteria Sans id dans "cervecerias". Je vais répéter la même chose avec le reste de mes opinions. - http://pinto.isalcedo.com/actividades/empresa/cervecerias/cerveceria-madriz-cafeteria

Désolé pour mon anglais et j'espère que cela peut aider beaucoup de gens.

2
Ignacio Salcedo

Créez un élément de menu pour tous les éléments pour lesquels vous ne souhaitez pas afficher d'identifiant, à tout le moins un élément de menu pour la catégorie parente /actividad/10-hosteleria-y-restaurantes _ dans votre exemple, l'alias (utilisé pour générer l'URL) peut être défini sur ce que vous voulez.

0
Seth Warburton