it-swarm.com.de

Erstellen Sie SEF-URLs aus einer benutzerdefinierten Komponente, die nicht in der Datenbank sucht

Ich erstelle eine benutzerdefinierte Komponente, die Daten von einer anderen URL per JSON abruft. Bisher funktioniert es gut, aber ich habe einige Schwierigkeiten, eine SEF-URL mit einer router.php-Datei anzuwenden.

Die aktuelle URL meiner Komponente lautet beispielsweise: index.php? Option = com_mycomponent & id = 333

Die gewünschte SEF-URL (sie wird nicht von Jroute generiert, sondern muss nur von Joomla gelesen werden) lautet: website.com/alias-id

Ich brauche nur die ID, um JSON zu analysieren. Alias ​​ist irrelevant.

Die Sache ist ... Ich kann die router.php überhaupt nicht zum Laufen bringen. Meine Route gibt niemals die Werte aus meinem $ vars-Array zurück. Es steht immer: Hinweis: Undefinierte Variable: vars in [...] router.php in Zeile 30.

Ich versuche alles, aber selbst wenn ich versuche, eine genaue Variable in die ParseRoute-Funktion einzufügen. (Wie bei $ vars [] = 30;) ist die Ausgabe von $ vars immer noch undefiniert.

Ich habe unzählige Beispiele ausprobiert, ich habe sogar versucht, Jumi router.php als Beispiel zu verwenden, weil ich weiß, dass dies eine Erweiterung ist, die den Alias ​​auf der Frontend-URL ohne Link auf Jroute oder Menü-ID erkennt ... aber kein Glück.

Hier ist meine aktuelle router.php. Da es überhaupt keine Abfrage gibt (und ich keine Ahnung habe, woher sie stammt), habe ich für die BuildRoute-Funktion keine $ query var verwendet.

function myComponentBuildRoute()
    {
    $url = JURI::getInstance();

    $myid = end(explode('-', $url)); // gets the id from a /alias-id format
    $segments = array();
    $segments[] = $myid;

    return $segments;
}

    function myComponentParseRoute($segments)
    {
       $vars = array();


    $vars['jid'] = $segments[0];

    return $vars;
}

print_r($vars);

Vielleicht fehlt mir also überhaupt die Logik auf der router.php. Vielleicht braucht es etwas aus der Sicht. Ich bin mir nicht einmal sicher, wie ich das $ vars-Array verwenden kann, nachdem es endgültig übergeben wurde. Aber was muss ich dann tun, um eine SEF-URL zu erstellen, die Joomla versteht und mir keine 404 gibt?

1
user1967509

Eine Sache ist, dass Sie versuchen, einen Router auf die alte Art und Weise zu erstellen. Er hat sich im Laufe der Zeit geändert. Jetzt ist Router eine Klasse. Zweitens muss eine Ihrer Komponentenansichten als Startseite für ein System festgelegt werden. Andernfalls wird auf den meisten Websites der Router von com_content als Standardrouter verwendet. Daher wird jede falsche URL (URL, die keinen richtigen Menüeintrag/übergeordneten Eintrag enthält) von com_content Verarbeitet und gibt höchstwahrscheinlich 404 zurück Sie möchten mit SEF-URLs für Seiten umgehen, für die kein ordnungsgemäßer Menüeintrag erforderlich ist.

Beispiel Komponenten Router

Einen geeigneten Beispielrouter finden Sie unter dem folgenden Link. Beachten Sie jedoch, dass in einer der nächsten Versionen von Joomla! Die Art und Weise, wie Sie den Router erstellen, wird sich erneut ändern (wenn die Fehler beseitigt sind).

https://github.com/joomla-extensions/weblinks/blob/master/src/components/com_weblinks/router.php

3
Artur Stępień

Erstellen Sie Ihre URLs wie folgt:

echo JRoute::_('index.php?option=com_mycomponent&Itemid='.Itemid.'&aliasid=alias-'.$id);

Sie möchten die Itemid Ihres aktuellen Menüeintrags einfügen, damit die Dinge übersichtlicher werden und Sie den Überblick behalten, wo Sie sich gerade befinden. Das kann gefunden werden mit:

$Itemid = JFactory::getApplication()->getMenu()->getActive()->id;

Versuchen Sie dies für Ihren Router. Es ist ein sehr einfacher Router, der nach einer URL-Variablen mit dem Aliasnamen sucht und diesen Wert als Segment an den Routenparser übergibt. Der Routenparser schreibt dieses Element dann in eine Variable. Die Variable kann dann mit der Anwendungseingabemethode aufgerufen werden.

function myComponentBuildRoute(&$query)
{
    $app = JFactory::getApplication();
    $segments = array();
    if(isset($query['aliasid'])){
        $segments[] = $query['aliasid'];
        unset($query['aliasid']);
    }
    return $segments;
}


function myComponentParseRoute($segments)
{
    $vars = array();
    switch(count($segments))
    {
        case '1':
            $id = end(explode('-', str_replace(':','-',$segments[0])));
            $vars['id'] = $id;
            break;
    }
    return $vars;
}

Um die ID in Ihre Ansicht einzubinden, verwenden Sie einfach Folgendes:

$JInput = JFactory::getApplication()->input;
$this->id = $JInput->get('id','','int');
1
Terry Carter

Mein ursprüngliches Ziel war es, einen Alias ​​auf dem Frontend ohne Link mit Jroute oder Menü-ID zu erstellen ...

Nach langem Suchen scheint Joomla dies jedoch nicht zu können, oder wenn dies möglich ist, muss der Router möglicherweise ernsthaft geändert werden. Anstatt mich mit Joomla Router zu beschäftigen (ich habe es tatsächlich versucht), habe ich in meinem Plugin ein Skript erstellt, um einen Menütyp zu erstellen und in der Datenbank einen neuen Menüpunkt für jeden Menütyp für jede Seite zu speichern. Das war der einfachste Weg eine funktionierende URL für jeden Artikel in meinem JSON.

Wenn jemand einen Hinweis auf eine Router-Lösung haben möchte, können Sie diesen Link überprüfen: https://docs.joomla.org/Creating_a_System_Plugin_to_augment_JRouter

Es ist für j25 und ich glaube, der Router selbst hat sich nach dieser Version bereits stark verändert, aber es war das Nächste, was ich gefunden habe, das vorschlägt, wie der Joomla-Router überarbeitet werden soll. Vielleicht haben Sie einige Ideen, wie Sie vorgehen sollen.

1
user1967509