Zum Inhalt springen

Up/Down Buttons im Seitenmodul fehlen nach Udate auf 4.3.3

Erstellt am 28. Juli 2010 · 12 Antworten · letzte Antwort am 13. November 2010

Tags: Update & Upgrade, Frage

harald.​witt ·

Hallo zunächst an alle.

Ich beschäftige mich zwar seit langem mit Typo3, doch sowas ist mir halt noch nicht passiert:

Ich habe vor ein paar Wochen ein Update von 4.2.9 auf 4.3.3 gemacht. Seitdem vermisse ich bei den Content-Elementen im Seitenmodul die Buttons zum Ändern der Reihenfolge. Auch der Button "neues Element nach diesem erstellen" ist nicht da.

Ich habe mich bisher mit dem Listenmodul beholfen. Da ist alles Ok! Doch kann ich das nicht in jedem Fall nutzen, weil bei mir die Extension kb_nescefe zum Einsatz kommt (nested content element containers). Die Hierarchie der Elemente wird im Listenmodul nicht dargestellt, sondern die Elemente in vermutlich der Reihenfolge ihrer Erzeugung aufgelistet.

Aber die Buttons im Seitenmodul müssen ja irgendwie wieder hervorzuzaubern sein. Meine wochenlange Suche hat bisher nichts greifbares ergeben. Kann da jemand helfen?

BTW: In einer parallelen (typo3_src ist ein symlink) Neuinstallation sind die Buttons da!

Danke
Harald

karlchen ·

kb_nescefe erweitert genau die TYPO3 Klasse die Für die Generierung der Move and New Buttons zuständig ist. Wenn man in die PHP von kb_nescefe rein schaut, gibt es auch eine Variable "$disableMoveAndNewButtons" die darauf schliessen lässt. Somit denke ich mal das es eine Einstellungssache ist, konnte jetzt aber auf die schnelle nicht finden wo die gesezt wird. Ich tippe auf irgendeine TSConfig Einstellung.

harald.​witt ·

Hallo karlchen,

zunächst danke für den Tipp. Habe den kompltten Dateibaum mit grep nach disableMoveAndNewButtons abgesucht. Der String kommt tatsächlich nur in der Klasse class.tx_cms_layout.php und in der Extension kb_nescefe in der Klasse ux_tx_cms_layout.php vor.

In Konfigurationen (z.B. localconf.php) ist von dem String weit und breit nichts zu sehen.

Auch in der gesamten Datenbank kommt der String nicht vor.

Somit denke ich, kann ich wohl TSConfig ausschließen.

Habe jetzt mal kb_nescefe probehalber deinstalliert --> ALLE Buttons wieder da! Nach der Neuinstallation sind die Buttons wieder weg. Auch die neueste Version von vorgestern hilft da nicht weiter.
Mal weitersehen ob ich den Bug noch finde.

Benjamecho ·

Ich habe das selbe Problem unter 4.4.0 - da sieht es mit der neusten Version noch schlechter aus. In der Seitendarstellung gibt es bei den Inhaltselementen weder Buttons, noch eine Vorschau (diese erscheint dann z.T. beim Hover; allerdings auch nicht korrekt).
Unter 4.3.3 habe ich bei einem anderen Projekt kb_nescefe 1.0.2 erfolgreich laufen.

karlchen ·

da durch die Extension eine TYPO3 Core Datei geändert, bzw. angepasst ist, kann es durch aus sein das der Extensionentwickler seine Sachen den neuen Umständen anpassen muss.

In dem Sinne ist es vielleicht wirklich ein Bug, wenn es denn keine Explizite Einstellungsmöglichkeit dafür gibt.
macht am besten einen Bug Report hier,
http://forge.typo3.org/projects/show/extension-kb_nescefe

harald.​witt ·

Hallo karlchen,

das sehe ich ganz genauso. Ich habe den Entwickler mittlerweile mal direkt angemailt. Jetzt schreib ich den Bugreport und widme mich dann dem Vergleich des Originals der Methode tt_content_drawHeader mit der aus der erweiterten Klasse.

Bis später
Harald

harald.​witt ·

Hallo ihr Lieben,

ich habe den Bug gefunden: }😃

Klasse: typo3conf/ext/kb_nescefe/class.ux_tx_cms_layout.php
Methode: tt_content_drawHeader und tt_content_drawHeader_44

Im Unterschied zum Original ist die Variable $out in der erweiterten Klasse von kb_nescefe ein Array und kein String.

Ganz am Ende der Methode wird aber die Eltern-Methode mit dieser Variablen als Parameter aufgerufen, ohne vorher ein imlode(..) zu machen. Wenn ihr dass korrigiert, funzt es. Hier das Workaround für tt_content_drawHeader (Zeilen 180-201). Die Korrektur in tt_content_drawHeader_44 kriegt ihr doch wohl selber hin 😉

