Ich habe mich gestern nach langer Pause dem Problem noch einmal gewidmet und bin - zumindest für mich - zu einer Lösung gekommen, die ich hier gerne beschreiben möchte.
In meinem Fall (in den Felddefinitionen des Catalog waren Änderungen an der Optionsauswahl für Select-Felder nicht mehr änderbar) lag das Problem aber offensichtlich gar nicht (wie ursprünglich vermutet) ausschließlich bei der Taxonomy, sondern vor allem an der Erweiterung "backend_tabletree".
Dort habe ich Anpassungen in den Dateien TableTree.php und vor allem in tabletreewizard.js vorgenommen.
Grundsätzlich lag das Problem nämlich darin begründet, dass es auf Grund der Änderungen von Contao 2 zu Contao 3 und im MooTools Framework zu Javascript-Fehlern kam, welche die korrekte Ausführung der Ajax-Requests zur Darstellung des TableTrees und zur Speicherung der getätigten Auswahl verhinderten.
Die Änderungen im Core-Javascript von Contao beinhalteten offensichtlich eine Entfernung der Funktionen showTreeBody und hideTreeBody. Über diese wurde der Ein-/Ausklappzustand des TableTrees im Backend gesteuert. Durch das Fehlen der Funktion hideTreeBody war der TableTree immer sofort sichtbar. Man musste also die Checkbox "Auswahl ändern" nicht anhaken, die musste aber eben angehakt werden, damit Änderungen beim Speichern auch in die Datenbank geschrieben werden. Da bin ich gestern einfach durch Zufall drauf gestoßen, als ich mich aus lauter Frust mit dem Aus- und Einklappen des TableTree beschäftigt habe, weil ich sonst nicht weiterkam.
Ich habe mir also aus der alten Contao Javascript-Datei die beiden Funktionen herauskopiert und einfach mit in die Datei tabletreewizard.js gepackt und in die Variable AjaxRequestTabletree inkludiert. Dann musste ich natürlich noch entsprechend den Aufruf von showTreeBody in der TableTree.php ändern.
Auf Zeile 174 wurde aus
PHP-Code:
onclick="Backend.showTreeBody(this, \''.$this->strId.'_parent\');"
PHP-Code:
onclick="AjaxRequestTabletree.showTreeBody(this, \''.$this->strId.'_parent\');"
Darüber hinaus habe ich in der tabletreewizard.js die Variable für das Einfügen des Request Tokens ändern müssen (Zeilen 34 und 40), da die alte Variable "REQUEST_TOKEN" nicht mehr zur Verfügung stand. Stattdessen kann nun "Contao.request_token" verwendet werden.
Als letztes gab es dann noch die oben erwähnten MooTools-Fehler auszubügeln (Zeilen 62 und 63).
Aus
Code:
ul.injectInside(item);
item.injectAfter($(el).getParent('li'));
wird nun
Code:
ul.inject(item,'bottom');
item.inject(($(el).getParent('li')),'after');
Zu guter letzt habe ich dann einfach noch ein
Code:
window.addEvent('domready', function() {
AjaxRequestTabletree.hideTreeBody();
});
an das Ende der tabletreewizard.js gepackt, damit der TablTree auch brav beim Laden der Seite versteckt wird.
Die komplette tabletreewizard.js sieht bei mir nun so aus:
Code:
/**
* Class BackendTabletreeWizard
*
* Provide methods to handle back end tasks.
* @copyright Thyon Design 2009
* @author John Brand <john.brand@thyon.com>
* @package BackendTaxonomyWizard
*/
var AjaxRequestTabletree =
{
/**
* Toggle the page tree (input field)
* @param object
* @param string
* @param string
* @param string
* @param integer
* @return boolean
*/
toggleTabletree: function (el, id, field, name, level)
{
el.blur();
var item = $(id);
var image = $(el).getFirst();
if (item)
{
if (item.getStyle('display') != 'inline')
{
item.setStyle('display', 'inline');
image.src = image.src.replace('folPlus.gif', 'folMinus.gif');
new Request.Contao().post({'isAjax': 1, 'action':'toggleTabletree', 'id': id, 'state': 1, 'REQUEST_TOKEN': Contao.request_token});
}
else
{
item.setStyle('display', 'none');
image.src = image.src.replace('folMinus.gif', 'folPlus.gif');
new Request.Contao().post({'isAjax': 1, 'action':'toggleTabletree', 'id': id, 'state': 0, 'REQUEST_TOKEN': Contao.request_token});
}
return false;
}
new Request.Contao(
{
onRequest: AjaxRequest.displayBox('Loading data ...'),
onSuccess: function(txt, xml)
{
var ul = new Element('ul');
ul.addClass('level_' + level);
ul.set('html', txt);
item = new Element('li');
item.addClass('parent');
item.setProperty('id', id);
item.setStyle('display', 'inline');
ul.inject(item,'bottom');
item.inject(($(el).getParent('li')),'after');
image.src = image.src.replace('folPlus.gif', 'folMinus.gif');
AjaxRequest.hideBox();
}
}).post({'isAjax': 1, 'action':'loadTabletree', 'id': id, 'level': level, 'field': field, 'name': name, 'state': 1, 'REQUEST_TOKEN': Contao.request_token});
return false;
},
/**
* Show all pagetree and filetree nodes
* @param object
* @param string
*/
showTreeBody: function(el, id)
{
el.blur();
var parent = $(id);
parent.setStyle('display', ($(el).checked ? 'inline' : 'none'));
},
/**
* Hide all pagetree and filetree nodes
*/
hideTreeBody: function()
{
var lists = $$('ul');
for (var i=0; i<lists.length; i++)
{
if (lists[i].className.indexOf('mandatory') != -1)
{
$('ctrl_' + lists[i].id).checked = 'checked';
continue;
}
if (lists[i].className.indexOf('tl_listing') != -1)
{
var parent = lists[i].getFirst().getNext();
if (parent && parent.className == 'parent')
{
parent.setStyle('display', 'none');
}
}
}
}
}
window.addEvent('domready', function() {
AjaxRequestTabletree.hideTreeBody();
});
Ich habe keine Ahnung, ob das noch irgendjemandem weiterhelfen wird; ich bin genötigt mich damit zu beschäftigen, weil wir den alten Catalog für ein Projekt einfach unter Contao 3 brauchen und ich glaube ich bin jetzt auf einem Stand wo wir damit arbeiten können. Und dokumentiert wollte ich das ganze auch gerne hier haben.
Man kann mit dieser Vorgehensweise auch den Backend-Feldtyp "TaxonmyTree" fitmachen (relevant z.B. in den Benutzer- und Benutzergruppen-Einstellungen, um erlaubt Taxonomy-Mounts festzulegen), das habe ich gerade eben verifiziert.
Lesezeichen