Zum Inhalt springen

Mehrsprachigkeit bei Videotut (CD Album)

Erstellt am 17. November 2006 · 16 Antworten · letzte Antwort am 31. Januar 2008

Tags: Frage

feelx ·

Hallo Leute

Ich versuche ja, mich langsam mit der Extension-Entwicklung vertraut zu machen. SteffenK hat mir schon geholfen, mit den Queries und den "SQL Wrapper" nach den CGL klarzukommen...

Basierend auf dem Videotutorial auf typo3.org möchte mein Verständnis vertiefen und stehe jetzt vor der Frage: "Wie wird das mit den Pages-Overlay" gehandhabt ?

So was ich bisher hier im Forum und im Archiv der Typo3-Mailing Liste gefunden habe, wird das ja mit einem IF-Else Statement erreicht.

Mir ist aber noch nicht ganz klar, WO das genau geschieht? Beim "Datensatz holen" - function getFieldContent() -oder- beim erstellen? function listView() ?

Dies ist die komplette Klasse bisher:

<?php
/***************************************************************
*  Copyright notice
*  (...gekürzt....)
***************************************************************/

require_once(PATH_tslib.'class.tslib_pibase.php');


/**
 * Plugin 'Display Products within Industry' for the 'user_test' extension.
 *
 * @author	 <>
 * @package	TYPO3
 * @subpackage	user_test
 */
class user_test_pi1 extends tslib_pibase {
	var $prefixId = 'user_test_pi1';		// Same as class name
	var $scriptRelPath = 'pi1/class.user_test_pi1.php';	// Path to this script relative to the extension dir.
	var $extKey = 'user_test';	// The extension key.
	var $pi_checkCHash = TRUE;
	
	
	var $categoryCache = array();
	var $industryCache = array();

	/**
	 * Main method of your PlugIn
	 *
	 * @param	string		$content: The content of the PlugIn
	 * @param	array		$conf: The PlugIn Configuration
	 * @return	The content that should be displayed on the website
	 */
	function main($content,$conf)	{
		switch((string)$conf['CMD'])	{
			case 'singleView':
				list($t) = explode(':',$this->cObj->currentRecord);
				$this->internal['currentTable']=$t;
				$this->internal['currentRow']=$this->cObj->data;
				return $this->pi_wrapInBaseClass($this->singleView($content,$conf));
			break;
			default:
				if (strstr($this->cObj->currentRecord,'tt_content'))	{
					$conf['pidList'] = $this->cObj->data['pages'];
					$conf['recursive'] = $this->cObj->data['recursive'];
				}
				return $this->pi_wrapInBaseClass($this->listView($content,$conf));
			break;
		}
	}
	
