phpMyDataGrid is loading ...

Requires Javascript.
phpMyDataGrid - CMGs Notizen zu diesem Script
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background::[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

table {border:2px solid [[ColorPalette::TertiaryDark]];}
th, thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
td, tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:absolute; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:200;}
*[id='messageArea'] {position:fixed !important; z-index:200;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

table {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:50; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and need larger font sizes.
***/

/*{{{*/
body {font-size:0.8em;}

#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}

.subtitle {font-size:0.8em;}

.viewer table.listView {font-size:0.95em;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
Die 10 Parameter der Funktion FormatColumn:

|!#|!interner Name|!Bedeutung|!Parameter|
|1|$strfieldName |>|Feldname, von Tabelle vorgegeben|
|2|$strHeader|~Ausgabe-Text für dieses Feld in der Tabelle|String, beliebig|
|3|$fieldWidth|Breite des Formularfeldes|numerischer Wert|
|4|$maxlength|maximale Textlänge|numerischer Wert|
|5|$inputtype|~InputTyp|numerischer Wert 0 - 5|
|6|$columnwidth|Spaltenbreite|numerischer Wert|
|7|$align|Textausrichtung|Left, center, right, justify|
|8|$Mask|Maske|siehe nachstehende Auflistung|
|9|$default|~Default-Wert für neuen Datensatz|leer oder String|
|10|$cutChar|Anzahl der anzuzeigenden Buchstaben des Feldinhalts|numerischer Wert|

Der 8. Parameter wird auch als //mask parameter// bezeichnet, er bietet viele Möglichkeiten der Gestaltung für die Anzeige dieses Feldes. Ein Beispiel: der Betrag im Feld //Gehalt// soll mit einem Währungskennzeichen versehen werden, also erhält der Mask-Parameter den Inhalt "~money:&euro;"
Sollen anstelle der direkten Verbindung zur ~MySQL-Datenbank die ~PHP-Datenbankabstraktionsklassen genutzt werden, um die [[phpMyDataGrid-Klasse|phpMyDataGrid]] universeller zu nutzen, also auch andere als die ~MySQL-Datenbank einzubinden, genügt das Einbinden der Klasse, vorausgesetzt die "~ADOdb-Library" steht zur Verfügung. 
Ob Sie diese Funktion nutzen können erfahren Sie beispielsweise mit der ~PHP-Funktion //phpinfo();//

Die Klasse wird im Script eingebunden und anschließend wird der Connect zur Datenbank um 2 weitere Parameter ergänzt:
{{{
/* ADOdb library must be included */
include_once('adodb/adodb.inc.php');
/* to use ADOdb is so simple as say true */
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru", true, "mysql"); 
}}}

die 2 letztgenannten Parameter "true" und "mysql" aktivieren den ~ADOdb-Modus  und legen fest, mit welcher Datenbank verbunden werden soll.

Parameter 5 = true/false <= ~ADOdb-Modus ja/nein
Parameter 6 = Name der zu konnektierenden Datenbank, Wert: alle von der PHP-Klasse unterstützten Datenbanken

{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee',true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
/* ADOdb library must be included */
include_once('adodb/adodb.inc.php');
/* to use ADOdb is so simple as say true */
$objGrid -> conectadb("127.0.0.1","phpclasses","test","guru",true,"mysql");
$objGrid -> tabla ("employees");
$objGrid -> buttons(true,true,true,true);
$objGrid -> keyfield("id");
$objGrid -> salt("Some Code4Stronger(Protection)");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age","DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id","ID Employee",5,5,1,"50","center","integer");
$objGrid -> FormatColumn("name","Name",30,30,0,"150","left");
$objGrid -> FormatColumn("lastname","Last name",30,30,0,"150","left");
$objGrid -> FormatColumn("age","Age",5,5,0,"50","right");
$objGrid -> FormatColumn("afiliation","Afiliation Date",10,10,0,"100","center","date:dmy:/");
$objGrid -> FormatColumn("status","Status",5,5,0,"60","left","select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active","Active",2,2,0,"50","center","check:No:Yes");
$objGrid -> FormatColumn("salary","Salary",10,10,0,"90","right","2");  
$objGrid -> FormatColumn("workeddays","Work days","10","10","5","100","left","chart:percent:val:31");        
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> ajax("silent");
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html> 
}}}
Sie legen fest, ob Änderungen durch  @@ENTER@@ oder @@~DoppelKlick@@ gespeichert werden (=silent) oder ob auf das Icon geklickt werden muss, dies entspricht 'default' und braucht nicht extra geregelt werden. =>[[ajax("silent")|ajax()]]
Diese Anweisung wird im ~Body-Part der ~HTML-Datei gegeben.
{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> buttons(true,true,true,true);
$objGrid -> keyfield("id");
$objGrid -> salt("Some Code4Stronger(Protection)");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
/* AJAX inline edition comes in two flawors */
/*    silent: To save record, just enter or double click */
/*    default: To save record, must click icon */
/* try yourself and see which one likes more (My preferred is silent) */
$objGrid -> ajax("silent");
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>
}}}

 Jeder Text, der zusätzlich zu dem von der Klasse ausgegebenem Text im Dokument steht, muß in einer Abfrage gesetzt werden, damit er nicht bei dem Reload des per ~AJAX-Technik gebildeten Textes erneut ausgegeben wird.

Dazu setzen Sie die Variable "~DG_ajaxid" ein: 
{{{
if (!isset($_REQUEST["DG_ajaxid"])){
== innerhalb dieser Bedingung setzen Sie den Text, der nur einmal ausgegeben werden soll.
== Also den Body-Teil bis zu den Anweisungen für die ~Ausgabe-Anweisungen
}
                $objGrid -> ajax('silent');
		$objGrid -> grid();
		$objGrid -> desconectar();
}}}

Diese Funktion ist die am schlechtesten dokumentierte Funktion. 
Was die Funktion tut, erschließt sich beim Ausprobieren: es werden in den jeweiligen Tabellenfeldern farbige Balkendiagramme als Hintergrund angezeigt.
Was die Bezugswerte für diese Diagramme sind, erschließt sich jedenfalls (nicht sofort).
Die Entwickler haben aber eine Erklärung zugesagt. @@Dann warten wir eben ein wenig.@@

Auf der Beispielseite heißt es als Erklärung:
//For statistical purposes, bar chart can be displayed on datagrid based on thee possibles values (Max number in column, sum of all values in column or a pre-defined value.//
{{{
/* Show a bar chart based on a pre-defined value */
$objGrid -> FormatColumn("workeddays","Work days","10","10","5","100","left","chart:percent:val:31");  
}}}


{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> buttons(true,true,true,true);
$objGrid -> keyfield("id");
$objGrid -> salt("Some Code4Stronger(Protection)");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname","Last name",30,30,0,"150","left");
$objGrid -> FormatColumn("age","Age",5,5,0,"50","right");
$objGrid -> FormatColumn("afiliation","Afiliation Date",10,10,0,"100","center","date:dmy:/");
$objGrid -> FormatColumn("status","Status",5,5,0,"60","left","select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active","Active",2,2,0,"50", center","check:No:Yes");
$objGrid -> FormatColumn("salary","Salary",10,10,0,"90","right","2");  
/* Show a bar chart based on a pre-defined value */
$objGrid -> FormatColumn("workeddays","Work days","10","10","5","100","left","chart:percent:val:31");        
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> ajax("silent");
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html> 
}}}
*Ein typisches phpMyDataGrid-Script setzt sich aus dem 
>Aufruf der Klasse, 
>Definition der Eigenschaften und 
>dem Aufruf der Hauptfunktion zusammen
>sowie dem Aufruf weiterer Methoden der Klasse   zusammen

*Im "Header" der Datei werden 
>die Klasse eingebunden
>ein Objekt angelegt
>die Datenbank konnektiert
>die Tabelle benannt, die ausgelesen wird
>die Datenbankfelder gelistet, die genutzt werden sollen
>die einzelnen Spalten für die zu bildende Tabelle definiert

Im "Body" wird dann 
>das Grid ausgegeben
>die Verbindung zur Datenbank geschlossen


__Im Header:__
{{{
<?php
// Klasse einbinden
 include ("phpmydatagrid.class.php");   
// Objekt anlegen   
 $objGrid = new datagrid;                   
// Form benennen, wird vom Script angelegt
$objGrid -> form('employee', true);      
//  Datenbankverbindung herstellen
$objGrid -> conectadb("127.0.0.1", "name", "Passwort", "Datenbank");
// Tabelle nennen, die ausgelesen wird
$objGrid -> tabla ("employees");      
// die auszugebenden Tabellenfelder werden definiert
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center");
.... weitere Spalten definieren
// diese Anweisung muss im Header stehen, damit Javascript - Parameter etc.
// korrekt gesetzt sind, ebenso das CSS 
$objGrid -> setHeader();  
?>
}}}

__im Body:__
{{{
<?php
// Die Tabelle ausgeben
$objGrid -> grid();
// Von der Datenbank abmelden
$objGrid -> desconectar();
?>
}}}
Durch [[Where-Klauseln|where()]] filtern Sie den Output weiter:
{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status","Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");

/* Records can be filtered to comply with a pre-defined condition */
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html> 
}}}
Jetzt wird es komplexer.
Grundsätzlich können die Werte einzelner Tabellenfelder miteinander //verrechnet// werden.
Dafür müssen die übergebenen Werte aber im numerischen Format vorliegen, nicht im  //Währungsformat//
 
Beispiel:
zuerst wird statt des Währungsformats ein Dezimalformat festgelegt:
{{{
$objGrid -> FormatColumn("salary","Salary",10,10,0,"90","right","2"); // Währungsformat durch Dezimalformat mit 2 Nachkommastellen ersetzen
$objGrid -> FormatColumn("workeddays","Work days",5,2,0,"50","right","integer");
}}}

Die Rechenaufgabe ist: Das Gehalt durch 30 (Arbeitstage) teilen und dann mit der Zahl der tatsächlich geleisteten Arbeitstage multiplizieren. Ein solcherart erwirtschaftetes Ergebnis wird nicht in die Datenbank geschrieben, es dient nur zur Anzeige!
Damit ein Ergebnis berechnet werden kann, muß der 5. Parameter, "input type", den Wert "3" haben
{{{
$objGrid -> FormatColumn("calc_1","Value Days", "10", "10", "3","70","right","calc:((salary/30)*workeddays)"); 
}}}
Bilder ausgeben, deren Name in der Datenbank steht (dynamisch) => [[FormatColumn()]]
Im "~Maskier-Feld" wird eine Anweisung generiert, die den gespeicherten Wert des jeweiligen Feldes als Bild ausgibt, beachten Sie hier die Pfadangabe!
Eine Variable "%s" steht für den Dateinamen, der im Datensatz gespeichert ist:
{{{
$objGrid -> FormatColumn("photo","Photo", "25", "0","0","150","center","image:images/sample/%s");    
$objGrid -> FormatColumn("image_1","Img","25","0","3","20","center","image:images/sample/money.png");   
}}}
Beispiel 2: Möchten Sie hingegen eine Standardgrafik unabhängig vom tatsächlichen Tabelleninhalt ausgeben, dann notieren Sie diesen Dateinamen ebenfalls im ~Maskier-Feld.
Achten Sie dann jedoch auf den //~Input-Typ 3//! => [[FormatColumn()]]
{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> buttons(true,true,true,true);
$objGrid -> keyfield("id");
$objGrid -> salt("Some Code4Stronger(Protection)");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left","select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "2");  
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> FormatColumn("calc_1","Value Days", "10", "10", "3","70","right","calc:((salary/30)*workeddays)");        
/* Dynamic image: Displaying an image with a value stored in a field */
/* Note: The %s will be replaced by the selected field, in this example by photo field */
$objGrid -> FormatColumn("photo","Photo", "25", "0","0","150","center","image:images/sample/%s");    
/* Static image: Displaying an image with an unique name */
/* Note: inputtype must be set to 3 */
$objGrid -> FormatColumn("image_1","Img","25","0","3","20","center","image:images/sample/money.png");    
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> ajax("silent");
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>
}}}
/***
|Name|BreadcrumbsPlugin|
|Source|http://www.TiddlyTools.com/#BreadcrumbsPlugin|
|OriginalAuthor|Alan Hecht (with 2.0 update from 'jack' and revisions by Bram Chen)|
|Version|1.5.7.0TT|
|Author|Eric Shulman|
|License|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.displayTiddler,TiddlyWiki.prototype.deleteTiddler|
|Description|show a list of tiddlers viewed during this session.  Also defines "back" (previousTiddler) toolbar button and macro|

!Configuration
<<<
<<option chkShowBreadcrumbs>> show breadcrumbs display
>//Note: although this checkbox does toggle the breadcrumbs ''setting'', the actual breadcrumbs ''display'' is not updated until the next crumb is added (or a previous crumb is clicked on).  In order for the checkbox setting to have ''immediate'' effect, please see [[ToggleBreadcrumbs]], which uses [[InlineJavascriptPlugin]] to synchronize the checkbox setting and the breadcrumbs display.//
<<option chkReorderBreadcrumbs>> re-order breadcrumbs when visiting a previously viewed tiddler
>//Note: standard (non-enabled) behavior is to ''trim'' the breadcrumbs list when visiting a previously viewed tiddler, so that all crumbs following that tiddler are removed from the list.//
<<<
!Code section:
***/
//{{{
version.extensions.breadCrumbs = {major: 1, minor: 5, revision: 8, date: new Date("May 26, 2007")};

// show/hide display option (default is to SHOW breadcrumbs)
if (config.options.chkShowBreadcrumbs==undefined)
	config.options.chkShowBreadcrumbs=true;

// REORDER breadcrumbs when visiting previously viewed tiddler (default is to TRIM breadcrumbs)
if (config.options.chkReorderBreadcrumbs==undefined)
	config.options.chkReorderBreadcrumbs=false;

// hijack story.displayTiddler() so crumbs can be refreshed when a tiddler is displayed
if (Story.prototype.breadCrumbs_coreDisplayTiddler==undefined)
	Story.prototype.breadCrumbs_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,title,template,animate,slowly)
{
	this.breadCrumbs_coreDisplayTiddler.apply(this,arguments);
	// if not displaying tiddler during document startup, then add it to the breadcrumbs
	// note: 'startingUp' flag is a global, set/reset by the core init() function
	if (!startingUp) config.breadCrumbs.addCrumb(title);
}

// hijack store.removeTiddler() so crumbs can be refreshed when a tiddler is deleted
if (TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler==undefined)
	TiddlyWiki.prototype.breadCrumbs_coreRemoveTiddler=TiddlyWiki.prototype.removeTiddler;
TiddlyWiki.prototype.removeTiddler= function(title)
{
	this.breadCrumbs_coreRemoveTiddler.apply(this,arguments);
	config.breadCrumbs.refreshCrumbs();
}

