Manuelle Sortierung ohne Elterntabelle

von Marco Simbürger

Contao bietet das manuelle Sortieren von Elementen im Backend nur für Kindtabellen mit dem Sorting-Mode 4 an. Hat man aber ein eigenes Modul erstellt und möchte dafür auch eine manuelle Sortierung einrichten (z.B. für die Ausgabe von Daten auf der Website; der Reihe nach sortiert wie im Backend) kann man folgenden Trick anwenden:

In der dca-Datei bei sorting den Sorting-Mode auf 5 (Tree-View -> Darstellung wie bei Seitenstruktur) stellen und den Callback paste_button_callback hinzufügen. Den Callback brauchen wir, um das Clipboard für das Einfügen in die untere Ebene zu verbieten.

// List
'list' => array
(
	'sorting' => array
	(
		'mode'                    => 5, //Tree-View
		'fields'                  => array('title'),
		'panelLayout'             => 'filter;sort,search,limit',
		'flag'                    => 1,
		'paste_button_callback'   => array('tl_ms_test', 'pasteElement') //Callback
	),

Anschliessend unten in die entsprechende Klasse folgende Funktion eintragen, um das Einfügen in die untere Ebene zu verbieten. Wir geben hiermit eigentlich einfach nur noch ein und nicht mehr beide Clipboard-Icons zurück.

class tl_ms_test extends Backend
{

	public function pasteElement(DataContainer $dc, $row, $table)
	{

		$imagePasteAfter = Image::getHtml('pasteafter.gif', sprintf($GLOBALS['TL_LANG'][$table]['pasteafter'][1], $row['id']));
		return '<a href="'.$this->addToUrl('act=cut&mode=1&pid='.$row['id']).'" title="'.specialchars(sprintf($GLOBALS['TL_LANG'][$table]['pasteafter'][1], $row['id'])).'" onclick="Backend.getScrollOffset()">'.$imagePasteAfter.'</a> ';

	}

}

$imagePasteAfter wird zurückgegeben. Die Variable $imagePasteInto, die normalerweise generiert wird, wird gar nicht mehr erstellt und mitgegeben.

 

Zurück

Kommentare

Kommentar von Adrian Känzig |

Damit funktioniert es aber nur, wenn bereits Datensätze vorhanden sind!

Kommentar von René Fehrmann |

Danke für den Beitrag.

Ich bekam eine Fehlermeldung. Mein Modul hatte im DCA weder ein Feld 'pid' bzw. 'sorting'. Beide sind aber notwendig, damit es funktioniert.

Contao 3.5.17

Antwort von Marco Simbürger

Hallo René

Vielen Dank für Deinen Beitrag.

Ja, das Feld 'sorting' ist zwingend, weil darin die Sortierungs-Position gespeichert wird. Bei einer Kind-Tabelle ist auch das Feld 'pid' zwigend, um die Referenz auf das Eltern-Element zu gewährleisten.

Gruss
Marco

Kommentar von Dennis Bohn |

Vielen Dank für diesen hilfreichen Beitrag. Ich hätte aber noch eine kleine Ergänzung. Ich konnte mit dieser Lösung keine neuen Elemente erstellen, da im paste_button_callback noch fest "act=cut" hinterlegt ist. Mit dem folgenden Code funktioniert auch das Erstellen neuer Elemente.

public function pasteElement(DataContainer $dc, $row, $table, $cr, $arrClipboard)
{
$imagePasteAfter = Image::getHtml('pasteafter.gif', sprintf($GLOBALS['TL_LANG'][$table]['pasteafter'][1], $row['id']));
return '<a href="'.$this->addToUrl('act='.$arrClipboard['mode'].'&mode=1&pid='.$row['id']).'" title="'.specialchars(sprintf($GLOBALS['TL_LANG'][$table]['pasteafter'][1], $row['id'])).'" onclick="Backend.getScrollOffset()">'.$imagePasteAfter.'</a> ';
}

Einen Kommentar schreiben

Bitte rechnen Sie 1 plus 9.