Vorher:
if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawHeader'])) {
$_params = array('tt_content',$row['uid']);
foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawHeader'] as $_funcRef) {
$_params = array(
'content' => &$out,
'space' => &$space,
'row' => $row,
'disableMoveAndNewButtons' => $disableMoveAndNewButtons,
'langMode' => $langMode,
);
t3lib_div::callUserFunction($_funcRef,$_params,$this);
}
}
// Wrap the whole header in a table:
return '
<table border="0" cellpadding="0" cellspacing="0" class="typo3-page-ceHeader">'.($space?'
<tr>
<td><img src="clear.gif" height="'.$space.'" alt="" /></td>
</tr>':'').
implode('', $out).'
</table>';
}

Nachher:
$out = implode('', $out); // added line
if (is_array($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawHeader'])) {
$_params = array('tt_content',$row['uid']);
foreach ($GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['cms/layout/class.tx_cms_layout.php']['tt_content_drawHeader'] as $_funcRef) {
$_params = array(
'content' => &$out,
'space' => &$space,
'row' => $row,
'disableMoveAndNewButtons' => $disableMoveAndNewButtons,
'langMode' => $langMode,
);
t3lib_div::callUserFunction($_funcRef,$_params,$this);
}
}
// Wrap the whole header in a table:
return '
<table border="0" cellpadding="0" cellspacing="0" class="typo3-page-ceHeader">'.($space?'
<tr>
<td><img src="clear.gif" height="'.$space.'" alt="" /></td>
</tr>':'').
$out.' //modified line
</table>';

Viele Grüße an alle
Harald

P.S. Ich Dummy finde jetzt gleich aml dem "Gelöst-Haken" nicht. Mache micht jetz erstmal an foge.typo3.org wegen dem Bugreport-Update.

harald.​witt ·

Hallo nochmal an alle,

vergesst bitte alle mittlerweile angestellten Spekulationen. In der angehängten Datei habt ihr die endgültige Lösung für das Problem der verschwundenen Buttons. Habe das Problem nach einigem Mailverkehr gemeinsam mit dem Entwickler gelöst. Danke an Bernhard.

Sorry, dass es so lange gedauert hat. Hatte es etwas verdrängt, dass das Thema in diesem Forum noch offen ist.

Viele Grüße
Harald

kb_nescefe-1.1.1.pdf
23kB
harald.​witt ·

Mit dem Download ist woh in diesem Forum etwas foul. Also paste ich das ganze mal direkt hier rein:
______________________________________________________________

Anpassungen in:
typo3conf/ext/kb_nescefe/class.tx_kbnescefe_layout.php
------------------------------------------------------
Die Buttons für Kopieren und Ausschneiden fehlen.
Als ich noch PHP 5.2 im Einsatz hatte, fehlten auch die Up- und Down-Buttons.

Bug 1:
------
In der Methode insertIntoArray() steht:
list($afterKey) = array_intersect($position, $currentKeys);

Das array_intersect() klappt, aber list() nicht.
Grund: In der Doku von PHP 5.2 steht:
"list() funktioniert nur bei numerischen Arrays und basiert auf der ANNAHME, DASS DIE NUMERISCHEN INDIZES BEI 0 BEGINNEN.

Letzteres ist nicht der Fall, da array_intersect() Indizes aus den Original-Arrays benutzt!
Daher ergibt list() NULL und wir landen bei if($arrayKey) immer im else-Zweig.

Lösung:
$afterKey = array_shift(array_intersect($position, $currentKeys));

Bug2:
-----
In der Methode insertIntoArray() steht:
$post = array_slice($array, $pos+$addOffset, NULL, true);

$post ist danach aber leer. Darin sollten die Buttons sein, die ich vermisse. Grund ist der NULL-Parameter. (BTW: Das verhalten von array_slice() zeigt zumindest in PHP 5.2 sogar unterschiedliches Verhalten bei +0 und -0).

Lösung 1:
$post = array_slice($array, $pos+$addOffset, count($array), true);

Lösung 2:
$post = array_diff($array, $pre);

Lösung 1 ist dabei wegen der Lesbarkeit zu bevorzugen, da es den eigentlichen Sinn der Anweisung besser dokumentiert. Diese Lösung wurde auch vom Entwickler, Bernhard Kraft, als offizielles Bugfix in forge eingestellt.

DIFF:
--------------------------------------------------------------
diff class.tx_kbnescefe_layout.php.orig class.tx_kbnescefe_layout.php
102c102
< list($afterKey) = array_intersect($position, $currentKeys);
---
> $afterKey = array_shift(array_intersect($position, $currentKeys));
107c107
< $post = array_slice($array, $pos+$addOffset, NULL, true);
---
> $post = array_slice($array, $pos+$addOffset, count($array), true);

harald.​witt ·

Mit dem Download ist woh in diesem Forum etwas foul. Also paste ich das ganze mal direkt hier rein:
______________________________________________________________

Anpassungen in:
typo3conf/ext/kb_nescefe/class.tx_kbnescefe_layout.php
------------------------------------------------------
Die Buttons für Kopieren und Ausschneiden fehlen.
Als ich noch PHP 5.2 im Einsatz hatte, fehlten auch die Up- und Down-Buttons.

Bug 1:
------
In der Methode insertIntoArray() steht:
list($afterKey) = array_intersect($position, $currentKeys);

Das array_intersect() klappt, aber list() nicht.
Grund: In der Doku von PHP 5.2 steht:
"list() funktioniert nur bei numerischen Arrays und basiert auf der ANNAHME, DASS DIE NUMERISCHEN INDIZES BEI 0 BEGINNEN.

Letzteres ist nicht der Fall, da array_intersect() Indizes aus den Original-Arrays benutzt!
Daher ergibt list() NULL und wir landen bei if($arrayKey) immer im else-Zweig.

Lösung:
$afterKey = array_shift(array_intersect($position, $currentKeys));

Bug2:
-----
In der Methode insertIntoArray() steht:
$post = array_slice($array, $pos+$addOffset, NULL, true);

$post ist danach aber leer. Darin sollten die Buttons sein, die ich vermisse. Grund ist der NULL-Parameter. (BTW: Das verhalten von array_slice() zeigt zumindest in PHP 5.2 sogar unterschiedliches Verhalten bei +0 und -0).

Lösung 1:
$post = array_slice($array, $pos+$addOffset, count($array), true);

Lösung 2:
$post = array_diff($array, $pre);

Lösung 1 ist dabei wegen der Lesbarkeit zu bevorzugen, da es den eigentlichen Sinn der Anweisung besser dokumentiert. Diese Lösung wurde auch vom Entwickler, Bernhard Kraft, als offizielles Bugfix in forge eingestellt.

DIFF:
--------------------------------------------------------------
diff class.tx_kbnescefe_layout.php.orig class.tx_kbnescefe_layout.php
102c102
< list($afterKey) = array_intersect($position, $currentKeys);
---
> $afterKey = array_shift(array_intersect($position, $currentKeys));
107c107
< $post = array_slice($array, $pos+$addOffset, NULL, true);
---
> $post = array_slice($array, $pos+$addOffset, count($array), true);

harald.​witt ·

Mit dem Download ist woh in diesem Forum etwas foul. Also paste ich das ganze mal direkt hier rein:
______________________________________________________________

Anpassungen in:
typo3conf/ext/kb_nescefe/class.tx_kbnescefe_layout.php
------------------------------------------------------
Die Buttons für Kopieren und Ausschneiden fehlen.
Als ich noch PHP 5.2 im Einsatz hatte, fehlten auch die Up- und Down-Buttons.

Bug 1:
------
In der Methode insertIntoArray() steht:
list($afterKey) = array_intersect($position, $currentKeys);

Das array_intersect() klappt, aber list() nicht.
Grund: In der Doku von PHP 5.2 steht:
"list() funktioniert nur bei numerischen Arrays und basiert auf der ANNAHME, DASS DIE NUMERISCHEN INDIZES BEI 0 BEGINNEN.

Letzteres ist nicht der Fall, da array_intersect() Indizes aus den Original-Arrays benutzt!
Daher ergibt list() NULL und wir landen bei if($arrayKey) immer im else-Zweig.

Lösung:
$afterKey = array_shift(array_intersect($position, $currentKeys));

Bug2:
-----
In der Methode insertIntoArray() steht:
$post = array_slice($array, $pos+$addOffset, NULL, true);

$post ist danach aber leer. Darin sollten die Buttons sein, die ich vermisse. Grund ist der NULL-Parameter. (BTW: Das verhalten von array_slice() zeigt zumindest in PHP 5.2 sogar unterschiedliches Verhalten bei +0 und -0).

Lösung 1:
$post = array_slice($array, $pos+$addOffset, count($array), true);

Lösung 2:
$post = array_diff($array, $pre);

Lösung 1 ist dabei wegen der Lesbarkeit zu bevorzugen, da es den eigentlichen Sinn der Anweisung besser dokumentiert. Diese Lösung wurde auch vom Entwickler, Bernhard Kraft, als offizielles Bugfix in forge eingestellt.

DIFF:
--------------------------------------------------------------
diff class.tx_kbnescefe_layout.php.orig class.tx_kbnescefe_layout.php
102c102
< list($afterKey) = array_intersect($position, $currentKeys);
---
> $afterKey = array_shift(array_intersect($position, $currentKeys));
107c107
< $post = array_slice($array, $pos+$addOffset, NULL, true);
---
> $post = array_slice($array, $pos+$addOffset, count($array), true);