it-swarm.com.de

Menüelement lädt Artikelinhalte, wenn ID in der URL übergeben wird, anstatt 404-Fehler anzuzeigen

Ich habe ein sehr seltsames Problem, bei dem ich einen Menüpunkt namens/foo habe, der Artikel 1 lädt. Wenn ich nun/foo/2 mache, würde ich erwarten, dass dies eine 404-Seite erzeugt, da ich keinen Untermenüpunkt habe '2' unter dem übergeordneten Menüpunkt/foo. Anstatt jedoch eine 404-Seite anzuzeigen, wird der Inhalt von Artikel 2 unter demselben Menüpunkt geladen.

Ich habe den .htaccess überprüft und es ist nur der normale, der mit Joomla geliefert wurde und kann nicht herausfinden, warum dies passieren könnte. Wenn ich versuche, eine Artikel-ID zu speichern, die nicht in der Datenbank vorhanden ist, wird die Nummer 404 angezeigt. Alle Hinweise wären großartig!

6
sifu

Ahhh die Freuden des aktuellen Routingsystems in Joomla. (Ich dachte, ich hätte gehört, dass jemand ein Google Summer of Code-Projekt zum Aktualisieren des Routingsystems durchführt, habe aber noch nichts dazu gesehen.)

Mein Verständnis des Routings ist also, dass Joomla versuchen wird, so viel wie möglich der Anfrage-URI (dh foo/2) Zu einem Menüpunkt zu analysieren. In Ihrem Fall würde dies nur für foo zutreffen.

Als nächstes werden die restlichen Teile an die Datei router.php Für die Komponente übergeben, die zu diesem Menüelement passt. In deinem Fall schätze ich, dass dies der com_content-Router bei components/com_content/router.php Ist.

Dies ruft die Funktion parse in dieser Klasse auf und übergibt die Segmente (in diesem Fall nur 2).

Der Router verfügt über einen Code (den Sie durchsehen können, wenn Sie möchten), um zu versuchen, die Segmente in der URL in Artikel-IDs und dergleichen zu zerlegen. Das Kernstück, das Sie betrifft, ist das, was passiert, wenn es nur ein Segmentteil gibt:

/*
     * 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;
                }
            }
        }
    }

Grundsätzlich wird geprüft, ob es sich um eine Kategorie- oder Artikel-ID handelt. Da Sie einen Artikel mit der ID 2 haben, vergeht dieser und wir gehen nun mit dieser ID vorwärts, anstatt mit dem, was Sie in der Menü-ID gesendet haben.

Genau dafür wurde com_content programmiert, egal ob gut oder schlecht ...: /

2
David Fritsch