	/**
	 * Shows a list of database entries
	 *
	 * @param	string		$content: content of the PlugIn
	 * @param	array		$conf: PlugIn Configuration
	 * @return	HTML list of table entries
	 */
	function listView($content,$conf)	{
		$this->conf=$conf;		// Setting the TypoScript passed to this function in $this->conf
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();		// Loading the LOCAL_LANG values
		
		$lConf = $this->conf['listView.'];	// Local settings for the listView function
	
		if ($this->piVars['showUid'])	{	// If a single element should be displayed:
			$this->internal['currentTable'] = 'user_test_product';
			$this->internal['currentRow'] = $this->pi_getRecord('user_test_product',$this->piVars['showUid']);
	
			$content = $this->singleView($content,$conf);
			return $content;
		} else {
			$items=array(
				'1'=> $this->pi_getLL('list_mode_1','Mode 1'),
				'2'=> $this->pi_getLL('list_mode_2','Mode 2'),
				'3'=> $this->pi_getLL('list_mode_3','Mode 3'),
			);
			if (!isset($this->piVars['pointer']))	$this->piVars['pointer']=0;
			if (!isset($this->piVars['mode']))	$this->piVars['mode']=1;
	
				// Initializing the query parameters:
			list($this->internal['orderBy'],$this->internal['descFlag']) = explode(':',$this->piVars['sort']);
			$this->internal['results_at_a_time']=t3lib_div::intInRange($lConf['results_at_a_time'],0,1000,3);		// Number of results to show in a listing.
			$this->internal['maxPages']=t3lib_div::intInRange($lConf['maxPages'],0,1000,2);;		// The maximum number of "pages" in the browse-box: "Page 1", "Page 2", etc.
			$this->internal['searchFieldList']='productname';
			$this->internal['orderByList']='uid,productname';
	
				// Get number of records:
			$res = $this->pi_exec_query('user_test_product',1);
			list($this->internal['res_count']) = $GLOBALS['TYPO3_DB']->sql_fetch_row($res);
	
				// Make listing query, pass query to SQL database:
			$res = $this->pi_exec_query('user_test_product');
			$this->internal['currentTable'] = 'user_test_product';
	
				// Put the whole list together:
			$fullTable='';	// Clear var;
		#	$fullTable.=t3lib_div::view_array($this->piVars);	// DEBUG: Output the content of $this->piVars for debug purposes. REMEMBER to comment out the IP-lock in the debug() function in t3lib/config_default.php if nothing happens when you un-comment this line!
	
				// Adds the mode selector.
			$fullTable.=$this->pi_list_modeSelector($items);
	
				// Adds the whole list table
			$fullTable.=$this->pi_list_makelist($res);
	
				// Adds the search box:
			$fullTable.=$this->pi_list_searchBox();
	
				// Adds the result browser:
			$fullTable.=$this->pi_list_browseresults();
	
				// Returns the content from the plugin.
			return $fullTable;
		}
	}
	/**
	 * Display a single item from the database
	 *
	 * @param	string		$content: The PlugIn content
	 * @param	array		$conf: The PlugIn configuration
	 * @return	HTML of a single database entry
	 */
	function singleView($content,$conf)	{
		$this->conf=$conf;
		$this->pi_setPiVarDefaults();
		$this->pi_loadLL();
		
	
			// This sets the title of the page for use in indexed search results:
		if ($this->internal['currentRow']['title'])	$GLOBALS['TSFE']->indexedDocTitle=$this->internal['currentRow']['title'];
	
		$content='<div'.$this->pi_classParam('singleView').'>
			<h2>Record "'.$this->internal['currentRow']['uid'].'" from table "'.$this->internal['currentTable'].'":</h2>
			<table>
				<tr>
					<td nowrap="nowrap" valign="top" this-="">pi_classParam('singleView-HCell').'><p>'.$this->getFieldHeader('productname').'</p></td>
					<td valign="top"><p>'.$this->getFieldContent('productname').'</p></td>
				</tr>
				<tr>
					<td nowrap="nowrap" valign="top" this-="">pi_classParam('singleView-HCell').'><p>'.$this->getFieldHeader('category').'</p></td>
					<td valign="top"><p>'.$this->getFieldContent('category').'</p></td>
				</tr>
				<tr>
					<td nowrap="nowrap" valign="top" this-="">pi_classParam('singleView-HCell').'><p>'.$this->getFieldHeader('industries').'</p></td>
					<td valign="top"><p>'.$this->getFieldContent('industries').'</p></td>
				</tr>
				<tr>
					<td nowrapthis-="">pi_classParam('singleView-HCell').'><p>Last updated:</p></td>
					<td valign="top"><p>'.date('d-m-Y H:i',$this->internal['currentRow']['tstamp']).'</p></td>
				</tr>
				<tr>
					<td nowrapthis-="">pi_classParam('singleView-HCell').'><p>Created:</p></td>
					<td valign="top"><p>'.date('d-m-Y H:i',$this->internal['currentRow']['crdate']).'</p></td>
				</tr>
			</table>
		<p>'.$this->pi_list_linkSingle($this->pi_getLL('back','Back'),0).'</p></div>'.
		$this->pi_getEditPanel();
	
		return $content;
	}
	/**
	 * Returns a single table row for list view
	 *
	 * @param	integer		$c: Counter for odd / even behavior
	 * @return	A HTML table row
	 */
	function pi_list_row($c)	{
		$editPanel = $this->pi_getEditPanel();
		if ($editPanel)	$editPanel='<td>'.$editPanel.'</td>';
	
		return '<tr'.($c%2 this-="">pi_classParam('listrow-odd') : '').'>
				<td><p>'.$this->getFieldContent('uid').'</p></td>
				<td valign="top"><p>'.$this->getFieldContent('productname').'</p></td>
				<td valign="top"><p>'.$this->getFieldContent('category').'</p></td>
				<td valign="top"><p>'.$this->getFieldContent('industries').'</p></td>
			</tr>';
	}
	/**
	 * Returns a table row with column names of the table
	 *
	 * @return	A HTML table row
	 */
	function pi_list_header()	{
		return '<tr'.$this->pi_classParam('listrow-header').'>
				<td><p>'.$this->getFieldHeader_sortLink('uid').'</p></td>
				<td><p>'.$this->getFieldHeader_sortLink('productname').'</p></td>
				<td nowrap=""><p>'.$this->getFieldHeader('category').'</p></td>
				<td nowrap=""><p>'.$this->getFieldHeader('industries').'</p></td>
			</tr>';
	}
	/**
	 * Returns the content of a given field
	 *
	 * @param	string		$fN: name of table field
	 * @return	Value of the field
	 */
	function getFieldContent($fN)	{
		switch($fN) {
			case 'uid':
				return $this->pi_list_linkSingle($this->internal['currentRow'][$fN],$this->internal['currentRow']['uid'],1);	// The "1" means that the display of single items is CACHED! Set to zero to disable caching.
			break;
		
		
		case 'category':
			 if (!count($this->categoryCache))	{

		$select_fields = '*';
		$from_table = 'user_test_productcategory';
		$where_clause = 'pid=121'.$this->cObj->enableFields('user_test_productcategory');
			
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy=''.$orderBy=''.$limit='');
				
			while ($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
				$this->categoryCache[$row['uid']]=$row;
				}
			}
			return htmlspecialchars($this->categoryCache[$this->internal['currentRow']['category']]['productcategory']);
		break; 
			
	
			
			default:
				return $this->internal['currentRow'][$fN];
			break;
		}
	}

	
	/**
	 * Returns the label for a fieldname from local language array
	 *
	 * @param	[type]		$fN: ...
	 * @return	[type]		...
	 */
	function getFieldHeader($fN)	{
		switch($fN) {
			
			default:
				return $this->pi_getLL('listFieldHeader_'.$fN,'['.$fN.']');
			break;
		}
	}
	
	/**
	 * Returns a sorting link for a column header
	 *
	 * @param	string		$fN: Fieldname
	 * @return	The fieldlabel wrapped in link that contains sorting vars
	 */
	function getFieldHeader_sortLink($fN)	{
		return $this->pi_linkTP_keepPIvars($this->getFieldHeader($fN),array('sort'=>$fN.':'.($this->internal['descFlag']?0:1)));
	}
}



