Typo3 Extensions programmieren - RTE: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
Zeile 113: Zeile 113:
 
}
 
}
  
Fehlende p Tags und anderes im RTE
+
 
 +
== Fehlende p Tags und anderes im RTE ==
 +
 
  
 
das liegt oft daran, das beim speichern in der DB die p Tags in Zeilenumbrüche gewandelt werden, beim Rückweg aber nicht mehr ersetzt werden.
 
das liegt oft daran, das beim speichern in der DB die p Tags in Zeilenumbrüche gewandelt werden, beim Rückweg aber nicht mehr ersetzt werden.
Zeile 121: Zeile 123:
 
Rendern einer Eingabe innerhalb eines Plugins
 
Rendern einer Eingabe innerhalb eines Plugins
  
$out=$this->cObj->parseFunc($data,$this->conf['parser.']);
+
$out=$this->cObj->parseFunc($data,$this->conf['parser.']);
$out=$this->cObj->parseFunc($data,$GLOBALS['TSFE']->tmpl->setup['lib.']['parseFunc_RTE.']);
+
$out=$this->cObj->parseFunc($data,$GLOBALS['TSFE']->tmpl->setup['lib.']['parseFunc_RTE.']);
  
 
   
 
   
Zeile 130: Zeile 132:
 
   
 
   
  
plugin.tx_<myextension>_pi1.parser < lib.parseFunc_RTE
+
plugin.tx_<myextension>_pi1.parser < lib.parseFunc_RTE
  
 
   
 
   
Zeile 139: Zeile 141:
  
 
   
 
   
 
+
<pre>
 
