Danke für den Hinweis, die neue Version 1.2.3 behebt das Problem.
Danke für den Hinweis, die neue Version 1.2.3 behebt das Problem.
terminal42 gmbh
Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle
Hallo zusammen,
ich nutze die aktuelle Version der Erweiterung (1.2.3 Stable Build 3) mit Contao 2.9.0 und einer Installation in einem Unterverzeichnis.
Mir ist aufgefallen, dass in meiner sitemap.xml eine falsche URL für die "Erste Seite" auftaucht, denn sie enthält 2x den TL_PATH (inkl. doppeltem Slash), d.h. der Eintrag sieht folgendermaßen aus:
Nun habe ich mich mal auf die Suche begeben und festgestellt, dass in der Funktion checkInitialPage() wohl ein Fehler enthalten ist:Code:<url> <loc> http://www.domain.tld/bla//bla/ </loc> </url>
Die markierte Stelle müsste korrekterweise heißen:Code:/** * Hook function for generateFrontendUrl() */ public function checkInitialPage($arrPage, $strParams, $strUrl) { if (!isset($arrPage['initialPage'])) { $objPage = $this->Database->prepare("SELECT * FROM tl_page WHERE id=?")->execute($arrPage['id']); if ($objPage->numRows) { $arrPage['initialPage'] = $objPage->initialPage; } } if ($arrPage['initialPage'] && !strlen($strParams)) { return TL_PATH . '/'; } return $strUrl; }
Die korrekte Domain inkl. TL_PATH wird bereits vor dem Aufruf des Callbacks bestimmt und der Callback soll lediglich den Alias an sich auflösen bzw. modifizieren (vgl. Debug-Ausgabe von $strUrl im Callback). Im Falle der ersten Seite hieße das also den Page-Alias durch '' zu ersetzen.Code:/** * Hook function for generateFrontendUrl() */ public function checkInitialPage($arrPage, $strParams, $strUrl) { if (!isset($arrPage['initialPage'])) { $objPage = $this->Database->prepare("SELECT * FROM tl_page WHERE id=?")->execute($arrPage['id']); if ($objPage->numRows) { $arrPage['initialPage'] = $objPage->initialPage; } } if ($arrPage['initialPage'] && !strlen($strParams)) { return ''; } return $strUrl; }
Habe den o.g. Code bei mir getestet, und er führt im Frontend sowie in der sitemap.xml zu korrekten URLs.
Falls ich was übersehen haben sollte, einfach melden, ansonsten wäre es schön, wenn das entsprechend gefixt werden könnte
Danke und viele Grüße,
Fabio
Hallo Fabio,
Damit funktioniert es nach meinem Wissen nicht mehr, wenn du im Root-Ordner bist.
terminal42 gmbh
Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle
Hi Andreas,
werde es heute Nachmittag mal testen, aber meiner Meinung nach sollte das keine Auswirkungen haben, denn wie gesagt ist die BaseURL zu dem Zeitpunkt schon bestimmt (inkl. ggf. gesetzten TL_PATH).
Ich melde mich später nochmal wenn ich das getestet habe.
Grüße,
Fabio
Hi nochmal,
mein "Problemlösungsbedürfnis" hat mich dazu motiviert, es doch gleich auszuprobieren
Ergebnis: Funzt trotzdem noch - Sitemap und FrontendUrls bleiben von der Änderung im "Root-Betrieb" unberührt.
Grüße,
Fabio
Nach meinem Wissen wird dann für die "Erste Seite" ein leeres Alias generiert, oder?
Deine Lösung war ursprünglich schon mal drin, hat aber auch Probleme gemacht.
terminal42 gmbh
Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle
Hi,
ja, der Alias für die erste Seite ist leer - aber das ist ja auch das gewünschte Verhalten oder nicht?
Man kommt somit bei Klick auf die erste Seite auf die Basis-URL, also Domain + TL_PATH.
Ohne den alten Code gesehen zu haben würde ich vermuten, dass du damals vielleicht '/' zurückgegeben hast? Das lässt den TL_PATH-Anteil nämlich verschwinden, so dass wieder das bekannte Problem auftritt, wenn man nicht im Root installiert hat.
Aber wie gesagt, bei meinen Versuchen vorhin hat es sowohl im Root als auch in Subfoldern geklappt. Vielleicht kann das ja noch jemand testen?
Grüße,
Fabio
Der Alias darf nicht komplett leer sein, sondern müsste mindestens "/" oder so sein... Das ist genau das Problem welches ich noch nicht lösen konnte.
terminal42 gmbh
Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle
Hi,
ich denke ich hab jetzt verstanden was das Problem ist. Leeres Alias bedeutet im Frontend einen solchen Link:
Daher hab ich nun erst mal meine letzte Änderung rückgängig gemacht, so dass checkInitialPage() nun wieder so aussieht:Code:<a href="" ...>Erste Seite</a>
Dafür mussten allerdings 2 andere Methoden unter's Messer.PHP-Code:
/**
* Hook function for generateFrontendUrl()
*/
public function checkInitialPage($arrPage, $strParams, $strUrl)
{
if (!isset($arrPage['initialPage']))
{
$objPage = $this->Database->prepare("SELECT * FROM tl_page WHERE id=?")->execute($arrPage['id']);
if ($objPage->numRows)
{
$arrPage['initialPage'] = $objPage->initialPage;
}
}
if ($arrPage['initialPage'] && !strlen($strParams))
{
return TL_PATH . '/';
}
return $strUrl;
}
1. Opfer war getPageOptions(), denn beim Versuch das 2. Opfer zu flicken ist mir aufgefallen, dass zunächst dieser Patient behandelt werden muss. Die Änderung sieht folgendermaßen aus:
Alt
Code:/** * Returns an array of all regular pages including their sitemap settings * * Based on Backend::getSearchablePages() from TYPOlight 2.6.5 */ protected function getPageOptions($pid=0, $domain='', $blnHook=true) { $time = time(); // Get published pages $objPages = $this->Database->prepare("SELECT * FROM tl_page WHERE pid=? AND (start='' OR start<?) AND (stop='' OR stop>?) AND published=1 ORDER BY sorting") ->execute($pid, $time, $time); if ($objPages->numRows < 1) { return array(); } // Fallback domain if (!strlen($domain)) { $domain = $this->Environment->base; } $arrPages = array(); // Recursively walk through all subpages while($objPages->next()) { // Set domain if ($objPages->type == 'root') { if (strlen($objPages->dns)) { $domain = ($this->Environment->ssl ? 'https://' : 'http://') . $objPages->dns . TL_PATH . '/'; } else { $domain = $this->Environment->base; } } // Add regular pages elseif ($objPages->type == 'regular') { // Searchable and not protected if (!$objPages->noSearch && (!$objPages->protected || $GLOBALS['TL_CONFIG']['indexProtected'])) { // Published if ($objPages->published && (!$objPages->start || $objPages->start < $time) && (!$objPages->stop || $objPages->stop > $time)) { // Start page marker if ($objPages->initialPage) { $arrPages[$domain] = $objPages->row(); } else { $arrPages[$domain . $this->generateFrontendUrl($objPages->row())] = $objPages->row(); } // Get articles with teaser $objArticle = $this->Database->prepare("SELECT * FROM tl_article WHERE pid=? AND (start='' OR start<?) AND (stop='' OR stop>?) AND published=1 AND showTeaser=1 ORDER BY sorting") ->execute($objPages->id, $time, $time); while ($objArticle->next()) { $arrPages[$domain . $this->generateFrontendUrl($objPages->row(), '/articles/' . ((strlen($objArticle->alias) && !$GLOBALS['TL_CONFIG']['disableAlias']) ? $objArticle->alias : $objArticle->id))] = $objPages->row(); } } } } // Get subpages if ((!$objPages->protected || $GLOBALS['TL_CONFIG']['indexProtected'])) { $arrPages = array_merge($arrPages, $this->getPageOptions($objPages->id, $domain, false)); } } // HOOK: get additional page options if ($blnHook && isset($GLOBALS['TL_HOOKS']['getSitemapOptions']) && is_array($GLOBALS['TL_HOOKS']['getSitemapOptions'])) { foreach ($GLOBALS['TL_HOOKS']['getSitemapOptions'] as $callback) { $this->import($callback[0]); $arrPages = $this->$callback[0]->$callback[1]($arrPages, $domain); } } return $arrPages; }
Neu
Grund hierfür ist der, dass in der createSitemap()-Methode zunächst das $arrPages-Array mit der jeweiligen URL als Key aufgebaut wird mittels findSearchablePages(). Diese Methode benutzt aber bereits die BaseURL + generateFrontendUrl() inkl. vorhandene Hooks zur Generierung der URLs, so dass der Index für die "Erste Seite" hier also $arrPages['http://meineseite.de/subfolder//subfolder/']. Die Tatsache, dass hier auch schon der "Fehler" aus der Sitemap auftaucht, ist erst mal egal. Das Problem ist nun aber, dass durch den bisherigen Code in getPageOptions() der Index für das $arrPageOptions-Array nicht nach gleichem Muster generiert wurde, sondern für die erste Seite eben nur $domain als Key gesetzt wird, also folglich $arrPageOptions['http://meineseite.de/subfolder/'].Code:/** * Returns an array of all regular pages including their sitemap settings * * Based on Backend::getSearchablePages() from TYPOlight 2.6.5 */ protected function getPageOptions($pid=0, $domain='', $blnHook=true) { $time = time(); // Get published pages $objPages = $this->Database->prepare("SELECT * FROM tl_page WHERE pid=? AND (start='' OR start<?) AND (stop='' OR stop>?) AND published=1 ORDER BY sorting") ->execute($pid, $time, $time); if ($objPages->numRows < 1) { return array(); } // Fallback domain if (!strlen($domain)) { $domain = $this->Environment->base; } $arrPages = array(); // Recursively walk through all subpages while($objPages->next()) { // Set domain if ($objPages->type == 'root') { if (strlen($objPages->dns)) { $domain = ($this->Environment->ssl ? 'https://' : 'http://') . $objPages->dns . TL_PATH . '/'; } else { $domain = $this->Environment->base; } } // Add regular pages elseif ($objPages->type == 'regular') { // Searchable and not protected if (!$objPages->noSearch && (!$objPages->protected || $GLOBALS['TL_CONFIG']['indexProtected'])) { // Published if ($objPages->published && (!$objPages->start || $objPages->start < $time) && (!$objPages->stop || $objPages->stop > $time)) { // Start page marker $arrPages[$domain . $this->generateFrontendUrl($objPages->row())] = $objPages->row(); // Get articles with teaser $objArticle = $this->Database->prepare("SELECT * FROM tl_article WHERE pid=? AND (start='' OR start<?) AND (stop='' OR stop>?) AND published=1 AND showTeaser=1 ORDER BY sorting") ->execute($objPages->id, $time, $time); while ($objArticle->next()) { $arrPages[$domain . $this->generateFrontendUrl($objPages->row(), '/articles/' . ((strlen($objArticle->alias) && !$GLOBALS['TL_CONFIG']['disableAlias']) ? $objArticle->alias : $objArticle->id))] = $objPages->row(); } } } } // Get subpages if ((!$objPages->protected || $GLOBALS['TL_CONFIG']['indexProtected'])) { $arrPages = array_merge($arrPages, $this->getPageOptions($objPages->id, $domain, false)); } } // HOOK: get additional page options if ($blnHook && isset($GLOBALS['TL_HOOKS']['getSitemapOptions']) && is_array($GLOBALS['TL_HOOKS']['getSitemapOptions'])) { foreach ($GLOBALS['TL_HOOKS']['getSitemapOptions'] as $callback) { $this->import($callback[0]); $arrPages = $this->$callback[0]->$callback[1]($arrPages, $domain); } } return $arrPages; }
Das hat nun Auswirkungen auf createSitemap(), denn für die erste Seite wird also nie eiein Options-Array gefunden werden, denn
Da dies aber durch o.g. Fix behoben ist, können wir nun folgendes in createSitemap() ändern, damit die <loc> für die erste Seite richtig ins XML-File geschrieben wird:Code:// Add pages foreach ($arrPages as $strUrl) { // Options for this page, if available $arrOptions = $arrPageOptions[$strUrl]; ... if (!is_array($arrOptions) || (!strlen($arrOptions['sitemap_lastmod']) && !strlen($arrOptions['sitemap_changefreq']) && !strlen($arrOptions['sitemap_priority']))) { $objFile->append(' <url><loc>' . $strUrl . '</loc></url>'); } ...
Code:... if (!is_array($arrOptions) || (!strlen($arrOptions['sitemap_lastmod']) && !strlen($arrOptions['sitemap_changefreq']) && !strlen($arrOptions['sitemap_priority']))) { $objFile->append(' <url><loc>' . $strUrl . '</loc></url>'); } else { if ($arrOptions['sitemap_ignore']) continue; if ($arrOptions['initialPage']) { $objFile->append(" <url>\n <loc>" . $strDomain . "</loc>"); } else { $objFile->append(" <url>\n <loc>" . $strUrl . "</loc>"); } ...
Damit hab ich nun die gleiche Funktionalität hergestellt wie vorher, allerdings sieht der Frontend-Link nun so aus:
Wäre schön wenn du das mal testen/nachvollziehen könntest, aber ich glaube es müsste nun passen oder?Code:<a href="/subfolder/" ...>Erste Seite</a>
Grüße,
Fabio
Gibt's hier was Neues? Neue Version hab ich jedenfalls leider noch keine im Repository gesehen...
Ich bin die nächsten 2 Wochen in den Ferien und werde daran nichts machen können. Du müsstest das Problem bei dir selber beheben.
terminal42 gmbh
Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle
Hallo zusammen,
Situation:
Ich habe für deutsch und englisch jeweils zwei Seitenbäume (Starpunkte einer Website). Ich kann nun zwar für jeden Baum eine Sitemap generieren, hätte die aber für Google lieber übergreifend, denn eigentlich handelt es sich ja nach außen hin betrachtet um _eine_ website.
Wie ist denn hier das Best-Practice? Oder muss ich mir ein Skript programmieren, dass die einzelnen Sitemaps einliest und eine neue, gemeinsame daraus schreibt?
Gruß
Timo
what does google say to that?
terminal42 gmbh
Wir sind Contao Premium-Partner! Für Modulwünsche oder Programmierungen kannst du uns gerne kontaktieren.
Hilfe für Isotope eCommerce kann man auch kaufen: Isotope Circle
Eine Sitemapindex-Datei ist die Lösung:
http://www.google.com/support/webmas...e&answer=71453
ich war mit der Erweiterung sehr zufrieden.
Durch das Update auf Contao 2.10.2 leider nicht mehr möglich.
Gibt es die Erweiterung nicht mehr?
funktioniert bei mir unter 2.10.2 immernoch tadellos.
gruss andi
Gruss Andi
ich hatte die Erweiterung aus Vorsicht vor dem Update von 2.9.5 auf 2.10.2 deinstalliert.
Im Erweiterungskatalog taucht nichts mehr auf.
Heißt wohl, die alte Version irgendwie händisch installieren?
entweder du setzt unter einstellungen im bereich «xtension Repository»einen haken bei «Inkompatible Erweiterungen anzeigen» oder du installierst die erweiterung unter «erweiterungsverwaltung», rechts oben «Erweiterung installieren».
gruss andi
Gruss Andi
danke, so gemacht.
Jedoch erhalte ich bei Änderung eines Artikels die Fehlermeldung
Invalid request token!
The request token could not be verified. Please go back and try again.
This error occurres if there is a POST request without a valid authentication token. In Contao 2.10, the referer check has been replaced with a request token system. If the problem persists, you are maybe using an incompatible third-party extension or have not correctly updated your Contao installation.
Hat sich nun erledigt, nach in Einstellungen | Sicherheitseinstellungen das Häckchen gesetzt wurde "Anfrage-Tokens deaktivieren"
Änderungen werden nun in der Sitemap gespeichert
Gruß Ordix
Geändert von ordix (07.11.2011 um 14:02 Uhr)
Hallo!
Wahrscheinlich habe ich Tomaten auf den Augen, aber ich hoffe, dass mir trotzdem jemand kurz weiterhelfen kann.
Ich würde ganz gerne auf meinen Seiten das letzten Änderungsdatum der Seite (also aller Artikel dieser Seite) automatisch generiert anzeigen lassen. Die Google-Sitemap-Erweiterung habe ich schon installiert. Leider komme ich nicht drauf, was ich nun weiter tun muss. Zudem bin ich verwirrt, dass im Backend bei der Seitenstruktur im Bereich XML-Sitemap sich nichts in das Feld "Letzte Änderung" einträgt, wenn ich einen Artikel bearbeitet habe.
Wäre toll, wenn mir jemand auf die Sprünge helfen könnte.
Vielen Dank!
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen