Zum Inhalt springen

MM Relation Sortierung per Frontend bearbeiten

Erstellt am 29. Januar 2013 · 1 Antwort · letzte Antwort am 4. Februar 2013

Tags: Extbase, Frage

jenser ·

Hi Zusammen

Ich stehe vor folgendem Problem, ich habe 2 Objekte in einer M:N Beziehung (MM Tabelle) und möchte bei diesen mit auf und ab Pfeilen im Frontend die Reihenfolge ändern (und speichern). Im Backend ist es ja kein Problem mit der Flexform von TYPO3. Es muss aber leider zwingend über das Frontend passieren? Gibt es in diese Richtung schon Lösungen? Abfrage der MM Tabelle? Wo muss ich ansetzen?
(TYPO 4.7 Extbase/fluid)

Danke für deine Hilfe!

jenser ·

Hallo Zusammen

Ich habe nun ein Weg gefunden das Problem der Sortierung zu lösen und zwar über das Repository und direktes editing der MM Tabelle:

Aufbau: In einem CardSet sind beliebig viele Cards zugeordnet (MM-Relation) die mit Pfeilen im Frontend in der Reihenfolge dauerhaft um 1 erhöht oder verringert werden können (Anpassung der MM Tabelle).

Controller:

$this->cardRepository->upDownSort($cardSet->getUid(),$this->request->getArgument('cardID'),'up');

cardRepository:

public function upDownSort($cardset,$mycard,$direction){
		
	$sql = $GLOBALS['TYPO3_DB']->exec_SELECTquery ("COUNT(*)", "tx_hbcardmanager_card_cardset_mm", "uid_local=".$cardset);
	$row = $GLOBALS['TYPO3_DB']->sql_fetch_row($sql); 
	$maxAnzahl = $row[0]; 
		
    if($direction == 'up') {
	$sql = $GLOBALS['TYPO3_DB']->exec_SELECTquery ("sorting", "tx_hbcardmanager_card_cardset_mm", "uid_local=".$cardset." AND uid_foreign=".$mycard);
        while($row = mysql_fetch_object($sql)) {
            $sortierung = $row->sorting;
        }
	$sql = $GLOBALS['TYPO3_DB']->exec_SELECTquery ("uid_foreign", "tx_hbcardmanager_card_cardset_mm", "sorting=".($sortierung-1)." AND uid_local=".$cardset);
        
        while($row = mysql_fetch_object($sql)) {
            $newId = $row->uid_foreign;
        }
        if(($sortierung-1)<= 0 ) {
            return "Sortierung nicht möglich, element ist schon an höchster stelle";
        }else {
	$GLOBALS['TYPO3_DB']->exec_UPDATEquery("tx_hbcardmanager_card_cardset_mm","uid_local=".$cardset." AND uid_foreign=".$mycard,array('sorting'=>($sortierung-1)));
	$GLOBALS['TYPO3_DB']->exec_UPDATEquery("tx_hbcardmanager_card_cardset_mm","uid_local=".$cardset." AND uid_foreign=".$newId,array('sorting'=>($sortierung)));
           
            return "sortiert";
        }
    }
    if($direction == 'down') {
	$sql = $GLOBALS['TYPO3_DB']->exec_SELECTquery ("sorting", "tx_hbcardmanager_card_cardset_mm", "uid_local=".$cardset." AND uid_foreign=".$mycard);
        
        while($row = mysql_fetch_object($sql)) {
            $sortierung = $row->sorting;
        }
	$sql = $GLOBALS['TYPO3_DB']->exec_SELECTquery ("uid_foreign", "tx_hbcardmanager_card_cardset_mm", "sorting=".($sortierung+1)." AND uid_local=".$cardset);
        
        while($row = mysql_fetch_object($sql)) {
            $newId = $row->uid_foreign;
        }
        if(($sortierung+1)> ($maxAnzahl) ) {
            return "Sortierung nicht möglich, element ist schon an niedrigster stelle";
        }else {
            
	$GLOBALS['TYPO3_DB']->exec_UPDATEquery("tx_hbcardmanager_card_cardset_mm","uid_local=".$cardset." AND uid_foreign=".$mycard,array('sorting'=>($sortierung+1)));
	$GLOBALS['TYPO3_DB']->exec_UPDATEquery("tx_hbcardmanager_card_cardset_mm","uid_local=".$cardset." AND uid_foreign=".$newId,array('sorting'=>($sortierung)));
			
	return "sortiert";
        }
    } 
	
}

Es gibt sicher noch bessere Lösungen, diese tuts aber im Moment.