menatwork / multicolumnwizard Goto Github PK
View Code? Open in Web Editor NEWContao Extension :: Define unlimited dca fields dynamically
Home Page: http://contao.org/en/extension-list/view/MultiColumnWizard.html
Contao Extension :: Define unlimited dca fields dynamically
Home Page: http://contao.org/en/extension-list/view/MultiColumnWizard.html
If I click the copy button, all fields are cleared. Is it possible to maintain those informations ?
Thx
Siehe #1
Das letzte Element lässt sich nicht löschen.
Hier sollte man die "values" der Widgets leeren.
--- Originally created by Christoph Wiechert on 14.09.2011 16:53.
Ich bastel gerade ein AutocompleterTextfield was natürlich auch mit den MultiColumnWizard funktionieren soll.
Da ich den Autocompleter bei jeder Änderung der Zeilen neu initialisieren muss, benötige ich einen HOOK.
Neue Javascriptdatei anbei.
Die "Klasse" MultiColumnWizard
definiert ein leeres Array execHOOK
.
In meiner Javascript-Datei fülle ich das mit dem Callback
@MultiColumnWizard.execHOOK.push(function(){ initAutocompleterTextfields(); });@
Diese Funktion ruft der MultiColumnWizard dann nach jeder Aktion auf.
--- Originally created by Christoph Wiechert on 26.10.2011 20:43.
1.) Bei Festlegung einer maximalen Zeilenanzahl über 'maxCount' scheint bei der Befüllung des DC bis zur Zeilenanzahl(maxCount) alles in Ordnung. Nach Speicherung des DC besteht plötzlich die Möglichkeit eine weitere Zeile hinzuzufügen (maxCount+1).
2.) Versucht man nun zeilenweise zu löschen, so erscheint das PLUS-Symbol auch bei Unterschreitung des maxCount nicht mehr und ist erst nach Speicherung wieder verfügbar.
--- Originally created by André Kirchner on 13.10.2011 11:15.
es werden keine Werte uebernommen.
--- Originally created by Stefan Lindecke on 05.08.2011 11:44.
In der aktuellen 3.0er Version wird beim löschen der letzten Zeile nicht einfach nur der Inhalt geleert (wie es in 2.0 von Psi programmiert wurde), es wird komplett alles gelöscht. Danach ist es nicht mehr möglich neue Inhalte anzulegen, der Wizard ist einfach gelöscht.
Im prepareForWidget Aufruf fehlt die strTable, damit der autosubmit JS valide gefuellt werden kann.
$objWidget = new $strClass($this->prepareForWidget($arrField,$arrField['name'],$arrField['value'],'',$this->strTable));
--- Originally created by Stefan Lindecke on 29.09.2011 11:05.
Moin,
der TinyMCE wird leider nicht in die MCW Felder geladen. Wird dies überhaupt unterstützt?
Ausgangssitutation sind folgende 2 Screenshots:
http://www.borowiakziehe.de/tl_files/mcw/code.png
http://www.borowiakziehe.de/tl_files/mcw/be.png
$GLOBALS['TL_DCA']['tl_content']['fields']['multiSRC']['eval']['columnFields'] = array
(
'img' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['m17GalleryPicture'],
'exclude' => true,
'inputType' => 'filepicker4ward',
'eval' => array('style'=>'width:180px')
),
'alt' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['alt'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('style'=>'width:180px')
),
'caption' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['caption'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('style'=>'width:180px')
),
'href' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_content']['caption'],
'exclude' => true,
'inputType' => 'textarea',
'eval' => array('style'=>'width:180px', 'rte'=>'tinyMCE')
)
);```
MultiColumnWizard.addOperationClickCallback('copy', function(){alert('a'); });
wird nicht ausgeführt, wahrscheinlich wegen operation.removeEvents('click');
Huhu!
Die Helper-Funktionen müssten noch angepasst werden, weil die Daten nicht gleich wie bei meinem MultiSelectWizard gespeichert werden.
Das wäre z.B. die korrekte Variante für die getByKey:
/**
* Static helper method to get all the data from a certain key for all the rows
* `param string
* `param string
* `return array
*/
public static function getByKey($strSerialized, $strKey)
{
$arrData = deserialize($strSerialized, true);
$arrReturnData = array();
foreach($arrData as $rowKey => $rowData)
{
$arrReturnData[] = $rowData[$strKey];
}
return $arrReturnData;
}
Die getFilteredByKey, habe ich nicht getestet aber ich tippe mal auf:
/**
* Static helper method to get all the data from a certain key for all the rows that match a certain other row key
* `param string
* `param string
* `param array
* @return array
*/
public static function getFilteredByKey($strSerialized, $strKey, $arrConditions)
{
$arrData = deserialize($strSerialized);
$intCountConditions = count($arrConditions);
$arrReturnData = array();
foreach($arrData as $rowKey => $rowData)
{
$intMeetCondition = 0;
// check data for every filter
foreach($arrConditions as $column => $value)
{
if($rowData[$column] == $value)
{
$intMeetCondition++;
}
}
// check if the value meets ALL conditions (AND condition)
if($intMeetCondition == $intCountConditions)
{
$arrReturnData[] = $rowData[$strKey];
}
}
return $arrReturnData;
}
--- Originally created by Yanick Witschi on 07.09.2011 20:55.
Heyho,
ich versuche derzeit über save_callback die Eingabe im mcw in eine andere Tabelle zu schreiben und per load_callback beim Aufruf wieder einzutragen. Das wegschreiben klappt, nur beim Laden des Datumsangaben bekomme ich falsche Werte.
Mein save_callback:
public function saveDates($varValue, DataContainer $dc){
$varValue = deserialize($varValue,true);
//delete all dates from event-id
$this->Database->prepare('DELETE FROM tl_ser_eventdates WHERE pid=?')->execute($dc->id);
foreach($varValue as $value)
{
$this->Database->prepare('INSERT INTO tl_ser_eventdates SET tstamp=?, pid=?, startdate=?')->execute(time(),$dc->id,$value['startdate']);
}
return '';
}
Mein load_callback:
public function loadDates($varValue, DataContainer $dc)
{
$objDates = $this->Database->prepare('SELECT * FROM tl_ser_eventdates WHERE pid=?')->execute($dc->id);
return $objDates->fetchEach('startdate');
}
Mein field:
'datetime' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_ser_events']['datetime'],
'exclude' => true,
'inputType' => 'multiColumnWizard',
'save_callback' => array(array('tl_ser_events', 'saveDates')),
'load_callback' => array(array('tl_ser_events', 'loadDates')),
'eval' => array
(
'buttons' => array('up' => false, 'down' => false),
'doNotSaveEmpty' => true,
'columnFields' => array
(
'startdate' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_ser_events']['startdate'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('mandatory'=>true, 'maxlength'=>10, 'tl_class' => 'w50 wizard', 'rgxp'=>'date', 'doNotCopy'=>true, 'datepicker'=>true)
)
)
)
)
In meiner db ist die spalte startdate ein int(10) und dort steht auch der timestamp drin, also z.B. 1338336000. Rufe ich aber die Seite auf, so wird im Eingabefeld des mcw nur 01-01-1970 eingetragen.
An welcher Stelle habe ich einen Fehler?
Danke :-)
VG
Patrick [codepiX]
Irgendwie fehlt das preventDefault() oder sowas. Beim Firefox (Chrome geht witzigerweise) werde ich beim Klick aufs "+" auf den entsprechenden Link weitergeleitet und krieg dann n 404 Not Found.
Kann das jemand bestätigen? Den Fehler konnte ich aber nicht finden, deshalb mach ich mal n Issue und hoffe auf Hilfe :S
Die Auswahl bei einem kopierten Select-Feld wird nicht übernommen, liegt wohl an stylect.
Beim ersten Klick auf copy (Reihe kopieren) lädt die Maske neu und alle Feldwerte eingaben im mulitColumnWizard werden
gelöscht. Es wird keine neue Reihe angelegt.
Erst beim 2. Click wird eine neue Reihe angelegt, aber Eingaben werden wieder alle gelöscht.
Dieses verhalten zeigt sich nur im Firefox. IE und Chrome funktionieren einwandfrei.
Wäre schön wenn man einen "neue Zeile" Button hätte um nicht jedesmal die Inhalte löschen zu müssen.
Das eval "tl_class" wird nicht berücksichtigt.
Im eval-Array für das Feld können Styles angegeben werden:
'inputType' => 'multiColumnWizard',
'eval' => array
(
'style'=>'width:100%;', ................................
Diese werden aber nicht übernommen: siehe Zeile 244 in MultiColumnWizard
Kann folgendermaßen gelöst werden:
$style = '';
if (strlen($this->style)) {
$style = ' style="' . $this->style . '"';
}
$return .= '<table cellspacing="0" ' . $style . 'rel="maxCount....................
--- Originally created by Cliff Parnitzky on 11.08.2011 11:38.
Please add befor the callback call
$this->activeRow = $i;
Therefor i could have the exact item info in the callback function. Actually i don´t know, which item was called.
Moin,
entweder ich hab das mit der Gruppierung nicht verstanden oder es ist ein Fehler.
Ich habe 10 Elemente und möchte diese in zwei spalten jeweils aufbauen. Hierfür wäre die Gruppierung geeignet da die Labels dadurch überhalb der Inputfelder stehen und nicht im table head.
Jetzt kommt bei einigen die Frage warum ich das überhaupt will? Ganz einfach ich hab einen Slider gebaut und will die config in einem blob speichern. Wenn ich die Buttons des MultiColumnWizard deaktiviere klappt das auch ganz gut.
Nun zu dem Problem. Gruppiere ich nun 2 elemente jeweils mit row_1, row_2 usw. wird nur das erste label ausgegeben. Die anderen sind leer.
Ich möchte nicht ausschließen das mein Ansatz hier der falsche ist und es sich um einen Benutzerfehler handelt. Falls das so ist, wäre es schön wenn man die Option hätte die labels entweder im table head oder überhalb der Felder auszugeben.
vg joe
Hallo,
leider lassen sich select-felder nach dem kopieren nicht mehr verändern. Erst wenn man einmal zwischen speichert, kann der Wert wieder verändert werden.
Mein select wird mit einem options_callback aus der DB befüllt, mit einem save_callback in eine andere Tabelle geschrieben und mit einem load_callback wird das mcw wieder geschrieben.
VG
Patrick
Verwendung von foreinKey bei SELECT wirft Fehler
Fatal error: Call to a member function execute() on a non-object in /DATA/webroot/contao210/system/modules/multicolumnwizard/MultiColumnWizard.php on line 487
Da fehlt ein $this->import('Database');
DCA:
'alerts' => array
(
'label' => array('Benachrichtigungen','Hier können Sie Benachrichtigungen definieren.'),
'inputType' => 'multiColumnWizard',
'eval' => array
(
'style'=>'width:100%;',
'columnsData' => array
(
'action' => array
(
'label' => array('Action'),
'inputType' => 'select',
'options' => array('TIMEOUT')
),
'cycles' => array
(
'label' => array('within Cycles'),
'inputType' => 'text',
'eval' => array('style'=>'width:80px;')
),
'alert' => array
(
'label' => array('Notification'),
'inputType' => 'select',
'foreignKey' => 'tl_moni4ward_alert.title'
)
)
)
)
--- Originally created by Christoph Wiechert on 10.08.2011 21:40.
Im Extension Repository ist eine Version welche auf Zeile 223 den erwähnten Befehl enthält. Den gibt's aber nicht...
--- Originally created by Andreas Schempp on 10.08.2011 16:00.
Eine entsprechende Funktion wäre nett :-)
--- Originally created by Andreas Schempp on 10.08.2011 16:05.
Der Linkwizard funktioniert nicht unter 2.10 und die CSS wird unter 2.9.5 nicht geladen!!!
Die save_callback-Funktionalität zeigt innerhalb der columnFields keine Funktionalität. Zum einen werden weder der aktuelle Wert, noch der DataContainer übergeben, noch nimmt das Feld den Ergebniswert einer save_callback-Funktion an. Eine automatisierte Befüllung von columnFields ist daher nicht möglich.
Getestet mit:
`
'parent_feld' => array
(
'label' => &$GLOBALS['TL_LANG']['tabelle']['parent_feld'],
'exclude' => true,
'inputType' => 'multiColumnWizard',
'eval' => array
(
'maxCount' => 3,
'columnFields' => array
(
'child_feld' => array
(
'label' => &$GLOBALS['TL_LANG']['tabelle']['child_feld'],
'exclude' => true,
'inputType' => 'text',
'save_callback' => array(array('klasse','funktion_01'))
)
}
}
}
class klasse extends Backend
{
public function funktion_01($strValue,DataContainer $dc)
{
return time();
}
}
`
--- Originally created by André Kirchner on 20.09.2011 13:46.
Bisher wird für die einzelnen Spalten nur der Titel verwendet, die Beschreibung aber ignoriert.
$GLOBALS['TL_LANG']['tl_irgendwas']['spalte'] = array('Ich bin der Spaltentitel', 'Ich bin die Beschreibung');
Das 2. Feld in der Sprachvariable wird komplett ignoriert.
Sinnvoll wäre vermutlich, das 2. Feld als Title-Attribut zu übernehmen.
<span title="Ich bin die Beschreibung">Ich bin der Spaltentitel</span>
Alternativ könnte auch ein kleines Fragezeichen (als Grafik) noch dahinter stehen, damit man sieht, aha, da gibt es noch mehr Informationen.
<span title="Ich bin die Beschreibung">Ich bin der Spaltentitel<sup>(?)</sup></span>
Oft muss oder möchte ich die einzelnen Spalten beschreiben und schreibe es dann in die Allgemeine Beschreibung für den Wizard, da muss man dann aber immer so viel lesen, weil die Beschreibung dann natürlich aufgebläht wird.
It would be very convenient if I can use a keyboard shortcut, for example Ctrl + Shift + Arrow down
, for creating a new row copy.
For now this operation is only availiable with a mouse.
Bei vielen Einträgen macht eine Drag&Drop Funktion Sinn!
Fix:
$return .= '<script>
window["MCW_" + ' . json_encode($this->strId) . '] = new MultiColumnWizard({
table: "ctrl_" + ' . json_encode($this->strId) . ',
maxCount: ' . json_encode($this->maxCount) . ',
minCount: ' . json_encode($this->minCount) . ',
uniqueFields: [] // TODO: implement
});
</script>';
Hallo,
ich baue gerade für einen Kunden eine Erweiterung in der ich auf den MultiColumnWizard zurückgreife.
Dieser benötigt die Möglichkeit schnell und unkompliziert zu einem Datensatz viele Bilder erfassen zu können,
daher habe ich mir ein "normales" File-Upload Widget gebastelt und dieses in den MCW eingebunden.
Leider sind der DataContainer.php ja nicht bekannt welche Widgets im MCW enthalten sind
und somit setzt diese das Backend-Formular nicht auf den enctype "multipart/form-data" da der MCW
nicht das uploadable Interface implementiert.
Wäre es möglich dies für künftige Versionen standardmäßig zu implementieren damit solche
Erweiterung auch Update-Safe wärenß Denn aktuell muss ich natürlich den MCW modifizieren.
--- Originally created by Benny Born on 29.11.2011 12:36.
Ich habe da eine ganz andere Frage: Könnte man MultiColumnWizard von dir aus in den Contao 3 Core integrieren? Wenn ja, dann frage ich mal Leo an, denn die Erweiterung ist für Entwickler sehr nützlich und sollte meines erachtens in den Core.
Wer gut, wenn man dem MCW auch assoziative Arrays geben könnte (geht zur Zeit nicht) und die Sortierung nicht über die Indexe sondern über die interne Array Sortierung bewerkstelligt wird:
$a = array();
$a[1] = "blub";
$a[0] = "bla";
Solange einem die Keys egal sind, spielt das keine Rolle, aber kommen wir zum Kern des Tickets:
Die Möglichkeit ein Feld des MCWs als Schlüssel zu definieren:
Bei folgendem MCW Layout:
Wert (val) | Label (label) | Standard (default)
Könnte man dann val gleich als Key definieren und anstatt folgendem Beispieleingabe:
$a = array(
array(
"val" => "v1",
"label" => "label1",
"default" => 1
),
array(
"val" => "v2",
"label" => "label2",
"default" => ""
)
);
bekommt man direkt
$a = array(
"v1" => array(
"label" => "label1",
"default" => 1
),
"v2" => array(
"label" => "label2",
"default" => ""
)
);
Das Widget versucht in die Datenbank zu schreiben, was bei "virtuellen" Feldern (die via save_callback immer "null" zurückgeben) einen Fehler verursacht. Das ist nur der Fall, wenn kein JS beim Hinzufügen/Löschen/Sortieren verwendet wird.
Version 3.0.0 rc1 generates control buttons (copy, up, down, delete) without title attribute.
At line 358
of MultiColumnWizard.php file we have:
elseif ($arrField['eval']['columnPos'])
{
$arrHeaderItems[$arrField['eval']['columnPos']] = '<td></td>';
}
As I understand, if we use columnPos
for field it will not be showing in table in it's own column. But, as you can see from code, empty cell shows in header.
So, next code should be like this:
elseif ($arrField['eval']['columnPos'])
{
$arrHeaderItems[$arrField['eval']['columnPos']] = '';
}
in der nochmal durch die Fields gegangen wird, damit deren validitaet kontrolliert wird.
--- Originally created by Stefan Lindecke on 04.08.2011 20:07.
Der Datepicker wird noch nicht unterstützt.
Die Version 1.0.0 erwartet einen Schlüssel "source", welche dieselbe Funktion wie ein "foreignKey" in Contao hat. Warum benennt ihr den nicht gleich soß
--- Originally created by Andreas Schempp on 10.08.2011 16:02.
Ich verwende in meinem MultiColumnWizard keine Namen für die Spalten.
'columnFields' => array
(
array
(
'label' => &$GLOBALS['TL_LANG']['xxx']['technical_data_0'],
'inputType' => 'text',
'eval' => array('style'=>'width:120px'),
),
array
(
'label' => &$GLOBALS['TL_LANG']['xxx']['technical_data_1'],
...
Lösung:
changeNamerecursive: function(arrEl, first, level)
{
arrEl.each(function(el){
if (el.name
![](= undefined && el.name )= null && el.name
![](= '' ){
var name = el.name.substring(0, el.name.indexOf('['));
el.name = el.name.replace(new RegExp(name+'\[[0-9]+\]', 'ig'), name+'[' + level + ']');
}
if (el.getProperty('for') )= undefined && el.getProperty('for')
![](= null && el.getProperty('for') )= '' ){
var name = el.getProperty('for').substring(0, el.getProperty('for').indexOf('['));
el.setProperty('for', el.getProperty('for').replace(new RegExp(name+'\[[0-9]+\]', 'ig'), name+'[' + level + ']'));
}
if (first.id
![](= undefined && first.id )= null && first.id != '' ){
var name = first.id.substring(0, first.id.indexOf('['));
el.id = first.id.replace(new RegExp(name+'\[[0-9]+\]', 'ig'), name+'[' + level + ']');
}
if (el.getChildren().length > 0)
MultiSelect.changeNamerecursive(el.getChildren(), first, level);
})
},
--- Originally created by Andreas Schempp on 21.09.2011 10:39.
Als eigenstaendiger CatalogFieldType
--- Originally created by Stefan Lindecke on 05.08.2011 06:49.
Moin,
hab gerade festgestellt das wenn man mcw Elemente verschachtelt, die Buttons des ersten Elements nicht mehr via Javascript reagieren. Die Debugger Console gibt folgendes zurück:
Uncaught TypeError: Cannot call method 'getElements' of null multicolumnwizard_be.js:1
Habe das ganze gefixed und stelle es gleich als Pull Request zur Verfügung.
Folgenden DCA Code habe ich dafür verwendet:
$GLOBALS['TL_DCA']['tl_content']['fields']['testcase'] => array
(
'label' => &$GLOBALS['TL_LANG']['tl_theme']['templateSelection'],
'exclude' => true,
'inputType' => 'multiColumnWizard',
'eval' => array
(
'columnFields' => array
(
'ts_client_os' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_theme']['ts_client_os'],
'exclude' => true,
'inputType' => 'select',
'options' => array
(
'option1' => 'Option 1',
'option2' => 'Option 2',
),
'eval' => array('style' => 'width:250px', 'includeBlankOption'=>true)
),
'ts_client_browser' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_theme']['ts_client_browser'],
'exclude' => true,
'inputType' => 'multiColumnWizard',
'eval' => array('columnFields'=>array(
'test' => array
(
'label' => &$GLOBALS['TL_LANG']['tl_theme']['test'],
'exclude' => true,
'inputType' => 'text',
'eval' => array('style'=>'width:180px')
),
)
)
),
)
)
);
MCW: 3.0.0
Contao: 2.11.2
Wenn man ein Datum im Datepicker anklickt wird dieses nicht ins Textfeld übernommen
Zeile 863, die Variable $arrItem
ist nicht definiert in der foreach Schleife.
Vermutlich soll es $arrItems
heißen wie der letzte Übergabeparamerter?
als so:
foreach ($arrItems as $itemKey => $itemValue)
Ich hätte gerne die Unterstützung für einfache Checkboxen. Ist das geplantß
--- Originally created by Andreas Schempp on 10.08.2011 16:03.
Wenn man dem Widget "'submitOnChange'=>true" gibt, wird die Seite neu geladen und man kann so mittels Callbacks die Spalten von anderen abhängig machen.
Es wäre schick, wenn dafür nicht die ganze Seite geladen werden müsste, sondern der MultiColumnWizard irgend einen Reload mittels Ajax unterstützen würde.
--- Originally created by Yanick Witschi on 17.08.2011 14:34.
Damit man entscheiden kann, ob man eine dynamische Liste oder nur ein einzelnes Element hat.
wenn multiple im eval-Field false
ist, dann kommen auch keine ActionButtons
--- Originally created by Stefan Lindecke on 04.08.2011 11:28.
Mit der aktuellen Git-Version funktioniert der pagePicker nicht mehr.
<img width="16" height="21" onclick="Backend.pickPage('ctrl_')" style="vertical-align:top; cursor:pointer;" alt="Seitenwähler (benötigt JavaScript)" src="system/themes/default/images/pickpage.gif">
Das "ctrl_" ist wieder leer.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.