it-swarm-es.tech

El elemento de menú carga el contenido de cualquier artículo cuando se pasa la ID en la URL en lugar de mostrar un error 404

Tengo un problema muy extraño en el que tengo un elemento de menú llamado/foo que carga el artículo 1. Ahora si lo hago/foo/2, esperaría que esto genere una página 404 ya que no tengo un elemento de submenú '2' debajo del elemento del menú principal/foo. Sin embargo, en lugar de mostrar una página 404, de alguna manera está cargando el contenido del Artículo 2 bajo el mismo elemento del menú.

He comprobado el .htaccess y es el normal que vino con Joomla y no puedo entender por qué podría estar sucediendo esto. Si trato de poner cualquier ID de artículo que no existe en la base de datos, entonces muestra el 404. ¡Cualquier puntero sería genial!

6
sifu

Ahhh las alegrías del sistema de enrutamiento actual en Joomla. (Creo que escuché que alguien estaba haciendo un proyecto Google Summer of Code para actualizar el sistema de enrutamiento, pero no he visto nada más al respecto).

Así que entiendo el enrutamiento es que Joomla intentará analizar la mayor parte de la uri de la solicitud (es decir, foo/2) a un elemento del menú como sea posible. En su caso, esto coincidiría con solo foo.

A continuación, el resto de las piezas se pasan a la router.php archivo para el componente que coincide con ese elemento del menú. En su caso, supongo que este es el enrutador com_content en components/com_content/router.php.

Esto llamará a la función parse en esta clase y pasará los segmentos (que en este caso serán 2.

El enrutador tiene un código (que puede consultar si lo desea) para intentar analizar los segmentos de la uri en identificadores de artículos y demás. La pieza central que le afecta es lo que sucede si solo hay una pieza de segmento:

/*
     * If there is only one segment, then it points to either an article or a category.
     * We test it first to see if it is a category.  If the id and alias match a category,
     * then we assume it is a category.  If they don't we assume it is an article
     */
    if ($count == 1)
    {
        // We check to see if an alias is given.  If not, we assume it is an article
        if (strpos($segments[0], ':') === false)
        {
            $vars['view'] = 'article';
            $vars['id'] = (int) $segments[0];

            return $vars;
        }

        list($id, $alias) = explode(':', $segments[0], 2);

        // First we check if it is a category
        $category = JCategories::getInstance('Content')->get($id);

        if ($category && $category->alias == $alias)
        {
            $vars['view'] = 'category';
            $vars['id'] = $id;

            return $vars;
        }
        else
        {
            $query = $db->getQuery(true)
                ->select($db->quoteName(array('alias', 'catid')))
                ->from($db->quoteName('#__content'))
                ->where($db->quoteName('id') . ' = ' . (int) $id);
            $db->setQuery($query);
            $article = $db->loadObject();

            if ($article)
            {
                if ($article->alias == $alias)
                {
                    $vars['view'] = 'article';
                    $vars['catid'] = (int) $article->catid;
                    $vars['id'] = (int) $id;

                    return $vars;
                }
            }
        }
    }

Básicamente, verifica si es una identificación de categoría o una identificación de artículo. Como tiene un artículo con la identificación 2, pasa y, por lo tanto, ahora avanzamos con esa información como la identificación en lugar de lo que haya enviado en la identificación del menú.

Esto es exactamente lo que com_content fue codificado para hacer, para bien o para mal ...: /

2
David Fritsch