Ich versuche meine eigene XML-Sitemap zu erstellen. Alles ist erledigt, außer dem Teil, von dem ich dachte, dass er der einfachste sein würde. Wie erhalten Sie eine Liste aller Seiten auf der Website? Ich habe eine Menge Ansichten in einem / Site-Ordner und ein paar anderen. Gibt es eine Möglichkeit, explizit ihre URLs oder vielleicht über die Controller anzufordern?
Ich möchte keine Erweiterung verwenden
Sie können Reflektion verwenden, um alle Methoden aller Ihrer Controller zu durchlaufen:
%Vor%Sie müssen wissen, welchen Inhalt Sie in Ihre sitemap.xml aufnehmen möchten. Ich glaube nicht wirklich, dass Sie ALLE Seiten in Ihre sitemap.xml einbeziehen möchten. Oder wollen Sie wirklich etwas wie site.com/ aufnehmen? Artikel / Bearbeiten / 1?
Das heißt, Sie möchten vielleicht nur das Ergebnis der Aktion view
in Ihren Controllern. Die Wahrheit ist, dass Sie wissen müssen, was Sie indizieren möchten.
Denken Sie nicht in Bezug auf Controller / Aktionen / Ansichten, sondern denken Sie an die Ressourcen in Ihrem System, die indiziert werden sollen, seien es Artikel oder Seiten, die sich alle in Ihrer Datenbank befinden oder irgendwie gespeichert sind, damit Sie sie auflisten können sie, und sie haben einen URI, der sie identifiziert, den URI zu bekommen ist eine Frage des Aufrufs ein paar Funktionen.
Es gibt zwei Möglichkeiten -
Sie betreiben eine statische Website, dann finden Sie alle Ihre HTML-Dateien in einem Ordner - protected / views / site / pages Ссылка
Die Website ist dynamisch. Aufgaben wie das Generieren und Neugenerieren von Sitemaps können in Hintergrundaufgaben unterteilt werden.
Das Ausführen von Hintergrund-Aufgaben kann durch Emulieren des Browsers erreicht werden, der in Linux möglich ist - WGET , GET oder lynx Befehle
Oder Sie können einen CronController als CConsoleCommand erstellen. Wie man Befehle in YII benutzt, wird in folgendem Link gezeigt - Ссылка
Sitemap ist ein XML-Code, der die URL Ihrer Website auflistet. Aber es macht mehr als das. Es hilft Ihnen, die Struktur einer Website zu visualisieren, die Sie möglicherweise haben
Bei der Erstellung einer sinnvollen Erweiterung können die oben genannten Punkte vor dem Design berücksichtigt werden.
Frameworks wie Wordpress bieten eine Möglichkeit, eine kategorische Sitemap zu erstellen. Daher werden die Metadaten für jede Seite von vor und unter Verwendung der Metadaten, die sie entdeckt und gruppiert, gespeichert.
Lösung durch Reflexion, vorgeschlagen von @Pavle ist gut und sollte der richtige Weg sein. Berücksichtigen Sie, dass möglicherweise Teilansichten vorhanden sind und Sie diese nicht als separate Links auflisten möchten oder nicht.
Wie viel Aufwand Sie in die Erstellung der Erweiterung investieren möchten, hängt von einigen davon ab.
Sie können entweder den Benutzer auffordern, alle Variablen in config fie aufzulisten und von dort gehen, was nicht schlecht ist oder Sie müssen Seiten und Listen mit Techniken wie Reflexion und Seiten analysieren und nach regex suchen.
Für ex - Basierend auf Modulnamen können Sie diese zuerst gruppieren, und Controller innerhalb eines Moduls können eine Untergruppe bilden.
Ein erster Ansatz könnte darin bestehen, über die View-Dateien zu iterieren, aber dann müssen Sie berücksichtigen, dass Views in einigen Fällen keine Seitenziele sind, sondern Seitenbereiche in anderen Seiten, indem Sie CController::renderPartial()
Methode. Bei der Untersuchung der Klassenreferenz von CController stieß ich auf die Methode CController::actions()
.
Also, ich habe keine Yii-Methode gefunden, um alle Aktionen eines CControllers zu durchlaufen, aber ich habe php benutzt, um alle Methoden eines SiteControllers in einem meiner Projekte zu durchlaufen und sie zu filtern Auf diese mit dem Präfix 'action', das ist mein Aktions-Präfix, hier ist das Beispiel
%Vor%Und der Output, den ich bekam, war ..
Ich bin sicher, dass es noch weiter verfeinert werden kann, aber diese Methode sollte für jeden der Controller funktionieren, die Sie haben ...
Was Sie also tun müssen, ist:
Für jeden Controller: Filtern Sie alle Nicht-Aktionsmethoden der Klasse mit der obigen Methode. Sie können ein assoziatives Array wie
erstellen %Vor%Ich würde dafür eine statische Methode getAllActions () in meinem SiteController hinzufügen.
get_class_methods , get_class , strrev und < a href="http://php.net/manual/en/function.strlen.php"> strlen sind alle PHP-Funktionen.
Basierend auf Ihrer Frage: 1. Wie erhalten Sie eine Liste aller Seiten auf der Website?
Basierend auf Yiis Art von Modul / Controller / Action / Action_Params und Ihrer Notwendigkeit, eine Sitemap für SEO zu erstellen.
Die nächstbeste Lösung ist eine Inhaltsdatenbank und Sie wissen, wie Sie jeden Inhalt über URL-Regeln erhalten, und dann einen Cron-Konsolenjob, um alle URLs zu erstellen, die als sitemap.xml gespeichert werden sollen.
Hoffe, das hilft!