Hallo,
ist es irgendwie möglich eigene generierte Aliase von einen eigene Modul in der Sitemap.xmöl aufzunehmen wie zum Beispiel auch bei den Nachrichten?
Hallo,
ist es irgendwie möglich eigene generierte Aliase von einen eigene Modul in der Sitemap.xmöl aufzunehmen wie zum Beispiel auch bei den Nachrichten?
Liebe Grüße
WebRoxx
Ja, das macht man mit dem getSearchablePages Hook. Sieh' es dir am Beispiel des News Moduls an: https://github.com/contao/core/blob/.../News.php#L257
Das sieht ja doch etwas komplizierter aus als ich es mir gedacht habe :/ Nunja, mal sehen ob ich das meistere
Liebe Grüße
WebRoxx
Wie komme ich denn dort an meine "$this->jumpTo" aus mein Modul ran? Also bei den News ist das JumpTo ja aus dem Archiv
Liebe Grüße
WebRoxx
Du müsstest dir in so einem Fall:Diese Page ist dann quasi dein "jumpTo".
- alle "Reader" Module deiner Extension aus der Datenbank holen (das wäre dann deine erste Schleife ähnlich dem while ($objArchive->next())).
- Für dieses Modul suchst du dir dann das Inhaltselement, das dieses Modul inkludiert
- … darüber den Parent Article
- … darüber die Parent Page.
Muss das Thema leider nochmal aufgreifen.
Der hook läuft ja super, aber wie schreibt man in 2 XML-Files?
Habe de und en, und es hängt mir meine Seiten in beiden Sprachen in beide Dateien.
Hier der Code wo ich mir den alias erzeuge
PHP-Code:
// Add items to the indexer
while($groups->next()){
$alias = ($getModul->product_pages) ? $this->generateFrontendUrl(\PageModel::findPublishedByIdOrAlias($getModul->product_pages)->row(), "".($GLOBALS['TL_CONFIG']['useAutoItem'] ? '/' : '/items/').$groups->alias) : '';
$arrPages[] = $domain.$alias;
}
Liebe Grüße
WebRoxx
Folgende Parameter werden dem getSearchablePages Hook übergeben:Über $intRoot (wenn > 0) kannst du ermitteln, für welchen Website Root die searchable pages gerade generiert werden. Wie schon im ersten Post von mir hier im Thread erwähnt, solltest du dir den Hook einfach im News Modul ansehen.PHP-Code:
public function getSearchablePages($arrPages, $intRoot=0, $blnIsSitemap=false)
Geändert von Spooky (05.05.2016 um 09:47 Uhr)
Ja das ist mit klar
Aber ganz ehrlich verstehe ich ne wie ich da unterscheiden kann in welche xml-Datei geschrieben wird :/
Liebe Grüße
WebRoxx
Welche XML Datei geschrieben wird, hängt ja vom Website Root ab (dort definierst du ja auch, ob eine Sitemap erstellt werden soll und welchen Namen diese Sitemap haben soll).
Du musst ermitteln, in welchem Website Root sich deine Zielseite befindet und ob sich das mit $intRoot gleicht (wenn > 0).
Es ist wahrscheinlich totaler Käse aber hier mal komplett ich hoffe man sieht durch
PHP-Code:
$getModul = $this->Database->prepare("SELECT * FROM tl_content WHERE type=?")->execute('psProductsList');
while($getModul->next()){
$artikel = \ArticleModel::findById($getModul->pid);
$pageRoot = \PageModel::findBy(array('language=?','id=?','type=?'),array($strLanguage,$intRoot,'root'));
$groups = $this->Database->prepare("SELECT * FROM tl_products_groups WHERE language=? AND published=?")->execute($pageRoot->language,1);
$domain = ($pageRoot->rootUseSSL ? 'https://' : 'http://') . ($pageRoot->domain ?: \Environment::get('host')) . TL_PATH . '/';
while($groups->next()){
$alias = ($getModul->product_pages) ? $this->generateFrontendUrl(\PageModel::findPublishedByIdOrAlias($getModul->product_pages)->row(), "".($GLOBALS['TL_CONFIG']['useAutoItem'] ? '/' : '/items/').$groups->alias) : '';
$arrPages[] = $domain.$alias;
}
}
return $arrPages;
Liebe Grüße
WebRoxx
Kurzes Code Review:Eigentlich holst du dir dort keine Module, sondern Inhaltselemente, daher ist der Variablenname irreführend . Außerdem kannst du dort auch Models verwenden, bspw.:PHP-Code:
$getModul = $this->Database->prepare("SELECT * FROM tl_content WHERE type=?")->execute('psProductsList');
PHP-Code:
$objContent = \ContentModel::findByType('psProductsList');
Den Page root für das Inhaltselement bekommst du zB auch mitPHP-Code:
while($getModul->next()){
$artikel = \ArticleModel::findById($getModul->pid);
$pageRoot = \PageModel::findBy(array('language=?','id=?','type=?'),array($strLanguage,$intRoot,'root'));
(komplett gekürzt). Wenn du mal das PageModel des Artikels des Inhaltselements hast, dann sind derartige Informationen auch sofort verfügbar, vorausgesetzt loadDetails oder findWithDetails wurde benutzt. Andere Herangehensweise:PHP-Code:
$intContentRoot = $objContent->getRelated('pid')->getRelated('pid')->loadDetails()->rootId;
PHP-Code:
$intContentRoot = \PageModel::findWithDetails( $objContent->getRelated('pid')->pid )->rootId;
Nachdem du die Root ID hast, kannst du danach einfachmachen.PHP-Code:
if( $intRoot > 0 && $intRoot != $intContentRoot )
continue;
Ok, soweit so gut
deine $intContentRoot erzeugen bei mir aber alle
Fatal error: Uncaught exception Exception with message Field pid does not seem to be related thrown in system/modules/core/library/Contao/Model.php on line 604
Dann wo muss ich das setzten
denn vor meinen "Produktlink" werden diese nicht erzeugt und nachher sind dennoch beide Sprachen in den Files, allerding erzeuge ich die $intContentRoot auch mit meinen Code da der obige ja den Fehler auswirft, vielleicht liegt da bei mir auch der Hund begrabenPHP-Code:
if($intRoot > 0 && $intRoot != $intContentRoot)
continue;
EDIT: ja die Variable war blöd, hatte ich aus ein anderen Projekt kopiert
Geändert von WebRoxx (05.05.2016 um 18:50 Uhr)
Liebe Grüße
WebRoxx
Alles klar so geht
Vielen Dank für deine wie immer großartige Hilfe, fühl mich schon richtig mies :/PHP-Code:
$objContent = \ContentModel::findByType('psProductsList');
if($objContent !== null) {
while($objContent->next()){
$artikel = \ArticleModel::findById($objContent->pid);
$intContentRoot = \PageModel::findWithDetails( $artikel->getRelated('pid')->pid )->rootId;
....
Liebe Grüße
WebRoxx
Dasist ein wenig überflüssig, damit holst du dir ja schon die Seite, auf der sich der Artikel befindet. Da könntest du einfach nurPHP-Code:
$artikel->getRelated('pid')->pid
nehmen.PHP-Code:
$artikel->pid;
Kein Problem. Du könntest dich ja mit einer Kleinigkeit aus meiner Wunschliste revanchieren .
Wenn ich "public function myGetSearchablePages($arrPages, $intRoot=false" setze funktioniert es, allerdings habe ich 3 Seitenbäume und dann ist mein Eintrag in allen Sitemaps enthalten.
Leider wird mir $intRoot anscheinend nicht übergeben, so dass ich das gezielt steuern könnte.
Wenn ich $intRoot (nicht als false oder 0 definiere) erhalte ich im Contao 4.5 Log:
"[2018-02-22 16:13:18] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowa bleError(code: 0): Type error: Too few arguments to function mm_produkt_class::myGetSearchablePages(), 1 passed in /****/vendor/contao/core-bundle/src/Resources/contao/classes/RebuildIndex.php on line 104 and at least 2 expected at /***/system/modules/mm_produkt/mm_produkt_class.php:5)"} []"
Jemand eine Idee, wie ich Einträge nicht in alle XML Daten gleichzeitig schreibe?
Geändert von kalterwind (22.02.2018 um 15:22 Uhr)
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen