Zum Inhalt springen

Problem mit Mapping Type:Container for Elements (Section)

Erstellt am 27. August 2007 · 5 Antworten · letzte Antwort am 6. November 2007

Tags: Frage

daniz78 ·

Moin moin,

wenn ein Redakteur bei einer Auswahl ein Element mitten in der Liste löscht, habe ich das Problem, dass in der DB ein leerer "section index" bestehen bleibt.

<section index="#"></section>

Das führt immer wieder zu Problemen, wenn ein neues Element angelegt wird und die Reihenfolge verändert wird.

Hatte jemand schon einmal das gleiche Problem?

Gruß, Daniz

picrasso ·

Ja, meiner einer!

Auch scheints Probleme mit den Index-Werten der Section zu geben. Sind diese nicht schön durchnummeriert, so wird die entsprechende Seite nicht nur nicht im Frontend, sondern auch im Backend angezeigt.

Bis 3 ist alles ok. Aber dann fehlt immer der Index 4 und schon haben wir den Salat.

Gibts schon Bugfixes in der Hinsicht?

daniz78 ·

Die Antwort ist jetzt da...weitergebracht hat sie mich leider noch nicht! :-(

Zu Ihrem Problem mit TemplaVoila kann ich Ihnen leider keine Hilfestellung geben. Die Weiterentwicklung von TemplaVoila hat inzwischen Dmitry Dulepov übernommen.

Am besten schauen Sie einmal im Bugtracker (bugs.typo3.org) nach, ob Ihr Problem schon bekannt ist und fragen ggf. in der TemplaVoila Mailing Liste nach.

Viele Grüße,
Robert Lemke

Flo S.​ ·

Hi,

wundert mich ein wenig, dass dieses Problem immernoch existiert. Ist scheinbar nicht wirklich vielen Leuten aufgefallen....
Ich hatte in einem mittlerweile schon etwas älterem Projekt das gleiche Problem.
Das ist definitiv ein Bug in der Methode die eine Section löscht. Ich hatte diese Methode (für mich) umgeschrieben. Hatte damals Robert Lemke im IRC darauf angesprochen, der mir nicht ganz folgen konnte, war aber auch zu faul das im Bugtracker zu melden. Ich such mal schnell nach der Methode.

Gruß

Flo S.​ ·

so habs gefunden...
Das Problem liegt in den zwei Funktionen _DELETE_FLEX_FORMdata und _MOVE_FLEX_FORMdata in class.t3lib_tcemain.php

Originalversionen:

function _DELETE_FLEX_FORMdata(&$valueArrayToRemoveFrom,$deleteCMDS){
                 if (is_array($valueArrayToRemoveFrom) && is_array($deleteCMDS)) {
                         foreach($deleteCMDS as $key => $value)  {
                                 if (is_array($deleteCMDS[$key]))        {                                         $this->_DELETE_FLEX_FORMdata($valueArrayToRemoveFrom[$key],$deleteCMDS[$key]);
                                 } else {
                                         unset($valueArrayToRemoveFrom[$key]);
                                 }
                         }
                 }
         } 
function _MOVE_FLEX_FORMdata(&$valueArrayToMoveIn, $moveCMDS, $direction)       {
                 if (is_array($valueArrayToMoveIn) && is_array($moveCMDS))       { 
                                 // Only execute the first move command:
                         list ($key, $value) = each ($moveCMDS); 
                         if (is_array($moveCMDS[$key]))  {                                 $this->_MOVE_FLEX_FORMdata($valueArrayToMoveIn[$key],$moveCMDS[$key], $direction);
                         } else {
                                 switch ($direction) {
                                         case 'up':
                                                 if ($key > 1) {                                                         $tmpArr = $valueArrayToMoveIn[$key];                                                         $valueArrayToMoveIn[$key] = $valueArrayToMoveIn[$key-1];                                                         $valueArrayToMoveIn[$key-1] = $tmpArr;
                                                 }
                                         break;
                                         case 'down':
                                                 if ($key < count($valueArrayToMoveIn)) {                                                         $tmpArr = $valueArrayToMoveIn[$key];                                                         $valueArrayToMoveIn[$key] = $valueArrayToMoveIn[$key+1];                                                        $valueArrayToMoveIn[$key+1] = $tmpArr;
                                                 }
                                         break;
                                 }
                         }
                 }
         }

Ich hatte damals nicht die DELETE Funktion angepasst sondern die MOVE Funktion. Also nach dem Löschen einer Section gibt es bei mir nach wie vor eine Sectionleiche im Datansatz. Wenn aber die Reihenfolge geändert wird, wobei dieser Fehler entsteht, wird wieder alles auf einen Normalzustand gebracht, so weit ich mich erinnern kann. Ist schon knapp 2 Jahre her 🙂

function _MOVE_FLEX_FORMdata(&$valueArrayToMoveIn, $moveCMDS, $direction)	{
		if (is_array($valueArrayToMoveIn) && is_array($moveCMDS))	{

			// Only execute the first move command:
			list ($key, $value) = each ($moveCMDS);

			if (is_array($moveCMDS[$key]))	{
				$this->_MOVE_FLEX_FORMdata($valueArrayToMoveIn[$key],$moveCMDS[$key], $direction);
			} else {
				switch ($direction) {
					case 'up':
						if ($key > 1) {
							$newarrayindex = 0;
							$tosortarr = $valueArrayToMoveIn;
							$sortedarr = array();
							$tmparr;
							$mykey = $key;
							foreach($tosortarr as $id => $element){
								if($mykey == $id){
									$tmparray = $sortedarr[$newarrayindex];
									$sortedarr[$newarrayindex] = $element;
									$newarrayindex++;
									$sortedarr[$newarrayindex] = $tmparray;
								}else{
									$newarrayindex++;
									$sortedarr[$newarrayindex] = $element;
								}	
							}
							$valueArrayToMoveIn = $sortedarr;
						}
					break;
					case 'down':
						if ($key < count($valueArrayToMoveIn)) {
							$up = false;
							$arr2sort = $valueArrayToMoveIn;
							$sortedarr = array();
							$newarrayindex = 1;
							foreach($arr2sort as $oldid => $element){
								if($key == $oldid){
									$sortedarr[$newarrayindex] = array();
									$sortedarr[($newarrayindex+1)] = $element;
									$up = true;
								}else{
									if($up){
										$sortedarr[($newarrayindex-1)] = $element;
										$up = false;
									}else{
										$sortedarr[$newarrayindex] = $element;
									}
								}
								$newarrayindex++;
							}
							$valueArrayToMoveIn = $sortedarr;
						}
					break;
				}
			}
		}
	}

Bezeichnet es als Hack oder was weiß ich was, mir egal, so funktionierts auf jeden Fall 😉

Gruß