config.breadCrumbs =  {
	crumbs: [], // the list of current breadcrumbs
	addCrumb: function (title) { // ELS: changed from passing event, "e", to passing tiddler title
		var thisCrumb = "[[" + title + "]]";
		var ind = this.crumbs.find(thisCrumb);
		if(ind === null)
			this.crumbs.push(thisCrumb);
		else if (config.options.chkReorderBreadcrumbs)
			this.crumbs.push(this.crumbs.splice(ind,1)[0]); // reorder crumbs
		else
			this.crumbs=this.crumbs.slice(0,ind+1); // trim crumbs
		this.refreshCrumbs();
		return false;
	},
	refreshCrumbs: function() {
		var crumbArea = document.getElementById("breadCrumbs");
		if (!crumbArea) {
			var crumbArea = document.createElement("div");
		 	crumbArea.id = "breadCrumbs";
		 	crumbArea.style.display= "none";
			var targetArea= document.getElementById("tiddlerDisplay"); // TW2.1-
			if (!targetArea) targetArea = document.getElementById("storyDisplay"); // TW2.2+
		 	targetArea.parentNode.insertBefore(crumbArea,targetArea);
		}
		crumbArea.style.display = config.options.chkShowBreadcrumbs?"block":"none";
		removeChildren(crumbArea);
		createTiddlyButton(crumbArea,"Home",null,this.restartHome);
		for (c=0; c<this.crumbs.length; c++)
			if (!store.tiddlerExists(this.crumbs[c].replace(/\[\[/,'').replace(/\]\]/,'')))
				this.crumbs.splice(c,1); // remove non-existing tiddler from crumbs
		wikify(" | " + this.crumbs.join(' > '),crumbArea);
	},
	restartHome: function() {
		story.closeAllTiddlers();
		restart();
		config.breadCrumbs.crumbs = [];
		var crumbArea = document.getElementById("breadCrumbs");
		if (crumbArea) crumbArea.style.display = "none";
	}
};

config.commands.previousTiddler = {
	text: 'back',
	tooltip: 'view the previous tiddler',
	hideReadOnly: false,
	dateFormat: 'DDD, MMM DDth YYYY hh:0mm:0ss',
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		if (config.breadCrumbs.crumbs.length>1) {
			var crumb=config.breadCrumbs.crumbs[config.breadCrumbs.crumbs.length-2].replace(/\[\[/,'').replace(/\]\]/,'');
			story.displayTiddler(here,crumb);
		}
		else
			config.breadCrumbs.restartHome();
		return false;
	}
};

config.macros.previousTiddler= {
	label: 'back',
	prompt: 'view the previous tiddler',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var label=params.shift(); if (!label) label=this.label;
		var prompt=params.shift(); if (!prompt) prompt=this.prompt;
		createTiddlyButton(place,label,prompt,function() {
			if (config.breadCrumbs.crumbs.length>1) {
				var crumb=config.breadCrumbs.crumbs[config.breadCrumbs.crumbs.length-2].replace(/\[\[/,'').replace(/\]\]/,'');
				story.displayTiddler(place,crumb);
			}
			else
				config.breadCrumbs.restartHome();
		});
	}
}
//}}}
für jede zu bearbeitende Zeile muß ein "~Key-Feld" definiert sein. => [[keyfield()]]
Datensätze bearbeiten: Hinzufügen, Editieren, Löschen. => [[buttons(true,true,true,true)]]
Aus Sicherheitsgründen wird dies durch einen verschlüsselten Code geschützt. => #[[salt("string")|salt()]]
{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");

/* Allow Add, edit, delete or view records */
$objGrid -> buttons(true,true,true,true);

/* Keyfield must be defined to indentify each row */
$objGrid -> keyfield("id");

/* A code is related with some transactions. so is very dificult to someone to try to do unauthorized process */
/* There are a internal code but you can made it strong by setting this function" */
$objGrid -> salt("Some Code4Stronger(Protection)");

$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html> 
}}}
Die ~Standard-Einstellungen werden in der Klasse phpMyDataGrid zuAnfang festgelegt.
Sie können diese ~Standard-Einstellungen in Ihrer Anwendung natürlich überschreiben.
Möchten Sie diese ~Standard-Einstellungen dauerhaft ändern, dann sollten Sie diese Werte in der Klasse phpMyDataGrid selbst setzen.
Die nachfolgende Tabelle listet die ~Standard-Einstellungen auf.
|!Bedeutung|!~Default-Wert|!~Neu-Definition|
|Anzahl auszugebender Zeilen|var $maxRec = 20;|$objGrid -> [[datarows(5);|datarows()]]|
|Buttons: Datensatz addieren|var $addBtn = false;|$objGrid -> [[buttons(true,false,false,false);|buttons(true,true,true,true)]]|
|Buttons: Datensatz aktualisieren|var $updBtn  = false;|$objGrid -> [[buttons(false,true,false,false);|buttons(true,true,true,true)]]|
|Buttons: Datensatz löschen|var $delBtn = false;|$objGrid -> [[buttons(false,false,true,false);|buttons(true,true,true,true)]]|
|Buttons: Datensatz betrachten|var $chkBtn  = false;|$objGrid -> [[buttons(false,false,false,true;)|buttons(true,true,true,true)]]|
|Pfad zu Grafikdateien|var $imgpath = "images/";|$objGrid -> [[pathtoimages("./images/");|pathtoimages()]]|
|Paginierung|var $pagination= 'mixed';|$objGrid -> [[paginationmode('links');|paginationmode()]]|
|~Sortier-Pfeile|var $orderArrows = true;|$objGrid ->  [[noorderarrows();|noorderarrows()]]|
|~XHTML-Konformität|var $closeTags|$objGrid ->  [[closeTags(true);|closeTags()]]|
|Output in ~FORM-Element|var $doForm = false;|$objGrid -> [[form('FormularName', true);|form()]]|
|POST oder GET|var $methodForm = 'POST';|$objGrid ->  [[methodForm("get");|methodForm()]]|
|Feld direkt editieren|var $ajaxEditable  = ' ';|Input-Type 0,1 oder 2|
|Anzahl der angezeigten Links in Paginierung|var $linksperpage = 5;|$dgGrid -> linksperpage = '15';|
|Dezimalstellen|var $decimalDigits = 2;|$objGrid -> [[decimalDigits(5); |decimalDigits(2)]]|
|Dezimalzeichen|var $decimalsep = ".";|$objGrid -> [[decimalPoint(",")|decimalPoint()]]|
|~Mehrfach-Bearbeitung von Zeilen|var $checkable = false;|$objGrid->[[checkable()]]|
|Anzahl der angezeigten Datensätze ausgeben|var $showToOf = true;|$dgGrid -> showToOf = false;|
|Farben für Balkendiagramme|var $color4Charts = Array("#B69133",....);|bei Bedarf in der Klasse selbst ändern|
|~Email-Adresse im Fehlerfall|var $strMailErrors = ' ';|$dgGrid -> strMailErrors = 'admin@yourmail.com'; untested;=) |
|Farbe für aktualisierte Zeilen|var $dgAjaxChanged = "#FF0000";|$dgGrid -> dgAjaxChanged = '0000FF'; |
config.options.txtUserName = "Connie";  // Gewünschter User anstatt "YourName"
config.options.chkAutoSave = true;       // AutoSave dauerhaft einschalten
"Version 1.1"
Einführung
Einsatzvoraussetzungen
// ****************************************************
// * TiddlyWiki 2.1.2a - German Translation (r811)    *
// * Maintainer: Besim Karadeniz <besim@karadeniz.de> *
// * Web: www.karadeniz.de/tiddlywiki/                *
// ****************************************************

if (config.options.txtUserName == "YourName")
	merge(config.options,{txtUserName: "IhrName"});

merge(config.messages,{
	customConfigError: "Beim Laden von Plugins sind Fehler aufgetreten. Siehe PluginManager für Details",
	pluginError: "Fehler: %0",
	pluginDisabled: "Nicht ausgeführt, da durch 'systemConfigDisable'-Tag deaktiviert",
	pluginForced: "Ausgeführt, da durch 'systemConfigForce'-Tag erzwungen",
	pluginVersionError: "Nicht ausgeführt, da dieses Plugin eine neuere Version von TiddlyWiki erfordert",
	nothingSelected: "Nichts ausgewählt. Sie müssen zuerst ein oder mehrere Elemente auswählen",
	savedSnapshotError: "Es scheint, dass dieses TiddlyWiki inkorrekt gespeichert wurde. Bitte besuchen Sie http://www.tiddlywiki.com/#DownloadSoftware für Details",
	subtitleUnknown: "(unbekannt)",
	undefinedTiddlerToolTip: "Der Tiddler '%0' existiert noch nicht",
	shadowedTiddlerToolTip: "Der Tiddler '%0' existiert noch nicht, hat aber einen vordefinierten Schatteneintrag",
	tiddlerLinkTooltip: "%0 - %1, %2",
	externalLinkTooltip: "Externer Link zu %0",
	noTags: "Es gibt keine getaggten Tiddler",
	notFileUrlError: "Sie müssen zunächst dieses TiddlyWiki in eine Datei speichern, bevor Änderungen gespeichert werden können",
	cantSaveError: "Änderungen können nicht gespeichert werden. Möglicherweise unterstützt Ihr Browser das Speichern nicht (nutzen Sie Firefox, wenn möglich) oder der Pfadname Ihrer TiddlyWiki-Datei enthält illegale Zeichen",
	invalidFileError: "Die originale Datei '%0' scheint kein gültiges TiddlyWiki zu sein",
	backupSaved: "Backup gespeichert",
	backupFailed: "Fehler beim Speichern des Backup",
	rssSaved: "RSS-Feed gespeichert",
	rssFailed: "Fehler beim Speichern des RSS-Feed",
	emptySaved: "Leere Vorlage gespeichert",
	emptyFailed: "Fehler beim Speichern der leeren Vorlage",
	mainSaved: "Haupt-TiddlyWiki-Datei gespeichert",
	mainFailed: "Fehler beim Speichern der Haupt-TiddlyWiki-Datei. Ihre Änderungen wurden nicht gespeichert",
	macroError: "Fehler im Makro <<%0>>",
	macroErrorDetails: "Fehler beim Ausführen von Makro <<%0>>:\n%1",
	missingMacro: "Kein entsprechendes Makro vorhanden",
	overwriteWarning: "Ein Tiddler namens '%0' existiert bereits. Wählen Sie OK zum Überschreiben",
	unsavedChangesWarning: "WARNUNG! Ungespeicherte Änderungen im TiddlyWiki vorhanden\n\nWählen Sie OK zum Speichern\nWählen Sie ABBRECHEN/CANCEL zum Verwerfen",
	confirmExit: "--------------------------------\n\nUngespeicherte Änderungen im TiddlyWiki vorhanden. Wenn Sie fortfahren, werden Sie diese Änderungen verlieren\n\n--------------------------------",
	saveInstructions: "SaveChanges",
	unsupportedTWFormat: "Nicht unterstütztes TiddlyWiki-Format '%0'",
	tiddlerSaveError: "Fehler beim Speichern von Tiddler '%0'",
	tiddlerLoadError: "Fehler beim Laden von Tiddler '%0'",
	wrongSaveFormat: "Speichern im Speicherformat '%0' nicht möglich. Standardformat zum Speichern wird verwendet.",
	invalidFieldName: "Ungültiger Dateiname %0",
	fieldCannotBeChanged: "Feld '%0' kann nicht geändert werden"});

merge(config.messages.messageClose,{
	text: "schließen",
	tooltip: "diesen Textbereich schließen"});

config.messages.dates.months = ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November","Dezember"];
config.messages.dates.days = ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"];
config.messages.dates.shortMonths = ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"];
config.messages.dates.shortDays = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];

merge(config.views.wikified.tag,{
	labelNoTags: "keine Tags",
	labelTags: "Tags: ",
	openTag: "Öffne Tag '%0'",
	tooltip: "Zeige Tiddlers mit Tags '%0'",
	openAllText: "Öffne alle",
	openAllTooltip: "Alle diese Tiddler öffnen",
	popupNone: "Keine anderen Tiddler mit '%0' getaggt"});

merge(config.views.wikified,{
	defaultText: "Der Tiddler '%0' existiert noch nicht. Doppelklicken zum Erstellen",
	defaultModifier: "(fehlt)",
	shadowModifier: "(vordefinierter Schatten-Tiddler)",
	createdPrompt: "erstellt"});

merge(config.views.editor,{
	tagPrompt: "Geben Sie die Tags durch Leerstellen getrennt ein, [[benutzen Sie doppelte eckige Klammern]] falls nötig, oder wählen Sie vorhandene",
	defaultText: "Geben Sie den Text für '%0' ein"});

merge(config.views.editor.tagChooser,{
	text: "Tags",
	tooltip: "Wählen Sie vorhandene Tags zum Hinzufügen zu diesem Tiddler aus",
	popupNone: "Es sind keine Tags definiert",
	tagTooltip: "Tag '%0' hinzufügen"});

merge(config.macros.search,{
	label: "suchen",
	prompt: "Dieses TiddlyWiki durchsuchen",
	accessKey: "F",
	successMsg: "%0 Tiddler gefunden, die %1 enthalten",
	failureMsg: "Keine Tiddler gefunden, die %0 enthalten"});

merge(config.macros.tagging,{
	label: "Tagging: ",
	labelNotTag: "kein Tagging",
	tooltip: "Liste der Tiddler, die mit '%0' getaggt sind"});

merge(config.macros.timeline,{
	dateFormat: "DD MMM YYYY"});

merge(config.macros.allTags,{
	tooltip: "Tiddler, die mit '%0' getagged sind, anzeigen",
	noTags: "Keine getaggten Tiddler vorhanden"});

config.macros.list.all.prompt = "Alle Tiddler in alphabetischer Reihenfolge";
config.macros.list.missing.prompt = "Tiddler, auf die verwiesen wird, die aber nicht existieren";
config.macros.list.orphans.prompt = "Tiddler, auf die nicht von anderen Tiddler verwiesen wird";
config.macros.list.shadowed.prompt = "Tiddler, für die Standardeinträge existieren";

merge(config.macros.closeAll,{
	label: "alle schließen",
	prompt: "Alle angezeigten Tiddler schließen (außer denen, die gerade bearbeitet werden)"});

merge(config.macros.permaview,{
	label: "Permaview",
	prompt: "Erzeugt einen URL, mit dem auf alle gerade geöffneten Tiddler verwiesen werden kann"});

merge(config.macros.saveChanges,{
	label: "Änderungen speichern",
	prompt: "Alle Änderungen speichern, um ein neues TiddlyWiki zu erstellen",
	accessKey: "S"});

merge(config.macros.newTiddler,{
	label: "Neuer Tiddler",
	prompt: "Neuen Tiddler erstellen",
	title: "Neuer Tiddler",
	accessKey: "N"});

merge(config.macros.newJournal,{
	label: "Neues Journal",
	prompt: "Neuen Tiddler mit aktuellem Datum und aktueller Zeit erstellen",
	accessKey: "J"});

merge(config.macros.plugins,{
	skippedText: "(Dieses Plugin wurde nicht ausgeführt, da es nach dem Start hinzugefügt wurde)",
	noPluginText: "Es sind keine Plugins installiert",
	confirmDeleteText: "Wollen Sie wirklich folgende Tiddler löschen:\n\n%0",
	listViewTemplate : {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', tiddlerLink: 'title', title: "Titel", type: 'TiddlerLink'},
			{name: 'Forced', field: 'forced', title: "Erzwungen", tag: 'systemConfigForce', type: 'TagCheckbox'},
			{name: 'Disabled', field: 'disabled', title: "Deaktiviert", tag: 'systemConfigDisable', type: 'TagCheckbox'},
			{name: 'Executed', field: 'executed', title: "Geladen", type: 'Boolean', trueText: "Ja", falseText: "Nein"},
			{name: 'Error', field: 'error', title: "Status", type: 'Boolean', trueText: "Fehler", falseText: "OK"},
			{name: 'Log', field: 'log', title: "Log", type: 'StringList'}
			],
		rowClasses: [
			{className: 'error', field: 'error'},
			{className: 'warning', field: 'warning'}
			],
		actions: [
			{caption: "Weitere Aktionen...", name: ''},
			{caption: "systemConfig-Tag entfernen", name: 'remove'},
			{caption: "Diese Tiddler endgültig löschen", name: 'delete'}
			]}
	});

merge(config.macros.refreshDisplay,{
	label: "aktualisieren",
	prompt: "Gesamte TiddlyWiki-Ansicht aktualisieren"
	});

