Giter Site home page Giter Site logo

friendsofredaxo / mblock Goto Github PK

View Code? Open in Web Editor NEW
81.0 6.0 10.0 679 KB

Beliebig viele Datenblöcke innerhalb eines Moduls, per Drag & Drop verschiebbar.

License: MIT License

JavaScript 36.39% CSS 1.00% PHP 62.62%
redaxo content editing backend redaxo-addon hacktoberfest forms repeating repeating-blocks

mblock's Introduction

MBlock

Mit MBlock ist es möglich, innerhalb eines Moduls beliebig viele Datenblöcke zu erzeugen. Diese können dann einfach per Button oder Drag & Drop sortiert werden.

English: MBlock lets you create an unlimited number of data blocks within a single module. These data blocks can be sorted per click or drag & drop.

Please note: The examples are valid for MForm version 7 and higher. When using older MForm versions, please refer to the documentation of the respective version.

Screenshot

Modulbeispiele / Module examples

MBlock enthält einige Modulbeispiele. Diese findest du auf der MBlock-Seite im REDAXO-Backend. An dieser Stelle möchten wir nur zwei Beispiele auflisten — mit Unterstützung durch MForm und ohne —, um zu zeigen, wie MBlock funktioniert.

English: MBlock contains several module examples. You’ll find them on the MBlock page within the REDAXO backend. At this point, we want to show two examples only — one with MForm support and another one without — to demonstrate how MBlock works.

Example 1: team members (requires MForm addon)

Input:

<?php

// base ID
$id = 1;

// init mform
$mform = new MForm();

// fieldset
$mform->addFieldsetArea('Team member');

// textinput
$mform->addTextField("$id.0.name", array('label'=>'Name')); // use string for x.0 json values

// media button
$mform->addMediaField(1, array('label'=>'Avatar')); // mblock will auto set the media file as json value

// parse form
echo MBlock::show($id, $mform->show(), array('min'=>2,'max'=>4)); // add settings min and max

Output:

<?php

echo '<pre>';
dump(rex_var::toArray("REX_VALUE[1]"));
echo '</pre>';

Example 2: team members (without MForm)

Input:

<?php

// base ID
$id = 1;

// html form
$form = <<<EOT
    <fieldset class="form-horizontal ">
        <legend>Team member</legend>
        <div class="form-group">
            <div class="col-sm-2 control-label"><label for="rv2_1_0_name">Name</label></div>
            <div class="col-sm-10"><input id="rv2_1_0_name" type="text" name="REX_INPUT_VALUE[$id][0][name]" value="" class="form-control "></div>
        </div>
        <div class="form-group">
            <div class="col-sm-2 control-label"><label>Avatar</label></div>
            <div class="col-sm-10">
                REX_MEDIA[id="1" widget="1"]
            </div>
        </div>
    </fieldset>
EOT;

// parse form
echo MBlock::show($id, $form);

Output:

<?php

echo '<pre>';
dump(rex_var::toArray("REX_VALUE[1]"));
echo '</pre>';

mblock's People

Contributors

alxndr-w avatar christophboecker avatar dtpop avatar eace avatar ingowinter avatar interweave-media avatar joachimdoerr avatar koala avatar lexplatt avatar nandes2062 avatar schuer avatar skerbis avatar slartibartfass avatar staabm avatar tbaddade avatar tyrant88 avatar ynamite avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mblock's Issues

Bestehendes Modul via mblock erweitern

Sollte ein bestehendes Modul via mblock erweitert werden, könnten die bisherigen Daten verloren gehen.

Daher der Vorschlag, dass mblock vorher schaut, ob die Daten bereits in json vorliegen. Wenn nicht, konvertiert mblock die Daten und legt dies in das erste Feld.

2ter Datenblock / löschen deaktiviert

Hi, wenn mehrere Datenblöcke innerhalb des Moduls angelegt wurden, kann der 2te Datenblock (unterhalb des ersten) nicht mehr entfernt werden. Delete ist deaktiviert. Getestet mit dem Beispielmodul "Teammitglieder".
mblock_test

CKEditor compat

Hi!
der Ck weisst die gleichen Freezes auf wie anscheind die anderen Editoren zuvor. Wie habt ihr dass Problem gefixt? Kann hier jemand behilflich sein? Aktuelle Version hier: https://github.com/RexDude/ckeditor
P.s: sowohl beim Block anlegen als auch beim Hoch/runter schieben hängt er fest.

Alternative REX_VARs funktionieren nicht

Bsp.
REX_YFORM_TABLE_DATA[id=1 output="widget" table="yform_table" field="name"]

Wird zwar korrekt angezeigt, aber die Daten werden nicht richtig gespeichert bzw. gelesen.

