Tulajdonságok
AJAX kliens – szerver arhitektúra, MVC (adat model – viewer - controller) koncepció,
popupMsg, pupuFrame,popupYesNo, popupNoYes dialóg ablakok,
Dátum beviteli mező naptár poup -al,
Pénznem beviteli mező (ezres elválasztó, két tizedere kerekítés),
Űrlap ellenőrzés (javascript alapú, AJAX szerver oldali adatlekéréssel kombinálható),
Fastruktúra megjelenítés AJAX szerver oldali adatlekéréssel,
Adat böngésző tábla AJAX szerver oldali lekéréssel,
Többnyelvű felület kialakítása előkészítve (jelenleg csak magyar változat van készen),
CSS fájlokkal image cserékkel testre szabható megjelenés,
Biztonságos védett rendszer (a Javascript forrás programokat illetéktelen nem tudja közvetlenül elérni, a böngészőbe egy tömörített nagyon nehezen olvasható visszafejthető JS kód kerül letöltésre, ebben a kényes adatok egyszer használatos algoritmussal kódolt formában szerepelnek. Az AJAX kommunikáció egy formonként képzett egyszer használatos egyedi kulccsal védett.
Továbbá rendelkezésre állnak a Jquery, jquery.ui alap szolgáltatásai is.
Ez a szoftver és annak dokumentációja a GNU/GPL licenc szerint ingyenesen és szabadon felhasználható, másolható, továbbfejleszthető.
A GNU/GPL licenc magyar fordítása:
A GNU/GPL licenc jogilag hiteles eredeti angol nyelvű változata:
http://www.gnu.org/licenses/gpl.html
Felhasznált külső fejlesztésű erőforrások:
Jquery v1.7.2 http://jquery.com
Jquery.ui v1.8.21 http://jqueryui.com/about
Jjquery.ui.datapicker v1.8.21 http://jqueryui.com/about
jquery.formatCurrency http://www.gnu.org/licenses/
dTree 2.05 http://www.destroydrop.com/javascript/tree/
jquery.ingrid 0.9.3 kis mértékben átdolgozva, fejlesztve
http://www.reconstrukt.com http://slu.sh
mysql http://www.mysql.com
Köszönet a fejlesztőknek!
A felhasznált külső erőforrások licenszeit lásd a fejlesztők honlapjain!
Fogler Tibor Ez az e-mail-cím a szpemrobotok elleni védelem alatt áll. Megtekintéséhez engedélyeznie kell a JavaScript használatát.
WEB oldal: adatmagus.hu
A felhasználói kérdéseket elsősorban ezen az oldalon a "Hozzászolások" részen várjuk és válaszoljuk meg, így a tapasztalatok válaszok egyuttal "közkinccsé" is válnak. Kérjük, hogy csak nagyon indokolt esetben irjon privát e-mail -t a Ez az e-mail-cím a szpemrobotok elleni védelem alatt áll. Megtekintéséhez engedélyeznie kell a JavaScript használatát. címre.
Hálásan megköszönöm amennyiben bármilyen csekély összeggel támogatni tudja a további GNU/GPL licenszű szabadszoftverek fejlesztésére irányuló munkámat. Ebben az esetben utalja át a támogatást a
Ez az e-mail-cím a szpemrobotok elleni védelem alatt áll. Megtekintéséhez engedélyeznie kell a JavaScript használatát.
fiókba és erről e-mail-ben is tjékoztasson!
Szerver oldali könyvtár szerkezet:
server_document_root/lib a keretrendszer JS és php fájljai /css a keretrendszer stilus fájljai és iamges könyvtárai /projektName a projekt html és js.php fájljai /projektName/models a projekt adatmodeljei és a konfiguráció beállítás (php fájlok)
Minden képernyőhöz minimum két fájl tartozik:
Javascript kód. Biztonsági okokból xxxxxxx.js.php fájlokban van tárolva (lásd lentebb), a Jquery koncepciónak megfelelően elkészítve.
html dokumentum. Ez egy komplett html dokumentum, tartalmazza a html headert, benne a stilus linkeket és a lib/xxxxxx.js javascript behivásokat is, valamint a képernyöhöz tartozó xxxxxx.js.php behívását.. A Jquery koncepciónak megfelelően ebben közvetlen JS kodok használata erősen ellenjavalt.
Mindkét fájl a 'projektName/' könyvtárban található.
A xxxx.js.php fájlok php includdal és egy kötelező php sorral egy „preprocesszort” futtatnak, ami a javascript kódot tömörítve és a legkényesebb adatokat egyszer használatos algoritmussal titkosítva küldi ki a böngészőnek. Továbbá egy formonként egyedileg képzett biztonsági kódot is elhelyez a javascript -ben amit az AJAX szerver hívásoknál ellenőrzésre használunk, ezzel is csökkentve az illetéktelen hozzáférések lehetőségét.
Amennyiben a form AJAX adatlekéréseket, adatmanipulációkat is végez akkor „adatmodell” is tartozik hozzá (egy adatmodelt több form is használhat). Az adatmodell php fájl a 'projekctName/models' könyvtárban. Ez egy 'dataModel' nevü osztályt definiál aminek különböző methodusai lehetnek amik az egyes adat lekérő, adat manipulációs akciókat szolgálják ki.
Az alábbi ábrán mindezt egy példa szemlélteti. A példában azt tételezem fel, hogy a program első képernyője (ami a projectName/index.html) a bejelentkező formot tartalmazza.
A programokat Javascript és PHP nyelven írjuk. A javascript programokat a Jquery keretrendszer koncepciója szerint alakítjuk ki.
Értelemszerüen használható minden JQuery API funkció és minden JQuery.UI function
>
Egy óldal képi megjelenését tartalmazó valami.html fájl:
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ingrid. the jQuery Datagrid</title>
….....
<link type="text/css" href="/jm/../css/ui-lightness/jquery-ui-custom.css" rel="stylesheet" />
<link rel="StyleSheet" href="/jm/../css/amform.css" type="text/css" />
<script type="text/javascript" src="/jm/../lib/jquery.min.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.cookie.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.ui.custom.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.amform.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.amform-hu.js"></script>
<!--- szükség szerint elhagyható elemek -->
<script type="text/javascript" src="/jm/../lib/jquery.ui.datepicker.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.ui.datepicker-hu.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.formatCurrency.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.formatCurrency.hu-HU.js"></script>
<script type="text/javascript" src="/jm/../lib/jquery.ingrid.js">
</script><script type="text/javascript" src="/jm/../lib/jquery.ingrid-hu.js"></script>
<link rel="StyleSheet" href="/jm/../css/ingrid.css" type="text/css" />
<script type=”text/javascript” src=”lib/jquery.tree.js”></script>
<link rel="StyleSheet" href="/jm/../css/dtree.css" type="text/css" />
<!-- kötelezö, fontos elem -->
< script type="text/javascript" src="/jm/valami.js.php"></script>
</head>
<body>
…......
</body>
</html>
Az oldalhoz tartozó Javascript kódot tartalmazó valami.js.php fájl:
<? php include '../lib/js.php'; ?> $( document).ready( function() { …........ }); <? php jsOut(); ?>
A 'projectName/models' könyvtárba készitsünk egy config.php fájlt:
<? php class amConfig { // if true send mysql errormsg into browser, // if false send only mysql errorNum and 'SQL ERROR' string var $resultSQLerrorMsg = false; // if true save sql into model\lastsql.sql file for // development error find var $saveSQL = false; // mysql connect info var $mysqlhost = 'localhost'; var $mysqluser = 'yourMYSQLuserName'; var $mysqlpassword = 'yourMYSQLpassword'; var $mysqldatabase = 'yourMYSQLdtabaseName'; var $prefix = ''; ?>
Ugyanide készitsük el az adatmodelname.php fájlt vagy fájlokat:
<? php /* adatmagus ajax data model */ global $records, $totalRecords, $errorNum, $errorMsg, $config; include 'config.php'; $config = new amConfig(); mysql_connect($config->mysqlhost,$config->mysqluser, $config->mysqlpassword); mysql_query('set names utf8'); mysql_select_db($config->mysqldatabase); class dataModel { public function actionName1() { ….} public function actionName2() { ….} ….... } ?>
Az adatmodell methodusainak a $records globális változóba egy tömböt kell elhelyezniük, ahol a tömb elemei egy-egy rekordnak felelnek meg. Mindegyik tömb elem egy objektum ami „fieldname'=fieldValue propertyket tartalmaz.
JSON szintaxis szerint:
[{'fieldname':'fieldValue', 'fieldname':'fieldValue'....},
{'fieldname':'fieldValue', 'fieldname':'fieldValue'....}
…......
]
Az ingrid hivások POST paraméterben a következő adatokat küldhetik:
filter sql feltétel string urlencoded formában
sort rendezés, oszlopszám (a bal szélső oszlop száma:0
dir rendezési irány 'asc' vagy 'desc'
pagesize több lapos megjelenés esetén a jelenleg kért sorok száma
page több lapos megjelenés esetén az aktuális lapszám az első lap : 1
a (page-1)*pagesize sorral kell kezdeni a lekérést
Ezen adatok elérésére a Request('name') hívás is használható.
A $totalRecords globális változóban a 'pagesize' és 'page' adatot figyelmen kívül hagyva, de a 'filtert' figyelembe véve lekérdezett összes rekordszámot kell elhelyezni.
A $errorNum és $errorMsg globális változókba értelemszerűen a MYSQL hívás esetleges hibajelzéseit kell elhelyezni.
Lásd a dem_ingrid/konferenciak.php példát.
Adatmanipuláló sql futtatása a Javascript kódban:
$.ajax({'url':'..\lib\remote.php', 'type':'POST', 'data':{'model':@”..\projektName\modelName.php”@, 'action':@”actionName”@, 'paramName'.'paramValue'), …... }, 'success':function() { …......} );
A body részben használhatunk includeokat is:
<div class="include includeFileURL"></div>
Egyszerü üzenet ablak „Rendben gombbal”
popupMsg(title,msgHtml);
Másik html oldal behívása modal popup dobouban
popupFrame(title,url,x,y,w,h);
Igen-nem kérdés, az Igen az alapértelmezett válasz
popupYesNo(title,msgHtl, function() {yes click esemény kezelő }, function() {no click esemény kezelő });
Igen-nem kérdés, a Nem az alapértelmezett válasz
popupNoYes(title,msgHtml, function() {yes click esemény kezelő }, function() {no click esemény kezelő });
Üzenet ablak definiált gombokkal és funkciókkal,az első az alapértelmezett
popupMsg(title,msgHtml, { 'gombFelirat':function() { gombClick eseménykezelő }, 'gombFelirat':function() { gombClick eseménykezelő }, ........ });
Dátum típusú ürlap mező:
Mindössze a HTML fájlban a class=”date” jelzést kell az input -tagbe beilleszteni.
Pénznem típusú ürlap mező:
Mindössze a HTML fájlban a class=”currency” jelzést kell az input -tagbe beilleszteni.
A nmező aktuális értékének lekérésére a $(#id).asNumber() szintaxis használandó.
A javascript kódban:
$(#formId).formInit();
$(#formId).setValidator(fieldId, function() {….})Az ellenörző függvények a
$(#fieldId).setValid(fieldId, valid_status, validMsg)hívással kell az ellenőrzés eredményét visszaadnia. valid_status lehet:
Az ellenorzó függvények szinkron vagy aszinkron AJAX hívásokat is tartalmazhatnak, ez esetben az AJAX 'success' eljárásban kell a
$(#formid).setValid(fieldid,valid_status,hibaüzenet); hívást elhelyezni.
NAGYON FONTOS! A setValid hívás minden ellenorzó függvényben kerüljön végrehajtásra akár jó az adat akár nem!
$("#formOK").button(); $("#formOK").click( function() { $('#formId').validator(); } );
A form sikeres ellenörzés után aktivizálodó feldolgozó eljárása:
$('# formId').setOKfunction( function() { ….......... } );
Lásd amform_demo.js.php
A HTML kódban helyezzünk el egy „konténer” DIV elemet, ahová a fa szerkezet kerülni fog.
A Javascript kódban:
$('# konténerId').tree({ 'ajax':true, 'model':@"../tree_demo/models/treedata.php"@, 'action':@"getTreeData"@, 'nodeClick':function(id) { alert('document click '+id); }, 'loadFun':function(result) {} });
Lásd tree_demo/tree_demo.js.php
A HTML kódban helyezzünk el egy „konténer” TABLE elemet, ahová az adattábla kerülni fog.
A thead részben alakítsuk ki a táblázat fejlécet. A tbody lehet üres is, de feltétlenül létezzen!.
A Javascript kódban:
var mygrid1 = $("#table1").ingrid({ url: '../lib/remote.php', type:'POST', dataType:'json', height: 350, savedStateLoad: true, totalRecords:10, //it is must! recordsPerPage:10, sortedCol:0, extraParams:{ 'model':@"../ingrid_demo/models/konferenciak.php"@, ' action':@"getRecords_table1"@, 'pagesize':10, 'skey':skey }, onRowSelect: function(tr, selected){ $('tr.grid-row-even').removeClass('grid-selected'); $('tr.grid-row-add').removeClass('grid-selected'); var str = selected ? 'SELECTED' : 'UNSELECTED'; var tr_html = $(tr).html(); $(tr).addClass('grid-selected'); popupMsg('row click',str + '<code>' + tr_html + '</code>'); } }); $( window).unload( function() { $.ajax({url:'../lib/remote.php', data:{'model':@"../ingrid_demo/models/konferenciak.php"@'}, 'action':@"close_getRecords"@} ); } ); );
lásd ingrid_demo/ingrid_demo.js.php
Mivel a JavaScript kód letöltődik a böngészőbe és ott illetéktelenek is hozzáférhetnek minimalizálni kell a JavaScript kódban lévő kényes adatok mennyiségét, továbbá meg kell akadályozni, hogy aaz AJAX szerver funkciókat illetéktelenek hívhassák.
Ennek érdekében ez a rendszer többszintű védelmet tartalmaz:
A böngészőkbe beépített alap AJAX védelmi rendszer megakadályozza, hogy AJAX hívásokat harmadik gépről küldjenek.
Ha esetleg ezt a védelmet valaki át tudja lépni akkor a rendszer saját védelmi rendszerébe ütközik. Ugyanis a Javascript preprocesszor minden letöltésekor generál egy egyedi kódot, amit SESSION-ban is tárol és kiküld a böngészőbe is. Az ajax szerverek csak akkor szolgálják ki a kérést ha ez a kód is érkezik a kéréssel. Továbbá a rendszer ellenőrzi, hogy a kérés AJAX által generált kérés-e?
A javascript preprocesszor a javascript kódban az 'adatmodel' neveket és 'action' neveket SESSIONban tárolja egy-egy minden alkalommal egyedileg képzett névhez rendelve, és a böngészőbe ezeket a session változó neveket küldi el. Így a kliens oldalon ezen adatok nem ismerhetőek meg, nem fejthetőek vissza.
A fejlesztők egyéb kényes adatainál is használhatja ezt a titkosítási eljárást.
A javascript forrás programba ezeket kényes adatokat @”xxxxxxxx”@ formában helyezzék el.
A preprocesszor ezeket „SAFE_#########” kóddal fogja helyettesíteni és ezen a néven SESSION -ban tárolja. Ezután a fejlesztő által írt adatmodel php program feladata a név alapján az adat kiolvasása a session változóból, és használat után a session változó törlése.
Az oldalak megjelenése a „css” könyvtárban lévő css fájlok javításával és az ez alatt lévő
'xxxxxxx_img' könyvtárakban lévő képfájlok cseréjével módosítható.
A l'ib' könyvtárban lévő 'xxxxxxxxx-hu.js' illetve 'xxxxxxxxx.hu-HU.js' fájlok lemásolásával és módosításával oldható meg. Természetesen ennek megfelelően módosítani kell a HTML oldalak head részét is.
Budapest 2012.08.01
Fogler Tibor