merge(config.macros.importTiddlers,{
	defaultPath: "http://www.tiddlywiki.com/index.html",
	fetchLabel: "abrufen",
	fetchPrompt: "TiddlyWiki-Datei abrufen",
	fetchError: "Während dem Abruf der TiddlyWiki-Datei sind Probleme aufgetaucht",
	confirmOverwriteText: "Wollen Sie wirklich folgende Tiddler überschreiben:\n\n%0",
	wizardTitle: "Import von Tiddler aus anderem TiddlyWiki",
	step1: "Schritt 1: TiddlyWiki-Datei ausfindig machen",
	step1prompt: "URL oder Pfadnamen eingeben: ",
	step1promptFile: "...oder nach einer Datei browsen: ",
	step1promptFeeds: "...oder einen vordefinierten Feed auswählen: ",
	step1feedPrompt: "Wählen...",
	step2: "Schritt 2: TiddlyWiki-Datei laden",
	step2Text: "Bitte warten, bis Datei geladen ist von: %0",
	step3: "Schritt 3: Zu importierende Tiddler auswählen",
	step4: "%0 Tiddler importiert",
	step5: "Erledigt",
	listViewTemplate: {
		columns: [
			{name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
			{name: 'Title', field: 'title', title: "Titel", type: 'String'},
			{name: 'Snippet', field: 'text', title: "Schnipsel", type: 'String'},
			{name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
			],
		rowClasses: [
			],
		actions: [
			{caption: "Weitere Aktionen...", name: ''},
			{caption: "Importieren dieser Tiddler", name: 'import'}
			]}
	});

merge(config.commands.closeTiddler,{
	text: "schließen",
	tooltip: "Diesen Tiddler schließen"});

merge(config.commands.closeOthers,{
	text: "andere schließen",
	tooltip: "Alle anderen Tiddler schließen"});

merge(config.commands.editTiddler,{
	text: "bearbeiten",
	tooltip: "Diesen Tiddler bearbeiten",
	readOnlyText: "betrachten",
	readOnlyTooltip: "Quellcode dieses Tiddlers betrachten"});

merge(config.commands.saveTiddler,{
	text: "fertig",
	tooltip: "Änderungen an diesem Tiddler speichern"});

merge(config.commands.cancelTiddler,{
	text: "abbrechen",
	tooltip: "Änderungen an diesem Tiddler verwerfen",
	warning: "Wollen Sie wirklich Änderungen in '%0' verwerfen?",
	readOnlyText: "fertig",
	readOnlyTooltip: "Diesen Tiddler normal anzeigen"});

merge(config.commands.deleteTiddler,{
	text: "löschen",
	tooltip: "Diesen Tiddler löschen",
	warning: "Wollen Sie '%0' wirklich löschen?"});

merge(config.commands.permalink,{
	text: "Permalink",
	tooltip: "Permalink für diesen Tiddler"});

merge(config.commands.references,{
	text: "Referenzen",
	tooltip: "Alle Tiddler zeigen, die auf diesen verweisen",
	popupNone: "Keine Referenzen"});

merge(config.commands.jump,{
	text: "springen",
	tooltip: "Zu anderem, geöffneten Tiddler springen"});

merge(config.shadowTiddlers,{
	DefaultTiddlers: "GettingStarted",
	MainMenu: "GettingStarted",
	SiteTitle: "Mein TiddlyWiki",
	SiteSubtitle: "ein wiederverwendbares nichtlineares, persönliches ~Web-Notizbuch",
	SiteUrl: "http://www.tiddlywiki.com/",
	GettingStarted: "Um mit diesem TiddlyWiki zu starten, sollten Sie folgende Tiddler modifizieren:\n* SiteTitle & SiteSubtitle: Den [[Titel|SiteTitle]] und [[Untertitel|SiteSubtitle]] der Site, wie oben angezeigt (nach dem Speichern werden diese auch in der Titelzeile des Browsers angezeigt)\n* MainMenu: Ihr Inhaltsverzeichnis (für gewöhnlich Links)\n* DefaultTiddlers: Beinhaltet die Namen der Tiddler, die Sie angezeigt haben möchten, wenn das TiddlyWiki geöffnet wird.\nSie sollten zudem Ihren Benutzernamen zum Unterzeichnen Ihrer Bearbeitungen eingeben: <<option txtUserName>>",
	SideBarOptions: "<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD. MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'Optionen »' 'Erweiterte Optionen von TiddlyWiki ändern'>>",
	OptionsPanel: "Diese [[Interface-Einstellungen|InterfaceOptions]] zur Anpassung von TiddlyWiki werden in Ihrem Browser gespeichert\n\nIhr Benutzername zum Unterzeichnen Ihrer Einträge. Bitte als WikiWord (z.B. KlausBrandmüller) schreiben\n\n<<option txtUserName>>\n<<option chkSaveBackups>> [[Backups speichern|SaveBackups]]\n<<option chkAutoSave>> [[Automatisch speichern|AutoSave]]\n<<option chkRegExpSearch>> [[RegExp Suche|RegExpSearch]]\n<<option chkCaseSensitiveSearch>> [[Groß-/Kleinschreibung in Suche|CaseSensitiveSearch]]\n<<option chkAnimate>> [[Animationen aktivieren|EnableAnimations]]\n\n----\[[Erweiterte Optionen|AdvancedOptions]]\nPluginManager\nImportTiddlers",
	AdvancedOptions: "<<option chkGenerateAnRssFeed>> [[RSS-Feed generieren|GenerateAnRssFeed]]\n<<option chkOpenInNewWindow>> [[Links in neuem Fenster öffnen|OpenLinksInNewWindow]]\n<<option chkSaveEmptyTemplate>> [[Leere Vorlage speichern|SaveEmptyTemplate]]\n<<option chkToggleLinks>> Klick auf geöffnete Tiddler läßt diese schließen\n^^(mit ~Strg-Taste oder anderer Änderungsfunktion übergehen)^^\n<<option chkHttpReadOnly>> [[Bearbeitungsfunktionen ausblenden, wenn Zugriff via HTTP|HideEditingFeatures]]\n<<option chkForceMinorUpdate>> Editierungen als [[kleine Änderungen|MinorChanged]] mit Beibehaltung von Datum und Zeit behandeln\n^^(mit gedrückter ~Umschalt-Taste während Klick auf 'erledigt' oder mit ~Strg-Umschalt-Eingabe-Kombination übergehen^^\n<<option chkConfirmDelete>> [[Mit Löschbestätigung|ConfirmBeforeDeleting]]\nMaximale Zahl von Zeilen in einer Textbox eines Tiddlers: <<option txtMaxEditRows>>\nVerzeichnisname für Backup Dateien: <<option txtBackupFolder>>\n<<option chkInsertTabs>> Benutzen Sie die Tabulatortaste um Tabulatorzeichen einzufügen anstelle jeweils zum nächsten Feld zu springen",
	SideBarTabs: "<<tabs txtMainTab Historie Historie TabTimeline Alles 'Alle Tiddler' TabAll Tags 'Alle Tags' TabTags Mehr 'Weitere Listen' TabMore>>",
	TabTimeline: "<<timeline>>",
	TabAll: "<<list all>>",
	TabTags: "<<allTags>>",
	TabMore: "<<tabs txtMoreTab Fehlend 'Fehlende Tiddler' TabMoreMissing Waisen 'Verwaiste Tiddler' TabMoreOrphans Schatten 'Tiddler mit Schatteneinträgen' TabMoreShadowed>>",
	TabMoreMissing: "<<list missing>>",
	TabMoreOrphans: "<<list orphans>>",
	TabMoreShadowed: "<<list shadowed>>",
	PluginManager: "<<plugins>>",
	ImportTiddlers: "<<importTiddlers>>",
	ViewTemplate: "<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>\n<div class='title' macro='view title'></div>\n<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date [[DD. MMM YYYY]]'></span> (erstellt am <span macro='view created date [[DD. MMM YYYY]]'></span>)</div>\n<div class='tagging' macro='tagging'></div>\n<div class='tagged' macro='tags'></div>\n<div class='viewer' macro='view text wikified'></div>\n<div class='tagClear'></div>",
	InterfaceOptions: "Die [[Interface-Einstellungen|InterfaceOptions]] werden angezeigt, wenn Sie rechts auf 'Optionen' klicken. Sie werden mit einem Cookie in Ihrem Browser gespeichert, um sie zwischen den Aufrufen zu sichern. Nähere Informationen zu den einzelnen Funktionen finden Sie, wenn Sie die Funktion selbst anklicken.",
	WikiWord: "Ein WikiWord ist ein Wort, das aus mehreren einzelnen Wörtern zusammengesetzt ist, in dem jedes Wort mit einem Grossbuchstaben beginnt und eine individuelle Seite bezeichnet.",
	SaveBackups: "[[Backups speichern|SaveBackups]] ist eine Funktion, mit der automatisch bei jedem Abspeichern ein Backup erstellt wird.",
	AutoSave: "[[Automatisches Speichern|AutoSave]] speichert automatisch Änderungen jedes Mal, wenn Sie einen Tiddler bearbeiten. Damit sinken die Chancen, dass Sie Daten verlieren. Beachten Sie jedoch, dass bei aktivierter [[Backup-Funktion|SaveBackups]] natürlich auch eine Menge Backup-Dateien erstellt werden. Entscheiden Sie sich deshalb für die eine oder andere Funktion.",
	RegExpSearch: "Mit der [[RegExp Suche|RegExpSearch]] können Sie mit regulären Suchausdrücken flexible Suchanfragen vornehmen.",
	CaseSensitiveSearch: "Die Unterscheidung der [[Groß-/Kleinschreibung in Suche|CaseSensitiveSearch]] tut genau dies.",
	EnableAnimations: "Diese Funktion aktiviert Animationen, wenn Sie einen Tiddler öffnen oder schliessen.",
	GenerateAnRssFeed: "Wenn Sie [[RSS-Feed generieren|GenerateAnRssFeed]] aktivieren, speichert TiddlyWiki automatisch einen RSS-2.0-gültigen Feed, so bald Ihr TiddlyWiki gespeichert wird. Der Feed hat den gleichen Dateinamen wie das TiddlyWiki, lediglich jedoch mit der Endung '.xml'.",
	OpenLinksInNewWindow: "Diese Funktion öffnet externe Links in einem neuen ~Browser-Fenster.",
	SaveEmptyTemplate: "Diese Funktion erwirkt, dass beim Abspeichern von Änderungen eine leere Vorlage von TiddlyWiki erzeugt wird. Dies ist als Hilfe gedacht für Entwickler, die Adaptionen von TiddlyWiki bereitstellen. Die Funktion ist nicht erforderlich, wenn Sie ein normaler Benutzer sind.",
	HideEditingFeatures: "Ist diese Funktion aktiviert, werden die Bearbeitungsfunktionen ausgeblendet, wenn das TiddlyWiki über HTTP aufgerufen wird. Der Benutzer hat dann die Möglichkeit, den Tiddler zwar betrachten zu können, aber nicht zu bearbeiten.",
	MinorChanged: "Manchmal ist es sinnvoll, dass bei kleinen Änderungen der Tiddler in der Historie nicht automatisch an den Anfang gesetzt wird. Mit Aktivierung dieser Funktion werden alle Bearbeitungen von Tiddlern als kleine Änderungen betrachtet und das Änderungsdatum nicht geändert.",
	ConfirmBeforeDeleting: "Bei Aktivierung dieser Funktion fordert TiddlyWiki eine Bestätigung des Benutzers an, wenn ein Tiddler gelöscht werden soll."});
zusätzlich zu dem schon aufgezeigten Gerüst:
#Anzahl der Nachkommastellen für Dezimalstellen => [[decimalDigits(2)]]
#Festlegung des Dezimalzeichens =>  [[decimalPoint(",")|decimalPoint()]]

{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php

include ("phpmydatagrid.class.php");
   
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
    
/* Define the amount of decimal characters to show in numeric fields */
$objGrid -> decimalDigits(2);
   
/* Define the decimal character to use in numeric fields */
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");

$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> setHeader();
?>
</head>

<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html> 
}}}
Nachstehend eine Auflistung  und Beschreibung der mitgelieferten Dateien, zudem auch der ~SQL-Code, der für das Nachvollziehen der Beispiele notwendig ist.

Ich gebe hier zwar den Code wieder, aber den riesigen Vorspann, den die Herren Entwickler da  jeweils vorangestellt haben, erspare ich Ihnen.
# Wie alle anderen ~PHP-Klassen auch muß ''phpMyDataGrid'' zuerst in der ersten Zeile ein Objekt anlegen.
# Anschließend erfolgt der Aufruf der Methoden zur Definition von Feldern, für Rechte, Tabellenname, Primary Key, etc.
# Zum Schluß wird mit //grid()// und eventuell //endGrid()// die Bildschirmausgabe angestoßen.

*[[SQLCode]]

