Hi,
ich habe eine mittlerweile lauffähige einfache Extension (mk_mp3news) geschrieben, die es möglich macht in einer News der tt_news Extension eine MP3 Playliste der fe_mp3player Extension zu wählen, so dass in der Detailansicht dann ein Flash MP3 Player angezeigt wird, falls eine Playlist angegebn wurde.
Allerdings bin ich an 2 Stellen derart "mit der php-Brechstange" zu Werke gegangen, dass ich jetzt gerne wüsste, wie man es eigentlich sauber löst.
Zum einen der Punkt, wie meine Extension einen neuen Marker in die News Extension hinzufügt - class.tx_ttnews.php:
<?php
//...
if (is_array($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['extraItemMarkerHook'])) {
foreach($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['tt_news']['extraItemMarkerHook'] as $_classRef) {
$_procObj = & t3lib_div::getUserObj($_classRef);
$markerArray = $_procObj->extraItemMarkerProcessor($markerArray, $row, $lConf, $this);
}
}
//...
?>
hier ergibt die Zeile $markerArray = ...
den Fehler:
Fatal error: Call to a member function on a non-object in D:\inetpub\wwwroot\typo3conf\ext\tt_news\pi\class.tx_ttnews.php on line 1559
Wenn ich aber in der localconf.php meiner Extension einfach die Zeilen:
<?php
//...
//$TYPO3_CONF_VARS['EXTCONF']['tt_news']['extraItemMarkerHook'][] = 'mk_mp3news';
//$TYPO3_CONF_VARS['EXTCONF']['tt_news']['extraCodesHook'][] = 'mk_mp3news';
//...
?>
auskommentiere und in class.tx_ttnews.php meine Klasse manuell einbinde durch hinzufügen von:
<?php
//...
$mp3extension = new mk_mp3news();
$markerArray = $mp3extension->extraItemMarkerProcessor($markerArray, $row, $lConf, $this);
//...
?>
geht es trotzdem. Also kann es doch an meiner Extension-Klasse irgendwo nicht liegen?
Meine andere Frage ist, wie ich durch die Flash MP3 Player sauber den Flash-HTML Code für meine Extension generieren lasse. Ich müsste wohl irgendwie von aussen die class.tx_femp3player_pi1.php instanziieren? Doch diese bezieht Ihre Werte für Konfiguration und Daten ja nicht über einen Konstruktor Aufruf, sondern von Typo3, wenn Sie in eine Seite eingebunden ist. Bisher habe ich mir einfach damit beholfen, dass den Output der Extension in meine Extension zu kopieren und im Output-Text die Playlist-ID gegen die ID der Playlist im aktuellen News-Datensatz zu ändern. Da gibt es doch sicher bessere Möglichkeiten über die Typo-Api?
Geht zwar alles auch so, aber ich würde für die Zukunft gerne lernen, wie man das richtig macht. Ich habe leider in meinem Typo3 Buch nur Beispiele, wie man neue Extensions entwickelt und nicht, wie man vorhandene mit einander verbindet.
Falls wichtig - hier der Code meiner Extension Hauptklasse:
<?php
require_once( PATH_tslib . 'class.tslib_pibase.php' );
class mk_mp3news extends tslib_pibase {
var $prefixId = 'mk_mp3news';
var $scriptRelPath = 'class.mk_mp3news.php';
var $extKey = 'mk_mp3news';
var $conf = array();
var $templateCode = ' ###MP3PLAYER### ';
var $newsObject = null;
var $newsConf = null;
var $newsRow = null;
var $db = null;
var $markerArray = array();
var $mp3Uid = null;
function main ( $parentObject ) {
$this->db = $GLOBALS[ 'TYPO3_DB' ];
$this->db->debugOutput = true;
$this->newsObject = $parentObject;
$this->newsConf = $this->newsObject->conf[ 'displaySingle.' ];
$this->newsRow = ( isset($this->newsObject->local_cObj->data['uid' ] ))? $this->newsObject->local_cObj->data: $this->loadNewsRow();
$this->conf = $this->newsObject->conf[ 'news_sponsor.' ];
$this->pi_loadLL();
$templateflex_file = $this->pi_getFFvalue($this->newsObject->cObj->data['pi_flexform'], 'template_file', 's_template');
$this->mp3Uid = ( ! is_null( $this->mp3Uid ) )? $this->mp3Uid : $this->newsRow[ 'tx_mkmp3news_snippets' ];
}
function loadNewsRow() {
$newsUid = $this->newsObject->tt_news_uid;
$where = '1 = 1 AND uid = ' . $newsUid . ' ';
$where .= $this->newsObject->cObj->enableFields('tt_news');
// refer to for the database functions ~/www/t3lib/class.t3lib_db.php
$newsItem = $this->db->exec_SELECTgetRows('*','tt_news',$where);
// check that our newsItem array exists
$newsItem = ( 0 < count( $newsItem ) ) ? array_pop( $newsItem ): false;
return $newsItem;
}
function extraItemMarkerProcessor( $markerArray, $row, $lConf, $parentObject) {
$this->main( $parentObject );
$this->newsConf = $lConf;
$this->markerArray = $markerArray;
$this->populateMarkerArray();
return $this->markerArray;
}
function populateMarkerArray() {
if ( $this->mp3Uid )
$this->populateMp3Fields( $this->markerArray );
else
$this->blankMp3Fields( $this->markerArray );
}
function getFlashCode ( $mp3Uid = false ) {
if ( ! $mp3Uid )
return false;
return '<object>...'.$mp3Uid.'...</object>'; //gekürzt
}
function blankMp3Fields( & $markerArray ) {
$markerArray[ '###MP3PLAYER###' ] = '';
}
function populateMp3Fields( & $markerArray ) {
$markerArray[ '###MP3PLAYER###' ] = $this->getFlashCode( $this->mp3Uid );
}
function extraCodesProcessor( $parentObject ) {
$this->main( $parentObject );
return $this->getParsedMp3Template();
}
function getParsedMp3Template() {
$this->populateMarkerArray();
$template = $this->templateCode;
return = $this->newsObject->cObj->substituteMarkerArrayCached(array(), $this->markerArray, array(), array());
}
}
?>