array('min'=>1,'max'=>1) - Hört sich doof an - was? :-)

Hallo Joachim,

ich mag es wenn alles mehr oder weniger gleich aussieht. Wenn ich alle meine Module mit mform / mblock baue soll alles möglichst gleich aussehen.

Das heisst aber auch, dass ich für einen Datenblock der nicht dupliziert werden können soll auch mblock nutze. Hier wäre es schön, wenn dann die Navi rechts oben (Plus, Trash, Up, Down) und der Anfasser links nicht dargestellt werden würden.

Wie denkst Du darüber?

LG
Oliver

sortable function umbenenen

nur zur Erinnerung, weil die Diskussion ja in einem anderen issue lief...

Dein mblock überschreibt die sortable Funktion der jquery-ui.custom.min.js des REDAXO Backends -
du wolltest deine Funktion umbenennen.

Einzelne Blöcke analog zu Accordioneffekt ermöglichen

Könnte ggf. so funktionieren, wenn MB_COUNT kein HTML liefern würde

<div class="panel panel-default">
    <div class="panel-heading">
        <h4 class="panel-title">
            <a data-toggle="collapse" href="#collapse-%%MB_COUNT%%">Bild %%MB_COUNT%%</a>
        </h4>
    </div>
    <div class="panel-body" id="collapse-%%MB_COUNT%%">
        ...
    </div>
</div>

move Buttons nicht korrekt

Schiebt man einen Block an erster Stelle, ist der moveUp Button noch aktiv und der moveDown Button inaktiv. Man kann den jetzigen ersten Block nicht mehr nach untern schieben.

Beim letzten Block ist ebenso das falsche in/aktive Verhalten zu sehen.

Dynamische Headlines (legend)

Ich hätte gerne zur besseren Übersicht, dass man im Platzhalter nutzen könnte. Dabei gehts mir vorallem um den Slice-Counter, damit z.B. Spalte #X möglich ist.

Fehler bei addRadioField #bug

Ich binde zwei Radiofelder ein:
$mform->addRadioField("$id.0.placement",array('left'=>'linke Spalte','right'=>'rechte Spalte'),array('label'=>'Platzierung'));

Wählt man nach Einsetzen des 1. Moduls das 1. Radiofeld aus und fügt einen weiteren Mblock (+) hinzu, verliert das 1. Radioset im 1. MBlock den Wert.

Wenn REX_MEDIA[] verwendet wird, erscheinen im Edit Warnings

Warning: DOMElement::setAttribute(): ID already defined in /mblock/lib/classes/Decorator/MBlockFormItemDecorator.php on line 192
Warning: DOMDocument::importNode(): ID already defined in /mblock/vendors/phpQuery/phpQuery/DOMDocumentWrapper.php on line 462

Warning

Bsp. Modul Diverse Formularelemente angelegt.
Im Slice Inhalte einfügen > speichern > wieder editieren

Warning: DOMElement::setAttribute(): ID already defined in /redaxo/src/addons/mblock/lib/classes/Decorator/MBlockFormItemDecorator.php on line 216
Warning: DOMDocument::importNode(): ID already defined in /redaxo/src/addons/mblock/vendors/phpQuery/phpQuery/DOMDocumentWrapper.php on line 462

default-values nur beim ersten Element

Moin,

habe gerade folgendes Problem festgestellt, evtl. kann das ja jemand bestätigen und ggf. sogar fixen :D

Modul-Input

$form->setAttributes(array(
	'label'=>'Textfeld',
	'style'=>'width: 100%',
	'default-value'=>'blablablubb'
));

Der default-value "blablablubb" steht nur im ersten Element. Jedes weitere neu hinzuzufügende Element besitzt keinen voreingestellten default-value mehr. Dieses Verhalten konnte ich auch bei Select-Feldern beobachten...

Ist jetzt kein großes Ding, geht natürlich auch erstmal ohne. Aber falls das noch nicht bekannt ist melde ich es mal. Sieht für mich wie ein kleiner Bug aus...

Danke und viele Grüße
dpf-dd

Inhalte gehen verloren

Wenn ein REX_MEDIA nachträglich vor allen anderen Formelemente im Modul eingetragen wird, ist zum Bsp. ein textarea leer geblieben, obwohl Inhalt drin waren.

Block-Count-Ersetzungs-Key

Ein Ersetzungs-Key mit fortlaufender Nummer wäre hilfreich. So könnten z.B. Tabs/Reiter innerhalb von Blöcken aufgebaut werden.
z.B:
$objForm->addHtml('<li><a href="#tab{%BLOCK-COUNTER%}" data-toggle="tab">Tab 1</a></li>');