*__Beispiele:__
##[[erstes Beispiel: Ausgabe von Datensätzen|erstes Beispiel]]
##[[HTML- und Output-Formatierung]]
##[[Dezimalzeichen und Nachkommastellen]]
##[[POST oder GET, Summen berechnen, Durchsuchbarkeit, weitere Parameter]]
##[[Header- und Footerzeilen der Ausgabe hinzufügen]]
##[[Paginierung, Sortierung]]
##[[Bedingungen / Where-Klauseln]]
##[[Datensätze bearbeiten]]
##[[AJAX-Modus]]
##[[Spaltenwerte berechnen]]
##[[Bilder ausgeben]]
##[[Links]]
##[[Balkendiagramme|Bar Charts]]
##[[ADOdb Einsatz]]
##[[Textausgabe regeln]]
/***
|Name|DisableWikiLinksPlugin|
|Source|http://www.TiddlyTools.com/#DisableWikiLinksPlugin|
|Version|1.4.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Tiddler.prototype.autoLinkWikiWords, 'wikiLink' formatter|
|Description|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|

This plugin allows you to disable TiddlyWiki's automatic ~WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links.  To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.

You can also block automatic WikiWord linking behavior only for non-existing tiddler titles, while still automatically linking WikiWords that correspond to existing tiddlers titles or shadow tiddler titles.

You can also block specific selected WikiWords from being automatically linked by listing them in [[DisableWikiLinksList]], separated by whitespace.  This tiddler is optional and, when present, causes the listed words to always be excluded, even if automatic linking of other WikiWords is being permitted.  

Note: WikiWords contained in default ''shadow'' tiddlers will be automatically linked unless you select an additional checkbox option lets you disable these automatic links as well, though this is not recommended, since it can make it more difficult to access some TiddlyWiki standard default content (such as AdvancedOptions or SideBarTabs)

!!!!!Configuration
<<<
Self-contained control panel:
<<option chkDisableNonExistingWikiLinks>> Disable automatic WikiWord links for non-existing tiddlers
<<option chkDisableWikiLinks>> Disable ALL automatic WikiWord tiddler links
<<option chkAllowLinksFromShadowTiddlers>> ... except for WikiWords contained in shadow tiddlers
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''DisableWikiLinksPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2006.12.31 [1.4.0]'' in formatter, test for chkDisableNonExistingWikiLinks
''2006.12.09 [1.3.0]'' in formatter, test for excluded wiki words specified in DisableWikiLinksList
''2006.12.09 [1.2.2]'' fix logic in autoLinkWikiWords() (was allowing links TO shadow tiddlers, even when chkDisableWikiLinks is TRUE).  
''2006.12.09 [1.2.1]'' revised logic for handling links in shadow content
''2006.12.08 [1.2.0]'' added hijack of Tiddler.prototype.autoLinkWikiWords so regular (non-bracketed) WikiWords won't be added to the missing list
''2006.05.24 [1.1.0]'' added option to NOT bypass automatic wikiword links when displaying default shadow content (default is to auto-link shadow content)
''2006.02.05 [1.0.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
''2005.12.09 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.disableWikiLinks= {major: 1, minor: 4, revision: 0, date: new Date(2006,12,31)};

if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks= false;
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
	config.formatters[i].coreHandler=config.formatters[i].handler;
	config.formatters[i].handler=function(w) {
		// supress any leading "~" (if present)
		var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
		var title=w.matchText.substr(skip);
		var exists=store.tiddlerExists(title);
		var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);

		// check for specific excluded wiki words
		var t=store.getTiddlerText("DisableWikiLinksList")
		if (t && t.length && t.indexOf(w.matchText)!=-1)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not disabling links from shadows (default setting)
		if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)
			return this.coreHandler(w);

		// check for non-existing non-shadow tiddler
		if (config.options.chkDisableNonExistingWikiLinks && !exists)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }

		// if not enabled, just do standard WikiWord link formatting
		if (!config.options.chkDisableWikiLinks)
			return this.coreHandler(w);

		// just return text without linking
		w.outputText(w.output,w.matchStart+skip,w.nextMatch)
	}
}

Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
	// DEBUG alert("processing: "+this.title);
	// if all automatic links are not disabled, just return results from core function
	if (!config.options.chkDisableWikiLinks)
		return this.coreAutoLinkWikiWords.apply(this,arguments);
	return false;
}
//}}}
phpMyDataGrid ist eine Klasse, die in ~PHP-Scripten verwandt werden kann um 
* ~MySQL-Datenbanken (oder mittels ~ADOdb andrere Datenbanken) auszulesen
* Datensätze anzuzeigen
* zu editieren
* zu löschen
Die  Anzeige ist außerordentlich konfigurabel.
Das für die [[Ajax-Funktionalität|AJAX-Modus]] benötigte Javascript wird automatisch generiert.
Das Stylesheet wird mitgeliefert und kann beliebig varriiert werden.
[[ADOdb|ADOdb Einsatz]] wird ebenfalls unterstützt.

Die Webseite für das Script: http://www.gurusistemas.com/indexdatagrid.php
In der [[Linkliste|phpMyDataGridLinks]] finden Sie weitere Links.
Die Eingabefelder für Daten im Editiermodus sind sehr klein. 
Immer wieder taucht die Frage auf, wie man dieses Feld vergrößern kann.
Mit ~HTML-Mitteln läßt sich da nicht viel machen, SIZE und MAXLENGTH reichen nicht aus.

Ich habe herausgefunden, daß die Eingabefelder einer ~CSS-Klasse "input" zugeordnet sind.
Diese Klasse ist in der ~CSS-Datei nicht definiert


mit dieser ~CSS-Definition werden alle  Eingabefelder größer:

{{{
.input {width:300px;}
}}}
*Microsoft IIS oder Apache unter Unix oder Windows
*php 4.0 oder höher
*mySQL 3.23 oder höher
*Um per [[ADOdb|ADOdb Einsatz]] auf die Datenbank zuzugreifen, benötigen Sie die Klasse von der [[ADOdb-Webseite|http://adodb.sourceforge.net/]] 
Auch die letzte, die Fußzeile der Tabelle können Sie definieren:
{{{
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>"); 
}}}

/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]]  is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
	};
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


	
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
//	 (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
			result.push(tiddler);
		}
	});
	return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	}
	this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
	}

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;
	}
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
	displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	}
	message += ">>";
	displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;
	}
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
	"forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
		}
	}
	return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
		}
	}
	return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
		}
	}
	return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/

Diese Funktion ist die umfangreichste und rätselhafteste Funktion der Klasse, weil sie einfach nicht ausreichend dokumentiert ist.
Ich versuche zu erklären, was sich hinter den Parametern verbirgt und was man mit ihnen anstellen kann:
{{{
$objGrid -> FormatColumn("id","ID Kollege",5,5,1,"50","center"); 
}}}

Für jede auszugebende Tabellenspalte wird eine ~FormatColumn-Anweisung benötigt.
Der Inhalt einer mit "FormatColumn" angelegten Tabellenspalte wird entweder aus der Datenbank gelesen oder mit dem Mask-Parameter //calc:// errechnet

[[10 Parameter insgesamt|10 Parameter]]
[[Der Parameter Input-Type|Input-Type]]
[[Der Maskier-Parameter|Mask-Parameter]]
Eine Auflistung der Funktionen und ihrer Parameter 
#__Ausgabevorbereitung__
##[[methodForm("post")|methodForm()]]
##[[form()]]
##[[friendlyHTML()]]
##[[pathtoimages()]]
##[[closeTags()]]
##[[setHeader()]]
##[[TituloGrid()]]
##[[FooterGrid()]]
##[[datarows()]]
##[[noorderarrows()]]
##[[paginationmode()]]
##[[checkable()]]
##[[language()]]
##[[buttons(true,true,true,true)]]
#__Datenbankfunktionen__
##[[conectadb()]]
##[[tabla()]]
##[[keyfield()]]
##[[sqlstatement()]]
##[[linkparam()]]
##[[where()]]
##[[orderby("feld","Sortierreihenfolge")|orderby()]]
#__Outputmanipulation__
##[[decimalDigits(2)]]
##[[decimalPoint(",")|decimalPoint()]]
##[[FormatColumn()]]
##[[10 Parameter der Ausgabe-Anweisung|10 Parameter]]
###Parameter 5: [[Input-Type]]
###Parameter 8: [[Mask-Parameter]]
###[[Berechnungen]] in Tabellenspalten
##[[total("feld1,feld3")|total()]]
##[[searchby("id,name,lastname,afiliation")|searchby()]]
##[[salt("string")|salt()]]
#__Ausgabe__
##[[ajax("silent")|ajax()]]
##[[grid()]]
##[[desconectar()]]
neben dem Grundgerüst wie in [[Beispiel 1|erstes Beispiel]] beschrieben zeigt dieses Listing:
#~HTML-Definitionen: 
##soll der Putput ~XHTML-konform sein oder nicht (Tags schließen, Default: ja) => [[closeTags()]]
##jede generierte Zeile in einer eigenen Zeile dargestellt => [[friendlyHTML()]]
#separaten ~Image-Path festlegen => [[pathtoimages()]]
#Formatierung der einzelnen Felder in Abhängigkeit vom ~Data-Typ: => [[FormatColumn()]]
##Checkboxen
##Datum
##Währung
##usw.
Hier kommen wir zum ersten Mal mit dem "~Masken-Parameter" in Berührung, dem 8. Parameter der Funktion [[FormatColumn()]] 
{{{
<?php /*
Copyright (c) 2007, Gurú Sistemas and/or Gustavo Adolfo Arcila Trujillo
All rights reserved.
www.gurusitemas.com
*/ ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>

<?php
 include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
  
/* HTML Output will have Line Breaks on each line generated */
$objGrid -> friendlyHTML();

/* Define path for images */
$objGrid -> pathtoimages("./images/");

 /* For compatibility with XHTML pages, some tags like IMG and INPUT
     must be closed with a Slash "/" by using this function you can 
     define if tags will be or not closed. (If the function is not 
     invoked, by default the script will close tags) */

$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");

/* Define fields to show, defining the MASK parameter */
/* id = Integer, no decimals */
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
/* name = String, is the mask by default, then no masking required */
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
/* lastname = String, is the mask by default, then no masking required */
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
/* age = Integer, no decimals */
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
/* afiliation = Date, display data in day-month-year format spaced by slashes "/" */
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
/* Status, select option from menu
    1 = Single
     2 = Married
     3 = Divorced */
$objGrid -> FormatColumn("status","Status", 5, 5, 0, "60", "left"," select:1_Single:2_Married:3_Divorced");
/* active, checkbox (Yes/No) */
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
/* salary, Money format */
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
/* workeddays, integer */
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>
}}}
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Version|2.1.4|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|Use wiki syntax formatting inside of HTML content|

The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.

When HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML.  However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain.  This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
!!!!!Usage
<<<
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.

When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags.  This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content.  Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.
<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.

Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.

If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead.  Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.

Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.
<<<
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block.  Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.  Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html.  It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.

However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.

Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward.  Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(

As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).

After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements.  The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node.  At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for HTMLFormatting handling^^
<<<
!!!!!Revision History
<<<
''2006.09.10 [2.1.4]'' update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children.  (thanks to "ayj" for bug report)
''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content.  This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
''2005.11.06 [2.0.1]'' code cleanup
''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler
''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers
''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 4, date: new Date(2006,9,10)};

// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		if (!this.lookaheadRegExp)  // fixup for TW2.0.x
			this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var html=lookaheadMatch[1];
			// optionally suppress wiki-style literal handling of newlines
			// strip any carriage returns added by Internet Explorer's textarea edit field
			// encode newlines as \n so Internet Explorer's HTML parser won't eat them
			// encode macro brackets (<< and >>) so HTML parser won't eat them
			if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(regexpNewLine,' ');
			html=html.replace(regexpCarriageReturn,'');
			html=html.replace(regexpNewLine,'\\n');
			html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');
			// create span to hold HTML
			// parse HTML and normalize the results
			// walk node tree and call wikify() on each text node
			var e = createTiddlyElement(w.output,"span");
			e.innerHTML=html;
			e.normalize(); 
			wikifyTextNodes(e);
			// advance to next parse position
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
}

