web-dev-qa-db-ja.com

JoomlaのSEF URLからIDを削除する方法?

私はカスタムコンポーネントを書いていて、すでに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;
}

それはその仕事をしますが、URLは次のようになります

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

私はたくさん読みましたが、記事にIDを削除するための情報しかありません(それは古いです、joomla 3.xはデフォルトでこれを行います)。これについては何もありません。誰かがこれを手伝ってくれる?

2
Ignacio Salcedo

私は@ Farahmandの助けを借りて解決策を見つけました、ここにあります:

<?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. ルートを構築する一時変数を記述して、クエリを「:」で分解し、$ catと呼びました。クエリにスラグがある場合、分解により次のような配列が作成されます:array([0]=> id, [1]=> alias) else、array([0]=> id)
  2. 次に、配列に実際にidaliasがあるかどうかを知るために、カウント付きの条件式を作成します:if (count($cat) == 2) {これがtrueの場合は、 $ cat [1]$segments[] = $cat[1];内にエイリアスコンテンツのみが含まれるセグメント、または$ query ['categoria']else { $segments[] = $query['categoria']; }で埋められます
  3. parse()の場合、 'empresa'の場合、これは私の見解です。エイリアスが---の中にリストされている場合に、IDを検索しようとする情報についてDB呼び出しを行いました$ 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();

そして、それをカテゴリIDの$ vars ['categoria']$vars['categoria'] = (int) $result;の中に格納します。

  1. "empresa" IDの場合、BuildRoute()またはParseRoute()が ":"のエイリアスの最初の "-"を変更し、データベース呼び出しを中断したことがわかります(理由はわかりません)。これを修正するために$empresa_alias = str_replace(":","-",$segments[2]);と書いた後、代わりに使用$ segments [1]変数$ empresa_aliasを使用しました。
  2. 最後に、URLは「cervecerias」のIDなしで...com/actividades/empresa/cervecerias/ cerveceria-madriz-cafeteriaのようになりました。残りの私の見解についても同じことを繰り返します。 - http://pinto.isalcedo.com/actividades/empresa/cervecerias/cerveceria-madriz-cafeteria

私の英語で申し訳ありません。これが多くの人に役立つことを願っています。

2
Ignacio Salcedo

IDを表示させたくないアイテムのメニューアイテムを作成します。少なくとも親カテゴリのメニュー/actividad/10-hosteleria-y-restaurantesこの例では、エイリアス(URLの生成に使用)を任意に設定できます。

0
Seth Warburton