it-swarm.dev

La voce di menu carica qualsiasi contenuto dell'articolo quando l'ID viene passato nell'URL invece di mostrare l'errore 404

Sto riscontrando un problema molto strano in cui ho una voce di menu chiamata/pippo che carica l'articolo 1. Ora se lo faccio/pippo/2, mi aspetto che ciò generi una pagina 404 poiché non ho una voce di sottomenu '2' sotto la voce del menu principale/pippo. Tuttavia, invece di mostrare una pagina 404, in qualche modo sta caricando il contenuto dell'articolo 2 sotto la stessa voce di menu.

Ho controllato .htaccess ed è solo quello normale fornito con Joomla e non riesco a capire perché questo potrebbe accadere. Se provo a mettere qualsiasi ID articolo che non esiste nel database, allora mostra il 404. Qualsiasi puntatore sarebbe fantastico!

6
sifu

Ahhh le gioie dell'attuale sistema di routing in Joomla. (Pensavo di aver sentito che qualcuno stava facendo un progetto Google Summer of Code per aggiornare il sistema di routing, ma non ho visto nient'altro al riguardo.)

Quindi la mia comprensione del routing è che Joomla proverà ad analizzare la maggior parte dell'uri richiesta (es. foo/2) a una voce di menu possibile. Nel tuo caso, ciò corrisponderebbe solo a foo.

Successivamente, il resto dei pezzi viene passato al router.php file per il componente che corrisponde a quella voce di menu. Nel tuo caso, immagino che questo sia il router com_content su components/com_content/router.php.

Questo chiamerà la funzione parse in questa classe e passerà nei segmenti (che in questo caso sarà solo 2.

Il router ha un codice (che puoi consultare se lo desideri) per provare ad analizzare i segmenti nell'uri in ID articolo e simili. Il pezzo principale che ti colpisce è ciò che accade se esiste un solo pezzo di 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;
                }
            }
        }
    }

Fondamentalmente, controlla se si tratta di un ID categoria o un ID articolo. Dato che hai un articolo con l'id 2, passa e quindi ora andiamo avanti con quello come id invece di qualunque cosa tu abbia inviato nel menu id.

Questo è esattamente ciò che è stato codificato da com_content, nel bene o nel male ...: /

2
David Fritsch