/**
 
/**
 
  * Will process the input string with the parseFunc function from tslib_cObj based on configuration set in "lib.parseFunc_RTE" in the current TypoScript template.
 
  * Will process the input string with the parseFunc function from tslib_cObj based on configuration set in "lib.parseFunc_RTE" in the current TypoScript template.
Zeile 155: Zeile 157:
 
}
 
}
  
   
+
  </pre>
  
 
RESULT: you can do it like this:
 
RESULT: you can do it like this:
Zeile 161: Zeile 163:
 
   
 
   
  
$out=$this->pi_RTEcssText($data);
+
$out=$this->pi_RTEcssText($data);
  
 
   
 
   
Zeile 177: Zeile 179:
 
   
 
   
  
lib.parseFunc_RTE < styled.content.parseFunc
+
lib.parseFunc_RTE < styled.content.parseFunc
  
 
   
 
   
Zeile 184: Zeile 186:
  
 
   
 
   
 
+
<pre>
 
$parseFunc = $GLOBALS['TSFE']->tmpl->setup['styled.']['content.']['parseFunc.'];
 
$parseFunc = $GLOBALS['TSFE']->tmpl->setup['styled.']['content.']['parseFunc.'];
 
if (is_array($parseFunc)) {
 
if (is_array($parseFunc)) {
Zeile 191: Zeile 193:
 
$out=$data;
 
$out=$data;
 
}
 
}
 
+
</pre>
 
   
 
   
  
Zeile 200: Zeile 202:
  
 
   
 
   
 
+
<pre>
 
$tt_content_conf = array('tables' => 'tt_content'
 
$tt_content_conf = array('tables' => 'tt_content'
 
                         ,'source' => $uidlist
 
                         ,'source' => $uidlist
Zeile 207: Zeile 209:
 
$content .= $this->cObj->RECORDS($tt_content_conf);
 
$content .= $this->cObj->RECORDS($tt_content_conf);
  
   
+
  </pre>
  
 
wobei in $uidlist die Komma-getrennte Liste der Contentelemente ist, die gerendert werden sollen.
 
wobei in $uidlist die Komma-getrennte Liste der Contentelemente ist, die gerendert werden sollen.
Zeile 223: Zeile 225:
  
 
   
 
   
 
+
<pre>
 
$imgpath='uploads/pics/';
 
$imgpath='uploads/pics/';
 
$ts['img']='IMAGE';
 
$ts['img']='IMAGE';
Zeile 234: Zeile 236:
 
}
 
}
 
$img=$this->cObj->IMAGE($ts['img.']);
 
$img=$this->cObj->IMAGE($ts['img.']);
 
+
</pre>
 
Bilder II
 
Bilder II
  
 
Etwas komplizierter ist es wenn man Bilder hat und dort Text einblenden möchte, zb. der Submit-Button, der in jeder Sprache anders beschriftet ist:
 
Etwas komplizierter ist es wenn man Bilder hat und dort Text einblenden möchte, zb. der Submit-Button, der in jeder Sprache anders beschriftet ist:
  
   
+
  <pre>
  
 
//get individual text for button:
 
//get individual text for button:
Zeile 270: Zeile 272:
 
//render to img-tag:
 
//render to img-tag:
 
$img=$this->cObj->IMAGE($ts['img.']);
 
$img=$this->cObj->IMAGE($ts['img.']);
 
+
</pre>
 
Quelle: http://www.pi-phi.de/rendering.html (9/2009)
 
Quelle: http://www.pi-phi.de/rendering.html (9/2009)

Version vom 15. September 2009, 14:40 Uhr

Mit dem Extension Kickstarter läßt sich in Backendformularen leicht der Rich Text Editor für die Texteingabe integrieren. Manche Formatierungen müssen aber vor der Ausgabe im Frontend gerendert werden. Sonst steht im Frontend statt eines a Tags beispielsweise der Typo3 eigene Tag <link>.

Möglichkeit 1 - Render funktion nutzen

Rendern von TYPO3-Links in eigener Extension (RTE: <link>) URL dieses Beitrags: http://blog.stefan-macke.com/2007/08/01/rendern-von-typo3-links-in-eigener-extension-rte/ 1. August 2007 Datum des Zugriffs 25.1.2009

Bei der Ausgabe von Links, die im TYPO3-Backend mit dem RTE eigegeben wurden, werden die dort erzeugten <a>-Tags umgewandelt in das TYPO3-interne Format <link> und in der Datenbank gespeichert. Die Ausgabe im Frontend führt dann zu Fehlern, da die <link>-Tags nicht interpretiert werden können.

Um die Tags vor der Ausgabe in korrekte Links umzuwandeln, habe ich folgende Lösung gefunden: Die Methode TS_links_rte der Klasse t3lib_parsehtml_proc übernimmt genau dieses Rendern von Links. Sie kann wie folgt in die eigene Extension eingebunden werden:

require_once(PATH_t3lib.'class.t3lib_parsehtml_proc.php');
$parseObj = t3lib_div::makeInstance('t3lib_parsehtml_proc');
$content = $parseObj->TS_links_rte($content);

Alternativ mit kleiner Funktion

 function parseRTE($content){
    $parseObj = t3lib_div::makeInstance('t3lib_parsehtml_proc');
    $content = $parseObj->TS_links_rte($content);
    return $content;
 }

und dann über

$content = $this->parseRTE($content);

Rendern. Läßt sich dann schön erweitern für spezielle Rendereigenschaften.

Möglichkeit 2 - über TypoScript

- nicht getestet -

Konfiguration Des RTE kopieren und innerhalb der eigenen Extension nutzen.

Das sähe grob gesehen folgendermaßen aus:

plugin.deine_extension {
  general_stdWrap.parseFunc < tt_content.text.20.parseFunc
  general_stdWrap.parseFunc {
   #  WEITERE EINSTELLUNGEN
  }
}


Möglichkeit 3 - über die Konfiguration der Extension

- nicht getestet -

beim Standard RTE hilft's den Eintrag in der ext_tables.php

PHP-Code:

$TCA['tt_content']['types'][$_EXTKEY.'_pi1']['showitem']= ... 

von PHP-Code:

rte_transform[mode=ts] 

nach PHP-Code:

rte_transform[mode=ts_css]  
# oder 
# rte_transform[mode=css]

Dann muß es noch in der Extension mit

$this->pi_RTEcssText($text)  

ausgegeben werden


weitere Infos

aus dem Forum zum Thema Typolinks im RTE...

Im Prinzip ist es ganz einfach:

temp.whatever = TEXT
temp.whatever {
    field = mytextfield
    parseFunc {
      tags {
        link = TEXT
        link {
          current = 1
          typolink.parameter.data = parameters : allParams
        }
     }
  }
}

Damit werden schon mal alle <link> Tags im Feld mytextfield mit typolink gerendert. Mit Hilfe weiterer typolink Parameter und/oder stdWrap Funktionen kannst Du noch einen Haufen von Modifikationen vornehmen, die den Link selbst, den Text oder den Wrap beeinflussen.

Noch eins...

RTE <link> parsen und simulateStaticDocuments

permalink Für das Archiv:

  1. TypoScript

plugin.tx_EXSTENIONKEY_pi1 { general_stdWrap.parseFunc < tt_content.text.20.parseFunc }


  1. für die Extension

$row['teasertext'] = $this->parseRTE($row['teasertext'])

private function parseRTE($string) { if (is_array($this->conf["general_stdWrap."])) { $string = $this->cObj->stdWrap($string,$this->conf["general_stdWrap."]); } return $string; }


Fehlende p Tags und anderes im RTE

das liegt oft daran, das beim speichern in der DB die p Tags in Zeilenumbrüche gewandelt werden, beim Rückweg aber nicht mehr ersetzt werden.

Im folgenden einige nützliche Infos:

Rendern einer Eingabe innerhalb eines Plugins

$out=$this->cObj->parseFunc($data,$this->conf['parser.']);
$out=$this->cObj->parseFunc($data,$GLOBALS['TSFE']->tmpl->setup['lib.']['parseFunc_RTE.']);


im Typoscript muss dazu folgendes stehen:


plugin.tx_<myextension>_pi1.parser < lib.parseFunc_RTE



class.tslib_pibase.php


/**
 * Will process the input string with the parseFunc function from tslib_cObj based on configuration set in "lib.parseFunc_RTE" in the current TypoScript template.
 * This is useful for rendering of content in RTE fields where the transformation mode is set to "ts_css" or so.
 * Notice that this requires the use of "css_styled_content" to work right.
 *
 * @param	string		The input text string to process
 * @return	string		The processed string
 * @see tslib_cObj::parseFunc()
 */