if (defined('TYPO3_MODE') && $TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_test/pi1/class.user_test_pi1.php'])	{
	include_once($TYPO3_CONF_VARS[TYPO3_MODE]['XCLASS']['ext/user_test/pi1/class.user_test_pi1.php']);
}

?>

Sie entspricht vornehmlich dem "rohen" output des Kickstarters basierend auf dem o.g. CD-Collection-Tut (mit abgewandelten Feldern). Abgeändert wurde zudem, dass die Wrapper-Funktionen zur DB-Abfrage verwendet werden.

Ich würde es sehr schätzen, wenn ein paar Tipps kommen würden. Denke es würde auch vielen Neulingen helfen, da der Kickstarter und das Video-Tut wohl den besten Einstieg bedeuten....

Ansonsten ist die Mehrsprachigkeit eingerichtet und Lokalisierung funktioniert soweit. D.h. bisher werden _ALLE_ datensätze in _allen_ Sprachen angezeigt...

feelx ·

Es ist schon ziemlich frustrierend da rum zu wursteln #angry#
Aber schliesslich habe ich es hinbekommen:

Die entsprechende "case" lautet mit Sprachüberprüfung im FE wie folgt:

<?
		case 'category':
			 if (!count($this->categoryCache))	{

		$select_fields = '*';
		$from_table = 'user_test_productcategory';
		$where_clause = 'pid=121'.$this->cObj->enableFields('user_test_productcategory');
			
		$res = $GLOBALS['TYPO3_DB']->exec_SELECTquery($select_fields,$from_table,$where_clause,$groupBy=''.$orderBy=''.$limit='');
		$OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
				
			while ($row=$GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
				
				
				// Check if the user is viewing a different language
				if ($GLOBALS['TSFE']->sys_language_uid != 0) {
					$OLmode = ($this->sys_language_mode == 'strict'?'hideNonTranslated':'');
					$row = $GLOBALS['TSFE']->sys_page->getRecordOverlay('user_test_productcategory', $row,
					$GLOBALS['TSFE']->sys_language_uid, $OLmode);
				 }
			$this->categoryCache[$row['uid']]=$row; 
			
			}
		}
		//	debug ($this->categoryCache[$this->internal['currentRow']['category']]['productcategory']);
		return $this->categoryCache[$this->internal['currentRow']['category']]['productcategory'];
		break;

