DC Memory: Unterschied zwischen den Versionen

Aus Contao Community Documentation

K (Link zum Tracker eingefügt)
 
(20 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Danke für's Formatieren :D
+
[[Kategorie:Extensions]]
 +
{{ExtInfo
 +
| Dev=Stefan Lindecke, Yanick Witschi
 +
| ExtVersion=0.5.0 rc1
 +
| Version=2.9.0 - 2.10,0 RC1
 +
| ERLink=http://www.contao.org/erweiterungsliste/view/DC_Memory.de.html
 +
| TrackerLink=http://www.contao-forge.org/projects/c3framework/issues
 +
| Depending=[http://www.contao.org/erweiterungsliste/view/3CFramework.de.html 3CFramework]
 +
}}
  
== Allgemeines ==
+
=Allgemeines=
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, also die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.
+
Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, als die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.
  
== Daten laden und speichern ==
+
=Daten laden und speichern=
  
Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt.
+
Zum Speichern und Laden der Daten werden die bekannten ''onload_callbacks'' und ''onsubmit_callbacks'' genutzt.
 
Hier ein Beispiel:
 
Hier ein Beispiel:
  
Zeile 55: Zeile 63:
 
</source>
 
</source>
  
== Versionierung ==
+
=Versionierung=
Es wäre ja gelacht, wenn wir die Standard-Versionierung von Contao nehmen würden, denn die bietet für die meisten Entwickler zu wenig Flexibilität (was aber nicht heisst, man kann die Core-Versionierung nicht auch einbauen).
+
Auf die Contao-eigene Versionierung wird verzichtet, da diese für die meisten Entwickler zu wenig Flexibilität bietet (was aber nicht bedeutet, dass man die Core-Versionierung nicht auch einbauen kann).
  
 
Folgende Konfiguration ist notwendig:
 
Folgende Konfiguration ist notwendig:
 
<source lang="php">
 
<source lang="php">
 
'enableVersioning' => true,
 
'enableVersioning' => true,
'listversions_callback'    => array
+
'dcMemory_versioning_list_callback'    => array
 
(
 
(
array('class', 'listversions_callback'),
+
array('class', 'dcMemory_versioning_list_callback'),
 
),
 
),
'dcMemory_onrestore_callback'    => array
+
'dcMemory_versioning_restore_callback'    => array
 
(
 
(
array('class', 'dcMemory_onrestore_callback'),
+
array('class', 'dcMemory_versioning_restore_callback'),
 +
),
 +
'dcMemory_versioning_createInitial_callback'    => array
 +
(
 +
array('class', 'dcMemory_versioning_createInitial_callback'),
 
)
 
)
 
</source>
 
</source>
Zeile 77: Zeile 89:
 
  * @return array
 
  * @return array
 
  */
 
  */
public function listversions_callback(DataContainer $dc, $arrVersions)
+
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)
 
{
 
{
 
$arrVersions[] = array
 
$arrVersions[] = array
Zeile 95: Zeile 107:
 
  * @param string | enthält die Version
 
  * @param string | enthält die Version
 
  */
 
  */
public function dcMemory_onrestore_callback(DataContainer $dc, $strVersion)
+
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)
 
{
 
{
 
// $strVersion enthält den value, also z.B. "version_1"
 
// $strVersion enthält den value, also z.B. "version_1"
 +
}
 +
</source>
 +
<source lang="php">
 +
/**
 +
* Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll
 +
* @param DataContainer
 +
*/
 +
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)
 +
{
 +
// Erstversion anlegen
 
}
 
}
 
</source>
 
</source>
  
== Mehrsprachigkeit ==
+
=Mehrsprachigkeit=
  
Ja, die DC_Memory unterstützt Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen anzubieten und Methoden zur Abfrage, welche Sprache aktuell bearbeitet wird.
+
Die DC_Memory unterstützt auch Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen und Methoden zur Abfrage anzubieten, welche Sprache aktuell bearbeitet wird.
Die Konfiguration erfolgt im onload_callback und könnte so aussehen:
+
Die Konfiguration erfolgt im ''onload_callback'' und könnte so aussehen:
 
<source lang="php">
 
<source lang="php">
 
/**
 
/**
Zeile 121: Zeile 143:
 
$objLangConfig->arrLanguages = array
 
$objLangConfig->arrLanguages = array
 
(
 
(
'de' => array
+
'de',
(
+
'fr'
'label' => 'Deutsch',
+
'selected' => ($dc->getLanguage() == 'de')
+
),
+
'fr' => array
+
(
+
'label' => 'Französisch',
+
'selected' => ($dc->getLanguage() == 'fr')
+
)
+
 
);
 
);
 
 
Zeile 154: Zeile 168:
 
</source>
 
</source>
  
== Buttons hinzufügen ==
+
Man kann zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt.
Im Contao-Core ist es äusserst mühsam eigene Buttons à la "Speichern und schliessen" hinzuzufügen. Mit der DC_Memory geht das ganz einfach:
+
Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:
 +
<source lang="php">
 +
'name' => array
 +
(
 +
'label'                  => &$GLOBALS['TL_LANG']['table']['name'],
 +
'inputType'              => 'text',
 +
'eval'                    => array('mandatory'=>true,'tl_class'=>'w50'),
 +
'translatableFor'        => array('*')
 +
),
 +
</source>
 +
Hier ein Feld, das nur nach Deutsch und Französisch übersetzbar ist:
 +
<source lang="php">
 +
'name' => array
 +
(
 +
'label'                  => &$GLOBALS['TL_LANG']['table']['name'],
 +
'inputType'              => 'text',
 +
'eval'                    => array('mandatory'=>true,'tl_class'=>'w50'),
 +
'translatableFor'        => array('de', 'fr')
 +
),
 +
</source>
 +
 
 +
Fehlt der Paramter "translatableFor" gänzlich, so ist das Feld nicht übersetzbar.
 +
 
 +
=Buttons hinzufügen=
 +
Im Contao-Core ist es äußerst mühsam, eigene Buttons à la "Speichern und Schliessen" hinzuzufügen. Mit der DC_Memory geht das ganz einfach:
 
<source lang="php">
 
<source lang="php">
 
/**
 
/**
Zeile 172: Zeile 210:
 
'button_callback' => array('class', 'saveNredirectToGoogleButtonCallback')
 
'button_callback' => array('class', 'saveNredirectToGoogleButtonCallback')
 
);
 
);
$dc->addButton('saveNredirectToGoogle', $arrData)
+
$dc->addButton('saveNredirectToGoogle', $arrData);
 
}
 
}
  
Zeile 183: Zeile 221:
 
{
 
{
 
$this->redirect('http://www.google.com');
 
$this->redirect('http://www.google.com');
 +
}
 +
</source>
 +
 +
Falls bei einem Button die Daten nicht gespeichert werden sollen, liegt es am Programmierer, diesen Fall vorherzusehen. Der ''onsubmit_callback' wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this->Input->post('myButton') gesetzt ist.
 +
 +
=Die Listenansicht=
 +
Contao verlangt von einem DataContainer, welcher Daten auflistet, dass vier Methoden eingebunden werden:
 +
* showAll()
 +
* show()
 +
* delete()
 +
* undo()
 +
 +
Deshalb gibt es für die vier Methoden jeweils Callbacks:
 +
<source lang="php">
 +
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');
 +
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');
 +
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');
 +
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');
 +
</source>
 +
 +
=DC_Memory_Helpers=
 +
Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.
 +
 +
==Beispiel für eine listView und Panel mit Limit wie bei DC_Table==
 +
Dieses Beispiel wird eine Listenansicht generieren; mit einem Panel und der Auswahl, welche Einträge man ansehen möchte. Es werden immer 2 Einträge pro Seite angezeigt.<br />
 +
Hier am Beispiel der Tabelle tl_user und jeweils mit zwei Operationen, nämlich "edit" und "copy"; das Ganze gruppiert nach Anfangsbuchstabe des Usernames.
 +
 +
<source lang="php">
 +
public function dcMemory_showAll_callback(DataContainer $dc)
 +
{
 +
$objHelper = new DC_Memory_Helpers($dc);
 +
// sets the current limits to the session according to DC_Table
 +
$objHelper->setCurrentLimits();
 +
 +
// total
 +
$objTotal = $this->Database->execute("SELECT COUNT(id) AS total FROM tl_user");
 +
 +
// get the data
 +
$objData = $this->Database->execute('SELECT id,username FROM tl_user' . $objHelper->getLimitForSQL());
 +
$arrDataArray = array();
 +
 +
while($objData->next())
 +
{
 +
// get the first letter of the username
 +
$strFirstLetter = substr($objData->username,0,1);
 +
 +
$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);
 +
$arrDataArray[$strFirstLetter]['data'][] = array
 +
(
 +
'id' => $objData->id,
 +
'class' => 'list_icon',
 +
'style' => 'background-image:url(\'system/themes/default/images/user.gif\');',
 +
'label' => $objData->username,
 +
'buttons' => array
 +
(
 +
'edit' => array
 +
(
 +
'href' => 'contao/main.php?do=user&amp;act=edit&amp;id=' . $objData->id,
 +
'title' => 'Edit user ID ' . $objData->id,
 +
'icon' => 'system/themes/default/images/edit.gif',
 +
'icon_w' => '12',
 +
'icon_h' => '16',
 +
'alt' => 'Edit user'
 +
),
 +
'copy' => array
 +
(
 +
'href' => 'contao/main.php?do=user&amp;act=copy&amp;id= ' . $objData->id,
 +
'title' => 'Duplicate user ID ' . $objData->id,
 +
'icon' => 'system/themes/default/images/copy.gif',
 +
'icon_w' => '14',
 +
'icon_h' => '16',
 +
'alt' => 'Duplicate user'
 +
)
 +
)
 +
);
 +
}
 +
 +
// 2 Einträge pro Seite
 +
$strLimitHtml = $objHelper->generateLimitMenuString($objTotal->total, 2);
 +
 +
$strPanel = $objHelper->generatePanel($strLimitHtml);
 +
$strGlobalOperations = $objHelper->generateGlobalOperationsString();
 +
$strListView = $objHelper->generateListViewString($arrDataArray);
 +
return $strPanel . $strGlobalOperations . $strListView;
 
}
 
}
 
</source>
 
</source>

Aktuelle Version vom 4. September 2011, 12:33 Uhr


Erweiterungs-Übersicht
Name des Entwicklers Stefan Lindecke, Yanick Witschi
Version der Erweiterung 0.5.0 rc1
Kompatibilität mit Contao Version 2.9.0 - 2.10,0 RC1
Link zum Extension Repository http://www.contao.org/erweiterungsliste/view/DC_Memory.de.html
Link zum Tracker http://www.contao-forge.org/projects/c3framework/issues
Abhängig von ff. Erweiterungen 3CFramework


Allgemeines

Die DC_Memory ist ein eigener DCA-Driver wie die DC_Table oder andere. Allerdings bietet diese für den Entwickler extrem viel mehr Flexibilität, als die DC_Table, weil die DC_Memory das Laden und Speichern der Daten vollständig dem Entwickler überlässt.

Daten laden und speichern

Zum Speichern und Laden der Daten werden die bekannten onload_callbacks und onsubmit_callbacks genutzt. Hier ein Beispiel:

'onload_callback'           => array
(
	array('class', 'onload_callback'),
),
'onsubmit_callback'           => array
(
	array('class', 'onsubmit_callback'),
)
/**
 * Laden der Daten
 * @param DataContainer
 */
public function onload_callback(DataContainer $dc)
{
	// Werte holen von der DB oder einem File oder was auch immer
 
	// Setzen eines Wertes
	$dc->setData('field', 'Wert');
 
	// auch das Setzen aller Werte auf einmal funktioniert:
	$arrData = array();
	$arrData['field1'] = 'Wert 1';
	$arrData['field2'] = 'Wert 2';
	$dc->setDataArray($arrData);
}
/**
 * Speichern der Daten
 * @param DataContainer
 */
public function onsubmit_callback(DataContainer $dc)
{
	// Holen eines Wertes
	$strField1 $dc->getData('field1');
 
	// auch das Holen aller Werte auf einmal funktioniert:
	$arrData = $dc->getDataArray();
 
	// und dann ab in die DB oder in ein File oder wohin auch immer
}

Versionierung

Auf die Contao-eigene Versionierung wird verzichtet, da diese für die meisten Entwickler zu wenig Flexibilität bietet (was aber nicht bedeutet, dass man die Core-Versionierung nicht auch einbauen kann).

Folgende Konfiguration ist notwendig:

'enableVersioning'			=> true,
'dcMemory_versioning_list_callback'     => array
(
	array('class', 'dcMemory_versioning_list_callback'),
),
'dcMemory_versioning_restore_callback'     => array
(
	array('class', 'dcMemory_versioning_restore_callback'),
),
'dcMemory_versioning_createInitial_callback'     => array
(
	array('class', 'dcMemory_versioning_createInitial_callback'),
)
/**
 * Ist dafür verantwortlich, welche Versionen im Dropdown angeboten werden
 * @param DataContainer
 * @param array
 * @return array
 */
public function dcMemory_versioning_list_callback(DataContainer $dc, $arrVersions)
{
	$arrVersions[] = array
	(
		'value'		=> 'version_1',
		'selected'	=> true, // Diese Version ist die jüngste
		'label'		=> 'Meine jüngste Version'
	);
 
	return $arrVersions;
}
/**
 * Ist dafür verantwortlich, was nach dem Klick auf "Wiederherstellen" passiert (also evtl. auch $this->reload() aufrufen!)
 * @param DataContainer
 * @param string | enthält die Version
 */
public function dcMemory_versioning_restore_callback(DataContainer $dc, $strVersion)
{
	// $strVersion enthält den value, also z.B. "version_1"
}
/**
 * Ist dafür verantwortlich, was bei der Ersterstellung einer Version gemacht werden soll
 * @param DataContainer
 */
public function dcMemory_versioning_createInitial_callback(DataContainer $dc)
{
	// Erstversion anlegen
}

Mehrsprachigkeit

Die DC_Memory unterstützt auch Mehrsprachigkeit. Da sie sich nicht darum kümmert, woher die Daten kommen und wohin sie gespeichert werden, bietet sie schlichtweg die Möglichkeit, Sprachen und Methoden zur Abfrage anzubieten, welche Sprache aktuell bearbeitet wird. Die Konfiguration erfolgt im onload_callback und könnte so aussehen:

/**
 * Laden der Daten
 * @param DataContainer
 */
public function onload_callback(DataContainer $dc)
{
	// Sprachwechsel-Konfiguration
	$objLangConfig = new stdClass();
 
	// Fallback zusätzlich zu den Sprachen anbieten
	$objLangConfig->enableFallback = true;
 
	// Sprachen-Array
	$objLangConfig->arrLanguages = array
	(
		'de',
		'fr'
	);
 
	// und jetzt das ganze noch aktivieren
	$dc->enableLanguageSwitch($objLangConfig);
 
	// die getLanguage()-Methode bietet die Möglichkeit, die aktuell bearbeitete Sprache zu holen	
	switch($dc->getLanguage())
	{
		case 'de':
			$dc->setData('name', 'Wir sprechen sowas von Deutsch!');
			break;
		case 'fr':
			$dc->setData('name', 'On parle le français aussi!');
			break;
		default:
			$dc->setData('name', 'What about a fallback?');
	}
 
	// Sprachen können auch gelöscht werden.
	$strEditMode = $dc->getLanguageEditMode() // enthält entweder "edit" wenn man eine Sprache bearbeitet oder "delete" wenn die Sprache gelöscht werden soll
}

Man kann zudem jedem Feld sagen, für welche Sprache es übersetzbar sein sollte. Beim Fallback werden logischerweise alle Felder angezeigt. Hier z.B. ein Feld welches für alle Sprachen übersetzbar sein soll:

'name' => array
(
	'label'                   => &$GLOBALS['TL_LANG']['table']['name'],
	'inputType'               => 'text',
	'eval'                    => array('mandatory'=>true,'tl_class'=>'w50'),
	'translatableFor'         => array('*')
),

Hier ein Feld, das nur nach Deutsch und Französisch übersetzbar ist:

'name' => array
(
	'label'                   => &$GLOBALS['TL_LANG']['table']['name'],
	'inputType'               => 'text',
	'eval'                    => array('mandatory'=>true,'tl_class'=>'w50'),
	'translatableFor'         => array('de', 'fr')
),

Fehlt der Paramter "translatableFor" gänzlich, so ist das Feld nicht übersetzbar.

Buttons hinzufügen

Im Contao-Core ist es äußerst mühsam, eigene Buttons à la "Speichern und Schliessen" hinzuzufügen. Mit der DC_Memory geht das ganz einfach:

/**
 * Laden der Daten
 * @param DataContainer
 */
public function onload_callback(DataContainer $dc)
{
	$arrData = array
	(
		'id'=>'saveNredirectToGoogle',
		'formkey'=>'saveNredirectToGoogle',
		'class'=>'',
		'accesskey'=>'g',
		'value'=>specialchars($GLOBALS['TL_LANG']['MSC']['saveNredirectToGoogle']),
		'button_callback' => array('class', 'saveNredirectToGoogleButtonCallback')
	);
	$dc->addButton('saveNredirectToGoogle', $arrData);
}
 
 
/**
 * Nach dem Speichern zu Google weiterleiten
 * @param DataContainer
 */
public function saveNredirectToGoogleButtonCallback(DataContainer $dc)
{
	$this->redirect('http://www.google.com');
}

Falls bei einem Button die Daten nicht gespeichert werden sollen, liegt es am Programmierer, diesen Fall vorherzusehen. Der onsubmit_callback' wird zuerst aufgerufen. Die Speicherung sollte also in diesem Falle dort nicht vorgenommen werden, wenn z.B. $this->Input->post('myButton') gesetzt ist.

Die Listenansicht

Contao verlangt von einem DataContainer, welcher Daten auflistet, dass vier Methoden eingebunden werden:

  • showAll()
  • show()
  • delete()
  • undo()

Deshalb gibt es für die vier Methoden jeweils Callbacks:

$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_showAll_callback'][] = array('class', 'dcMemory_showAll_callback');
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_show_callback'][]    = array('class', 'dcMemory_show_callback');
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_delete_callback'][]  = array('class', 'dcMemory_delete_callback');
$GLOBALS['TL_DCA'][$strTable]['config']['dcMemory_undo_callback'][]    = array('class', 'dcMemory_undo_callback');

DC_Memory_Helpers

Die DC_Memory_Helpers Klasse unterstützt Entwickler bei trivialen Dingen, die immer wieder gebraucht werden.

Beispiel für eine listView und Panel mit Limit wie bei DC_Table

Dieses Beispiel wird eine Listenansicht generieren; mit einem Panel und der Auswahl, welche Einträge man ansehen möchte. Es werden immer 2 Einträge pro Seite angezeigt.
Hier am Beispiel der Tabelle tl_user und jeweils mit zwei Operationen, nämlich "edit" und "copy"; das Ganze gruppiert nach Anfangsbuchstabe des Usernames.

public function dcMemory_showAll_callback(DataContainer $dc)
{
	$objHelper = new DC_Memory_Helpers($dc);
	// sets the current limits to the session according to DC_Table
	$objHelper->setCurrentLimits();
 
	// total
	$objTotal = $this->Database->execute("SELECT COUNT(id) AS total FROM tl_user");
 
	// get the data
	$objData = $this->Database->execute('SELECT id,username FROM tl_user' . $objHelper->getLimitForSQL());
	$arrDataArray = array();
 
	while($objData->next())
	{
		// get the first letter of the username
		$strFirstLetter = substr($objData->username,0,1);
 
		$arrDataArray[$strFirstLetter]['label'] = ucfirst($strFirstLetter);
		$arrDataArray[$strFirstLetter]['data'][] = array
		(
			'id'		=> $objData->id,
			'class'		=> 'list_icon',
			'style'		=> 'background-image:url(\'system/themes/default/images/user.gif\');',
			'label'		=> $objData->username,
			'buttons'	=> array
			(
				'edit' => array
				(
					'href'		=> 'contao/main.php?do=user&amp;act=edit&amp;id=' . $objData->id,
					'title'		=> 'Edit user ID ' . $objData->id,
					'icon'		=> 'system/themes/default/images/edit.gif',
					'icon_w'	=> '12',
					'icon_h'	=> '16',
					'alt'		=> 'Edit user'				
				),
				'copy' => array
				(
					'href'		=> 'contao/main.php?do=user&amp;act=copy&amp;id= ' . $objData->id,
					'title'		=> 'Duplicate user ID ' . $objData->id,
					'icon'		=> 'system/themes/default/images/copy.gif',
					'icon_w'	=> '14',
					'icon_h'	=> '16',
					'alt'		=> 'Duplicate user'				
				)
			)
		);
	}
 
	// 2 Einträge pro Seite
	$strLimitHtml = $objHelper->generateLimitMenuString($objTotal->total, 2);
 
	$strPanel = $objHelper->generatePanel($strLimitHtml);
	$strGlobalOperations = $objHelper->generateGlobalOperationsString();
	$strListView = $objHelper->generateListViewString($arrDataArray);
	return $strPanel . $strGlobalOperations . $strListView;
}
Ansichten
Meine Werkzeuge

Contao Community Documentation

Meiner Meinung nach, sollten zu kleine Webspacepakete entweder Webspaß-Pakete (man beachte die Ironie) oder Horsting-Pakete heißen!

Sascha Müller
Navigation
Verstehen
Verwenden
Entwickeln
Verschiedenes
Werkzeuge