Um den Datumsstring für die einzelnen Newsbeiträge aus "tt_news" mit in die von der Extension "mc_googlesitemap" erstellten Sitemap zu bekommen, gibt es folgenden Fix.
Folgenden Code bitte in die Datei "class.tx_mcgooglesitemap_base.php" im Ordner "mc_googlesitemap" einfügen. Die geänderten Stellen zum Original sind markiert.
<?php
/***************************************************************
* Copyright notice
*
* (c) 2004 Maximo Cuadros (mcuadros@gmail.com)
* All rights reserved
*
* This script is part of the TYPO3 project. The TYPO3 project is
* free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This script is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/
/**
* Plugin 'Google Sitemap for Pages and Contents' for the 'mc_googlesitemap' extension.
*
* @author Maximo Cuadros <mcuadros@gmail.com>
* @others Peter Russ <peter.russ@4many.net>, 4Many Services
* Thx for some lines of code and guidelines
*/
class tx_mcgooglesitemap_base {
function tx_mcgooglesitemap_base($cObj,$type=0) {
$this->cObj = &$cObj;
ini_Set("max_execution_time",120);
$GLOBALS["TSFE"]->set_no_cache();
$this->act=array("1" => "Always", "2" => "Hourly", "3" => "Daily", "4" => "Weekly", "5" => "Monthly", "6" => "Yearly", "7" => "Never");
header('Content-type: text/xml');
$head[]='<?xml version="1.0" encoding="UTF-8"?>';
if ( $type != 2 ) {
#$head[]='<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">'."\n";
$head[]='<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
} else {
#$head[]='<sitemapindex xmlns="http://www.google.com/schemas/sitemap/0.84">'."\n";
$head[]='<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
}
echo implode("\n",$head); unset($head);
$tmp=explode("/",$GLOBALS['_SERVER']['PHP_SELF']);
unset($tmp[0]); unset($tmp[count($tmp)]);
$path=implode("/",$tmp);
if ( strlen($path) != 0 ) { $path.="/"; }
$host=$_SERVER['HTTP_X_FORWARDED_HOST'];
if (!$host) {
$host=$_SERVER['HTTP_HOST'];
}
$this->baseUrl='http://'.$host.'/'.$path;
if ( $this->cObj->data['tx_mcgooglesitemap_lastmod'] == 1 ) {
$this->dateFormat='Y-m-d\TH:i:s\Z';
} else {
$this->dateFormat="Y-m-d";
}
if ( $type == 0 ) {
$this->sitemapContent();
} elseif ($type==2) {
$this->sitemapIndex();
} else {
$this->sitemapPage();
}
echo "</urlset>\n";
exit();
}
function sitemapContent($array=array()) {
if ( count($array) == 0 ) { $array=$this->cObj->data; }
if ( $array['tx_mcgooglesitemap_objective'] == "tt_news" ) { return $this->sitemapTTNews($array); }
if ( $array['tx_mcgooglesitemap_changefreq'] != 0 ) { $fix['changefreq']=strtolower($this->act[$array['tx_mcgooglesitemap_changefreq']]); }
if ( $array['tx_mcgooglesitemap_priority'] <= 1 && $array['tx_mcgooglesitemap_priority'] > 0 ) {
$fix['priority']=$array['tx_mcgooglesitemap_priority'];
if ( strlen($fix['priority']) == 1 ) { $fix['priority'].=".0"; }
}
$sel=mysql_query("SELECT * FROM ".$array['tx_mcgooglesitemap_objective']." WHERE pid IN (".$array['pages'].") ".$this->cObj->enableFields($array['tx_mcgooglesitemap_objective']));
while ($row=mysql_fetch_array($sel,MYSQL_ASSOC)) {
#if ( $i++ > 10 ) { exit(); }
// Alter Code Anfang
// $tema=array_merge($fix,$tema);
// $tema['lastmod']=gmdate($this->dateFormat,$row['tstamp']);
// $tema['page']=$this->elcHash($array['tx_mcgooglesitemap_pageuid'],$this->replaceParams ($row,$array['tx_mcgooglesitemap_url']));
// if ($GLOBALS['TYPO3_CONF_VARS']['EXT']['mc_googlesitemap'] == 1 ) { $tema['page']=$this->changeTitle($tema['page'],$row['title']); }
// $tema['loc']=htmlspecialchars(utf8_encode($this->baseUrl.$tema['page']));
// Alter Code Ende
// ======== Neuer Code Anfang =======================
$tema=array_merge($fix,$tema);
$tema['lastmod']=gmdate($this->dateFormat,$row['tstamp']);
$tema['page']=$this->elcHash($row['single_pid'],
array("tx_ttnews[tt_news]" => $row['uid'],
"tx_ttnews[day]" => date("d",$row['datetime']),
"tx_ttnews[month]" => date("m",$row['datetime']),
"tx_ttnews[year]" => date("Y", $row['datetime'])));
$tema['loc']=htmlspecialchars(utf8_encode($this->baseUrl.$tema['page']));
// ======== Neuer Code Ende =========================
$this->createElement($tema);
unset($tema);
}
}
function sitemapTTNews($array=array()) {
if ( count($array) == 0 ) { $array=$this->cObj->data; }
if ( count($GLOBALS['TYPO3_LOADED_EXT']['tt_news']) == 0 ) { return; }
if ( $array['tx_mcgooglesitemap_changefreq'] != 0 ) { $fix['changefreq']=strtolower($this->act[$array['tx_mcgooglesitemap_changefreq']]); }
if ( $array['tx_mcgooglesitemap_priority'] <= 1 && $array['tx_mcgooglesitemap_priority'] > 0 ) {
$fix['priority']=$array['tx_mcgooglesitemap_priority'];
if ( strlen($fix['priority']) == 1 ) { $fix['priority'].=".0"; }
}
$pages=explode(',',$array['pages'] ? $array['pages'] : $GLOBALS['TSFE']->id);
foreach ($pages as $page) {
// Alter Code Anfang
// $res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT tt_news.uid,tt_news.tstamp, tt_news_cat.single_pid FROM tt_news LEFT OUTER JOIN tt_news_cat_mm ON tt_news_cat_mm.uid_local = tt_news.uid LEFT OUTER JOIN tt_news_cat ON tt_news_cat_mm.uid_foreign = tt_news_cat.uid WHERE tt_news.pid = '.$page.$this->cObj->enableFields("tt_news"));
// Alter Code Ende
// ======== Neuer Code Anfang =======================
$res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT tt_news.uid,tt_news.tstamp,tt_news.datetime,tt_news_cat.single_pid FROM tt_news LEFT OUTER JOIN tt_news_cat_mm ON tt_news_cat_mm.uid_local = tt_news.uid LEFT OUTER JOIN tt_news_cat ON tt_news_cat_mm.uid_foreign = tt_news_cat.uid WHERE tt_news.pid = '.$page.$this->cObj->enableFields("tt_news"));
// ======== Neuer Code Ende =========================
// $res = $GLOBALS['TYPO3_DB']->sql(TYPO3_db, 'SELECT tt_news.uid,tt_news.tstamp, tt_news_cat.single_pid FROM tt_news INNER JOIN tt_news_cat_mm ON tt_news_cat_mm.uid_local = tt_news.uid INNER JOIN tt_news_cat ON tt_news_cat_mm.uid_foreign = tt_news_cat.uid WHERE tt_news.pid = '.$page.$this->cObj->enableFields("tt_news"));
while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
if ( $row['single_pid'] == 0 ) { $row['single_pid']=$GLOBALS['TSFE']->tmpl->setup['plugin.']['tt_news.']['singlePid']; }
$tema=array_merge($fix,$tema);
$tema['lastmod']=gmdate($this->dateFormat,$row['tstamp']);
// ======== Neuer Code Anfang =======================
$tema['page']=$this->elcHash($row['single_pid'], array("tx_ttnews[tt_news]" => $row['uid'], "tx_ttnews[day]" => date("d",$row['datetime']), "tx_ttnews[month]" => date("m",$row['datetime']), "tx_ttnews[year]" => date("Y", $row['datetime'])));
// ======== Neuer Code Ende =========================
// ALT
// $tema['page']=$this->elcHash($row['single_pid'], array("tx_ttnews[tt_news]" => $row['uid']));
// ALT
$tema['loc']=htmlspecialchars(utf8_encode($this->baseUrl.$tema['page']));
if ( ((int)$row['single_pid']*1) == 0 ) { $row['single_pid']=$array['tx_mcgooglesitemap_pageuid']; }
if ( ((int)$row['single_pid']*1) != 0 ) { $this->createElement($tema); }
unset($tema);
}
print_R($i);
}
}
function sitemapIndex($array=array()) {
if ($this->cObj->data['pages']) {
$pages=explode(',',$this->cObj->data['pages'] ? $this->cObj->data['pages'] : $GLOBALS['TSFE']->id);
foreach ($pages as $page) {
$tree.=$this->cObj->getTreeList($page, 1000);
}
$tree=substr($tree, 0, strlen($tree)-1);
$getTree = " AND pages.uid IN (".$tree.") ";
} else {
$getTree = "";
}
$this->dateFormat='Y-m-d\TH:i:s\Z';
$res=mysql_query("SELECT tt_content.* FROM tt_content INNER JOIN pages ON pages.uid=tt_content.pid WHERE ( tt_content.menu_type='mc_googlesitemap_pi1' OR tt_content.menu_type='mc_googlesitemap_pi3' ) " . $getTree .$this->cObj->enableFields("pages")." ".$this->cObj->enableFields("tt_content"));
//$res=mysql_query("SELECT tt_content.* FROM tt_content INNER JOIN pages ON pages.uid=tt_content.pid WHERE ( tt_content.menu_type='mc_googlesitemap_pi1' OR tt_content.menu_type='mc_googlesitemap_pi3' ) " .$this->cObj->enableFields("pages")." ".$this->cObj->enableFields("tt_content"));
while($row=mysql_fetch_array($res)) {
$url= $this->cObj->typolink("",array("no_cache" => 0,"returnLast" => "url","parameter" => $row['pid'], "useCacheHash" => 0));
if ( $row['menu_type']=="mc_googlesitemap_pi1" ) {
$last=mysql_query("SELECT tstamp FROM ".$row['tx_mcgooglesitemap_objective']." WHERE pid IN (".$row['pages'].") ".$this->cObj->enableFields($row['tx_mcgooglesitemap_objective'])." ORDER BY tstamp DESC LIMIT 1");
} else {
$last=mysql_query("SELECT tstamp FROM pages WHERE pid IN (".$row['pages'].") ".$this->cObj->enableFields("pages")." ORDER BY tstamp DESC LIMIT 1");
}
$last=mysql_fetch_array($last);
$linea[]= "\t<sitemap>";
$linea[]= "\t\t<loc>".$this->baseUrl.$url."</loc>";
$linea[]= "\t\t<lastmod>".gmdate('Y-m-d\TH:i:s\Z',$last[0])."</lastmod>";
$linea[]= "\t</sitemap>";
echo implodE("\n",$linea); unset($linea);
}
echo "</sitemapindex>\n";
exit();
}
function sitemapPage($array=array()) {
if ( count($array) == 0 ) { $array=$this->cObj->data; }
$anormal=array();
$pages=explode(',',$array['pages'] ? $array['pages'] : $GLOBALS['TSFE']->id);
foreach ($pages as $page) {
$tree.=$this->cObj->getTreeList($page, 1000);
}
$tree=substr($tree, 0, strlen($tree)-1);
$sel=mysql_query("SELECT uid,pid,doktype,tx_mcgooglesitemap_priority AS prio,tx_mcgooglesitemap_changefreq AS freq FROM pages WHERE uid IN (".$tree.") ".$this->cObj->enableFields("pages"));
while ($row=mysql_fetch_array($sel,MYSQL_ASSOC)) {
$pids[$row['uid']]=$row['pid'];
$prios[$row['uid']]=$row['prio'];
$freqs[$row['uid']]=$row['freq'];
if ( ( !in_array($row['uid'],$pages) && ( $row['doktype'] == 254 || $row['doktype'] == 199 )) || @in_array($row['pid'],$anormal) ) {
$anormal[]=$row['uid'];
}
}
$tree=implode(",",array_merge($pages,array_diff(explode(",",$tree),$anormal)));
if ( count($anormal) != 0 ) {
$anormal=implode(",",$anormal);
$anormalSql=" pid NOT IN (".$anormal.") AND ";
}
$sel=mysql_query("SELECT * FROM pages WHERE doktype IN(1,2) AND ".$anormalSql." uid IN (".$tree.") AND nav_hide=0 ".$this->cObj->enableFields("pages"));
while ($row=mysql_fetch_array($sel,MYSQL_ASSOC)) {
$uid=$row['uid'];
$freq=$row['tx_mcgooglesitemap_changefreq'];
while (($freq == 0) && array_key_exists($uid,$pids)) {
$uid=$pids[$uid];
$freq=$freqs[$uid];
}
$uid=$row['uid'];
$prio=$row['tx_mcgooglesitemap_priority'];
while (($prio == 0) && array_key_exists($uid,$pids)) {
$uid=$pids[$uid];
$prio=$prios[$uid];
}
if ( $freq != 0 ) { $tema['changefreq']=strtolower($this->act[$freq]); }
if ( $prio <= 1 && $prio > 0 ) {
$tema['priority']=$prio;
if ( strlen($tema['priority']) == 1 ) { $tema['priority'].=".0"; }
}
$time=($row['SYS_LASTCHANGED']>$row['tstamp'])?$row['SYS_LASTCHANGED']:$row['tstamp'];
$tema['lastmod']=gmdate($this->dateFormat,$time);
$tema['page']=$this->elcHash($row['uid'],array(),0);
if ( @strpos('http://',$tema['page'])===false ) {
$tema['loc']=htmlspecialchars(utf8_encode($this->baseUrl.$tema['page']));
} else {
$tema['loc']=htmlspecialchars(utf8_encode($tema['page']));
}
$this->createElement($tema);
unset($tema);
}
}
function recoverTree($pids) {
$i=0; $pids=explode(",",$pids); $max=count($pids);
while ($i < $max) {
$salida=array_merge($salida,$tree= $this->cObj->getTreeList($pids[$i], 100));
$i++;
}
return $salida;
}
function replaceParams ($fields,$params) {
$params=str_replace("?","",$params);
$i=0; $max=count($fields); $keys=array_keys($fields);
while ($i < $max) {
$params=str_replace("###".$keys[$i]."###",$fields[$keys[$i]],$params);
$i++;
}
$i=0; $ele=explode("&",$params);$max=count($ele);
while ($i < $max) {
$tmp=explodE("=",$ele[$i]);
$salida[$tmp[0]]=$tmp[1];
$i++;
}
return $salida;
}
function elcHash ($page,$array,$cHash=1) {
$i=0; $max=count($array); $keys=array_keys($array);
while ($i < $max) {
if ( strlen($array[$keys[$i]]) != 0 ) {
$salida.="&".$keys[$i]."=".$array[$keys[$i]];
}
$i++;
}
$typolink_conf=array(
"no_cache" => 0,
"returnLast" => "url",
"parameter" => $page,
"additionalParams" => $salida,
"useCacheHash" => $cHash);
return $this->cObj->typolink("",$typolink_conf);
}
function createElement($array) {
$linea[]="\t<url>";
$linea[]="\t\t<loc>".$array['loc']."</loc>";
$linea[]="\t\t<lastmod>".$array['lastmod']."</lastmod>";
if ( strlen($array['changefreq']) != 0 ) { $linea[]="\t\t<changefreq>".$array['changefreq']."</changefreq>"; }
if ( strlen($array['priority']) != 0 ) { $linea[]="\t\t<priority>".$array['priority']."</priority>"; }
$linea[]="\t</url>\n";
echo implode("\n",$linea); unset($linea);
}
function changeTitle($url,$str){
$str=str_replace(chr(225),"a",$str);
$str=str_replace(chr(233),"e",$str);
$str=str_replace(chr(237),"i",$str);
$str=str_replace(chr(243),"o",$str);
$str=str_replace(chr(250),"u",$str);
$str=str_replace(chr(193),"A",$str);
$str=str_replace(chr(201),"E",$str);
$str=str_replace(chr(205),"I",$str);
$str=str_replace(chr(211),"O",$str);
$str=str_replace(chr(218),"U",$str);
$str=str_replace(chr(241),"n",$str);
$str=str_replace(chr(209),"N",$str);
$str=str_replace("+","",$str);
$str=str_replace("%","",$str);
$str=str_replace("&","",$str);
$str=str_replace("(","",$str);
$str=str_replace(")","",$str);
$str=str_replace("$","",$str);
$str=str_replace("@","",$str);
$str=str_replace("#","",$str);
$str=str_replace("!","",$str);
$str=str_replace("","",$str);
$str=str_replace("?","",$str);
$str=str_replace("","",$str);
$str=str_replace(":","",$str);
$str=str_replace('.',"",$str);
$str=str_replace("'","",$str);
$str=str_replace("'","",$str);
$str=str_replace("*","",$str);
$str=str_replace(';',"",$str);
$str=str_replace(',',"",$str);
$str=str_replace(" ","_",$str);
$str=str_replace("\n","",$str);
$str=str_replace("\r","",$str);
$str=str_replace("\t","",$str);
$tmp=explode('.',$url);
$tmp[0]=$str;
return implode('.',$tmp);
}
}
if (defined("TYPO3_MODE") && $TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/mc_googlesitemap/class.tx_mcgooglesitemap_base.php"])
{
include_once ($TYPO3_CONF_VARS[TYPO3_MODE]["XCLASS"]["ext/mc_googlesitemap/class.tx_mcgooglesitemap_base.php"]);
}
?>