REX_INPUT_VALUE wird nicht hochgezählt

beim hinzufügen eines weiteren Blocks bleibt REX_INPUT_VALUE gleich

Das initiale HTML sieht aktuell so aus

<button type="button" class="btn btn-default iconpicker" name="REX_INPUT_VALUE[4][2][icon]" data-iconpickerset="fontawesome">
    <i class="fa fa-battery-full"></i>
    <input type="hidden" name="REX_INPUT_VALUE[4][2][icon]" value="fa-battery-full" />
    <span class="caret"></span>
</button>

Füge ich einen weiteren Block hinzu bleibt das REX_INPUT_VALUE[4][2][icon]unverändet im neuen Block.

Name des Addons

Im Slack kam die Diskussion auf, ob es nicht vielleicht einen treffenderen Namen für JBlock gäbe.

  • json_blocks
  • Nested Slices
  • Multiblock
  • Frau Schultze

Master Module - mblocks über Module hinweg verwenden.

Wäre klasse, wenn man nicht nur Module innerhalb von mblock definieren könnte, sondern auch auf die regulären Module Zugriff hätte oder Master-Module hätte.

So muss man Code ja ggf. doppelt führen, bspw. ein Download-mblock in einem mblock-Modul 1 und ein Download-mblock in einem mblock-Modul 2

textarea und &-Zeichen: unterminated entity reference Tag

Hi,
ich habe mform/mblock mal getestet und dabei dem textarea die class: redactorEditor2-simple verpasst. In der EIngabe mit einem &-Zeichen erscheint folgender Fehler:

Warning: MBlockFormItemDecorator::replaceValue(): unterminated entity reference Tag
/redaxo/src/addons/mblock/lib/classes/Decorator/MBlockFormItemDecorator.php on line 121

Fehler tritt mit und ohne redactor2 im textarea auf ...
Danke. Gruß Chris

Modulbeispiel ohne mForm

Hallo Joachim,

da ich aktuell alle Module (noch) ohne mForm habe würde ich mich über ein einfaches Beispiel eines Moduls ohne mForm freuen.

LG
Oliver

Blocks als Reiter / Tabs

Das fände ich gut...
Ich weiß, bei 12 Tabs sieht es wahrscheinlich Mist aus, aber bis dahin....

2 MBlocks mit jeweils 1 REX_ MEDIA fehlerhaft

Versionen
REDAXO: 5.4.-dev
MBlock: 1.7.2

Eingabe

<?php

$form = '
<fieldset class="form-horizontal">
    <legend>Medien</legend>
    <div class="form-group">
        <div class="col-md-3 control-label"><label>Bild</label></div>
        <div class="col-md-9">
            REX_MEDIA[id=3 widget=1]
        </div>
    </div>
</fieldset>';
echo MBlock::show(3, $form, ['min' => 1, 'max' => 3]);

$form = '
<fieldset class="form-horizontal">
    <legend>Medien</legend>
    <div class="form-group">
        <div class="col-md-3 control-label"><label>Bild</label></div>
        <div class="col-md-9">
            REX_MEDIA[id=4 widget=1]
        </div>
    </div>
</fieldset>';
echo MBlock::show(4, $form, ['min' => 1, 'max' => 3]);

HTML (abgespeckt)

...
<input class="form-control" type="text" name="REX_INPUT_VALUE[3][0][REX_INPUT_MEDIA_3]" value="" id="REX_MEDIA_1000" readonly="">
...
<input class="form-control" type="text" name="REX_INPUT_VALUE[4][0][REX_INPUT_MEDIA_4]" value="" id="REX_MEDIA_1000" readonly="">
...

Die id ist dieselbe und damit weißt der Medienpool immer dem ersten Widget das Medium zu

Drag&Drop: Value Radiobutton geht verloren

Kleines, aber blödes Problem beim Rumspielen mit mblock festgestellt.
Zum Reproduzieren folgendes Input-Modul benutzen:

<?php
### interne ID
$id = 1;

### Formular erstellen
$form = new MForm();

### Fieldset erstellen (wird automatisch geschlossen!)
$form->addFieldset('Element');

### Slide: Box-Ausrichtung
$form->addRadioField("$id.0.ausrichtung");
$form->setOptions([0 => 'links', 1 => 'zentriert', 2 => 'rechts']);
$form->setAttributes(array(
	'label'=>'Box-Ausrichtung'
));

### MBlock-Formular parsen
echo MBlock::show($id, $form->show(), array('min'=>1,'max'=>4));
?>