// wikify text nodes remaining after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode)
{
	// textarea node doesn't get wikified, just decoded... 
	if (theNode.nodeName.toLowerCase()=='textarea')
		theNode.value=theNode.value.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(regexpBackSlashEn,'\n');
	else for (var i=0;i<theNode.childNodes.length;i++) {
		var theChild=theNode.childNodes.item(i);
		if (theChild.nodeName.toLowerCase()=='option') continue;
		if (theChild.nodeName.toLowerCase()=='select') continue;
		wikifyTextNodes(theChild);
		if (theChild.nodeName=='#text') {
			var txt=theChild.nodeValue;
			// decode macro brackets and newlines
			txt=txt.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(regexpBackSlashEn,'\n');
			// replace text node with wikified() span
			var newNode=createTiddlyElement(null,"span");
			theNode.replaceChild(newNode,theChild);
			wikify(txt,newNode);
		}
	}
}
//}}}
Der Ausgabe können Sie weiteren Text hinzufügen:
#Titelzeilen hinzufügen => [[TituloGrid()]]
#Fußzeilen hinzufügen => [[FooterGrid()]]
{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>

<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");

/* Define the title or header to show in the grid (The first row) */
$objGrid -> TituloGrid("phpMyDataGrid Sample page");

/* Define the footer to show in the grid (The last row) */
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");

$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>
}}}
der 5. Parameter der Funktion [[FormatColumn]] legt den  "Input Type" fest:
|!Inputtype|!Erläuterung|
|0|Text|
|1|readonly|
|2|hidden|
|3|calc  / link zu statischem Bild / Imagelink zu einer Funktion|
|4|textlink|
|5|chart|
Da es noch keine offizielle Dokumentation gibt, muß man sich mit den Beispielen begnügen, die aber jedes für sich Schritt für Schritt die Möglichkeiten der Klasse aufzeigen. Alle Beispiele finden Sie auf der [[Webseite|http://www.gurusistemas.com/indexdatagrid.php?page=samples]] der Autoren.

Kopieren Sie die Dateien, wie Sie sie entzippt haben, in ein Verzeichnis. 
Achten Sie, daß Sie die [[Verzeichnisstruktur|Programm-Dateien]] beibehalten.  

Zuerst muß eine ''Datenbank'' eingerichtet werden, damit die Beispiele durchgespielt werden können, wobei  Sie natürlich die Namen der Datenbank ändern können. 
Den Tabellennamen sollten Sie beibehalten.
Anschließend können Sie sich die einzelnen Beispiele anschauen. 
Jedes einzelne Beispiel wird hier [[vorgestellt und erklärt.|Die Beispiele]]
Beachten Sie bitte, daß nicht alle Funktionen der Klasse in den Beispielen eingesetzt oder erläutert sind.

Achten Sie darauf, daß einige Datenbanken Großbuchstaben in Feldnamen nicht akzeptieren, achten Sie darauf, daß die Feldnamen in Ihrem Code mit den Feldnamen in der Tabelle übereinstimmen!
Links können entweder als ''~Text-Links'' oder als ''~Image-Links'' ausgegeben werden 
(''~Image-Links:'' ein Klick auf das Bild öffnet die entsprechende URL)
''~Image-Links'' können entweder statische, vorgegebene Bilder nutzen oder auf  ''~Image-Referenzen'' aus dem Datensatz zugreifen.

Möglichkeiten, Links zu setzen:
''1.'' ''~Text-Links:'' Voraussetzung: //~Input-Type = 4// Der Inhalt eines Datenbankfeldes wird als Link ausgegeben, das Linkziel ist beispielsweise  eine ~JS-Prozedur, die im Script definiert sein muss.  Siehe am Ende des Scriptes die ~Javascript-Funktion //updatepicture()//

der 8. Parameter erhält den Wert //"link:updatepicture(%s%s%s),id,name,lastname"//

''2.''''statische ~Image-Links:'' Voraussetzung: //~Input-Type = 0// Es wird eine Tabellenspalte angelegt, in der der Zelleninhalt der Zelle //photo// ausgegeben wird (z.B. 1.jpg. 2.jpg oder 3.jpg) Der Inhalt der Spalte wird als //%s// referenziert. In diesem Beispiel wird eine ~Javascript-Prozedur als ~Image-Link angesprochen und es werden  //%s// sowie weiteren Feldinhalte an diese Prozedur übergeben

der 8. Parameter erhält den Wert //"imagelink:images/%s:updatepicture(%s%s%s),id,name,lastname//

''3.'' ''dynamische ~Image-Links:'' Voraussetzung: //~Input-Type = 3// Es wird eine Tabellenspalte //image_1// ausgegeben mit der Beschriftung //Img//, und als Feldinhalt wird ein ~Image-Link zur ~Javascript-Prozdur gebildet, der ebenfalls an die Prozedur den Feldinhalt //%s// enthält, aber in diesem Beispiel die Grafik //images/money.png// ausgibt.

der 8. Parameter erhält den Wert //"imagelink:images/money.png:updatepicture(%s%s%s),id,name,lastname"//

{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> buttons(true,true,true,true);
$objGrid -> keyfield("id");
$objGrid -> salt("Some Code4Stronger(Protection)");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
/* Text Links: Displaying a text link is only available to show values stored in fields */
/* Note: inputtype must be set to 4 */
$objGrid -> FormatColumn("lastname","Text link", "30", "30","4","100","left","link:updatepicture(%s%s%s),id,name,lastname");    
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "2");  
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> FormatColumn("calc_1","Value Days", "10", "10", "3","70","right","calc:((salary/30)*workeddays)");        

/* Dynamic image: Displaying an image link with a value stored in a field */
/* Note: The %s in the image name will be replaced by the selected field, in this example by photo field */
$objGrid -> FormatColumn("photo","Photo", "25", "0","0","150","center","imagelink:images/sample/%s:updatepicture(%s%s%s),id,name,lastname");    
/* Static image: Displaying an image link with an unique name */
/* Note: inputtype must be set to 3 */
$objGrid -> FormatColumn("image_1","Img", "25", "0", "3","20","center","imagelink:images/sample/money.png:updatepicture(%s%s%s),id,name,lastname");    
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
<!-- /* Sample Script to execute when user click over the photo link */ -->
<script type="text/javascript">
function updatepicture(    code, name, lastname ){
alert ("SAMPLE SCRIPT\n\nHere must go a process to update the picture or something else for:\n\nRecord ID:"+code+
"\nName: "+ name +
"\nLast name: "+ lastname );
}
</script>
</head>
<body>
<?php 
$objGrid -> ajax("silent");
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>

}}}
!phpMyDataGrid Basics
*[[Einführung]]
*[[Anforderungen|Einsatzvoraussetzungen]]
*[[ADOdb-Funktionalität|ADOdb Einsatz]]
*[[phpMyDataGridLinks]]
*[[Programm-Dateien]]

!So gehts
*[[Installation]]
*[[Basisgerüst]]
*[[Beispiele|Die Beispiele]]

!Die Klasse
*[[Die Klasse|phpMyDataGrid]]
*[[die Variable DG_ajaxid|Ablaufsteuerung per Variable DG_ajaxid]]
*[[Das Objekt $objGrid|Objekt]]
*[[Defaults|Default-Einstellungen]]
*[[Funktionen]]

!Tips
*[[Eingabefeld verbreitern]]
*[[Textausgabe regeln]]
*[[UTF-8]]

!links
*[[TiddlyWiki|http://www.tiddlywiki.com]]
*[[Deutsches Handbuch für dieses Wiki|http://www.tiddlywikihandbuch.de/]]
*[[Die Autorin|http://www.mueller-goedecke.de]]
<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml'/>
<!--}}}-->

<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>phpMyDataGrid</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>
der 8. Parameter, "Mask", bestimmt das ~Anzeige-Format des Datensatzes und manipuliert oder ergänzt ihn&#58;
Da dieser Parameter die meisten Möglichkeiten für die Definition/Gestaltung der Tabelle bietet, werden alle Varianten hier explizit aufgeführt.

Achten Sie darauf, daß Sie @@alle ~Mask-Parameter@@ in @@Anführungszeichen@@ eingeben!

|!Value|!Erläuterung|!Zusatz|
|integer|>|Ganzzahl, keine Dezimalstellen|
|date&#58;dmy&#58;/|>|Datum in Format '~TagMonatJahr' und Festlegung des Trennzeichens&#58; hier das /|
|select&#58;1_Single&#58;2_Married&#58;3_Divorced|>|Feldinhalt (hier 1,2 oder 3) wird anzuzeigendem Text zugeordnet|
|select&#58;1_<img src='images/cancel.png'>&#58;2_<img src='images/edit.png'>&#58;3_<img src='images/close.png'>|>|wie oben, aber es werden Grafiken ausgegeben|
|select&#58;1_<img src=$image_1><br />&#58;2_<img src=$image_2>&#58;3_<img src=$image_3>|>|wie oben, aber es werden ~Image-Dateien als Parameter übergeben|
|check&#58;No&#58;Yes|>|Checkbox mit den Alternativen //No// oder //Yes//, auch mehr als 2 Alternativen möglich|
|money&#58;&euro;|>|Währungszeichen, falls es ein Sonderzeichen ist, muß es als ~HTML-Entität eingegeben werden|
|2|>|Ersetzungsformat, hier 2 Dezimalstellen anstelle des Währungsformats|
|calc&#58;((salary/30)*workeddays)|Berechnung&#58; Gehalt / 30 x Arbeitstage|Input-Type&#58; 3|
|textarea|>|Editierfeld ist ~Formular-Element "textarea"|
|image&#58;images/%s|>|Jeder Datensatz enthält im Feld photo einen Dateinamen. Diese Datei wird folgendermaßen dynamisch eingebunden&#58; image&#58;Pfad zu Bild/%s   %s = steht für den Feldinhalt|
|image&#58;images/money.png|ein festdefiniertes Bild wird eingebunden&#58; image&#58;Pfad zu Bild/Bilddateiname|Input-Type&#58; 3|
|link&#58;updatepicture(%s%s%s),id,name,lastname|~TextLink&#58;Der Inhalt eines Datenbankfeldes wird als Link ausgegeben,das Linkziel ist eine ~JS-Prozedur, die im Script definiert sein muss|Input-Type&#58; 4|
|imagelink&#58;images/%s&#58;updatepicture(%s%s%s),id,name,lastname|~DynamischerImage-Link mit Wert aus Datenbank&#58;Pfad zum Bild/Bild&#58;Verweisziel|Input-Type&#58; 0|
|imagelink&#58;images/money.png&#58;updatepicture(%s%s%s),id,name,lastname|statischer ~Image-Link&#58;Pfad zum Bild/Bild&#58;Verweisziel|Input-Type&#58;3|
|chart&#58;percent&#58;val&#58;31|Balkengrafik mit definierter Einheit&#58;|Input-Type&#58;5|
| |>|Parameter 1 = chart |
| |>|Parameter 2 = anzuzeigendes Zeichen|
| |Parameter 3 = Typ des Balkendiagramms: sum  - max - value |Größter Spaltenwert / Summe aller Spaltenwerte / vordefinierter Wert|
| |>|Parameter 4 = Bezugswert für vordefinierten Wert|
Manchmal ist es sinnvoll, dass bei kleinen Änderungen der Tiddler in der Historie nicht automatisch an den Anfang gesetzt wird. Mit Aktivierung dieser Funktion werden alle Bearbeitungen von Tiddlern als kleine Änderungen betrachtet und das Änderungsdatum nicht geändert.
<<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD MMM YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'options »' 'erweiterte Optionen bearbeiten'>>
/***
|''Name:''|MultiTagEditorPlugin|
|''Version:''|0.2.0 (Dec 29, 2006)|
|''Source:''|http://ido-xp.tiddlyspot.com/#MultiTagEditorPlugin|
|''Author:''|Ido Magal (idoXatXidomagalXdotXcom)|
|''Licence:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
|''Browser:''|??|

!Description
This plugin enables the addition and deletion of tags from sets of tiddlers.

!Installation instructions
*Create a new tiddler in your wiki and copy the contents of this tiddler into it. Name it the same and tag it with "systemConfig".
*Save and reload your wiki.
*Use it here [[MultiTagEditor]].

!Revision history
* v0.2.0 (Dec 29, 2006)
** Added Selection column that allows excluding tiddlers.
* v0.1.0 (Dec 27, 2006)
** First draft.

!To Do
* Clean up text strings.
* Figure out how to store selection so it isn't reset after every action.
* Prettify layout.

!Code
***/
//{{{

merge(config.shadowTiddlers,
{
 MultiTagEditor:[
 "<<MTE>>",
 ""
 ].join("\n")
});

config.macros.MTE =
{
 AddToListLabel : "Add to List",
 AddToListPrompt : "Add Tiddlers to the List",
 listViewTemplate :
 {
 columns: [
 {name: 'Selected', field: 'Selected', rowName: 'title', type: 'Selector'},
 {name: 'Title', field: 'title', tiddlerLink: 'title', title: "Title", type: 'TiddlerLink'},
 {name: 'Snippet', field: 'text', title: "Snippet", type: 'String'},
 {name: 'Tags', field: 'tags', title: "Tags", type: 'Tags'}
 ],
 rowClasses: [
 ],
 actions: [
 //{caption: "More actions...", name: ''},
 //{caption: "Remove selected tiddlers from list", name: 'delete'}
 ]
 },
 tiddlers : [],
 HomeSection : [],
 ListViewSection : [],
 AddToListSection : [],
 
 handler : function( place, macroName, params, wikifier, paramString, tiddler )
 {
 this.HomeSection = place;
 var newsection = createTiddlyElement( null, "div", null, "MTE_AddTag" );
 createTiddlyText(newsection, "Tiddler Tags to edit: ");
 var input = createTiddlyElement( null, "input", null, "txtOptionInput" );
 input.type = "text";
 input.size = 50;
 newsection.appendChild( input );
 newsection.inputBox = input;
 createTiddlyButton( newsection, this.AddToListLabel, this.AddToListPrompt, this.onAddToList, null, null, null );
 createTiddlyButton( newsection, "Clear List", this.addtoListPrompt, this.onClear, null, null, null );
 createTiddlyElement( newsection, "br" );
 createTiddlyElement( newsection, "br" );
 this.AddToListSection = newsection;
 this.HomeSection.appendChild( newsection );

 newsection = createTiddlyElement( null, "div", null, "MTE_addtag" );
 createTiddlyButton( newsection, "Add Tag", "Add tag to all listed tiddlers", this.onAddTag, null, null, null );
 var input = createTiddlyElement( null, "input", null, "txtOptionInput" );
 input.type = "text";
 input.size = 50;
 newsection.appendChild( input );
 newsection.inputBox = input;
 createTiddlyElement( newsection, "br" );
 this.AddTagSection = newsection;
 this.HomeSection.appendChild( newsection );

 newsection = createTiddlyElement( null, "div", null, "MTE_removetag" );
 createTiddlyButton( newsection, "Remove Tag", "Remove tag from all listed tiddlers", this.onRemoveTag, null, null, null );
 var input = createTiddlyElement( null, "input", null, "txtOptionInput" );
 input.type = "text";
 input.size = 50;
 newsection.appendChild( input );
 newsection.inputBox = input;
 createTiddlyElement( newsection, "br" );
 this.RemoveTagSection = newsection;
 this.HomeSection.appendChild( newsection );

 this.ListViewSection = createTiddlyElement( null, "div", null, "MTE_listview" );
 this.HomeSection.appendChild( this.ListViewSection );
 ListView.create( this.ListViewSection, this.tiddlers, this.listViewTemplate, null );

 },


 ResetListView : function()
 {
 ListView.forEachSelector( config.macros.MTE.ListViewSection, function( e, rowName )
 {
 if( e.checked )
 {
 var title = e.getAttribute( "rowName" );
 var tiddler = config.macros.MTE.tiddlers.findByField( "title", title );
 tiddler.Selected = 1;
 }
 });
 config.macros.MTE.HomeSection.removeChild( config.macros.MTE.ListViewSection );
 config.macros.MTE.ListViewSection = createTiddlyElement( null, "div", null, "MTE_listview" );
 config.macros.MTE.HomeSection.appendChild( config.macros.MTE.ListViewSection );
 ListView.create( config.macros.MTE.ListViewSection, config.macros.MTE.tiddlers, config.macros.MTE.listViewTemplate, config.macros.MTE.onSelectCommand);
 },

 onAddToList : function()
 {
 store.forEachTiddler( function ( title, tiddler )
 {
 var tags = config.macros.MTE.AddToListSection.inputBox.value.readBracketedList();
 if (( tiddler.tags.containsAll( tags )) && ( config.macros.MTE.tiddlers.findByField( "title", title ) == null ))
 {
 var t = store.getTiddlerSlices( title, ["Name", "Description", "Version", "CoreVersion", "Date", "Source", "Author", "License", "Browsers"] );
 t.title = title;
 t.tiddler = tiddler;
 t.text = tiddler.text.substr(0,50);
 t.tags = tiddler.tags;
 config.macros.MTE.tiddlers.push(t);
 }
 });
 config.macros.MTE.ResetListView();
 },

 onClear : function()
 {
 config.macros.MTE.tiddlers = [];
 config.macros.MTE.ResetListView();
 },

 onAddTag : function( e )
 {
 var selectedRows = [];
 ListView.forEachSelector(config.macros.MTE.ListViewSection, function( e, rowName )
 {
 if( e.checked )
 selectedRows.push( e.getAttribute( "rowName" ));
 });
 var tag = config.macros.MTE.AddTagSection.inputBox.value;
 for(t=0; t < config.macros.MTE.tiddlers.length; t++)
 {
 if ( selectedRows.indexOf( config.macros.MTE.tiddlers[t].title ) != -1 )
 store.setTiddlerTag( config.macros.MTE.tiddlers[t].title, true, tag);
 }
 config.macros.MTE.ResetListView();
 },

 onRemoveTag : function( e )
 {
 var selectedRows = [];
 ListView.forEachSelector(config.macros.MTE.ListViewSection, function( e, rowName )
 {
 if( e.checked )
 selectedRows.push( e.getAttribute( "rowName" ));
 });
 var tag = config.macros.MTE.RemoveTagSection.inputBox.value;
 for(t=0; t < config.macros.MTE.tiddlers.length; t++)
 {
 if ( selectedRows.indexOf( config.macros.MTE.tiddlers[t].title ) != -1 )
 store.setTiddlerTag( config.macros.MTE.tiddlers[t].title, false, tag);
 }
 config.macros.MTE.ResetListView();
 }

};
//}}}
/%
|Name|NextTiddler|
|Source|http://www.TiddlyTools.com/#NextTiddler|
|Version|0.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin|
|Overrides||
|Description|insert a link that, when clicked, closes the current tiddler and opens another one in its place|

usage: <<tiddler NextTiddler with: NewTiddlerTitle linktext>>


%/<script label="$2">
	var tiddler=story.findContainingTiddler(place);
	story.displayTiddler(tiddler,"$1");
	story.closeTiddler(tiddler.id.substr(7)); // close self
	return false;
</script>
Copyright © Connie ~Müller-Gödecke
Das Objekt der Klasse ''phpMyDataGrid'' ist  ''$objGrid''
In diesem Script sehen Sie:
#Festlegung ob ''POST'' oder ''GET'' => [[methodForm("post")|methodForm()]]
#Summen errechnen => [[total("feld1,feld3")|total()]]
#Durchsuchbarkeit festlegen => [[searchby("id,name,lastname,afiliation")|searchby()]]
#eigene Parameter der Query  hinzufügen => [[linkparam()]]
{{{
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);

/* Defines the "method" through the data will be sent. May be defined as "post" or "get" */
$objGrid -> methodForm("post"); 

/* To totalize columns, simply add each column separated by comma */
$objGrid -> total("salary,workeddays");

/* To enable search, add each searchable column separated by comma */
$objGrid -> searchby("id,name,lastname,afiliation");

/* To forward your own parameters, add them in the GET format */
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60","left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>
}}}
<!--{{{-->
<div id='header' class='header'>
<div class='headerShadow'>
<span class='searchBar' macro='search'></span>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>

<div id='mainMenu'>
<span refresh='content' tiddler='MainMenu'></span>
<span id='noticeBoard' refresh='content' tiddler='NoticeBoard'></span>
</div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='MochaSideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<div id='contentFooter' refresh='content' tiddler='contentFooter'></div>
<!--}}}-->
Per Default gibt das Script 20 Tabellenzeilen aus und fügt am Tabellenende ~Blätter-Buttons hinzu.
Dieser ~Default-Wert kann überschrieben werden => [[datarows()]]
~DesWeiteren können Sie die Art der Seitenblätterung festlegen, default ist //mixed// =>[[paginationmode()]]
Die ~Sortier-Reihenfolge (auf- oder absteigend) legen Sie fest: => [[orderby("feld","Sortierreihenfolge")|orderby()]]
Möchten Sie das "Umsortieren" der Tabellenzeilen verhindern => [[noorderarrows()]]
{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");

/* Define the number of rows to show per page */
$objGrid -> datarows(5);

/* Define the desired pagination style */
$objGrid -> paginationmode('links');

/* Define the initial ordering field and its direction */
$objGrid -> orderby("age", "DESC");

/* Define that ordering arrows will not be available to users */
$objGrid -> noorderarrows();

$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>

}}}
Ausgeliefert wird das Script mit diesen Dateien. Da die Dokumentation aber sehr spärlich ist, sollten Sie sich die Übungsdateien von der [[Webseite|http://www.gurusistemas.com/indexdatagrid.php?page=samples]] herunterladen
>phpmydatagrid.class.php
>>css
>>>dgstyle.css
>>js
>>>dgscripts.js
>>images
>>>add.png
>>>ajax.gif
>>>asc.png
>>>cancel.png
>>>close.png
>>>desc.png
>>>down.png
>>>down_off.png
>>>edit.png
>>>erase.png
>>>locate.png
>>>minidown.png
>>>miniup.png
>>>poweredby.png
>>>save.png
>>>search.png
>>>up.png
>>>up_off.png
>>>view.png
{{{
create database if not exists `guru`;

USE `guru`;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';
        
/*Table structure for table `employees` */
    
CREATE TABLE `employees` (
      `id` int(6) NOT NULL auto_increment,
      `name` char(20) default NULL,
      `lastname` char(20) default NULL,
      `salary` float default NULL,
      `age` int(2) default NULL,
      `afiliation` date default NULL,
      `status` int(1) default NULL,
      `active` tinyint(1) default NULL,
      `workeddays` int(2) default NULL,
      `photo` char(30) default NULL,
      PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
/*Data for the table `employees` */
        
insert into `employees`
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`) 
    values (1, 'Ana', 'Trujillo',2000,45, '2005-05-13',1,1,10, '1.jpg');
insert into `employees` 
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)
    values (2, 'Jennifer', 'Aniston',3500,23, '2004-10-22',1,0,0, '2.jpg');
insert into `employees` 
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)
    values (3, 'Michael', 'Norman',1200,19, '2007-01-10',1,1,5, '3.jpg');
insert into `employees` 
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)
    values (4, 'Vanessa', 'Black',6500,31, '2000-11-05',1,1,30, '4.jpg');
insert into `employees` 
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)
    values (5, 'Michael', 'Strauss',3200,45, '2006-10-21',2,0,22, '5.jpg');
insert into `employees` 
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)
    values (6, 'William', 'Brown',2300,21, '2001-03-10',3,1,10, '6.jpg');
insert into `employees` 
    (`id`,`name`,`lastname`,`salary`,`age`,`afiliation`,`status`,`active`,`workeddays`,`photo`)
    values (7, 'Lucca', 'Normany',2800,36, '2006-10-02',3,1,20, '7.jpg');
    
SET SQL_MODE=@OLD_SQL_MODE;";
}}}
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Version|2.6.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.search, TiddlyWiki.prototype.search, config.macros.search.onKeyPress|
|Description|extend core search function with additional user-configurable options|

The TiddlyWiki search function normally looks in both tiddler titles and tiddler body content ('text').  However, narrowing the search so that it examines only titles or only text, or expanding the search to include text contained in tiddler tags can be very helpful, especially when searching on common words or phrases.  In addition, it is often useful for the search results to show tiddlers with matching titles before tiddlers that contain matching text or tags.

!!!!!Usage
<<<
This plugin adds checkboxes (see below and in AdvancedOptions) to let you selectively configure the TiddlyWiki search function to just examine any combination of tiddler titles, text, or tags.  It also provides an option to switch the search results order between 'titles mixed in' (default) and 'titles shown first', as well as an option display the search results as a list of links (in an auto-generated "SearchResults" tiddler), rather than actually displaying all matching tiddlers.  You can also enable/disable the "incremental search" (key-by-key searching), so that a search is only initiated when you press the ENTER key or click on the "search:" prompt text.
<<<
!!!!!Configuration
<<<
In additional to the checkboxes in AdvancedOptions, a self-contained control panel is included here for your convenience:
<<option chkSearchTitles>> Search in titles
<<option chkSearchText>> Search in tiddler text
<<option chkSearchTags>> Search in tags
<<option chkSearchFields>> Search in data fields
<<option chkSearchShadows>> Search shadow tiddlers
<<option chkSearchTitlesFirst>> Show title matches first
<<option chkSearchByDate>> Sort matching tiddlers by date
<<option chkSearchList>> Show list of matches in [[SearchResults]]
<<option chkSearchIncremental>> Incremental searching
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''SearchOptionsPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for SearchOptionsPlugin handling^^

When installed, this plugin automatically adds checkboxes in the AdvancedOptions shadow tiddler so you can enable/disable the extended search behavior.  However, if you have customized your AdvancedOptions, you will need to manually add {{{<<option chkSearchTitles>>}}},  {{{<<option chkSearchText>>}}} and {{{<<option chkSearchTitlesFirst>>}}}  (with suitable prompt text) to your customized tiddler.
<<<
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]].
<<<
!!!!!Code
***/
//{{{
version.extensions.searchOptions = {major: 2, minor: 6, revision: 1, date: new Date(2007,2,17)};
//}}}

//{{{
if (config.options.chkSearchTitles==undefined) config.options.chkSearchTitles=true;
if (config.options.chkSearchText==undefined) config.options.chkSearchText=true;
if (config.options.chkSearchTags==undefined) config.options.chkSearchTags=true;
if (config.options.chkSearchFields==undefined) config.options.chkSearchFields=true;
if (config.options.chkSearchTitlesFirst==undefined) config.options.chkSearchTitlesFirst=false;
if (config.options.chkSearchList==undefined) config.options.chkSearchList=false;
if (config.options.chkSearchByDate==undefined) config.options.chkSearchByDate=false;
if (config.options.chkSearchIncremental==undefined) config.options.chkSearchIncremental=true;
if (config.options.chkSearchShadows==undefined) config.options.chkSearchShadows=false;

config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitles>> Search in tiddler titles";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchText>> Search in tiddler text";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTags>> Search in tiddler tags";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchFields>> Search in tiddler data fields";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchShadows>> Search in shadow tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchTitlesFirst>> Search results show title matches first";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchList>> Search results show list of matching tiddlers";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchByDate>> Search results sorted by modification date ";
config.shadowTiddlers.AdvancedOptions += "\n<<option chkSearchIncremental>> Incremental searching";

if (config.macros.search.reportTitle==undefined) config.macros.search.reportTitle="SearchResults";
//}}}

//{{{
config.macros.search.onKeyPress = function(e)
{
	if(!e) var e = window.event;
	switch(e.keyCode)
		{
		case 13: // Ctrl-Enter
		case 10: // Ctrl-Enter on IE PC
			config.macros.search.doSearch(this);
			break;
		case 27: // Escape
			this.value = "";
			clearMessage();
			break;
		}
	if (config.options.chkSearchIncremental) {
		if(this.value.length > 2)
			{
			if(this.value != this.getAttribute("lastSearchText"))
				{
				if(config.macros.search.timeout)
					clearTimeout(config.macros.search.timeout);
				var txt = this;
				config.macros.search.timeout = setTimeout(function() {config.macros.search.doSearch(txt);},500);
				}
			}
		else
			{
			if(config.macros.search.timeout)
				clearTimeout(config.macros.search.timeout);
			}
	}
}
//}}}

//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	highlightHack = new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	var matches = store.search(highlightHack,config.options.chkSearchByDate?"modified":"title","excludeSearch");
	if (config.options.chkSearchByDate) matches=matches.reverse(); // most recent changes first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (config.options.chkSearchList) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (config.options.chkSearchList) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}

//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag)
{
	var candidates = this.reverseLookup("tags",excludeTag,false,sortField);

	// scan for matching titles first...
	var results = [];
	if (config.options.chkSearchTitles) {
		for(var t=0; t<candidates.length; t++)
			if(candidates[t].title.search(searchRegExp)!=-1)
				results.push(candidates[t]);
		if (config.options.chkSearchShadows)
			for (var t in config.shadowTiddlers)
				if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
					results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
	}
	// then scan for matching text, tags, or field data
	for(var t=0; t<candidates.length; t++) {
		if (config.options.chkSearchText && candidates[t].text.search(searchRegExp)!=-1)
			results.pushUnique(candidates[t]);
		if (config.options.chkSearchTags && candidates[t].tags.join(" ").search(searchRegExp)!=-1)
			results.pushUnique(candidates[t]);
		if (config.options.chkSearchFields && store.forEachField!=undefined) // requires TW2.1 or above
			store.forEachField(candidates[t],
				function(tid,field,val) { if (val.search(searchRegExp)!=-1) results.pushUnique(candidates[t]); },
				true); // extended fields only
	}
	// then check for matching text in shadows
	if (config.options.chkSearchShadows)
		for (var t in config.shadowTiddlers)
			if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
				results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));

	// if not 'titles first', or sorting by modification date,  re-sort results to so titles, text, tag and field matches are mixed together
	if(!sortField) sortField = "title";
	var bySortField=function (a,b) {if(a[sortField] == b[sortField]) return(0); else return (a[sortField] < b[sortField]) ? -1 : +1; }
	if (!config.options.chkSearchTitlesFirst || config.options.chkSearchByDate) results.sort(bySortField);

	return results;
}
//}}}

// // ''REPORT GENERATOR''
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	var body="\n";

	// summary: nn tiddlers found matching '...', options used
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	body+="^^//searched in:// ";
	body+=(config.options.chkSearchTitles?"''titles'' ":"");
	body+=(config.options.chkSearchText?"''text'' ":"");
	body+=(config.options.chkSearchTags?"''tags'' ":"");
	body+=(config.options.chkSearchFields?"''fields'' ":"");
	body+=(config.options.chkSearchShadows?"''shadows'' ":"");
	if (config.options.chkCaseSensitiveSearch||config.options.chkRegExpSearch) {
		body+=" //with options:// ";
		body+=(config.options.chkCaseSensitiveSearch?"''case sensitive'' ":"");
		body+=(config.options.chkRegExpSearch?"''text patterns'' ":"");
	}
	body+="^^";

	// numbered list of links to matching tiddlers
	body+="\n<<<";
	for(var t=0;t<matches.length;t++) {
		var date=config.options.chkSearchByDate?(matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" "):"";
		body+="\n# "+date+"[["+matches[t].title+"]]";
	}
	body+="\n<<<\n";

	// open all matches button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.displayTiddlers(null,["
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" ";
	body+="accesskey=\"O\" ";
	body+="value=\"open all matching tiddlers\"></html> ";

	// discard search results button
	body+="<html><input type=\"button\" href=\"javascript:;\" ";
	body+="onclick=\"story.closeTiddler('"+title+"'); store.deleteTiddler('"+title+"'); store.notify('"+title+"',true);\" ";
	body+="value=\"discard "+title+"\"></html>";

	// search again
	body+="\n\n----\n";
	body+="<<search \""+text+"\">>\n";
	body+="<<option chkSearchTitles>>titles ";
	body+="<<option chkSearchText>>text ";
	body+="<<option chkSearchTags>>tags";
	body+="<<option chkSearchFields>>fields";
	body+="<<option chkSearchShadows>>shadows";
	body+="<<option chkCaseSensitiveSearch>>case-sensitive ";
	body+="<<option chkRegExpSearch>>text patterns";
	body+="<<option chkSearchByDate>>sort by date";

	// create/update the tiddler
	var tiddler=store.getTiddler(title); if (!tiddler) tiddler=new Tiddler();
	tiddler.set(title,body,config.options.txtUserName,(new Date()),"excludeLists excludeSearch temporary");
	store.addTiddler(tiddler); story.closeTiddler(title);

	// use alternate "search again" label in <<search>> macro
	var oldprompt=config.macros.search.label;
	config.macros.search.label="search again";

	// render/refresh tiddler
	story.displayTiddler(null,title,1);
	store.notify(title,true);

	// restore standard search label
	config.macros.search.label=oldprompt;

}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
}
//}}}
<<search>><<closeAll>><<permaview>><<newTiddler>><<newJournal 'DD.. MMM. YYYY'>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel 'Optionen »' 'Erweiterte Optionen von TiddlyWiki ändern'>>
<<tabs txtMainTab Historie Historie TabTimeline Alles 'Alle Tiddler' TabAll Tags 'Alle Tags' TabTags Mehr 'Weitere Listen' TabMore>>
~CMGs Notizen zu diesem Script
phpMyDataGrid
http://www.tiddlywiki.com/
Spaltenwerte, mit denen gerechnet wird, müssen im arithmetischen Format vorliegen, nicht als Währungsfeld. Deshalb zur Not den 8. Paramater nutzen und hier Dezimalformat festlegen. =>[[FormatColumn()]]
{{{
/* Währungsformat in Dezimalformat umwandeln */ 
$objGrid ->FormatColumn("salary","Salary",10,10,0,"90","right","2");   
}}}
Die Berechnungen werden on the fly durchgeführt, die Werte werden nicht in die Datenbank geschrieben oder von dort ausgelesen.
Das nachstehende Beispiel liest sich so:
*Das Recheneergebnis steht in Spalte //calc_1//,
*wird beschriftet mit //Value Days//, 
*es ist //~Input-Format 3// 
*und im //~Maskier-Feld// steht die Rechenanweisung //teile Gehalt durch 30 und multipliziere mit Anzahl der Arbeitstage//
{{{
 $objGrid -> FormatColumn("calc_1","Value Days", "10", "10", "3","70","right","calc:((salary/30)*workeddays)");        
}}}

{{{
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid -> friendlyHTML();
$objGrid -> pathtoimages("./images/");
$objGrid -> closeTags(true);  
$objGrid -> form('employee', true);
$objGrid -> methodForm("post"); 
$objGrid -> total("salary,workeddays");
$objGrid -> searchby("id,name,lastname,afiliation");
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);     
$objGrid -> decimalDigits(2);
$objGrid -> decimalPoint(",");
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
$objGrid -> tabla ("employees");
$objGrid -> buttons(true,true,true,true);
$objGrid -> keyfield("id");
$objGrid -> salt("Some Code4Stronger(Protection)");
$objGrid -> TituloGrid("phpMyDataGrid Sample page");
$objGrid -> FooterGrid("<div style='float:left'>&copy; 2007 Gurusistemas.com</div>");
$objGrid -> datarows(5);
$objGrid -> paginationmode('links');
$objGrid -> orderby("age", "DESC");
$objGrid -> noorderarrows();
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
/* If you need to calculate columns, the format MUST NOT BE money, instead use any numeric mask */
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "2");   // Replaced money format with "2" (2 decimals)
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
/* Calculate: divide salary between 30 and then multiply the result by the workeddays column */
/* Note: inputtype must be set to 3 */
/*          Calculated fields WILL NOT BE saved or retrieved from database */
$objGrid -> FormatColumn("calc_1","Value Days", "10", "10", "3","70","right","calc:((salary/30)*workeddays)");        
$objGrid -> where ("active = '1'");
$objGrid -> setHeader();
?>
</head>
<body>
<?php 
$objGrid -> ajax("silent");
$objGrid -> grid();
$objGrid -> desconectar();
?>
</body>
</html>

}}}
/***

''Inspired by [[TiddlyPom|http://www.warwick.ac.uk/~tuspam/tiddlypom.html]]''

|Name|SplashScreenPlugin|
|Created by|SaqImtiaz|
|Location|http://tw.lewcid.org/#SplashScreenPlugin|
|Version|0.21 |
|Requires|~TW2.08+|
!Description:
Provides a simple splash screen that is visible while the TW is loading.

!Installation
Copy the source text of this tiddler to your TW in a new tiddler, tag it with systemConfig and save and reload. The SplashScreen will now be installed and will be visible the next time you reload your TW.

!Customizing
Once the SplashScreen has been installed and you have reloaded your TW, the splash screen html will be present in the MarkupPreHead tiddler. You can edit it and customize to your needs.

!History
* 20-07-06 : version 0.21, modified to hide contentWrapper while SplashScreen is displayed.
* 26-06-06 : version 0.2, first release

!Code
***/
//{{{
window.old_lewcid_splash_restart=window.restart;

window.restart = function()
{   if (document.getElementById("SplashScreen"))
        document.getElementById("SplashScreen").style.display = "none";
      if (document.getElementById("contentWrapper"))
        document.getElementById("contentWrapper").style.display = "block";
    
    window.old_lewcid_splash_restart();
   
    if (splashScreenInstall)
       {if(config.options.chkAutoSave)
			{saveChanges();}
        displayMessage("TW SplashScreen has been installed, please save and refresh your TW.");
        }
}


var oldText = store.getTiddlerText("MarkupPreHead");
if (oldText.indexOf("SplashScreen")==-1)
   {var siteTitle = store.getTiddlerText("SiteTitle");
   var splasher='\n\n<style type="text/css">#contentWrapper {display:none;}</style><div id="SplashScreen" style="border: 3px solid #ccc; display: block; text-align: center; width: 320px; margin: 100px auto; padding: 50px; color:#000; font-size: 28px; font-family:Tahoma; background-color:#eee;"><b>'+siteTitle +'</b> is loading<blink> ...</blink><br><br><span style="font-size: 14px; color:red;">Requires Javascript.</span></div>';
   if (! store.tiddlerExists("MarkupPreHead"))
       {var myTiddler = store.createTiddler("MarkupPreHead");}
   else
      {var myTiddler = store.getTiddler("MarkupPreHead");}
      myTiddler.set(myTiddler.title,oldText+splasher,config.options.txtUserName,null,null);
      store.setDirty(true);
      var splashScreenInstall = true;
}
//}}}
/*{{{*/
/*Mocha TiddlyWiki Theme*/
/*Version 1.0*/
/*Design and CSS originally by Anthonyy, ported to TiddlyWiki by Saq Imtiaz.*/
/*}}}*/
/*{{{*/

#contentWrapper{margin: 0 1.4em;font-family: Lucida Grande, Tahoma, Arial, Helvetica, sans-serif;font-size: 11px;line-height: 1.6em;color: #666;}
.header {background: #fff;padding-top: 10px;clear: both;border-bottom: 4px solid #948979;}
.headerShadow {	padding: 2.6em 0em 0.5em 0em; }
.siteTitle {font-family: 'Trebuchet MS' sans-serif;font-weight: bold;font-size: 32px;color: #CC6633;margin-bottom: 30px;background-color: #FFF;}
.siteTitle a{color:#CC6633; border-bottom:1px dotted #cc6633;}
.siteSubtitle {font-size: 1.0em;display: block;margin: .5em 3em; color: #999999;}
#mainMenu {position:relative;float:left;margin-bottom:1em;display:inline;text-align:left;padding: 2em 0.5em 0.5em 0em;width:10em;font-size:1em;}
#mainMenu ul  {margin-left:5px;padding-left:1px;text-indent:2;}
#sidebar{position:relative;float:right;margin-bottom:1em;padding-top:2em;display:inline;}
#displayArea {margin: 0em 17em 0em 12em;width:70%;}
.tagClear {clear:none;}
#contentFooter {background:#575352; color:#BFB6B3; clear: both; padding: 0.5em 1em;}
#contentFooter a {color: #BFB6B3;border-bottom: 1px dotted #BFB6B3;}
#contentFooter a:hover {color: #FFFFFF;background-color:#575352;}
a,#sidebarOptions .sliderPanel a{color:#CC6714;	text-decoration: none;}
a:hover,#sidebarOptions .sliderPanel a:hover {color:#CC6714;background-color: #F5F5F5; 	}
.viewer .button, .editorFooter .button{	color: #666;border: 1px solid #CC6714;}
.viewer .button:hover, .editorFooter .button:hover{color: #fff;	background: #CC6714;border-color:#CC6714;}
.viewer .button:active, .viewer .highlight,.editorFooter .button:active, .editorFooter .highlight{color:#fff; background:#575352;border-color:#575352;}
#mainMenu a {display: block;padding: 5px;border-bottom: 1px solid #CCC;}
#mainMenu a:link, #navlist a:visited {color:#CC6714;text-decoration: none;}
#mainMenu a:hover {background: #000000 url(arrow.gif) 96% 50% no-repeat;background-color: #F5F5F5;color:#CC6714;}
#mainMenu br {display:none;}
#mainMenu ul {padding-left:8px;}
#sidebarOptions a {color:#999;text-decoration: none;}
#sidebarOptions	a:hover {color:#4F4B45;	background-color: #F5F5F5;border:1px solid #fff;}
#sidebarOptions {line-height:1.4em;}
.tiddler {padding-bottom: 40px;	border-bottom: 1px solid #DDDDDD; }
.title {color:#CC6633;}
.subtitle, .subtitle a { color: #999999; font-size: 1.0em;margin:0.2em;}
.shadow .title{color:#948979;}

.selected .toolbar a {color:#999999;}
.selected .toolbar a:hover {color:#4F4B45; background:transparent;border:1px solid #fff;}
.toolbar .button:hover, .toolbar .highlight, .toolbar .marked, .toolbar a.button:active {color:#4F4B45; background:transparent;border:1px solid #fff;}
 .listLink,#sidebarTabs .tabContents {line-height:1.5em;}
 .listTitle {color:#888;}
#sidebarTabs .tabContents {background:#fff;}
#sidebarTabs .tabContents .tiddlyLink, #sidebarTabs .tabContents .button{color:#999;}
#sidebarTabs .tabContents .tiddlyLink:hover,#sidebarTabs .tabContents .button:hover{color:#4F4B45;background:#fff}
#sidebarTabs .tabContents .button:hover, #sidebarTabs .tabContents .highlight, #sidebarTabs .tabContents .marked, #sidebarTabs .tabContents a.button:active{color:#4F4B45;background:#fff}
.tabSelected{color:#fff; background:#948979;}
.tabUnselected { background: #ccc;}
 .tabSelected, .tabSelected:hover {color: #fff;background: #948979;border: solid 1px #948979;padding-bottom:1px;}
 .tabUnselected {color: #999;background: #eee;border: solid 1px #ccc;padding-bottom:1px;}
#sidebarTabs .tabUnselected { border-bottom: none;padding-bottom:3px;}
#sidebarTabs .tabSelected{padding-bottom:3px;}
#sidebarTabs .tabUnselected:hover { border-bottom: none;padding-bottom:3px;color:#4F4B45}
#sidebarOptions .sliderPanel {background: #fff; border:none;font-size: .9em;}
#sidebarOptions .sliderPanel a {font-weight:normal;}
#sidebarOptions .sliderPanel input {border:1px solid #999;}

.viewer blockquote {border-left: 3px solid #948979;}
.viewer table {	border: 2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, thead td {background: #948979;border: 1px solid #948979;color: #fff;}
.viewer pre {border: 1px solid #948979;	background: #f5f5f5;}
.viewer code {color: #2F2A29;font-family:Courier;width:85%;font-size:0.9em}
.viewer hr {border-top: dashed 1px #948979;}
.editor input {	border: 1px solid #948979;}
.editor textarea {border: 1px solid #948979;}

.popup {background: #948979;border: 1px solid #948979;}
.popup li.disabled {color: #000;}
.popup li a, .popup li a:visited {color: #eee;border: none;}
.popup li a:hover {background: #575352;color: #fff;border: none;}
.tagging, .tagged {border: 1px solid #eee;background-color: #F7F7F7;}
.selected .tagging, .selected .tagged {background-color: #eee;border: 1px solid #BFBAB3;}
 .tagging .listTitle, .tagged .listTitle {color: #bbb;}
.selected .tagging .listTitle, .selected .tagged .listTitle {color: #666; }
.tagging .button, .tagged .button {color:#aaa;}
.selected .tagging .button, .selected .tagged .button {color:#4F4B45;}
.highlight, .marked {background:yellow; color:#111; border:none; text-decoration:none;}
.tagging .button:hover, .tagged .button:hover, .tagging .button:active, .tagged .button:active {border: none; background:transparent; text-decoration:underline; color:#000;}

h1,h2,h3,h4,h5 { color: #666; background: transparent; padding-bottom:2px; font-family: Arial, Helvetica, sans-serif; }
h1 {font-size:18px;}
h2 {font-size:16px;}
h3 {font-size: 14px;}

#messageArea {border: 4px solid #948979;background: #f5f5f5;color: #999;font-size:90%;}
#messageArea a:hover { background:#f5f5f5;}
#messageArea .button{color: #666;border: 1px solid #CC6714;}
#messageArea .button:hover {color: #fff;background: #948979;border-color: #948979;}

* html .viewer pre {margin-left: 0em;}
* html .editor textarea, * html .editor input {width: 98%;}

.searchBar {float:right;font-size: 1.0em;}
.searchBar .button {color:#999;display:block;}
.searchBar .button:hover {border:1px solid #fff;color:#4F4B45;}
.searchBar input {background-color: #FFF;color: #999999;border: 1px solid #CCC;	margin-right:3px;}

#sidebarOptions .button:active, #sidebarOptions .highlight {background:#F5F5F5;}

*html #contentFooter { padding:0.25em 1em 0.5em 1em;}

#noticeBoard {font-size: 0.9em; color:#999; position:relative;display:block;background:#fff; clear: both; margin-right:0.5em; margin-top:60px; padding:5px; border-bottom: 1px dotted #CCC; border-top: 1px dotted #CCC;}
#mainMenu #noticeBoard a,#mainMenu #noticeBoard .tiddlyLink {display:inline;border:none;padding:15px 2px;color:#DF9153 }
#noticeBoard a:hover {border:none;}	
#noticeBoard br {display:inline;}
#mainMenu #noticeBoard  .button{color: #666;border: 1px solid #DF9153;padding:2px;}
#mainMenu #noticeBoard  .button:hover{	color: #fff;background: #DF9153;border-color: #DF9153;}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;margin-top:1em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:absolute; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:200;}
*[id='messageArea'] {position:fixed !important; z-index:200;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.5em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:94%; padding:0 0 1em 0;font-size:0.8em}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

table {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1em; line-height:1.1em; overflow:auto;}
.viewer code {font-size:0.8em; line-height:1em;font-family:Courier serif:}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:50; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
Wenn Sie alle Beispiele, die bis jetzt vorgestellt wurden, durchsehen, stellen Sie fest, daß keines der Beispiele in eine Webseite mit weiterem Text eingebunden war. 
In der Praxis ist aber wohl sicher so, daß nicht nur die Tabelle selbst ausgegeben werden soll, sondern sicherlich auch weiterer Text. 

Ein Beispiel:

__Literaturverzeichnis Proseminar 2007:__
|!Titel|!Autor|!Verlag|
|Hermeneutik zur Einführung|Matthias Jung|Junius|
|Hermeneutik. Eine sozialwissenschaftliche Einführung|Ronald Kurt|dtb|

Wenn Sie diese Tabelle bearbeitet haben, werden Sie sich wundern, daß der Text über der Tabelle doppelt ausgegeben wird:
__Literaturverzeichnis Proseminar 2007:__
__Literaturverzeichnis Proseminar 2007:__
|!Titel|!Autor|!Verlag|
|Hermeneutik zur Einführung|Matthias Jung|Junius|
|Hermeneutik. Eine sozialwissenschaftliche Einführung|Ronald Kurt|dtb|

Es ist notwendig, genau festzulegen, welcher Textbereich beim ~AJAX-Reload erneut geladen werden soll.
Sicherlich soll nur die Tabelle neu aufgebaut werden, der Rest der Seite soll //stehen bleiben,// das ist ja gerade der Charme von AJAX.

Dafür gibt es die Variable "[[DG_ajaxid|Ablaufsteuerung per Variable DG_ajaxid]]"
Diese Variable wird von der Klasse phpMyDataGrid bei der Ausführung gesetzt und kann entsprechend abgeprüft werden:
{{{
if (!isset($_REQUEST["DG_ajaxid"])) {
.... hier steht einmal auszugebender Text
}
}}}

Der Text, der nur einmal ausgegeben wird, wird also  in eine Abfrage gestellt und nur dann produziert, wenn diese Variable noch nicht exisitiert.

Das aktuelle Beispiel sample15.php ist leider unklar und auch fehlerhaft.
Die Abfrage wird falsch gesetzt und zusätzlich werden die ~CSS- und ~JS-Definitionen zweimal gesetzt, einmal von der eingebundenen Klasse und einmal im ~SourceCode selbst.

Eine ''Abwandlung'' des ~Original-Beispiel-Scriptes, die nur den auszugebenden Text in die Abfrage stellt und zudem den Quellcode etwas leserlicher darstellt: 
{{{
<?php 
include ("phpmydatagrid.class.php");
$objGrid = new datagrid;
$objGrid->closeTags(true);  
$objGrid->friendlyHTML();  
$objGrid->methodForm("get"); 
$objGrid -> conectadb("127.0.0.1", "Connie", "puschkin", "cmg");
$objGrid->salt("Myc0defor5tr0ng3r-Pro3EctiOn");
$objGrid->language("en");
$objGrid->buttons(true,false,true,false);
$objGrid->form('employee', true);
$objGrid->searchby("name,lastname");
$objGrid->tabla ("employees");
$objGrid->keyfield("id");
$objGrid->datarows(20);
$objGrid->orderby("name", "ASC");
$objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center", "integer");
$objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
$objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
$objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
$objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left", "select:1_Single:2_Married:3_Divorced");
$objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center", "check:No:Yes");
$objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right", "money:&euro;");
$objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right", "integer");
$objGrid->checkable();
echo <<<END
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=$charset" />  
<meta name="description" content="Site description" /> 
<meta name="revisit-after" content="8 days" /> 
<meta name="keywords" content="keywords for site" /> 
<meta http-equiv="Pragma" content="no-cache" />
<meta name="robots" content="all" /> 
<link rel="shortcut icon" href="images/guru.ico" /> 
<meta http-equiv="Content-Script-Type" content="type" />
<title>phpMyDataGrid Test script</title>
END;
$objGrid -> setHeader();

?>
<body>
<div id='content'>
<?php 	
if (!isset($_REQUEST["DG_ajaxid"])) {
echo <<<END2
<table width="100%" border="1" cellspacing="0" cellpadding="0">
<tr>
<td colspan="5">&nbsp;</td>
</tr>
<tr>
<td colspan="5">
<div id="masthead">
<div id="logodiv">
<img src="http://www.gurusistemas.com/images/logo.jpg" alt="phpMyDataGrid Logo" />
</div>
</div>
This is the header of page. here goes a menu or wherever you want</td>
</tr>
<tr>
<td style="width:5%">&nbsp;</td>
<td style="width:42.5%">&nbsp;</td>
<td style="width:5%">&nbsp;</td>
<td style="width:42.5%" align="right">Employees</td>
<td style="width:5%">&nbsp;</td>
</tr>
<tr>
<td style="width:5%">&nbsp;</td>
<td colspan="3" align="center"><br />
END2;
} // if (!isset($_REQUEST["DG_ajaxid"])) end interception, until here, script wont be processed when DG_ajaxid is set
$objGrid -> ajax('silent');
$objGrid -> grid();
$objGrid -> desconectar();
?>
</td>
<td style="width:5%">&nbsp;</td>
</tr>
</table><br />
</div>
</body>
</html>
}}}
Sie können die erste Zeile der Tabelle, die Titelzeile, selbst bestimmen:
{{{
$objGrid -> TituloGrid("Papageien - Aufkommen im Regenwald, Jahresdurchschnitt der letzten 100 Jahre"); 
}}}
Wenn die Ausgabe der Daten im ~UTF-8-Format erfolgen soll, sind einige Punkte zu beachten.
Leider ist die Klasse im Moment nicht UTF-8-fähig, die Klasse muss also auch editiert werden.

Eine aktuelle  Diskussion zu diesem Thema finden Sie im Forum: http://www.gurusistemas.com/forum/viewtopic.php?t=7
Bevor Sie diese Tips übernehmen, prüfen Sie, ob es dort nicht noch neuere Information gibt.

1.
im ~Header-Bereich ~UTF-8-Zeichensatz definieren: 
so ist es Standard in den Beispielen:
{{{
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
}}}
so muss es sein:
{{{
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
}}}

2.
Um die Daten im korrekten Format in die Datenbank zu schreiben:
Suchen Sie  in ~phpMyDataGrid.class.php die Zeile 413:
{{{
$this->SQLerror("mysql_select_db($strDatabase, $this->connectionHandler)", mysql_error());
}}}
hinter diese Zeile fügen Sie die nachstehenden Zeilen ein:
{{{
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");
mysql_query("SET COLLATION_CONNECTION = 'utf8_general_ci'");
}}}
3.
Zur richtigen Ausgabe der Daten:
Suchen Sie  in ~phpMyDataGrid.class.php die Zeile 1478:
{{{
Value = trim($rowValue); $rowValue = (empty($rowValue))?"&nbsp;":$rowValue;
}}}

Kommentieren Sie diese Zeile zur Sicherheit aus und fügen Sie eine weitere Zeile ein.
Dann muß es so ausssehen:
{{{
// Value = trim($rowValue); $rowValue = (empty($rowValue))?"&nbsp;":$rowValue;
$rowValue = trim($rowValue); $rowValue = (empty($rowValue))?"&nbsp;":utf8_decode(utf8_encode($rowValue)); 
}}}
Version 1.0 dieses Manuals für phpMyDataGrid ist fertig. Es ist noch nicht ganz vollständig:

die Beschreibung/Erklärung für die Option //chart// der Funktion [[FormatColumn()]]  fehlt.

Die Tabelle mit der Übersicht über ~Default-Werte wurde vervollständigt.
Die lückenhafte Beschreibung der ~Link-Möglichkeiten per Mask-Parameter wurde vervollständigt.

Die fehldende Informationen werden nachgereicht. Das ergibt dann Version 1.2.
Im Moment lesen Sie also "Version 1.1"

Version 1.2 wird dann wahrscheinlich schon als //richtiges// WIKI zur Verfügung stehen, ich arbeite daran.
<div class='toolbar' macro='toolbar -closeTiddler closeOthers +editTiddler permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='tagging' macro='tagging'></div> 
<div class='viewer' macro='view text wikified'><div class='tagged' macro='tags'><br clear="all"></div></div>
<div class='tagClear'></div>
Mittels dieser Funktion regeln Sie, wie bearbeitete Datensätze gespeichert werden sollen: mit Klick auf ein ICON oder mit ENTER|Doppelklick. Standard ist //default//, Sie brauchen diese Anweisung also nicht zu setzen.

Speichern mit ENTER oder Doppelklick:
{{{
$objGrid -> ajax("silent"); 
}}}

Speichern mit Klick auf ein Icon:
{{{
$objGrid -> ajax("default"); 
}}}
Legen Sie fest, welche Datenmanipulationen zugelassen sind, default: false
{{{
$objGrid -> buttons(true,true,true,true); 
}}}

|!Parameter|!Funktion|!Bedeutung|
|#1|Add|Datensatz hinzufügen|
|#2|Edit|Datensatz bearbeiten|
|#3|Delete|Datensatz löschen|
|#4|View|Datensatz ansehen|

Diese Methode steht in engem Zusammenhang mit der Festlegung des Keyfields (//keyfield()// und optionalem verstärktem  ~Prozess-Schutz //salt()//
Die Funktion fügt der ausgegebenen Tabelle eine weitere Spalte hinzu.
In dieser Spalte stehen Checkboxen,  die die Auswahl mehrerer Datensätze zum gleichzeitigen Editieren ermöglichen.
Aktivieren Sie die Checkbox in der Titelzeile der Tabelle, werden alle Datensätze ausgewählt.
{{{
$objGrid->checkable();
}}}
Das Beispiel [[Textausgabe regeln]]  zeigt eine solcherart gestaltete Tabelle.
Sie können festlegen, ob der zu generierende ~HTML-Output ~XHTML-konform ist oder nicht.
Das bedeutet, "alleinstehende" Tags müssen mit einem Slash "/" geschlossen werden.
{{{
$objGrid -> closeTags(true);   
}}}

Default: false, ohne diese Funktion werden die entsprechenden Tags einfach geschlossen.
Mit der Datenbank verbinden:

Standardmäßig reichen 4 Parameter, möchten Sie aber die [[ADOdb Funktionalität|ADOdb Einsatz]] nutzen, müssen Sie den 5. und 6. Parameter auch setzen.
{{{
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru", true, "mysql"); 
}}}
oder 
{{{
$objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru"); 
}}}
|!Funktion|!Parameter 1|!Parameter 2|!Parameter 3|!Parameter 4|!Parameter 5|!Parameter 6|
|conectadb|Host|Username|Passwort|Datenbank|[[ADOdb|ADOdb Einsatz]]  benutzen|von [[ADOdb|ADOdb Einsatz]] genutzte Datenbank|

[[TiddlyWiki|http://www.tiddlywiki.com]] © Connie ~Müller-Gödecke 2007
"phpMyDataGrid" generiert selbständig eine Seitennavigation und zeigt per default 20 Zeilen pro Seite an.
Sie können diesen Wert je nach Anforderung ändern.
{{{
$objGrid -> datarows(5); 
}}}
Bestimmen Sie die Zahl der Stellen hinter dem Dezimalzeichen/Dezimalkomma:
{{{
$objGrid -> decimalDigits(5); 
}}}
Bestimmen Sie das Dezimalzeichen für die Ausgabe arithmetischer Werte
{{{
$objGrid -> decimalPoint(","); 
}}}
Zuguterletzt wird die Verbindung zur Datenbank geschlossen.
{{{
$objGrid -> desconectar(); 
}}}

Dieses Beispiel 
# im Header
##bindet die Klasse ein
##erstellt das Objekt
##legt den Namen für das auszugebende Formular fest  => [[form()]]
##verbindet mit der Datenbank => [[conectadb()]]
##nennt die auszulesende Tabelle => [[tabla()]]
##definiert die auszulesenden und anzuzeigenden Tabellenfelder und deren Darstellung => [[FormatColumn()]]
##gibt Links zu den benötigten Javascript- und ~CSS-Dateien aus => [[setHeader()]]
#im Body
##gibt das Formular aus => [[grid()]]
##schließt die Verbindung zur Datenbank => [[desconectar()]]

{{{
<?php /*
Copyright (c) 2007, Gurú Sistemas and/or Gustavo Adolfo Arcila Trujillo
All rights reserved.
www.gurusitemas.com 
For more info, samples, tips, screenshots, help, contact, forum, please visit phpMyDataGrid site  
http://www.gurusistemas.com/indexdatagrid.php
For contact author: tavoarcila at gmail dot com or info at gurusistemas dot com
*/ ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>phpMyDatagrid - Sample file</title>
<?php
    /* Include class file */
    include ("phpmydatagrid.class.php");
    /* Create object */
    $objGrid = new datagrid;
    /* Define the "FORM" will be named employee and Must be  created by the grid script */
    $objGrid -> form('employee', true);
    /* Connect with the database */
    $objGrid -> conectadb("127.0.0.1", "phpclasses", "test", "guru");
    /* Select the table to use */
    $objGrid -> tabla ("employees");
   /* Define fields to show */
    $objGrid -> FormatColumn("id", "ID Employee", 5, 5, 1, "50", "center");
    $objGrid -> FormatColumn("name", "Name", 30, 30, 0, "150", "left");
    $objGrid -> FormatColumn("lastname", "Last name", 30, 30, 0, "150", "left");
    $objGrid -> FormatColumn("age", "Age", 5, 5, 0, "50", "right");
    $objGrid -> FormatColumn("afiliation", "Afiliation Date", 10, 10, 0, "100", "center", "date:dmy:/");
    $objGrid -> FormatColumn("status", "Status", 5, 5, 0, "60", "left");
    $objGrid -> FormatColumn("active", "Active", 2, 2, 0,"50", "center");
    $objGrid -> FormatColumn("salary", "Salary", 10, 10, 0, "90", "right");
    $objGrid -> FormatColumn("workeddays", "Work days", 5, 2, 0, "50", "right");
    /* The setHeader function MUST be set between the <HEAD> and </HEAD>  to correctly set the CSS and JS parameters */
    $objGrid -> setHeader();
?>
</head>
<body>
<?php 
    /* draw the grid */
    $objGrid -> grid();
    /* Disconnect from database */
    $objGrid -> desconectar();
?>
</body>
</html> 
}}}
//{{{
//This ensures that the footer sticks to the bottom of the screen when there are no tiddlers open. If that is not desirable, it can be deleted.
function setFooter() {
         if (document.getElementById && document.getElementById("contentFooter") ) {
            var windowHeight=findWindowHeight();
         if (windowHeight>0) {
            var contentHeight= document.getElementById('mainMenu').offsetHeight + document.getElementById("header").offsetHeight + document.getElementById("contentFooter").offsetHeight;
            var menu= document.getElementById('mainMenu');
            if (windowHeight-(contentHeight)>=0) {
               menu.style.position='relative';
               menu.style.marginBottom=(windowHeight-(contentHeight))+'px';
               }
            else {
                 menu.style.position='';
                 menu.style.marginBottom='';
                 }
            }
         }
}
window.onresize = function() {
  setFooter();
}

Story.prototype.refreshTiddler_footerhack=Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function (title,template,force)
{    
var theTiddler = Story.prototype.refreshTiddler_footerhack.apply(this,arguments);
setFooter();
   return theTiddler;}

//}}}
wenn gesetzt, wird der generierte ~HTML-Text in ein ~HTML-Formular eingebunden.
Dies ist dann besonders wichtig, wenn die angezeigen Datensätze auch editiert werden sollen, denn dazu benötigt es ~Formular-Elemente.

{{{
$objGrid -> form('Formularname', true); 
}}}
|!Funktion|!Parameter 1|!Parameter 2|
|form|Formularname|anlegen|

Der 2. Parameter muß in Apostroph, als String eingegeben werden.
Jede vom Script generierte ~HTML-Zeile wird eine eigene Zeile gestellt, es wird nach jeder Direktive ein Zeilenumbruch eingebunden. Das macht den Quellcode lesbarer.
{{{
$objGrid -> friendlyHTML();
}}}
Im Body-Bereich der Datei wird das Objekt ausgegeben:
{{{
$objGrid -> grid();
}}}
Wenn Datensätze editiert/modifiziert werden sollen, muß das ~Schlüssel-Feld für die Datensätze angegeben werden. (Für den Editiermodus wird immer ein Layer über das Hauptfenster geleg).
{{{
$objGrid -> keyfield("id");
}}}

Sie können die Sprache für den ~Text-Output bestimmen.
Momentan sind die folgenden Sprachen unterstützt:

|!Kurzform|!Kurzform|!Sprache|
|nederlands|ne|holländisch|
|deutch|de|deutsch|
|español|es|spanisch|
|francais|fr|französisch|
|italian|it|italienisch|
|èeština|cs|tschechisch|
|portuguese|pt oder pt_br|portugiesisch/brasilianisch|

{{{
$objGrid->language("deutch");
}}}
Beachten Sie, daß die Langform für die deutsche Sprache falsch geschrieben ist. Dies ist als Bug gemeldet. 
Trotzdem empfiehlt sich die Kurzform. (Die ändert sich so schnell nicht.)


Sie können dem vom Script generierten SQL weitere Parameter mitgeben.
Wichtig ist, daß Sie diese Parameter im "~GET_Format" notieren:
{{{
$objGrid -> linkparam("sess=".$_REQUEST["sess"]."&username=".$_REQUEST["username"]);   
}}}
Bestimmen Sie die Art der Werteübergabe: entweder per POST oder GET
{{{
$objGrid -> methodForm("post");  
}}}
oder
{{{
$objGrid -> methodForm("get");  
}}}
Sie können die Sortierung der Tabellenspalten durch die Nichtanzeige der ~Sortier-Buttons unterbinden.
{{{
$objGrid -> noorderarrows(); 
}}}
Bestimmen Sie das Feld, nach dem die Tabelle bei der Ausgabe sortiert werden soll sowie die Sortierreihenfolge: //aufsteigend// oder //absteigend//
{{{
$objGrid -> orderby("age", "DESC"); 
}}}
oder
{{{
$objGrid -> orderby("Preis", "ASC"); 
}}}

Die Standardmethode für die Seitennavigation ist //mixed//.
Sie können dies mittels //paginationmode()// selbst bestimmen
{{{
$objGrid -> paginationmode('links'); 
}}}
oder
{{{
$objGrid -> paginationmode('select'); 
}}}
oder
{{{
$objGrid -> paginationmode('mixed'); 
}}}

Der Pfad für vom Script einzubindende Grafiken.
{{{
$objGrid -> pathtoimages("./images/"); 
}}}
Der Pfad wird in Hochkommata eingeben, String.
"phpMyDataGrid" ist eine Klasse zur Manipulation von Datenbankinhalten.
Die Klasse nutzt ~AJAX-Funktionalitäten, um das Editieren der Datenbankfelder "reibungsloser" zu gestalten.

In den nachstehenden Artikeln sollen die Möglichkeiten der Klasse beschrieben werden.
Für jede Funktion finden Sie einen Artikel.
Ebenso werden die [[Standard-Werte|Default-Einstellungen]] aufgezeigt.
Folgende ~URLs sind wichtig:
*[[Hauptseite|http://www.gurusistemas.com/]]
*[[Download|http://www.gurusistemas.com/indexdatagrid.php?page=download]]
*[[Beispiele|http://www.gurusistemas.com/indexdatagrid.php?page=samples]]
*[[Forum|http://www.gurusistemas.com/forum/]]
*Download der [[ADOdb-Klasse|http://adodb.sourceforge.net/]], falls Sie phpMyDataGrid mit ~ADOdb-Funktionalität einsetzen möchten
----
und ein Link zur Webseite der [[TiddlyWikis|http://www.tiddlywiki.org]] , dem Programm, mit dem diese Seite erstellt wurde
Einige Funktionen verschlüsseln die Werte mittels der "~MD5-Methode."
Legen Sie den String fest, der hierbei als Verschlüsselungsbasis genommen wird.
{{{
$objGrid -> salt("Some Code4Stronger(Protection)"); 
}}}
Dieser Parameter ist optional, er verstärkt jedoch die Verschlüsselung und damit die Sicherheit Ihrer Anwendung.
Definiert die Felder, deren Inhalte per Suchdialog durchforstet werden sollen.
Geben Sie die Feldnamen kommagetrennt ein.
{{{
$objGrid -> searchby("Land,Name,Ort"); 
}}}
Diese Funktion plaziert Javascript und CSS in den ~Header-Bereich der Datei
{{{
$objGrid -> setHeader(); 
}}}
Das ~Standard-SQL der Klasse ist ein einfaches ~SQL-Statement
{{{
SELECT * FROM TABELLE
}}}
wobei die Tabelle ausgelesen wird, die Sie mit
{{{
$objGrid -> tabla ("employees"); 
}}}
definiert haben. Diese Abfrage muss nicht explizit gesetzt werden.

Dieses SQL reicht natürlich nicht für komplexere Abfragen.
Deshalb gibt es die Funktion //sqlstatement():// 
{{{
$orders_grid->sqlstatement("SELECT * FROM `mytable_one` INNER JOIN `mytable_two` 
ON `mytable_one`.`id_one`= `mytable_two`.`id_two` 
WHERE .....");
}}}
benennt die Tabelle, die ausgelesen werden soll
{{{
$objGrid -> tabla ("employees"); 
}}}
Bestimmen Sie die Felder, deren Werte am Tabellenende als Gesamtsumme ausgegeben werden soll:
{{{
$objGrid -> total("salary,workeddays"); 
}}}
oder z. B.
{{{
$objGrid -> total("Monat,Preis"); 
}}}

Das Ergebnis steht in einer zusätzlichen Zeile am Ende der Tabelle, die mit der ~CSS-Klasse ".dgRowsTot" formatiert ist. 
Dadurch kann die Ergebniszeile gezielt formatiert werden. Das Ergebnis übernimmt das Format der dazugehörenden Tabellenspalte, ist diese ein "Währungsfeld", so wird auch das Ergebnis als Währungsfeld ausgegeben.

Umfaßt die Tabelle mehrere Seiten, wird das ~Seiten-Ergebnis ausgegeben
Anzeige filtern durch zusätzliche //~Where-Klauseln//:
{{{
$objGrid -> where ("active = '1'"); 
}}}