?>

Allerdings bin ich noch lange nicht am Ziel...

Im BE werden mir leider die Kategorien sowie die übersetzten Kategorien auf english angezeigt.Das macht in meinem Fall aber keinen Sinn. Wie binde ich die Kategorien nun im BE(!!) an die Sprache des jeweils eingeloggten BE Users? Wenn deutsch gewählt ist, soll NUR deutsch und wenn english gewählt ist nur english angezeigt werden... hab ehrlich gesagt nicht die Idee was ich machen muss... vermutlich etwas in der tca.php, richtig ???
Vielleicht kommt etwas hilfreiches ... wäre jedenfalls dankbar #paralyzed#

feelx ·

TCA.php war goldrichtig... Beim entsprechenden "Feld" wie folgt editieren:

<?
$TCA["user_test_product"] = Array (
...
...
   "columns" => Array (
    ....
          "category" => Array (                  ...
             'config' => array (
              ...
              ...
              "foreign_table_where" => "AND user_test_productcategory.pid=###CURRENT_PID###
               AND sys_language_uid=###REC_FIELD_sys_language_uid###
?>

Wichtig ist der Teil "AND sys_language_uid=###REC_FIELD_syslanguage_uid###" - natürlich kann man statt des reservierten Markers auch die language_uid (z.B. 0) einsetzen.

steffenk ·

vielen Dank, habe auch lang nach diesem Eintrag gesucht

AND sys_language_uid=###REC_FIELD_sys_language_uid### ORDER BY ...

war bei mir schon ausreichend - die pid-Klausel bewirkt ja, das nur Datensätze mit der aktuellen pid genommen wird, und das brauch ich nicht.

Was mich eigentlich am meisten stört, ist die Tatsache, das man in der Listenansicht alle Einträge und deren Übersetzung sieht, ohne Kennzeichnung, welche Sprache es ist und um welche Übersetzung es sich handelt.

Nächstes Problem: Ich kann nicht wie bei Seiten einen Datensatz übersetzen. Man kann nur neue anlegen und eine Sprache wählen, dann kann man sich einen Ursprungsdatensatz auswählen. Das hat alles sehr wenig Komfort.

Leider finde ich hier wenig Infos, und die devliste schweigt.

btw - wo hast Du das gefunden ? Ich hab grad mal einen Beitrag von Nikolas gefunden, bei Google-Suche nach REC_FIELD_sys_language_uid finde ich grad mal 3 Ergebnisse ...
Keiner der Extensions die ich kenn nutzt das.

Zusätzlich entsteht ein Problem beim anlegen neuer Datensätze, dann ist sys_language_uid nämlich nicht vorhanden und es gibt einen SQL-Fehler.
Bug #4405 beschreibt das Problem auch. Eine Anfrage in der dev-Liste läuft.

feelx ·

Hi

steffenk schrieb

vielen Dank, habe auch lang nach diesem Eintrag gesucht

AND sys_language_uid=###REC_FIELD_sys_language_uid### ORDER BY ...

war bei mir schon ausreichend - die pid-Klausel bewirkt ja, das nur Datensätze mit der aktuellen pid genommen wird, und das brauch ich nicht.

hmmm... die pid-Klausel hat der Kickstarter reingebastelt... Wohl weil ich die Datensätze in einem StorageFolder speichere. Aber habe viel mit den Optionen rumgespielt, von daher ist es schon möglich, dass es unnötig wäre 😉

steffenk schrieb

Was mich eigentlich am meisten stört, ist die Tatsache, das man in der Listenansicht alle Einträge und deren Übersetzung sieht, ohne Kennzeichnung, welche Sprache es ist und um welche Übersetzung es sich handelt.

Nächstes Problem: Ich kann nicht wie bei Seiten einen Datensatz übersetzen. Man kann nur neue anlegen und eine Sprache wählen, dann kann man sich einen Ursprungsdatensatz auswählen. Das hat alles sehr wenig Komfort.

Leider finde ich hier wenig Infos, und die devliste schweigt.

Hmmmmmm... also bin mir nicht sicher, ob ich dich da richtig verstehe..? Bei mir funktioniert das Übersetzen (lokalisieren) eines Eintrages (im Beispiel hier "category" oder im Screenshot "Einsatzzweck".
Bild: feelx.net/…/lokalisierung_extension.png
Wenn ich mir das FE anzeigen lasse, zeigt es bei Std.Sprache =...&L=0 "Briefumschläge" an und bei &L=1 entsprechend "Envelopes".
Bei " ... AND sys_language_uid=###REC_FIELD_sys_language_uid###" wird im BE nur noch deutsch angezeigt, weil die Std.Sprache der Einträge deutsch ist.

steffenk schrieb

btw - wo hast Du das gefunden ? Ich hab grad mal einen Beitrag von Nikolas gefunden, bei Google-Suche nach REC_FIELD_sys_language_uid finde ich grad mal 3 Ergebnisse ...
Keiner der Extensions die ich kenn nutzt das.

Ja genau! Beim Beitrag von Nikolas habe ich es gefunden - über google... bzw zuerst habe ich die entsprechende Frage von Francesco gefunden...
In der Doc-Core-Api steht auch noch etwas dazu... siehe hier:
https://docs.typo3.org/m/typo3/reference-tca/main/en-us/Index.html
So wie es aussieht wäre es auch noch möglich via ###PAGE_TSCONFIG_STR### einen String via Page TSConfig zu erzeugen und den in der "where Clause" einzusetzen. Habe das aber nicht probiert...

steffenk schrieb

Zusätzlich entsteht ein Problem beim anlegen neuer Datensätze, dann ist sys_language_uid nämlich nicht vorhanden und es gibt einen SQL-Fehler.
Bug #4405 beschreibt das Problem auch. Eine Anfrage in der dev-Liste läuft.

Hmmm bin erst seit gestern nacht auf der DEV-Liste. Habe gestern abend um 22:28 Uhr gepostet aber mein Betrag wurde mir nie "geliefert" - aber deine Antwort heute so gegen halb elf. Habe jetzt wieder was geschrieben - aber auch dieses Mal habe ich meinen eigenen Beitrag noch nicht empfangen. Merkwürdig...
Jedenfalls habe ich zwei Felder (Selectboxen). Eines davon zeigt der o.g. screenshot und ein anderes soll Kategorien zeigen. Bei den Kategorien tritt bei mir dieser SQL-assoc() Fehler NICHT auf... bei den "Einsatzzwecken" hingegen schon... ist ein merkwürdiges Problem.

feelx ·

ahhh #angry# das prob mit den eigenen Postings war ein Setting, dass ich eigene Beträge nicht erhalten will.. habs geändert 😃

steffenk ·

ach Du bist das in der dev-Liste
:p

na fein, dann können wir das ja hier verfeinern.
Du hast Recht, ich hatte den Haken Lokalisierungsansicht nicht angeklickt, danach werden die Einträge schon mit den entsprechenden Flaggen angezeigt.

Der SQL-Fehler bleibt noch - ich kämpf mich grad durch die entsprechenden TCA-Einträge. Mach mal das SQL-Debug an und poste mal Deine Abfrage, die scheitert.
Die Developer scheinen alle noch zu schlafen, vll lösen wir es ja vorher 🙂

feelx ·

Also bei dem Feld wo es funktioniert, habe ich einen Fehler provoziert (siehe xXx) - das sys_language_uid=0 wird gesetzt...

<?
(..)		
"category" => Array (		
			"exclude" => 0,		
			"label" => "LLL:EXT:user_test/locallang_db.xml:user_test_product.category",		
			"config" => Array (
				"type" => "select",	
				"foreign_table" => "user_test_productcategory",	
				"foreign_table_where" => "AND user_test_productcategory.pid=###CURRENT_PID### and
sys_language_uid=###REC_FIELD_sys_language_uid### xXx ORDER BY user_test_productcategory.uid",	
				"size" => 5,	
?>

SELECT user_test_productcategory.uid,user_test_productcategory.productcategory,user_test_productcategory.hidden
FROM user_test_productcategory,pages

WHERE
pages.uid=user_test_productcategory.pid
AND pages.deleted=0 AND user_test_productcategory.deleted=0 AND 1=1 AND user_test_productcategory.pid=121 and
sys_language_uid=0 xXx ORDER BY user_test_productcategory.uid"

Da wo es NICHT funktioniert wird die sys_language_uid tatsächlich nicht gesetzt:

<?
(..)		
		"industries" => Array (		
			"exclude" => 1,		
			"label" => "LLL:EXT:user_test/locallang_db.xml:user_test_product.industries",		
			"config" => Array (
				"type" => "select",	
				"foreign_table" => "user_test_industries",	
				"foreign_table_where" => "AND sys_language_uid=###REC_FIELD_sys_language_uid###  AND user_test_industries.pid=###CURRENT_PID### ORDER BY user_test_industries.uid",	
				"size" => 10,		
?>


SELECT user_test_industries.uid,user_test_industries.industries
FROM user_test_industries,pages
WHERE
pages.uid=user_test_industries.pid
AND pages.deleted=0 AND user_test_industries.deleted=0 AND 1=1 AND sys_language_uid= AND user_test_industries.pid=121
ORDER BY user_test_industries.uid

steffenk ·

ich bin noch nicht weiter gekommen, im Moment suche ich einfach eine SQL-Funktion, die einen leeren Wert zulässt, sowas wie intval in PHP, hab aber noch nichts gefunden.

Sobald ich was weiss, sag ich Bescheid.

feelx ·
steffenk schrieb

ich bin noch nicht weiter gekommen, im Moment suche ich einfach eine SQL-Funktion, die einen leeren Wert zulässt, sowas wie intval in PHP, hab aber noch nichts gefunden.

Sobald ich was weiss, sag ich Bescheid.

cool - sehr nett, danke!!
Man könnte ja auch direkt "foreign_table_where" => "AND sys_language_uid=0" reinschreiben, anstatt über den Marker zu gehen.
Zumindest für meinen Bedarfsfall machen andere Werte als 0 keinen Sinn - und selbst wenn man ihn auf 1 setzt, was bei mir English wäre, zeigt mir das Frontend selbst bei gewählter deutscher Sprache (url...&L=0) den englischen Eintrag an... was ich nicht sehr prickelnd finde 🙁
Man müsste dann bei der FE-Ausgabe wieder über die Spalte l18n_parent herausfinden, welches das Elternelement ist und ggf. in der richtigen Sprache ausgeben...

update
aaaaaaaah jezt.. ich hätte den Bug-Report genauer lesen sollen
The error comes only if "###REC_FIELD_sys_language_uid### " is in the "foreign_table_where" AND "maxitems" is higher then 1.
If I set "maxitems" = 1 or I delete the part "AND xxx.sys_language_uid = ###REC_FIELD_sys_language_uid###" the error does not come.

Das kann ich reproduzieren - wenn maxitems im jeweiligen config-array der tca.php höher als 1 ist, erscheint der fehler... wird dir aber wohl auch nicht helfen, oder? 😢

steffenk ·

FE hat mit der Einstellung nichts zu tun, hier muss man in der Ext selber dafür sorgen, das immer die korrekten Einträge angezeigt werden.

Der Eintrag ist ja dafür verantwortlich, was in der BE-Form angezeigt wird. Bei 0 hätte man die entsprechenden Kategorie-Einträge immer von der Defaultsprache. Wenn man die Sprache umstellt, sollen ja die Einträge der entsprechenden Sprache angezeigt werden.

Es bezieht sich also alles auf die Combobox "Sprache"
Bei einem neuen Datensatz steht die auf "Standard" was dem Wert 0 entspricht. Es bleibt also zu prüfen, warum der Marker dann mit einem Leerstring gefüllt wird.

steffenk ·

ich hab tatsächlich eine Lösung gefunden 🙂

Durch eine SQL-Umwandlung darf das sogar leer sein:

CAST('###REC_FIELD_sys_language_uid###' AS UNSIGNED)

und alles ist gut 😉

feelx ·

RESPEKT !! :p :p

*confirmed* - Bei mir funktioniert das so auch!! 😉 Verstehe ich das richtig - durch das "CAST('xxxxxxx' AS UNISGNED)" wird der "leere Wert" einfach zu "0" ?

Gracias 😃

edit
Mach doch beim Bug 4405 noch ein Entry für den Workaround

feelx ·

Na wunderbar... Das einzige was mich noch etwas nachdenklich stimmt ist, weshalb man wirklich nur 3 results bei google bekommt und warum andere extensions teilweise einen anderen Weg gehen...
BTW: was glaubst du, weshalb bei maxitems > 1, deinen workaround benötigt? Ist das ein Bug im Core?

steffenk ·

das man so wenig darüber findet macht Eines ganz deutlich:
Die wenigsten kennen sich mit der Mehrsprachigkeit aus. Die meisten aktivieren im Kickstarter die Unterstützung und fertig, scheinbar testet keiner so richtig im mehrsprachigen Kontext.

tt_news zeigt, wie man mit mehrsprachigem Kontext umgehen muss (in der Extension). Das wird gern als Beispiel genommen und in eigene Extensions kopiert. Ausserdem benutzt tt_news für die Kategorieen eine eigene php-Datei, die den Kategoriebaum erstellt, kann daher die Lokalisierung innerhalb dieser Routine gestalten und ist nicht vom TCA abhängig.

In den Docs gibt es auch nichts zum Thema TCA und Mehrsprachigkeit, nur zum Umgang mit den xml-Dateien, und das ist ja geradezu trivial. Die TCA-Referenz ist mit den Erklärungen sehr dürftig, und nur, wer fleissig austestet, wird wirklich schlau draus.
Die Unterstützung der Coremembers, die das eigentlich kennen sollten ?!? ist da eher schwach, die leiden auch an Overflood.

Und so müssen erst wir kommen, das gabze hinterfragen, austesten und Lösungen suchen - der nächste mit dem Problem wird sich freuen, wenn er was zu lesen findet (was machen nur die ganzen nicht-deutschsprechenden Typo3-User? 😃 )

Achso, das mit den max-Einträgen ist ja wohl der Grund, da stimmt eine Zuweisung nicht. Bevor man aber die Stelle nicht kennt und so eine Lösung anbieten kann, hat das posten im Bugtracker wenig Aussichten - Du siehst es ja an #4405

log2e ·
steffenk schrieb

ich hab tatsächlich eine Lösung gefunden 🙂

Durch eine SQL-Umwandlung darf das sogar leer sein:

CAST('###REC_FIELD_sys_language_uid###' AS UNSIGNED)

und alles ist gut 😉

Dein Workaround hat mir den Abend (und die Weiterentwicklung meiner Extension) gerettet. Vielen Dank!