Patches für TYPO3 Extensions

Anbei werden Patches beschrieben, die beim Arbeiten mit verschiedenen TYPO3 Erweiterungen gemacht wurden.

realurl

Änderungen in der Datei ''ext_localconf.php''

Hier haben wir drin rumgefrickelt, um vermutlich realurl mit tt_news zum Laufen zu bringen. Nix genaues weiss ich aber nicht mehr.

:!: Wichtig: 'rootpage_id' => '1' muss entsprechend dem Seitenbaum angepasst werden, sonst böser „was not a keyword for a postVarSet as expected!“-Fehler!

Hier die ganze Datei:

<?php
 
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tstemplate.php']['linkData-PostProc']['tx_realurl'] = 'EXT:realurl/class.tx_realurl.php:&tx_realurl->encodeSpURL';
$TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkAlternativeIdMethods-PostProc']['tx_realurl'] = 'EXT:realurl/class.tx_realurl.php:&tx_realurl->decodeSpURL';
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearPageCacheEval']['tx_realurl'] = 'EXT:realurl/class.tx_realurl.php:&tx_realurl->clearPageCacheMgm';
 
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearAllCache_additionalTables']['tx_realurl_urldecodecache'] = 'tx_realurl_urldecodecache';
$TYPO3_CONF_VARS['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['clearAllCache_additionalTables']['tx_realurl_urlencodecache'] = 'tx_realurl_urlencodecache';
 
$TYPO3_CONF_VARS['FE']['addRootLineFields'].= ',tx_realurl_pathsegment';
$TYPO3_CONF_VARS['EXTCONF'] ['realurl'] ['_DEFAULT'] = array(
   	'init' => array(
      		'enableCHashCache' => 1,
      		'enableUrlDecodeCache' => 1,
      		'enableUrlEncodeHash' => 1,
   	),
//				   'preVars' => array(
//		      array(
//         		'GETvar' => 'L',
//      		   'valueMap' => array(
//            			'de' => '0',
//         			   'en' => '1',
//      		   ),
//         		'valueDefault' => 'de',
//   		   ),
//	   ),
		'pagePath' => array(
   		'type' => 'user',
   		'userFunc' => 'EXT:realurl/class.tx_realurl_advanced.php:&tx_realurl_advanced->main',
   		'spaceCharacter' => '-',
   		'languageGetVar' => 'L',
   		'expireDays' => 3,
   		'rootpage_id' => '1'
	),
		'fileName' => array (
		   'defaultToHTMLsuffixOnPrev' => 1,
   		'index' => array(
      			'page.html' => array(
         				'keyValues' => array (
            					'type' => 1,
         				),
      			),
   		),
	),
		'fixedPostVarSets' => array(
	   ),
	   	'postVarSets' => array(
      		'_DEFAULT' => array(
         			'period' => array (
            				array (
               					'condPrevValue' => -1,
               					'GETvar' => 'tx_ttnews[pS]',
               					//'valueMap => array()
            				),
            				array (
               					'GETvar' => 'tx_ttnews[pL]',
               					//'valueMap => array()
            				),		
				            array (
               					'GETvar' => 'tx_ttnews[arc]',
               					'valueMap' => array(
               					'non-archived' => -1,
            					),
         				),
      			),
	   			'browse' => array (
      				array (
         					'GETvar' => 'tx_ttnews[pointer]',
      				),
			   ),
		   			'select' => array (
      				array (
         					'GETvar' => 'tx_ttnews[cat]',
         					'lookUpTable' => array (
            						'table' => 'tt_news_cat',
            						'id_field' => 'uid',
            						'alias_field' => 'title',
            						'addWhereClause'=> 'AND NOT deleted',
            						'useUniqueCache'=> 1,
            						'useUniqueCache_conf' => array (
               							'strtolower' => 1,
               							'spaceCharacter' => '-',
            						),
        	 				),
      				),
			   ),
						'article' => array( 
//				   array (
//     					'GETvar' => 'tx_ttnews[backPid]',
      					// 'valueMap => array(
      					// ),
//   				),
				   array (
      					'GETvar' => 'tx_ttnews[tt_news]',
					      'lookUpTable' => array (
      						'table' => 'tt_news',
      						'id_field' => 'uid',
      						'alias_field' => 'title',
      						'maxLength' => 12,
      						'addWhereClause'=> 'AND NOT deleted',
      						'useUniqueCache'=> 1,
      						'useUniqueCache_conf' => array (
         							'strtolower' => 1,
         							'spaceCharacter' => '-',
      						),
					   ),
				),
			),
		),
	), 
);
?>

aux_newsmailer

Änderungen in der Datei ''ext_tables.php''

Ein neue Checkbox einfügen, mit der man ändern kann, ob eine News neu ist oder schon einmal gesendet wurde. Dies hilft auch enorm beim Debuggen! An dieser Stelle herzlichen Dank an Typo3-Nürnberg!

Hierfür in der Datei ext_tables.php folgenden Code einfügen:

/* Das wird eingefügt */
$tempColumns = Array (
    "tx_auxnewsmailer_scanstate" => Array (       
        "exclude" => 1,       
        "label" => "Newsletter Status",       
        "config" => Array (
            'type' => 'select',
            'items' => Array (
                Array('Neu', 0),
                Array('Gesendet', 2)
            ),
            "default"=>"0",
        )
    ),
);
t3lib_div::loadTCA("tt_news");
t3lib_extMgm::addTCAcolumns("tt_news",$tempColumns,1);
t3lib_extMgm::addToAllTCAtypes("tt_news","tx_auxnewsmailer_scanstate;;;;1-1-1");
 
/* Hier beginnt der Originalcode */
$TCA["tx_auxnewsmailer_maillist"] = Array (
	"ctrl" => Array (
...

Änderungen in der Datei ''mod1/class_auxnewsmailer_core.php''

eMails formatieren

Layout ohne CSS

Manche Mail-Programme, z.B. das Webfrontend von web.de, haben den HTML Code nicht sauber angezeigt. Dieser wird im aux_newsmailer z.T. über das Template /res/template.tmpl bestimmt, der Code für die einzelnen News aber ist genialerweise in der /mod1/class_auxnewsmailer_core.php fest verdrahtet.

Wenn man dort die Funktion formatHTML() anpasst, indem man die Klassen durch direkte Stilangaben ersetzt, sieht die Ansicht besser aus.

function formatHTML($ctrl,$news){
	global $LANG;
 
	$i=explode(',',$news['image']);
	$image=$i[0];
	$newsdate=strftime($ctrl['dateformat'], $news['datetime']);
 
	$showitems=$ctrl['showitems'];
	$result.='<div style="padding:0px; margin:0px; clear:both; text-align:left; border-bottom:2px solid #acb5ce;">';
 
	$result.='<div style="clear:both; float:left;">';
	if (t3lib_div::inlist($showitems,'2'))
		$result.='<div class="newsmailimage">'.$this->getImage($image,$ctrl['listimagew'],$ctrl['listimageh']).'</div>';
	if (t3lib_div::inlist($showitems,'1'))
		$result.='<div style="font-weight:bold; margin-bottom:6px; background-color: #acb5ce; color: #000088; padding:10px;">'.$news['title'].'</div>';
	if (t3lib_div::inlist($showitems,'4'))
		$result.='<div style="font-size:100%; color:#000088; padding: 0px 10px 0px 10px; float:left;">'.$newsdate.'</div>';
		$result.='<div style="font-weight:bold; color:#000088; padding: 0px 10px 0px 10px;">'.$news['short'].'</div>';
	if (t3lib_div::inlist($showitems,'3'))
		$result.='<div style="float:left; padding:10px;">'.$this->formatStrHTML($news['bodytext']).'</div>';
	else
		$result.='<div class="newsmaillink"><a href="http://'.$ctrl['orgdomain'].'/index.php?id='.$ctrl['newspage'].'&tx_ttnews[tt_news]='.$news['uid'].'">'.$LANG->getLL("readmore").'</a></div>';
		$result.='</div>';
	return $result;
	}

Die Formatierung mit CSS funktioniert aber weder in Outlook/Entourage noch in Lotus Notes. Dazu muss man noch etwas weiter gehen:

function formatHTML($ctrl,$news){
	global $LANG;
 
	$i=explode(',',$news['image']);
	$image=$i[0];
	$newsdate=strftime($ctrl['dateformat'], $news['datetime']);
 
	$showitems=$ctrl['showitems'];
	$result.='<tr bgcolor="#acb5ce">';
 
	if (t3lib_div::inlist($showitems,'1'))
		$result.='<td valign="middle" colspan="2"><font color="#000088" size="2" face="Arial,Helvetica,sans-serif"><b>'.$news['title'].'</b></font></td></tr>';
	if (t3lib_div::inlist($showitems,'4'))
		$result.='<tr bgcolor="#eaedf3"><td><font color="#000088" size="2" face="Arial,Helvetica,sans-serif">'.$newsdate.'</font></td>';
		$result.='<td><font color="#000088" size="2" face="Arial,Helvetica,sans-serif"><b>'.$news['short'].'</b></font></td></tr>';
	if (t3lib_div::inlist($showitems,'3'))
		$result.='<tr bgcolor="#eaedf3"><td colspan="2"><font color="#000000" size="2" face="Arial,Helvetica,sans-serif">'.$this->formatStrHTML($news['bodytext']).'</font></td></tr>';
	else
		$result.='<div class="newsmaillink"><a href="http://'.$ctrl['orgdomain'].'/index.php?id='.$ctrl['newspage'].'&tx_ttnews[tt_news]='.$news['uid'].'">'.$LANG->getLL("readmore").'</a></div>';
		$result.='</div>';
		$result.='<div style="clear:both;"></div></div>';
	return $result;
	}
Zeilenvorschübe

Eine neue Funktion formatStrHTML() ermöglicht HTML Code zu erzeugen, bei dem alle Zeilenvorschübe durch <br> ersetzt werden. Die Funktion wird in formatHTML() aufgerufen.

    /**
     * Format string with general_stdWrap from configuration
     *     
     * @param	string		$string to wrap     
     * @return	string		wrapped string
     */
    function formatStrHTML($str) {
        if (is_array($this->conf['general_stdWrap.'])) {
            $str = $this->local_cObj->stdWrap($str, $this->conf['general_stdWrap.']);
        }
        return nl2br($str);
    }
 

Gelöschte Benutzer erhalten weiterhin eMails

Es gibt einen Bug, wenn man die fe_users Erweiterung benutzt. Ein Benutzer der sich von der Emailliste abgemeldet hat, bekommt trotzdem Newsletter. Dies behebt man durch einfügen einer Zeile, in der abgefragt wird, ob der Benutzer gelöscht wurde. Weiterhin wird durch das auskommentieren einer Zeile erreicht, dass man nicht alle Ordner und Unterordner angeben muss, aus denen Newsletter generiert werden, sondern das immer alle News berücksichtigt werden. Hierfür muss auch die Datei mod1/index.php angepasst werden (s.u.). Hier der Originalcode aus der Funktion scanNews():

    $sql.='fe_users.pid='.$row['userpid'].' and ';
    $sql.='fe_users.tx_auxnewsmailer_newsletter=1 and ';
    $sql.='tt_news.pid in '.$pid.' and ';
    $sql.='tt_news.hidden=0 and ';
    $sql.='tt_news.deleted=0 and ';
    $sql.='tt_news.starttime<'.time().' and ';
    $sql.='tx_auxnewsmailer_scanstate=1';
    $sql.=' order by tt_news.uid';
    $res =$GLOBALS['TYPO3_DB']->sql_query($sql);
    $cnt=$GLOBALS['TYPO3_DB']->sql_affected_rows();

Und hier unsere Anpassungen:

    $sql.='fe_users.pid='.$row['userpid'].' and ';
    $sql.='fe_users.tx_auxnewsmailer_newsletter=1 and ';
// Auskommentiert, damit alle News berücksichtigt werden, egal welche Kategorien man wählt. 
//    $sql.='tt_news.pid in '.$pid.' and ';
    $sql.='fe_users.deleted=0 and '; // Hinzugefügt, damit gelöschte Benutzer keine News erhalten
    $sql.='tt_news.hidden=0 and ';
    $sql.='tt_news.deleted=0 and ';
    $sql.='tt_news.starttime<'.time().' and ';
    $sql.='tx_auxnewsmailer_scanstate=1';
    $sql.=' order by tt_news.uid';
    $res =$GLOBALS['TYPO3_DB']->sql_query($sql);
    $cnt=$GLOBALS['TYPO3_DB']->sql_affected_rows();

Änderungen in der Datei ''mod1/index.php''

Damit immer alle News durchsucht werden ist, wird in der Funktion renderOverview() eine Zeile geändert. Originalcode:

    'deleted=0 and hidden=0 and tx_auxnewsmailer_scanstate<2 and tt_news.pid in '.$ctrl['pages'],

Angepasster Code:

    'deleted=0 and hidden=0 and tx_auxnewsmailer_scanstate<2',

Änderungen in der Datei ''pi1\class.tx_auxnewsmailer_pi1.php''

Eine im PHP hardkodierte Ausgabe erscheint uns unsinnig. Daher wird in der Funktion main() eine Zeile auskommentiert:

//    $content="no fe user logged in";

In unserem Fall wollen wir nicht, das der Benutzer Kategorien auswählen kann. Daher wird in der Funktion listusercat() ein Block auskommentiert.

/* 
Beginn auskommentierter Block
    if ($this->lConf['usecat']){
        $usercat=array();
        while($row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($dbres)){
            $catid=$row['mailcat'];
            $usercat[$catid]['mail']=$row['domail'];
            $usercat[$catid]['sms']=$row['dosms'];
        }
        $content.='<h2>'.$this->pi_getLL('cat').'</h2>';
        $content.=$this->buildCatTree(0,$this->pidQuery,$usercat);
    }
Ende auskommentierter Block 
*/