- https://raw.githubusercontent.com/yakamara/yform/master/docs/01_intro.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/02_email.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/03_table_manager.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/04_yorm.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/05_rest.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/06_demos.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/07_formbuilder.md
- https://raw.githubusercontent.com/yakamara/yform/master/docs/08_tools.md
Aus eigenem ChatGPT Verlauf erstellt
Das AddOn YForm dient vor allem zur Generierung von Formularen im Frontend. Formulare sind oft komplex und ziehen meist umfangreiche Nacharbeit mit sich. YForm versucht, durch flexible Verzahnung verschiedener Komponenten möglichst viele dieser Aufgaben zu übernehmen.
YForm enthält nicht nur alle gängigen Formular-Feldtypen, sondern stellt auch vielfältige Validierungen bereit, Funktionen zum Versand von E-Mails sowie Aktionen, die zum Beispiel Daten in eine Datenbank schreiben oder Weiterleitungen ausführen.
YForm kann aber nicht nur Formulare für das Frontend generieren sowie Formulareingaben per E-Mail versenden oder in eine Datenbank speichern.
Der Admin kann mit Hilfe des Table Managers auch Datenbank-Tabellen "zusammenklicken" und diese - ergänzt z. B. durch Validierungen - im Backend samt Eingabemaske zur Verfügung stellen. Diese automatisch erzeugten Daten-Verwaltungen können dann wiederum den Code für ein dazu passendes Frontend-Formular generieren.
Will man eine E-Mail aus einem YForm-Formular versenden, kann man mit Hilfe eines E-Mail-Templates diese E-Mail gestalten und mit Platzhaltern aus dem Formular versehen.
Über die E-Mail-Template-Verwaltung kann ein Template angelegt werden. Dabei muss zuerst ein Key erstellt werden, der die eindeutige Zuordnung zu diesem Template ermöglicht. Ebenfalls muss die Absender-E-Mail, der Absender-E-Mail-Name sowie der Betreff eingegeben werden.
text|vorname|Vorname|
text|name|Name|
text|emailadresse|E-Mail-Adresse|
validate|type|emailadresse|email|Das Feld enthält keine korrekte E-Mail-Adresse!
validate|empty|email|Das Feld enthält keine korrekte E-Mail-Adresse!
action|tpl2email|testtemplate|email
Als E-Mail-Template Key wird eingetragen:
testtemplate
In den E-Mail-Template Body kommt:
Hallo,
REX_YFORM_DATA[field="vorname"] REX_YFORM_DATA[field="name"]
Hallo,<br />
<?php
if ('REX_YFORM_DATA[field="anrede"]' == 'w') {
echo "Frau";
} else {
echo "Herr";
}
?> REX_YFORM_DATA[field="vorname"] REX_YFORM_DATA[field="name"]<?php
$yform = new rex_yform();
$yform->setObjectparams('form_ytemplate', 'bootstrap');
$yform->setObjectparams('form_showformafterupdate', 0);
$yform->setObjectparams('real_field_names', true);
$yform->setValueField('text', array("name","Name"));
$yform->setValueField('text', array("emailadresse","E-Mail-Adresse"));
$yform->setValidateField('type', array('emailadresse', "email","Bitte geben Sie eine gültige Emailadresse an."));
$yform->setValueField('textarea', array("message","Nachricht"));
$yform->setObjectparams('form_action',rex_article::getCurrent()->getUrl());
$form = $yform->getForm();
if($form) {
echo $form;
} else {
$yform_email_template_key = 'test';
$debug = 0;
$values = $yform->objparams['value_pool']['email'];
$values['custom'] = 'Eigener Platzhalter';
if ($yform_email_template = rex_yform_email_template::getTemplate($yform_email_template_key)) {
if ($debug) {
echo '<hr /><pre>'; var_dump($yform_email_template); echo '</pre><hr />';
}
$yform_email_template = rex_yform_email_template::replaceVars($yform_email_template, $values);
$yform_email_template['mail_to'] = $values['emailadresse'];
$yform_email_template['mail_to_name'] = $values['name'];
if (!rex_yform_email_template::sendMail($yform_email_template, $yform_email_template_key)) {
if ($debug) { echo 'E-Mail konnte nicht gesendet werden.'; }
return false;
} else {
if ($debug) { echo 'E-Mail erfolgreich gesendet.'; }
return true;
}
}
}
?><?php
$yform_email_template_key = 'test';
$debug = 0;
$values['anrede'] = 'Herr';
$values['name'] = 'Max Mustermann';
$values['emailadresse'] = 'max@mustermann.de';
if ($yform_email_template = rex_yform_email_template::getTemplate($yform_email_template_key)) {
$yform_email_template = rex_yform_email_template::replaceVars($yform_email_template, $values);
$yform_email_template['mail_to'] = $values['emailadresse'];
$yform_email_template['mail_to_name'] = $values['name'];
if (!rex_yform_email_template::sendMail($yform_email_template, $yform_email_template_key)) {
if ($debug) { echo 'E-Mail konnte nicht gesendet werden.'; }
return false;
} else {
if ($debug) { echo 'E-Mail erfolgreich gesendet.'; }
return true;
}
}
?>Der Table Manager in YForm dient zum Erstellen und Bearbeiten von Datenbanktabellen sowie zum Verwalten von tabellarischen Daten innerhalb von Redaxo.
- Tabelle im Table Manager erstellen
- Felder der neuen Tabelle hinzufügen
- Datensätze in die Felder der neuen Tabelle eintragen
$dataset = rex_yform_manager_dataset::create('rex_my_yform_table');
$yform = $dataset->getForm();
$yform->setObjectparams('form_action', rex_getUrl(rex_article::getCurrentId()));
$yform->setActionField('showtext', array('',"Thank you."));
echo $dataset->executeForm($yform);Modul Eingabe:
REX_YFORM_TABLE_DATA[id=1 table="tablename"]
REX_YFORM_TABLE_DATA[id=1 table="tablename" widget=1]
REX_YFORM_TABLE_DATA[id=1 table="tablename" field=name widget=1]
REX_YFORM_TABLE_DATA[id=1 table="tablename" field=name widget=1 multiple=1]
Modul Ausgabe:
REX_YFORM_TABLE_DATA[1]
| Option | Erläuterungen |
|---|---|
| Priorität | Legt fest, an welcher Position sich die neue Tabelle zwischen bestehenden Tabellen einreiht |
| Name | Der Name der Datenbank-Tabelle, wie sie in MySQL heißt |
| Bezeichnung | Der Name der Tabelle, wie sie im Menü aufgelistet wird |
| Beschreibung | Informationen zur Tabelle |
| aktiv | Legt fest, ob die Tabelle im Hauptmenu angezeigt wird |
| Datensätze pro Seite | Legt fest, ab wie vielen Datensätzen die Tabellen-Übersicht in Seiten unterteilt wird |
| Standardsortierung Feld | Legt fest, nach welchem Feld die Tabellen-Übersicht sortiert wird |
| Standardsortierung Richtung | Legt fest, ob auf- oder absteigend sortiert wird |
| Suche aktiv | Zeigt die Schaltfläche "Datensatz suchen" an |
| In der Navigation versteckt | Legt fest, ob die Tabelle auch im Menü angezeigt wird |
| Export der Daten erlauben | Zeigt die Schaltfläche "Datensätze exportieren" an |
| Import von Daten erlauben | Zeigt die Schaltfläche "Datensätze importieren" an |
Ein Redaxo-Feld, um einen Redaxo-Artikel auszuwählen.
Ein Auswahlfeld/Popup, um Datensätze mit denen einer fremden Tabelle zu verknüpfen.
Ein Redaxo-Feld, um eine einzelne oder mehrere Medienpool-Datei/en auszuwählen.
Eine Reihe von Eingabefeldern, um tabellarische Daten einzugeben (JSON-Format).
Eine Checkbox mit vordefinierten Werten.
Eine Reihe von Auswahlfeldern für ein Datum (Tag, Monat, Jahr).
Ein unsichtbares Feld für einen Zeitstempel.
Eine Reihe von Auswahlfeldern für Datum und Uhrzeit.
Ein einfaches Eingabefeld für E-Mail-Adressen.
Ein Feld ohne Eingabemöglichkeit.
Ein Fieldset gruppiert Formularfelder.
Ein Feld, das aus dem Wert eines anderen Feldes einen Hashwert erzeugt.
Gibt HTML-Code an der gewünschten Stelle aus.
Ein Feld, das einen Index/Schlüssel über mehrere Felder erzeugt.
Ein einfaches Eingabefeld für ganze Zahlen.
Für Dezimalzahlen mit precision und scale.
Passwort-Eingabefeld.
Führt PHP-Code an der gewünschten Stelle aus.
Ein Auswahlfeld, um Datensätze in eine bestimmte Reihenfolge zu sortieren.
Zeigt einen Wert in der Ausgabe.
Ein oder mehrere Submit-Buttons zum Absenden des Formulars.
Input-Feld zur Eingabe eines Textes.
Ein mehrzeiliges Eingabefeld für Text.
Eine Reihe von Auswahlfeldern für die Uhrzeit.
Ein Upload-Feld für Dateien.
Erstellt eine eindeutige UUID.
Vergleicht zwei Eingabe-Werte miteinander.
Vergleicht einen Eingabe-Wert mit einem fest definierten Wert.
Ruft eine eigene PHP-Funktion für einen Vergleich auf.
Überprüft, ob ein Eingabe-Wert vorhanden ist.
Überprüft, ob ein Eingabe-Wert in der DB vorhanden ist.
Überprüft ob der Eingabe-Wert zwischen zwei Zahlen liegt.
Überprüft die Eingabe auf Regex-Regeln.
Überprüft ob der Eingabe-Wert eine exakte Anzahl von Zeichen hat.
Überprüft ob die Länge des Eingabe-Werts zwischen zwei Zahlen liegt.
Überprüft ob der Typ des Eingabe-Werts korrekt ist.
Überprüft ob der Eingabe-Wert noch nicht in anderen Datensätzen vorhanden ist.
<?php
if (rex::isBackend())
{
rex_extension::register("YFORM_DATA_LIST", function( $ep ) {
if ($ep->getParam("table")->getTableName()=="gewuenschte_tabelle"){
$list = $ep->getSubject();
$list->removeColumn("id");
}
});
}<?php
if (rex::isBackend())
{
rex_extension::register('YFORM_DATA_LIST', function( $ep ) {
if ($ep->getParam('table')->getTableName()=="gewuenschte_tabelle"){
$list = $ep->getSubject();
$list->setColumnFormat(
'title',
'custom',
function($a){
$neuer_wert=$a['value']." ".$a['list']->getValue('xyz');
return $neuer_wert;
}
);
}
});
}<?php
if (rex::isBackend() && rex_request('table_name') == 'rex_test') {
rex_extension::register('YFORM_DATA_LIST', function( $ep ) {
$list = $ep->getSubject();
$list->setColumnFormat('bild', 'custom', function ($params ) {
return '<img src="/images/rex_medialistbutton_preview/'.$params['list']->getValue('bild').'">';
});
});
}- name (text)
- titel (text)
- text (textarea)
- id_tag (be_manager_relation)
<?php
$sql = rex_sql::factory();
$query = 'SELECT * FROM ' . rex::getTable('news_beitrag') . ' JOIN ' . rex::getTable('news_tag') . ' ON ' . rex::getTable('news_beitrag') . '.id_tag = ' . rex::getTable('news_tag') . '.id ';
$rows = $sql->getArray($query);
foreach($rows as $row) {
echo '<h1>' . $row['titel'] . '</h1>';
echo '<p>' . $row['text'] . '</p>';
echo '<p>Tag: ' . $row['name'] . '</p>';
}
?>- name (text)
- titel (text)
- text (textarea)
- id_tag (be_manager_relation)
- id_beitrag (be_manager_relation)
<?php
$sql = rex_sql::factory()
$query = 'SELECT ' . rex::getTable('news_beitrag') . '.*, GROUP_CONCAT(' . rex::getTable('news_tag') . '.name SEPARATOR ",") AS tags ';
$query.= 'FROM ' . rex::getTable('news_beitrag') . ' ';
$query.= 'JOIN ' . rex::getTable('news_tag_beitrag') . ' ON ' . rex::getTable('news_beitrag') . '.id = ' . rex::getTable('news_tag_beitrag') . '.id_beitrag ';
$query.= 'JOIN ' . rex::getTable('news_tag') . ' ON ' . rex::getTable('news_tag') . '.id = ' . rex::getTable('news_tag_beitrag') . '.id_tag ';
$query.= 'GROUP BY ' . rex::getTable('news_beitrag') . '.id';
$rows = $sql->getArray($query);
foreach($rows as $row) {
echo '<h1>' . $row['titel'] . '</h1>';
echo '<p>' . $row['text'] . '</p>';
echo '<p>Tags: ' . $row['tags'] . '</p>';
}
?>// Key auslesen per getCSRFKey
$_csrf_key = $table->getCSRFKey();
// Token erstellen
$_csrf_params = rex_csrf_token::factory($_csrf_key)->getUrlParams();Rückwärtskompatible Lösung:
$_csrf_key = 'table_field-'.$table->getTableName();YOrm erleichtert den Umgang mit in YForm Table Manager angemeldeten Tabellen und deren Daten.
<?php
$items = rex_yform_manager_table::get('rex_my_table')->query()->find();
dump($items);<?php
class MyTable extends \rex_yform_manager_dataset
{
}<?php
rex_yform_manager_dataset::setModelClass('rex_my_table', MyTable::class);<?php
$items = MyTable::query()
->alias('t')
->joinRelation('relation_id', 'r')
->select('r.name', 'relation_name')
->where('t.status', '1')
->orderBy('t.name')
->find();<?php
$item = MyTable::create()
->setValue('user_id', 5)
->setValue('article_id', 6)
->save();<?php
MyTable::query()
->where('user_id', 5)
->where('article_id', 6)
->find()
->delete();<?php
$post = rex_yform_manager_dataset::get($id, 'rex_blog_post');
?>
<article>
<h1><?= $post->title ?></h1>
<p><?= $post->text ?></p>
</article><?php
$dataset = rex_yform_manager_dataset::get(2,'tabelle');
$yform = $dataset->getForm();
$yform->setObjectparams('form_method','get');
$yform->setObjectparams('form_action',rex_getUrl(REX_ARTICLE_ID));
$yform->setObjectparams('getdata',true);
$yform->setActionField('showtext',array('','Gespeichert'));
echo $dataset->executeForm($yform);
?><?php
$post = rex_yform_manager_dataset::get($id, 'rex_blog_post');
$post->title = 'REDAXO-Tag in Wackershofen (am Grundbach)';
$post->text = '...';
if ($post->save()) {
echo 'Gespeichert!';
} else {
echo implode('<br>', $post->getMessages());
}<?php
$post = rex_yform_manager_dataset::create('rex_blog_post');
$post->title = 'REDAXO-Tag in Wackershofen (am Grundbach)';
$post->text = '...';
if ($post->save()) {
echo 'Gespeichert!';
} else {
echo implode('<br>', $post->getMessages());
}<?php
// boot.php
rex_yform_manager_dataset::setModelClass(
'rex_blog_author',
rex_blog_author::class
);<?php
// lib/author.php
class rex_blog_author extends rex_yform_manager_dataset
{
public function getFullName(): string
{
return $this->first_name.' '.$this->last_name;
}
}<?php
$query = rex_blog_post::query();
$query
->where('status', 1)
->where('created', $date, '>')
->orderBy('created', 'desc')
;
$posts = $query->find();
// $post = $query->findOne();<?php
$posts->isEmpty();
$posts->getIds();
$posts->toKeyIndex();
$posts->toKeyValue('title', 'text');
$posts->getValues('title');
$posts->groupBy('author_id');
$posts->setValue('author_id', $authorId);
$posts->save();
$posts->delete();<?php
foreach ($posts as $post) {
$author = $post->getRelatedDataset('author_id');
echo 'Autor: '.$author->getFullName();
echo $post->title;
}
$posts = $author->getRelatedCollection('posts');<?php
$pager = new rex_pager(20);
$query = rex_blog_post::query();
//$query->...
$posts = $query->paginate($pager);
foreach ($posts as $post) {
// ...
}
$pager->getRowCount();
$pager->getCurrentPage();
$pager->getLastPage();
$pager->getPageCount();<?php
$post = rex_blog_post::get($id);
$yform = $post->getForm();
// $yform->setHiddenField();
// $yform->setObjparams();
echo $post->executeForm($yform)- delete
- executeForm
- filter
- first
- getForm
- getIds
- getTable
- getTableName
- getUniqueValue
- getValues
- groupBy
- isEmpty
- isValid
- isValueUnique
- last
- map
- populateRelation
- save
- setData
- setValue
- shuffle
- slice
- sort
- split
- toKeyIndex
- toKeyValue
- alias
- getTableAlias
- count
- exists
- find
- findId
- findIds
- findOne
- get
- getAll
- groupBy
- groupByRaw
- resetGroupBy
- joinRaw
- joinRelation
- joinType
- joinTypeRelation
- leftJoin
- leftJoinRelation
- resetJoins
- limit
- resetLimit
- orderBy
- orderByRaw
- resetOrderBy
- paginate
- query
- queryOne
- save
- resetSelect
- select
- selectRaw
- getTable
- getTableName
- resetWhere
- setWhereOperator
- where
- whereNot
- whereNull
- whereNotNull
- whereBetween
- whereNotBetween
- whereNested
- whereRaw
- whereListContains
- resetHaving
- setHavingOperator
- having
- havingNot
- havingNull
- havingNotNull
- havingBetween
- havingNotBetween
- havingRaw
- havingListContains
- create
- get
- getAll
- getData
- getForm
- getId
- getMessages
- getRaw
- getRelatedCollection
- getRelatedDataset
- getTable
- getTableName
- getValue
- hasValue
- isValid
- loadData
<?php
$query = MyTable::query();
$query
->alias('t')
->joinRelation('relation_id', 'r')
->select('r.name', 'relation_name')
->where('t.status', '1')
->orderBy('t.name')
$items = rex_sql::factory()->setDebug()->getArray($query->getQuery(), $query->getParams());
$items = $query->find();Datei /redaxo/src/addons/yform/plugins/manager/lib/yform/manager/dataset.php und die Variable private static $debug = false; auf true setzen
<?php
class rex_data_mydata extends rex_yform_manager_dataset
{
public function getFields(array $filter = [])
{
$fields = $this->getTable()->getFields($filter);
if (rex::isBackend()) {
return $fields;
}
foreach ($fields as $i => $field) {
if ('interne_links' == $field->getName()) {
unset($fields[$i]);
}
if ('user' == $field->getName()) {
unset($fields[$i]);
}
}
return $fields;
}
}$query
->setWhereOperator('OR')
->where('foo', 1)
->where('bar', 2)
;$query->whereRaw('(foo = :foo OR bar = :bar)', ['foo' => 1, 'bar' => 2]);$query->whereNested(['foo' => 1, 'bar' => 2], 'OR');$query->whereNested(function (rex_yform_manager_query $query) {
$query
->where('foo', 1)
->where('bar', 2)
;
}, 'OR');Mit dem REST-Plugin lässt sich eine Schnittstelle aktivieren, mit der man YForm Tabellen von außen abrufen, verändern und löschen kann. Die Schnittstelle orientiert sich an https://jsonapi.org/format/.
Die Standardroute der REST-API ist auf "/rest" gesetzt. Die Konfiguration wird über PHP festgelegt und sollte im project-AddOn in der boot.php abgelegt werden.
<?php
$route = new \rex_yform_rest_route(
[
'path' => '/v1/user/',
'auth' => '\rex_yform_rest_auth_token::checkToken',
'type' => \rex_ycom_user::class,
'query' => \rex_ycom_user::query(),
'get' => [
'fields' => [
'rex_ycom_user' => [
'id',
'login',
'email',
'name'
],
'rex_ycom_group' => [
'id',
'name'
]
]
],
'post' => [
'fields' => [
'rex_ycom_user' => [
'login',
'email',
'ycom_groups'
]
]
],
'delete' => [
'fields' => [
'rex_ycom_user' => [
'id',
'login'
]
]
]
]
);
\rex_yform_rest::addRoute($route);RequestType: GET
URL: https://url.localhost/rest/v1/users/[id]
Header:
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer [token]
Response:
{
"id": "[id]",
"type": "rex_ycom_user",
"attributes": {
"login": "jannie",
"email": "jan.kristinus@yakamara.de"
},
"relationships": {
"ycom_groups": {
"data": [
{ "type": "tags", "id": "2" },
{ "type": "tags", "id": "3" }
]
}
},
"links": {
"self": "https:\/\/url.localhost\/rest\/v1\/users\/[id]"
}
}Über URL Parameter können die internen Feldsuchen verwendet werden: filter[feldname]=suchwert
Über include=title,user.login,user.email kann man entscheiden welche Werte man empfangen möchte.
per_page=x: Anzahl der Treffer pro Seitepage=x: Direkt auf Ergebnisseiten springenorder[Feldname]=ascoderdesc: Sortierung
RequestType: POST
URL: https://url.localhost/rest/v1/users/
Body:
{
"data": {
"type": "rex_ycom_user",
"attributes": {
"login": "jannie",
"email": "jan.kristinus@yakamara.de"
},
"relationships": {
"ycom_groups": {
"data": [
{ "type": "tags", "id": "2" },
{ "type": "tags", "id": "3" }
]
}
}
}
}RequestType: DELETE
URL: https://url.localhost/rest/v1/users/?filter[login]=jannie
Response:
{
"all": 1,
"deleted": 1,
"failed": 0,
"dataset": [{
"id": "[id]"
}]
}RequestType: DELETE
URL: https://url.localhost/rest/v1/users/[id]
Wenn im Model '\rex_yform_rest_auth_token::checkToken()' angegeben wurde, werden Token aus der YForm:Rest:Tokenverwaltung überprüft.
Allgemein:
\rex_yform_rest::setHeader('Access-Control-Allow-Origin', '*');Route-spezifisch:
$route->setHeader('Access-Control-Allow-Origin', 'redaxo.org');<?php
$yform->setValueField('upload', array('upload','Dateianhang','100,10000','.pdf,.odt,.doc,.docx,.xls,.xlsx,.png,.jpg,.jpeg,.zip'));
$yform->setValueField('php', array('php_attach','Datei anhängen','<?php if (isset($this->params[\'value_pool\'][\'files\'])) { $this->params[\'value_pool\'][\'email_attachments\'] = $this->params[\'value_pool\'][\'files\']; } ?>'));upload|upload|Dateianhang|100,10000|.pdf,.odt,.doc,.docx,.xls,.xlsx,.png,.jpg,.jpeg,.zip|
php|php_attach|Datei anhängen|<?php if (isset($this->params['value_pool']['files'])) { $this->params['value_pool']['email_attachments'] = $this->params['value_pool']['files']; } ?>
<?php
$yform->setValueField('php', array('php_attach', 'Datei anhängen', '<?php $this->params[\'value_pool\'][\'email_attachments\'][] = [\'agb.pdf\', rex_path::media(\'agb.pdf\')]; ?>'));<div class="alert alert-info">
Dieses Modul gibt das Glossar aus. Keine weiteren Einstellungsmöglichkeiten.
</div><?php
$db_table = "rex_glossar";
$sql = rex_sql::factory();
$sql->setDebug(false);
$query = "SELECT * FROM $db_table ORDER BY Begriff ";
$rows = $sql->getArray($query);
$counter = $bcounter = 1;
if ($sql->getRows() > 0) {
foreach($rows as $row)
{
$id = $row["id"];
$begriff = $row["Begriff"];
$char = strtoupper(mb_substr($begriff,0,1));
$beschreibung = $row["beschreibung"];
$counter++;
if ($char != $dummy) {
$bcounter++;
$buchstabe ='<h2 id="buchstabe'.$char.'">'.$char. '</h2>';
$index .= '<a type="button" class="btn btn-default" href="#buchstabe'.$char.'">'.$char. '</a>';
} else {
$buchstabe = "";
}
$out .= $buchstabe.'
<div class="panel panel-default">
<div class="panel-heading">
<a data-toggle="collapse" data-parent="#accordionREX_SLICE_ID" href="#collapse'.$counter.'">'.$begriff.'</a>
</div>
<div id="collapse'.$counter.'" class="panel-collapse collapse">
<div class="panel-body">'.$beschreibung.'
</div>
</div>
</div>';
$dummy = $char;
}
echo $index;
echo $out;
}
?>Versteckte Werte übergeben (Hidden-Fields)
PHP-Schreibweise:
<?php
$yform->setHiddenField("summe", 150);
// oder mit Variable
$yform->setHiddenField("summe", $bestellung_summe);Formbuilder Pipe-Schreibweise:
hidden|summe|150|
<?php
// www.domain.de/meinformular/?q=Foo
$yform->setValueField('hidden', array("suche", "q", REQUEST));PHP-Schreibweise:
<?php
$yform->setValueField('text', array('anzahl','Anzahl','0','0','{"type":"hidden"}'));Pipe-Schreibweise:
text|anzahl|Anzahl|0|0|{"type":"hidden"}|
- Feld vom Typ PHP anlegen:
php|validate_timer|Spamschutz|<?php echo '<input name="validate_timer" type="hidden" value="'.microtime(true).'" />' ?>|
- Validierung vom Typ custom_function anlegen:
validate|customfunction|validate_timer|yform_validate_timer|5|Spambots haben keine Chance|
- Funktion hinterlegen:
<?php
function yform_validate_timer($label,$microtime,$seconds)
{
if (($microtime + $seconds) > microtime(true)) {
return true;
} else {
return false;
}
}Via hidden E-Mail-Field
- Feld vom Typ
emailanlegen, als Labelemailverwenden - Weiteres Feld vom Typ
emailanlegen, als Label z.B.xmailverwenden - Validierung vom Typ
compareanlegen, das Feld darf nicht>0sein - Eingabefeld
emailvia CSS verstecken
In die boot.php:
<?php
$path = rex_addon::get('project')->getPath('ytemplates');
rex_yform::addTemplatePath($path);
?>In der PHP Schreibweise:
<?php
$yform->setObjectparams('form_ytemplate', 'meinetemplates,bootstrap', true);
?>Felder:
- text|firstname|Vorname|{"required":"required"}
- text|lastname|Nachname|{"required":"required"}
- text|street|Straße|{"required":"required"}
- text|zip|PLZ|{"required":"required"}
- text|city|Ort|{"required":"required"}
- text|bankname|Kreditinstitut
- text|iban|IBAN|{"required":"required"}
- text|bic|BIC
- text|email|E-Mail-Adresse|{"required":"required","type":"email"}
- index|key|key|email|md5
- hashvalue|token|Token|iban|sha512|/Ru7Vz(%tQ5VV%vkV#VYB=KhaQYAavf/?APtYpe}59ynUTybL\
- datestamp|createdate|Angemeldet am|mysql||nur wenn leer
- datestamp|updatedate|Aktualisiert am|mysql||immer
objparams|form_ytemplate|bootstrap
objparams|form_showformafterupdate|0
objparams|real_field_names|true
radio|salutation|Anrede|Herr,Frau||{"required":"required"}|
text|firstname|Vorname|||{"required":"required"}|
text|lastname|Nachname|||{"required":"required"}|
text|street|Straße|||{"required":"required"}|
text|zip|PLZ|||{"required":"required"}|
text|city|Ort|||{"required":"required"}|
text|bankname|Kreditinstitut|
text|iban|IBAN|||{"required":"required"}|
text|bic|BIC|
text|email|E-Mail-Adresse|||{"required":"required","type":"email"}|
index|key|key|email||md5|
hashvalue|token|Token|iban|sha512|/Ru7Vz(%tQ5VV%vkV#VYB=KhaQYAavf/?APtYpe}59ynUTybL\|
datestamp|createdate|Angemeldet am...|mysql||1|
datestamp|updatedate|Aktualisiert am|mysql||0|
action|db|rex_yf_member|
action|tpl2email|member_confirm|email|
action|tpl2email|member_confirm||betreiber@domain.de
<div class="modul-wrapper">
<?php
$key = rex_get('key', 'string', 0);
$token = rex_get('token', 'string', 0);
if($key && $token) {
$member = current(rex_sql::factory()->setDebug(0)->getArray('SELECT * FROM rex_yf_member WHERE key = ? AND token = ? AND status = 0 LIMIT 1', array($key, $token)));
if(count($member)) {
if($member['token'] == $token) {
rex_sql::factory()->setDebug(0)->setQuery('UPDATE rex_yf_member SET token = NULL, key = NULL, status = 1, updatedate = NOW() WHERE key = ?', array($key));
?>
<div class="header-message"><p>Ihre Mitgliedschaft wurde bestätigt. Vielen Dank!</p></div>
<?
} else {
?>
<div class="header-message warning"><p>Ihre Mitgliedschaft wurde bereits bestätigt.</p></div>
<?
}
} else {
?>
<div class="header-message warning"><p>Ein Antrag zur Mitgliedschaft liegt uns nicht vor.</p></div>
<?
}
} else {
?>
<div class="header-message warning"><p>Ihre Mitgliedschaft wurde nicht beantragt oder wurde bereits aktiviert.</p></div>
<?
}
?>
</div>Innerhalb von YForm gibt es im Menüpunkt Übersicht unter Setup den Button Modul "YForm Formbuilder installieren".
Normalschema: Feldtyp|Name|Optionen (getrennt durch Pipe |)
Beispiel:
text|name|Nachname
validate|empty|name|Bitte einen Nachnamen eingeben
choice|anrede|Anrede|Anrede=,Frau=w,Herr=m
action|db|adressen|
Zusätzliche Attribute:
text|phone|Telefon|#attributes:{"class":"phone-class"}
choice|is_approved|Neu|ja,nein|1|1|#group_attributes:{"class": "custom-control custom-switch"}
<?php
$yform = new rex_yform();
$yform->setValueField('text', array("name","Nachname"));
$yform->setValidateField('empty', array("name","Bitte einen Nachnamen eingeben"));
$yform->setValueField('choice', array("anrede","Anrede","Anrede=,Frau=w,Herr=m"));
$yform->setActionField('db', array('adressen'));
echo $yform->getForm();- Nur in Datenbank speichern
- Nur E-Mail versenden
- E-Mail versenden und in Datenbank speichern
- Meldung bei erfolgreichem Versand
objparams|form_show|0
objparams|form_name|formular
objparams|form_class|contact_form
objparams|form_wrap_id|contact_form
objparams|form_wrap_class|contact_form
objparams|form_label_type|html
objparams|csrf_protection|0
objparams|form_ytemplate|classic
objparams|submit_btn_label|Formular senden
objparams|submit_btn_show|0
objparams|error_class|my_form_error
objparams|real_field_names|1
$yform->setObjectparams('form_method','get');objparams|form_action|zielseite.html
objparams|form_action_query_params|key1,key2,key3
objparams|form_anchor|my_form
objparams|form_showformafterupdate|1
objparams|debug|1
objparams|hide_top_warning_messages|1
objparams|getdata|1
objparams|main_where|id=1
objparams|main_table|rex_table
objparams|form_exit|1
$yform->setValueField('be_link', array("link","Link zu Artikel"));$yform->setValueField('be_manager_relation', array("manager_relation","Beispiel","rex_yf_messages","","0","0","","","","rex_yf_employees"));$yform->setValueField('be_media', array("image","Bild","1","0","general","jpg,gif,png,jpeg"));$yform->setValueField('be_table', array("table","Tabelle","Menge,Preis,Gewicht"));$yform->setValueField('checkbox', array("checkbox","Checkbox","1"));// Select
$yform->setValueField('choice',["selectfield","Verkehrsmittel","Auto,Bus,Fahrrad",0,0]);
// Gruppiertes Checkboxfeld
$yform->setValueField('choice',["mycheckboxfield","Speisen",'{"Vorspeisen": {"Salat":"insalata","Suppe":"piatto"},"Dessert":{"Eis":"ghiaccio"}}',1,1]);$yform->setValueField('date', array("date","Datum","2016","+5","DD/MM/YYYY","1","","select"));$yform->setValueField('datestamp', array("createdate","Zeitstempel","mysql","0","0"));$yform->setValueField('datetime', array("datetime","Datetime","2016","+5","00,15,30,45","DD/MM/YYYY HH:ii","0","","select"));$yform->setValueField('email', array("email","E-Mail-Adresse"));$yform->setValueField('emptyname', array("emptyname","Emptyname"));$yform->setValueField('fieldset', array("fieldset","Fieldset"));generate_key|name|[no_db]
$yform->setValueField('hashvalue', array("hashvalue","Hashvalue"));hidden
$yform->setValueField('hidden', array("name", "Max Muster"));$yform->setValueField('html', array("html","HTML","<p>Hallo Welt!</p>"));$yform->setValueField('index', array("index","Index"));$yform->setValueField('integer', array("int","Integer"));$yform->setValueField('ip', array("ip"));number|zahl|Zahl|6|2|5||cm|Hinweis Number
$yform->setValueField('password', array("name","label", "default_value"));$yform->setValueField('php', array("php","PHP","<? echo 'hallo welt'; ?>"));$yform->setValueField('prio', array("prio","Reihenfolge"));$yform->setValueField('resetbutton', array("reset","reset","Reset"));showvalue|name|label|defaultwert|notice
$yform->setValueField('submit', array("submit","Submit"));$yform->setValueField('text', array("text","Text"));$yform->setValueField('textarea', array("textarea","Textarea"));$yform->setValueField('time', array("time","Zeit","","00,15,30,45","HH:ii","","select"));$yform->setValueField('upload', array("upload","Upload","config" => $json_config));uuid|name|
$yform->setValidateField('compare', array("wert1","wert2","!=", "Die Felder haben unterschiedliche Werte"));$yform->setValidateField('compare_value', array("wert1",2,"<", "Der Wert ist kleiner als 2!"));validate|customfunction|label|[!]function/class::method|weitere_parameter|warning_message
$yform->setValidateField('empty', array("name","Bitte geben Sie einen Namen an!"));validate|existintable|label,label2|tablename|feldname,feldname2|warning_message
$yform->setValidateField('intfromto', array("wert","2", "4", "Der Wert ist kleiner als 2 und größer als 4!"));$yform->setValidateField('in_names', array("vorname, name, tel", "1", "2", "Fehlermeldung"));$yform->setValidateField('preg_match', array("eingabe","/[a-z]+/", "Es dürfen nur klein geschriebene Buchstaben eingegeben werden!"));$yform->setValidateField('size', array("plz","5", "Die Eingabe hat nicht die korrekte Zeichenlänge!"));$yform->setValidateField('size_range', array("summe", "3", "10", "Die Eingabe hat nicht die korrekte Zeichenlänge!"));$yform->setValidateField('type', array("wert", "numeric", "Die Eingabe ist keine Nummer!"));$yform->setValidateField('unique', array("email", "Ein User mit dieser E-Mail-Adresse existiert schon!","rex_user"));action|callback|mycallback / myclass::mycallback
$yform->setActionField('copy_value', array("name","user"));$yform->setActionField('create_table', array("rex_order"));$yform->setActionField('db', array("rex_warenkorb", "main_where"));$yform->setActionField('db_query', array("insert into rex_ycom_user set name = ?, email = ?", "name,email"));$yform->setActionField('email', array("from@mustermann", "to@mustermann.de", "Test", "Hallo ###name###"));$yform->setActionField('html', array("<b>fett</b>"));$yform->setActionField('readtable', array("shop_user", "fname", "name"));$yform->setActionField('redirect', array("32"));$yform->setActionField('showtext', array("Hallo das ist Redaxo", "<p>", "</p>", "0"));$yform->setActionField('tpl2email', array("emailtemplate", "email"));CSS-Klasse selectpicker:
{"class": "form-control selectpicker", "placeholder": "My Placeholder"}Mit Suchfeld:
{"class": "form-control selectpicker", "data-live-search": "true", "placeholder": "My Placeholder"}Datumformat erzwingen:
{"data-inputmask-alias":"datetime", "data-yform-tools-inputmask":"", "data-inputmask-inputformat":"yyyy-mm-dd"}Datepicker:
{"data-yform-tools-datepicker":"YYYY-MM-DD"}Datetimepicker:
{"data-yform-tools-datetimepicker":"YYYY-MM-DD HH:ii:ss"}Datepicker und Inputmask:
{"data-yform-tools-datepicker":"YYYY-MM-DD", "data-inputmask-alias":"datetime", "data-yform-tools-inputmask":"", "data-inputmask-inputformat":"yyyy-mm-dd"}Datetimepicker und Inputmask:
{"data-yform-tools-datetimepicker":"YYYY-MM-DD HH:ii:ss", "data-inputmask-alias":"datetime", "data-yform-tools-inputmask":"", "data-inputmask-inputformat":"yyyy-mm-dd hh:mm:mm"}Diese Anleitung beschreibt den standardisierten Aufbau und Einsatz von YForm-Exportsets im JSON-Format – insbesondere für den Import und Export von Tabellen, Feldern und Relationen innerhalb des REDAXO CMS.
Ein YForm-Exportset ist eine JSON-Datei, die eine oder mehrere Tabellen mit ihren zugehörigen Feldern und Konfigurationen beschreibt.
Es dient dem schnellen Aufbau oder der Wiederverwendung komplexer Datenstrukturen.
Das Exportset ist ein JSON-Objekt mit folgendem Aufbau:
{
"rex_meinetabelle": {
"fields": [ ... ],
"table": { ... }
},
"rex_weitere_tabelle": {
...
}
}"table": {
"status": 1,
"name": "rex_meinetabelle",
"table_name": "rex_meinetabelle",
"list_amount": 50,
"search": 1,
"hidden": 0
}Feldbeschreibung:
| Feld | Bedeutung |
|---|---|
status |
1 = aktiv, 0 = inaktiv |
name |
Anzeigename (kann identisch zu table_name sein) |
table_name |
Technischer Tabellenname (z. B. rex_meinetabelle) |
list_amount |
Anzahl Einträge pro Seite im Backend |
search |
1 = Suchfunktion aktiv |
hidden |
1 = Tabelle im Backend ausblenden |
Jedes Feld ist ein Objekt mit folgender Struktur:
{
"type_id": "value",
"type_name": "text",
"db_type": "varchar(255)",
"name": "mein_feld",
"label": "Mein Feld",
...
}Wichtige Standard-Felder:
| Feld | Bedeutung |
|---|---|
type_id |
Immer "value" |
type_name |
YForm-Feldtyp (z. B. text, number, choice) |
db_type |
SQL-Datentyp (z. B. varchar(255), int(11)) |
name |
Technischer Feldname |
label |
Feldbezeichnung im Backend |
search |
1 = durchsuchbar |
list_hidden |
1 = nicht in Listenansicht anzeigen |
validate |
Array mit Validierungen (z. B. ["empty"]) |
placeholder |
Platzhalter-Text im Formularfeld |
Relationstyp (type) |
Bedeutung |
|---|---|
"0" |
Einfache 1:1-Relation |
"1" |
Multiple-Relation (Mehrfachauswahl) |
"5" |
Inline-Relation (eingebettete Datenbearbeitung) |
| Feld | Bedeutung |
|---|---|
table |
Ziel-Tabelle der Relation |
type |
Relationstyp (0, 1, 5) |
field |
Feld in der Ziel-Tabelle (i. d. R. id) |
Beispiel Inline-Relation (type 5):
{
"type_id": "value",
"type_name": "be_manager_relation",
"db_type": "int(11)",
"name": "meine_inline_relation",
"label": "Inline-Daten",
"table": "rex_zieltabelle",
"type": "5",
"field": "id"
}- Definiere Tabellenstruktur in einem JSON-Editor.
- Für jede Tabelle:
- Erstelle
table-Metadaten. - Liste alle
fieldsals Array.
- Erstelle
- Verwende eindeutige Feldnamen.
- Nutze
validate,placeholder,search,list_hiddengezielt. - Für Relationen:
- Einfache Relation →
type: "0" - Mehrfachrelation →
type: "1" - Inline-Relation →
type: "5"+"field": "id"
- Einfache Relation →
- Öffne
YForm → Tabellen → Import/Export → Importieren. - Lade die JSON-Datei hoch.
- Tabellen und Felder werden automatisch erzeugt.
- Öffne
YForm → Tabellen. - Markiere gewünschte Tabellen.
- Klicke auf Exportieren.
- Lade das generierte JSON herunter.
- Nutze konsistente Namenskonventionen (
rex_Prefix). - Nutze Relationen statt Duplikate.
- Verwende
list_hiddenfür technische Felder (z. B.id,updatedate). - Dokumentiere komplexe Strukturen mit Kommentaren (außerhalb der JSON-Datei).
Achte darauf, dass deine Datei:
- Ein valides JSON ist (verwende JSON-Validatoren)
- Die Struktur exakt einhält (
table,fields,type_name, ...)
Letzte Überprüfung: Automatisch generiert
Gültig für: REDAXO 5.x mit YForm