Hallo, ich habe mit dem Kickstarter ein FE Plugin mit Listen und Single Darstellung für eine mehrsprachige Site erstellt. Ich habe auch den Flag auf Enabled localization features gesetzt.
Nach einigen Anpassungen funkt die Extension gut bis aus eines:
Mehrsprachig eingegebene Inhalte werden alle zusammen unabhängig von der Sprache im Frontend ausgegeben, also nicht jede Sprache für sich. In der Datenbank sind die Datensätze mit der richtigen ID in der Spalte sys_language_uid abgelegt. Auch normale Content Elemente werden richtig ausgegeben. Ich habe also keinen Fehler in meinen typoScript für den normalen Content. Habe auch mal meine ganzen Anpassungen in der Ausgabe der Extension rausgeschmissen, hat auch nichts gebracht. Leider habe ich in keinem Forum oder Buch etwas gefunden, was mir weiterhelfen könnte die FE Ausgabe nach Sprachen getrennt auszugeben.
Kann mir jemand weiterhelfen?
Grüße
Rina
Du musst in der Ext auch die Sprache entsprechend berücksichtigen, hier ein Ausschnitt aus der tt_news:
// get the translated record if the content language is not the default language
if ($GLOBALS['TSFE']->sys_language_content) {
$OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tt_news', $row, $GLOBALS['TSFE']->sys_language_content, $OLmode);
}
Irgendwie krieg ich das Prinzip von tt_news nicht auf meine Extension übertragen. Meine PHP-Kenntnisse stecken noch in plauschigen Kinderschuhen. Was ist bei folgendem simplen Beispiel zu tun, damit im FE nur die Datensätze zur aktiv gewählten Sprache angezeigt werden?
function main($content,$conf) {
$this->conf=$conf;
$this->pi_setPiVarDefaults();
$this->pi_loadLL();
// Lade das Template-File
$this->templateCode = $this->cObj->fileResource($this->conf["templateFile"]);
if ($this->templateCode=="") {
return "<p>Projekt: Kein HTML-Template gefunden:</p>".$this->conf["pid_list"];
}
$content .= $this->getContent();
// Gebe den erstellten Content zurück
return $this->pi_wrapInBaseClass($content);
}
/****************************/
/*** Function: getContent ***/
function getContent() {
// Lösche $content
$content = '';
// Bereich des Templates in dem gearbeitet wird.
$template = $this->cObj->getSubpart($this->templateCode,"###TEMPLATE_IRGENDWAS###");
// Array für die Marker
$markerArray=array();
// Definiere ein Array für die wrappedSubparts
$wrappedSubpartArray=array();
// pid_list ist die Page_ID des Sysordners mit den Daten
// Ist im Setup keine Liste mit ID angegeben werden die Werte des "Ausgangspunktes" benutzt.
$this->config["pid_list"] = trim($this->cObj->stdWrap($this->conf["pid_list"],$this->conf["pid_list."]));
$this->config["pid_list"] = $this->config["pid_list"] ? implode(t3lib_div::intExplode(",",$this->config["pid_list"]),",") : $this->cObj->data["pages"];
list($pid) = explode(",",$this->config["pid_list"]);
$this->pid = $pid;
//DB-Abfrage
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
'*',
'tx_meineextension_tabelle',
'pid = '.$pid.''.
$this->cObj->enableFields("tx_meineextension_tabelle"),
'',
'');
//Gehe alle ausgelesenen Daten durch und schreibe ins Template
while( $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
// Muss das hier hin?
if ($GLOBALS['TSFE']->sys_language_content) {
$OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('meine_extension', $row, $GLOBALS['TSFE']->sys_language_content, $OLmode);
}
$markerArray["###NAME###"] = $row['name'];
// Die HTML-Vorlage inkl. ersetzte Marker in die $content Variable schreiben
$content.=$this->cObj->substituteMarkerArrayCached($template,$markerArray,array(),$wrappedSubpartArray);
}
// Daten an die main() Funktion zurück
return $content;
}
/*** ENDE Function: getContent ***/
}
ich muss ja nun irgendwie die DB-Abfrage noch anpassen. Bei tt_news wird das wohl hier gemacht:
// Get news
$selectConf = Array();
$selectConf['pidInList'] = $this->pid_list;
$selectConf['where'] = '';
if ($this->sys_language_mode == 'strict' && $GLOBALS['TSFE']->sys_language_content) {
// sys_language_mode == 'strict': If a certain language is requested, select only news-records from the default language which have a translation. The translated articles will be overlayed later in the list or single function.
$tmpres = $this->cObj->exec_getQuery('tt_news', array(
'selectFields' => 'tt_news.l18n_parent',
'where' => 'tt_news.sys_language_uid = '.$GLOBALS['TSFE']->sys_language_content.$this->enableFields,
'pidInList' => $this->pid_list));
$strictUids = array();
while ($tmprow = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($tmpres)) {
$strictUids[] = $tmprow['l18n_parent'];
}
$strStrictUids = implode(',', $strictUids);
$selectConf['where'] .= '(tt_news.uid IN (' . ($strStrictUids?$strStrictUids:0) . ') OR tt_news.sys_language_uid=-1)'; // sys_language_uid=-1 = [all languages]
} else {
// sys_language_mode != 'strict': If a certain language is requested, select only news-records in the default language. The translated articles (if they exist) will be overlayed later in the list or single function.
$selectConf['where'] .= 'tt_news.sys_language_uid IN (0,-1)';
}
Das krieg ich nicht umgelegt auf mein Beispiel. Kann mir jemand helfen?
mmm, ich hab folgenden Beitrag gefunden:
#42167
Jetzt hab ich folgendes:
function main($content,$conf) {
[...]
$this->sys_language_mode = $this->conf['sys_language_mode'];
[...]
$content .= $this->getContent();
}
function getContent() {
[...]
// DB-Abfrage
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
'*',
'tx_meineextension_tabelle',
'pid = '.$pid.''.
$this->cObj->enableFields("tx_meineextension_tabelle"),
'',
'');
while( $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
if ($GLOBALS['TSFE']->sys_language_content == $row['sys_language_uid']){
$OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('tx_extension', $row, $GLOBALS['TSFE']->sys_language_content, $OLmode);
}
$markerArray["###NAME###"] = $row['name'];
}
[...]
return $content;
}
verändert nichts. Es werden immer noch alle Sprachversionen angezeigt. Fehlt noch etwas oder muss ich getContent() nach der if-Abfrage noch mal aufrufen?
also irgendwie hab ich das jetzt etwas anders lösen können. Schön ist das wahrscheinlich nicht, aber es funktioniert:
function getContent() {
[...]
// DB-Abfrage
if ($this->sys_language_mode == 'strict') {
$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
'*',
'tx_meineextension_tabelle',
'pid = '.$pid.' AND sys_language_uid='.$GLOBALS['TSFE']->config['config']['sys_language_uid'].''.
$this->cObj->enableFields("tx_meineextension_tabelle"),
'',
'');
}
else $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
'*',
'tx_meineextension_tabelle',
'pid = '.$pid.''.
$this->cObj->enableFields("tx_meineextension_tabelle"),
'',
'');
while( $row = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
$markerArray["###NAME###"] = $row['name'];
}
[...]
return $content;
}