function pi_RTEcssText($str)	{
	$parseFunc = $GLOBALS['TSFE']->tmpl->setup['lib.']['parseFunc_RTE.'];
	if (is_array($parseFunc))	$str = $this->cObj->parseFunc($str, $parseFunc);
	return $str;
}

 

RESULT: you can do it like this:


$out=$this->pi_RTEcssText($data);



Das funktioniert aber nur wenn das Include Static "CSS Styled Content (css_styled_content)" eingebunden ist.

Nur mit "content (default)" muss man sich die parseFunc selber holen:


entweder nur über typoscript (irgendwo im Setup):


lib.parseFunc_RTE < styled.content.parseFunc


oder explizit im Code:


$parseFunc = $GLOBALS['TSFE']->tmpl->setup['styled.']['content.']['parseFunc.'];
if (is_array($parseFunc)) {
	$out = $this->cObj->parseFunc($data, $parseFunc);
} else {
	$out=$data;
}


Rendern eines Content-Elmentes innerhalb einer Extension

ein oder mehrere Contentelemente (Einträge in tt_content) kann man ganz einfach wie folgt rendern:


$tt_content_conf = array('tables' => 'tt_content'
                        ,'source' => $uidlist
			,'dontCheckPid' => 1
			);
$content .= $this->cObj->RECORDS($tt_content_conf);

 

wobei in $uidlist die Komma-getrennte Liste der Contentelemente ist, die gerendert werden sollen.


ACHTUNG das Ganze funktioniert aber nicht wenn eines der zu rendernden Contentelemente ein USER_INT / COA_INT o.ä., also ungecachtes Element, ist.


Bilder

Bilder muss man nicht selber skalieren. Das nimmt einem TYPO3 ab.

(hier werden die Daten direkt aus dem Contentelement ausgelesen (zb. für FE-Plugin des Typs "(x) Add as a totally new Content Element type")


$imgpath='uploads/pics/';
$ts['img']='IMAGE';
$ts['img.']['file']=$imgpath.$this->cObj->data['image'];
$ts['img.']['format']='jpg';
$ts['img.']['altText']=$this->cObj->data['altText'];
$ts['img.']['titleText']=$this->cObj->data['titleText'];
if ($this->cObj->data['imagewidth']) {
	$ts['img.']['file.']['maxW']=$this->cObj->data['imagewidth'];
}
$img=$this->cObj->IMAGE($ts['img.']);

Bilder II

Etwas komplizierter ist es wenn man Bilder hat und dort Text einblenden möchte, zb. der Submit-Button, der in jeder Sprache anders beschriftet ist:


//get individual text for button:
$buttontext=$this->pi_getLL('submit');

$buttonimage='fileadmin/images/blank_button.gif';
$size=getimagesize($buttonimage);	// get size of background-image

// define the whole Image
$ts['img']='IMAGE';	//optional
$ts['img.']['file']='GIFBUILDER';		
$ts['img.']['file.']['format']='gif';
$ts['img.']['file.']['XY']=$size[0].','.$size[1];	// use original size
$ts['img.']['file.']['altText']=$buttontext;
$ts['img.']['file.']['titleText']=$buttontext;

// insert background-image
$ts['img.']['file.']['1']='IMAGE';
$ts['img.']['file.']['1.']['file']=$buttonimage;

// insert text
$ts['img.']['file.']['10']='TEXT';
$ts['img.']['file.']['10.']['text']=$buttontext;
// style textappearance
$ts['img.']['file.']['10.']['fontSize']='12';
$ts['img.']['file.']['10.']['fontFile']='fileadmin/fonts/arial.ttf';
$ts['img.']['file.']['10.']['fontColor']='#666666';
$ts['img.']['file.']['10.']['offset']='22,14';

//render to img-tag:
$img=$this->cObj->IMAGE($ts['img.']);

Quelle: http://www.pi-phi.de/rendering.html (9/2009)