Auf meinem Redaxo 5.3. erstelle ich einen neuen Slice mit diesem Modul und gebe beiden Radiobuttons einen Wert. Dann speichern. Jetzt direkt wieder editieren und mit Drag&Drop die Anordnung der "mblocks" verändern => Dabei geht mir immer ein Value flöten und ich muss den verloren gegangenen Radiobutton neu setzen.

Da man hier in eine böse Ausgabefehler-Falle tappen kann (wenn keine Validierung erfolgt) wäre es hilfreich, wenn sich das mal jemand anguckt, der sich damit auskennt :)

Vielen Dank und Grüße
dpf.dd

reindex_end : Element ist undefined

ob beim hinzufügen oder löschen eines Blocks: item ist aktuell in der 1.7.1 immer undefined

mblock_module.registerCallback('reindex_end', function( item ){
    console.log(item);
});

ping @ynamite

Sonderfall: null Blöcke

array('min'=>0,'max'=>5))

leere mblocks werden trotzdem gespeichert. Wenn ich sie ganz entferne, tauchen sie beim nächsten editieren wieder auf, was ja auch gut ist, sonst könnte man sie ja gar nicht mehr bearbeiten.

Das hat zur Folge, dass leer abgespeicherte Blöcke beim nächsten editieren noch ein weiteres leeres mblock hinzufügen.

Zu erwarten wäre, dass dann nur ein leeres mblock dargestellt wird und leere mblocks nicht mit gespeichert werden.

MultiSelect speichert nicht

Hab gesehen, dass dies bereits gefixt sein sollte, aber Multiselect-Felder lassen sich nicht mehr bearbeiten.

Beim Hinzufügen des Blocks werden die Daten zwar gespeichert, aber nach dem Bearbeiten übernimmt es die neuen Werte nicht.

Unterstützung für yForm-Tools

Ich nutze immer wieder mal die yForm-Tools (z.B. den Datepicker), welche mit mblock nicht kompatibel sind. Sprich, wenn man einem Inputfeld z.B. das Attribut 'data-yform-tools-datepicker="YYYY-MM-DD"' gibt, funktioniert es für die bestehenden aber nicht für neue Blöcke. Wäre schön, wenn man das fixen könnte :)

multiple selects speichert nicht alle Werte

Aufbau des selects

$s = new rex_select();
$s->setName('REX_INPUT_VALUE[' . $id . '][0][gallery_id]');
$s->setMultiple(true);
$s->addSqlOptions('SELECT ' . sprogfield('name') . ' AS name, id FROM ' . rex::getTable('project_gallery') . ' ORDER BY ' . sprogfield('name'));

Wählt man jetzt mehrere Optionen aus, wird nur die letzte Option gespeichert.

Gefunden habe ich das
https://github.com/FriendsOfREDAXO/mblock/blob/master/assets/mblock.js#L233

Die Funktion wurde in Mform in der Zwischenzeit wieder gelöscht.

addSelectField aus der Beispiel-Sammlung funzt nicht

@joachimdoerr Betrifft aktuelle mblock/mform Kombination.

$id = 1;

$mform->addSelectField("$id.0.test4", array(1=>'test-1',2=>'test-2',3=>'test-3',4=>'test-4'), array('label'=>'Select'));

echo MBlock::show($id, $mform->show(), array('min'=>1)); // add settings min and max

Ist direkt aus der Beispielsammlung und führt bei mir zur Fehlermeldung:

Argument 2 passed to MBlockFormItemDecorator::replaceOptionSelect() must be an instance of DOMElement, instance of DOMText given, called in /home/***/www/***/redaxo/src/addons/mblock/lib/classes/Decorator/MBlockFormItemDecorator.php on line 78 and defined

Scheinbar hat sich bei Select-Felder etwas geändert. Nur was? Finde keine Info dazu.

Drag & Drop für Fieldsets innerhalb eines Datenblocks

Hi Joachim,

ich schreibe gerade viele Moduel und wenn ich innerhalb eine Datenblocks die Fieldset Reihenfolge ändern könnte (Ausgabe müsste selbstverständlich berücksichtigt werden) wäre das ein großer Meilenstein.

Ist so etwas realisierbar?

LG
Oliver

Scrollen zum neuen Block

Wenn ein neuer Block erstellt (dupliziert wird) , macht es Sinn, gerade bei langen Formularen, dass zum neuen Block gesprungen wird.

Bei Installation mblock dependencies prüfen

Falls noch unbekannt: hab gerade zum ersten mal mblock installiert und wollte ein Test-Modul einsetzen, dabei erhielt ich die Fehlermeldungclass mform not found

Wäre top wenn das Addon bei der Installation prüft ob mform vorhanden ist.

Edit: aber ansonsten feine Sache! :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.