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...