ALAF ist ein PHP-Framework für Web-Anwendungen
Eine ausführliche Dokumentation finden Sie hier!
Listausgaben im Framework ALAF werden mit dem jQuery-Plugin DataTables realisiert:
Im HTML-File der Listausgabe:
<script>
$(document).ready(function() {
$('#dataTables-userlist').DataTable({
responsive : true,
columnDefs: [
{ "orderable": false, "targets": [6] },
{ "responsivePriority": 1, "targets": [0,1,2,3,6]},
{ "responsivePriority": 2, "targets": [5]}
],
order: [[ 1, 'asc'], [2, 'asc']],
language: {
"url": "js/plugins/dataTables/language/<?php echo af_engine::get_lang()?>.json"
}
});
});
$('a.alaf_func_delete')
.click(
function() {
if (confirm('<?php echo afHtmlEntityDecode(af_tran("_DELREC_AREYOUSURE1")) ?>')
&& confirm('<?php echo afHtmlEntityDecode(af_tran("_DELREC_AREYOUSURE2")) ?>')) {
return true;
}
return false;
});
</script>
Inspired by twitter.com's autocomplete search functionality, typeahead.js is a flexible JavaScript library that provides a strong foundation for building robust typeaheads.
The typeahead.js library consists of 2 components: the suggestion engine, Bloodhound, and the UI view, Typeahead. The suggestion engine is responsible for computing suggestions for a given query. The UI view is responsible for rendering suggestions and handling DOM interactions. Both components can be used separately, but when used together, they can provide a rich typeahead experience.
Dieses Beispiel zeigt, wie direkt nach der Auswahl der "Suggestion" ein submit erfolgen kann:
Dabei wird der anchour in das template für die PullDown-Liste eingebaut:
var autocomplMaterial = new Bloodhound({
datumTokenizer : function(datum) {
return Bloodhound.tokenizers.whitespace(datum.matnr);
},
queryTokenizer : Bloodhound.tokenizers.whitespace,
//prefetch: 'modules/<?php echo $this->_module_name?>/api/post_1960.json',
remote : {
url : 'modules/<?php echo $this->_module_name?>/api/124_ajax_read.php?callback=?&term=%QUERY&name=<?php echo $this->_module_name?>&op=bgc&func=autocomp_mataddinfo',
wildcard : '%QUERY',
transform : function(reply) {
// Map the remote source JSON array to a JavaScript object array
return $.map(reply, function(matinfo) {
return {
matnr : matinfo.matnr,
maktx : matinfo.maktx
};
});
}
}
});
$('#f_matnr').typeahead({
//hint : true,
highlight : true,
minLength : 1
},{
limit : 15,
name : 'tah_matnr',
display : 'matnr',
source : autocomplMaterial,
templates : {
empty : [ '<div class="list-group search-results-dropdown"><div class="list-group-item">Nothing found.</div></div>' ],
header : [ '<div class="list-group search-results-dropdown">' ],
suggestion : function(data) {
return '<a href="' + data.matnr + '" class="list-group-item">'
+ data.matnr
+ ' - '
+ data.maktx
+ '</a>'
}
}
});
Im Framework gibt es unterschiedliche Einstellungsmöglichkeiten zur Registrierung von neuen Benutzern:
1. Frontend - Eigene Registrierung mit eigenem Kennwort
2. Frontend - Eigene Registrierung mit automatisch generierten Kennwort
3. Backend - Administrator
Die Formular-Engine ist eigens für "bootstrap" erstellt worden!
Dadurch ist es möglich, "responsive"-Formulare mit einfachenMitteln zu erstellen!
Die entsprechende Klasse lautet:
af_form_bt
und kann wie folgt instanziert werden:
$tb = load_class ( 'af_form_bt', "settings" ); /* erstmal AdminForm laden */
Der 2te Übergabeparameter ist der Formularname
$FormHtml [] = $tb->horizontal ( [
'left_column_class' => 'col-md-2',
'left_column_offset_class' => 'col-md-offset-2',
'right_column_class' => 'col-md-10',
'action' => adminUrl ('Content', 'save' )
] );
Ein input-field wird zur Eingabe von allgemeinen Werten im Formular verwendet.
/**
* Create the input group for an element with the correct classes for errors.
*
* @param string $type
* @param string $name
* @param string $label
* @param string $value
* @param array $options
* @return string
*/
public function input($type, $name, $label = null, $value = null, array $options = []) {
...}
$type |
HTML-Formuar Input-Type:
für spezielle Eingabetypen gibt es jeweils einen eigenen Funktionsaufruf, da die Parameterleiste unterschiedlich sein kann! |
||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$name | Name des Input-Feldes. Dieser wird beim senden des Formulars in $_GET übergeben. | ||||||||||||
$label | Feldüberschrift für das Eingabefeld. Wird kein $label übergeben, so wird $name als Label übernommen | ||||||||||||
$value | Eingabewert für das Input-Feld. | ||||||||||||
$options |
Array mit Optionen zu einem input-Feld. Hier sind grundsätlich alle HTML-Attribute möglich. Weiterhin können interne Optionen eingetragen werden, welche die Darstellung des Input-Feldes beeinflussen Interne Optionen:
|
Beispiel:
Input-Feld mit einem Hilfe-Text, einer Hilfe-Text-ID und eienr Text-Klasse
$FormHtml [] = $tb->input ( 'input', 'VORNAME', af_tran('Vorname'), 'Mike', [
'helptext' => [
'Bitte geben Sie den Vornamen ein',
'class' => "text-danger",
'id' => 'helptext_id'
]
] );
Beispiel:
Input-Feld mit einer input-group, bestehend aus einem linken Führungstext und einem rechten Ergänzungstext.
$FormHtml [] = $tb->input ( 'input', 'AUSS_KG2', af_tran('Ausschuss'), '1250', [
'input-group' => [
'input-group-addon-left' => [
'text' => 'Kilo',
'class' => '',
'iconclass' => ''
],
'input-group-addon-right' => [
'text' => '.00',
'class' => ''
]
],
'helptext' => af_tran('Ausschuss in KG'),
'size' => '10',
'maxlength' => '10',
'title' => af_tran('Ausschuss in KG')
] );
Beispiel:
Mehrere Eingabefelder nebeneinander im horizontalen Formular.
/*
* Beispiel für mehrere Felder in einem horizontalen Formular:
*
* Erreicht wird dies über die Option 'form-group' => ['form-group' => 'no-form-group'] für
* jede Label|Field-Gruppe
*/
// 1. Input in eine neue "Zeilen"-Variable
// form-group muss 'no-form-group' option enthalten!
$FormRow = $tb->input ( 'input', 'MeinInputFeld2', 'Auch mit helptext', 'Inhalt', [
'helptext' => 'Hinweis zum Eingabefeld...',
'left_column_class' => $tb->getLeftColumnClass (), // Standard-Linke Spalte vom Formular!
'right_column_class' => $tb->column_class [3],
'form-group' => [
'form-group' => 'no-form-group'
]
] );
// 2. nächste Label|Spaltenkombi mit jeweiligen Spaltenbreiten in "Zeilen"-Variablen anhängen
$FormRow .= $tb->number ( 'MeinInputFeld99', 'Gewicht', '150', [
'helptext' => 'Bitte Gewicht eingeben',
'input-group' => [
'input-group-addon-left' => [
'text' => 'KG',
'class' => '',
'iconclass' => ''
],
'input-group-addon-right' => [
'text' => '.00',
'class' => ''
]
],
'left_column_class' => $tb->column_class [1],
'right_column_class' => $tb->column_class [2],
'form-group' => [
'form-group' => 'no-form-group'
]
] );
// 2b nächste Label|Spaltenkombi mit jeweiligen Spaltenbreiten in "Zeilen"-Variablen anhängen
$FormRow .= $tb->email ( 'eMail-Adresse', 'eMail:', 'ich@123.de', [
'required' => 'required',
'helptext' => 'please enter your eMail...',
'left_column_class' => $tb->column_class [1],
'right_column_class' => $tb->column_class [3],
'form-group' => [
'form-group' => 'no-form-group'
]
] );
// 3. die Zeile um die Form-Group ergänzen
$FormRow = $tb->getFormGroup ( null, $FormRow, [ ] );
// 4. die "Zeilen"-Variable an das Formular-Array übergeben:
$FormHtml [] = $FormRow;
Ein input-field wird zur Eingabe von allgemeinen Werten im Formular verwendet.
/**
* Create a Bootstrap date field input.
*
* @param string $name
* @param string $label
* @param string $value
* @param array $options
* ['dateformat' => ('date','datetime'=Default)]
* @return string
*/
public function date($name, $label = null, $value = null, array $options = []) {...}
$name | Name des Input-Feldes. Dieser wird beim senden des Formulars in $_GET übergeben. | ||||||
---|---|---|---|---|---|---|---|
$label | Feldüberschrift für das Eingabefeld. Wird kein $label übergeben, so wird $name als Label übernommen | ||||||
$value | Eingabewert für das Input-Feld. | ||||||
$options |
Array mit Optionen zu einem input-Feld. Hier sind grundsätlich alle HTML-Attribute möglich. Weiterhin können interne Optionen eingetragen werden, welche die Darstellung des Input-Feldes beeinflussen Interne Optionen: Es sind alle Optionen aus dem "input"-Element möglich!
|
Beispiel:
Date Input-Feld mit einem Hilfe-Text und einem onMouseOver-titel
$FormHtml [] = $tb->date ( 'TS_START', af_tran ( 'Ereignis-Beginn' ), $data ['TS_START'], [
'dateformat' => 'datetime',
'helptext' => af_tran ( 'Wann soll das Ereignis beginnen?' ),
'title' => af_tran ( 'Ereignis-Beginn' )
] );
Ein input-field wird zur Eingabe von allgemeinen Werten im Formular verwendet.
/**
* Create a Bootstrap colorpicker field input.
*
* @param string $name
* @param string $label
* @param string $value
* @param array $options
* @return string
*/
public function colorpicker($name, $label = null, $value = null, array $options = []) {
...}
$name | Name des Input-Feldes. Dieser wird beim senden des Formulars in $_GET übergeben. | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$label | Feldüberschrift für das Eingabefeld. Wird kein $label übergeben, so wird $name als Label übernommen | ||||||||||||
$value | Eingabewert für das Input-Feld. | ||||||||||||
$options |
Array mit Optionen zu einem input-Feld. Hier sind grundsätlich alle HTML-Attribute möglich. Weiterhin können interne Optionen eingetragen werden, welche die Darstellung des Input-Feldes beeinflussen Interne Optionen: Es sind alle Optionen aus dem "input"-Element möglich! Elementspezifische Optionen:
|
Beispiel:
Input-Feld als Colorpicker einer input-group, bestehend aus einer rechten Schaltfläche zur Darstellung der Farbe / Aktivierung des Farbauswahldialogs.
$FormHtml [] = $tb->colorpicker (
'config[FILL_COLOR_ROW_1]',
'Bingokartenfarbe-1,
$this->_config ['FILL_COLOR_ROW_1'],
[
'input-group' => [
'input-group-addon-right' => [
'text' => " < i > < / i > "
]
]
]
);
Ein button-field wird zur Bestätigung von Eingaben in einem Formular verwendet.
/**
* Create a Bootstrap form-button.
*
* @param unknown $name
* @param string $label
* @param string $value
* @param string $type
* [button|submit|reset]
* @param array $options
* [
* 'class' => 'btn btn-default',
* 'iconclass' => 'glyphicon glyphicon-floppy-saved',
* 'formaction' => 'modules.php?op=xyz',
* 'confirm' => [
* 'confirm_1' => af_tran ( 'Die Freigabe wird zurückgenommen!' ),
* 'confirm_2' => af_tran ( 'Wollen Sie die Freigaben wirklich zurücknehmen?' )
* ]
* ]
* @return string
*/
public function button($name, $label = null, $value = null, $type = 'button', array $options = []) {...}
$name | Name des Input-Feldes. Dieser wird beim senden des Formulars in $_GET übergeben. | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
$label | Beschriftung des Buttons. Wird kein $label übergeben, so wird $name als Label übernommen | ||||||||||
$value | Eingabewert für den Button. Dieser Wert wird bei der Betätigung des Buttons vial $_GET übergeben. | ||||||||||
$options |
Array mit Optionen zu einem Form-Button. Hier sind grundsätlich alle gültigen HTML-Attribute möglich. Weiterhin können interne Optionen eingetragen werden, welche die Darstellung und die Funktionen des Buttons beeinflussen Interne Optionen: Es sind alle Optionen aus dem "button"-Element möglich!
|
Beispiel:
Form Button-Element mit Einfärbung "Success", Icon, und einer einfachen Bestätigung
// Freigabe beantragen
$FormHtml [] = $tb->button ( 'frm_save', af_tran ( 'Freigabe beantragen'), 'user/save_send', 'submit', [
'class' => 'btn btn-success',
'iconclass' => 'glyphicon glyphicon-send',
'title' => af_tran ( 'Hiermit beantragen Sie die Freigaben...' ),
'confirm' => [
'confirm_1' => af_tran ( 'Soll der Auftrag freigegeben werden?' )
]
] );
Ein spezielles Eingabefeld ist der "DecisionTree" oder auch "Entscheidungsbaum" genannt.
Hier wird aus dem Entscheidungsbaum des ALAF-Moduls "DecisionTree" ein Select-Input Feld erstellt, welches am Ende die Auswahl einer Datensatznummer zurückgibt.
/**
* Erstellt HTML-Code für ein Formular
*
* @param unknown $FrmObj
* @param unknown $tree_id
* @param unknown $options
* @param char $input_name
*/
public function Build_FormSelect($FrmObj, $tree_id, $options, $input_name = 'NEXT_OBJ_ID') { ... }
$FrmObj | Objektzeiger zum Modul DecisionTree | ||||||||
---|---|---|---|---|---|---|---|---|---|
$tree_id | Satznummer/Objektnummer der für die Anwendung im Modul DecisionTree eingetragenen Entscheidungsbäume. | ||||||||
$options |
Array mit Optionen zu einem input-Feld. Hier sind grundsätlich alle HTML-Attribute möglich. Weiterhin können interne Optionen eingetragen werden, welche die Darstellung des Input-Feldes beeinflussen Interne Optionen: Es sind alle Optionen aus dem "input"-Element möglich! Elementspezifische Optionen:
|
Beispiel:
include_once (ALAF_MODULES_DIR . DS . 'DecisionTree' . DS . 'includes' . DS . 'class.DecisionTree.php');
$ObjSelOpt = new DecisionTree ();
$inputname = 'SAP_MATAUSWAHL';
$FormHtml [] = $ObjSelOpt->Build_FormSelect ( $FrmObj, 2, [
'label' => 'Materialauswahl...',
'title' => 'Titel der Materialauswahl',
'helptext' => 'Zur korrekten Materialfindung bitte die Schaltfläche neben dem Eingabefeld klicken...',
'iconclass' => 'fa fa-search'
], $inputname );
Ein input-field wird zur Eingabe von allgemeinen Werten im Formular verwendet.
/**
* Create a Bootstrap form field to enter a signature
*
* Creates the input and canvas group for an element with the correct classes for errors.
*
* @param string $name
* @param string $label
* @param string $value
* @param array $options
* @return string
*/
public function signpad($name, $label = null, $value = null, array $options = []) {...}
$name | Name des Input-Feldes. Dieser wird beim senden des Formulars in $_GET übergeben. | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
$label | Feldüberschrift für das Eingabefeld. Wird kein $label übergeben, so wird $name als Label übernommen | ||||||||||||||
$value | Eingabewert für das Input-Feld. | ||||||||||||||
$options |
Array mit Optionen zu der input-Group. Hier sind grundsätlich alle HTML-Attribute möglich. Weiterhin können spezifische Optionen für das SIGNPAD eingetragen werden: Interne Optionen: Es sind alle Optionen aus dem "input"-Element möglich! Elementspezifische Optionen:
|
Beispiel:
Input-Feld als Signature-Pad (Unterschriftenbereich).
// Hier der Test mit dem Signature-Pad
$FormHtml [] = $tb->signpad ( 'MeinSignaturePad', 'Unterschrift', null, [
'helptext' => 'Bitte unterzeichnen sie hier:',
'height' => 250,
'title' => 'Bereich für die Unterschrift',
'right_column_class' => $tb->column_class [8],
'signpad' => [
'height' => 250,
'penColor' => '#82cb27'
]
] );
Hier wird die Programmablaufsteuerung für das PHP-Framework ALAF beschrieben:
Die Ablaufsteuerung umfasst grundsätzlich 2 Bereiche:
Frontend
Aufruf über das Skript index.php
Backend
Aufruf über das Skript admin.php
Hier wird die Backend - Ablaufsteuerung für Framework ALAF erklärt:
Das Backend wird aufgerufen, indem in der URL der Skriptaufruf admin.php enthalten ist:
Nr | php-skript | aktion / funktion |
---|---|---|
1 | admin.php | include 'mainfile.php'; |
1.1 | mainfile.php | Konstanten definieren (z.B. DS, ALAF_SYSTEM_DIR, ALAF_SYSTEM_CLASS_DIR, ...) |
1.2 | mainfile.php |
error_reporting ( E_ALL ^ E_NOTICE ); // Alle Fehler ausser E_NOTICE melden |
1.3 | mainfile.php |
Prüfung, ob Konfigurationsdatei 'config.php' vorhanden: Sonst die() |
1.4 | mainfile.php |
/* System-Funktionen laden und API's einbinden */ require_once (ALAF_SYSTEM_DIR . DS . 'af_system.php'); |
1.4.1 | af_system.php | Hier stehen nur Satzstatus-Konstanten und Systemfunktionen! |
1.5 | mainfile.php |
// Basisklasse für das Framework laden: load_class ( 'af_base' ); |
1.5.1 | af_base.php | Basis-Klasse: liest die config.php in die Basis-Klasse af_base |
1.6 | mainfile.php | Setzt die länderspezifischen und Zeitzonenspezifischen Einstellungen |
1.7 | mainfile.php |
/* Fehlerbehandlung und Debugmethoden aktivieren */ load_class ( 'af_debug', false ); af_debug::init (); |
1.8 | mainfile.php |
/* Session einbinden (Start erfolgt in af_engine::start() */ $afSessionLifetime = af_base::get_afConfig('afSessionLifetime'); $afSessionLifetime = (isset ( $afSessionLifetime )) ? $afSessionLifetime : 30; define ( "AF_COOKIE_LIFETIME", $afSessionLifetime * 24 * 60 * 60 ); define ( "AF_SESSION_LIFETIME", $afSessionLifetime * 24 * 60 * 60 ); // Standard 6 Stunden /* die Sessionlifetime für nicht-User / nicht-Admins in Sekunden */ define ( 'AF_SESSION_LIFETIME_NOUSER', '1440' ); require_once (ALAF_SYSTEM_DIR . DS . 'af_session.php'); |
1.9 | mainfile.php |
/* Referer aktualisieren */ afReferer(); |
2 | admin.php |
// Framework-Engine starten: load_class ( 'af_engine', 'admin' ); af_engine::start (); |
3 | admin.php |
// Admin-Klasse af_admin (statisch) instanzieren require_once (ALAF_ADMIN_DIR . DS . 'admin_functions.php'); // Admin: Ablauf-Steuerung: echo af_admin::run (); |
3.1 | admin/admin_functions.php | AF_IS_USER und AF_IS_ADMIN - Konstanten setzen |
3.2 | admin/admin_functions.php |
// Userstatistik aktualisieren: self::update_userstat (); |
3.3 | admin/admin_functions.php | admin-Modul(e) ermitteln und durchlaufen... |
3.4 | admin/admin_functions.php |
// Menü, helptab und newentries erstellen und in die af_engine uebergeben: self::admin_build_sidemenubar ( self::$__op ); self::admin_build_helptab (); self::admin_get_newentries (); |
3.5 | admin/admin_functions.php |
/* Template "admin/templates/adminpage.html" aufbereiten und ausgeben
*/ return self::$_template->fetch ( 'adminpage.html' ); |
4 | admin.php |
// Letzte Aktion: Ausgabe erzeugen: af_engine::final_output (); // Schliesst den Ausgabepuffer und gibt den Seiteninhalt aus! |
4.1 | class: af_engine |
// Theme-Dateien einlesen und Theme-Funktion zum Ersetzen der Schlüsselworte aufrufen: include_once (ALAF_THEMES_DIR . DS . self::$__config ['themename'] . DS . 'theme.php'); include_once (ALAF_THEMES_DIR . DS . self::$__config ['themename'] . DS . 'theme.functions.php'); $export = self::fetch_with_theme (); |
4.2 | class: af_engine |
function fetch_with_theme() /* HTML-Grundgerüst aus den af_engine - Variablen erstellen:
*/ /* Theme einlesen - es wird nur der Body- Bereich verwendet! */"themeordner/theme.html" // Löschen der Blöcke:
// Die Platzhalter aus dem theme ersetzen: if (function_exists ( 'theme_define_placeholders' )) { $parts = theme_define_placeholders (); ... } // Ersetzung der Template-Platzhalter für den Content und die Side-Bar:
// Skript-Code für das Ende hinzufügen
|