Digitale renovaties - Congres 2008 - V-ICT-OR

Post on 05-Dec-2014

803 views 0 download

description

Lithium is looking ahead when using new techologies in our webprojects

Transcript of Digitale renovaties - Congres 2008 - V-ICT-OR

Nieuwe technologieën

Propel, patForms en Ext

Jan Fabry – jan.fabry@lithium.be V-ICT-OR Shopt IT 2008

Introductie

Ext (Javascript-library)

patForms (Formulieren)

Propel (DB-toegang)

Eigenschappen

  Open source software   transparantie, goedkoop, mogelijkheden

  Aparte onderdelen, maar werken mooi samen   patForms heeft Propel-ondersteuning (naast andere)   Ext is overal te integreren (servertaal-onafhankelijk, dus ook met PHP (of

ASP, Java, Cobol…))   Ext werkt ook samen met Prototype+script.aculo.us, JQuery of YUI

Wanneer gebruiken?

  Altijd   Nieuwe projecten

  Uiteraard analyse van alle mogelijkheden maken   Anders werken voor wie ervaring heeft met PHP, maar zeker doenbaar

  Bestaande projecten   Ideaal als je al met bestaande code zit, en een bestaande databank   Die willen we uiteraard behouden   Maar bestaande “fouten” willen we maskeren   Lithium heeft voor dit trio gekozen bij start eGo v3

Propel

http://propel.phpdb.org

Wat is Propel?   Object-Relational Mapping (ORM) framework voor PHP5   Database als objecten

  Geen gedoe met connecties, escaping, type-casting, …   Werk met objecten, niet met queries   Gegenereerde klassen die uitbreidbaar zijn voor eigen implementaties

  Geen SQL meer   “Criteria”-objecten worden opgebouwd   Volgt complexe business-logica   Maar wel nog mogelijk indien gewenst

  Database-onafhankelijk   MySQL, Oracle, PostgreSQL, SQLite, en MS SQL Server   Maskeert DB-specifieke dialecten (LIMIT, AUTO_INCREMENT…)   DB-schema in XML-formaat

Voorbeeld

INSERT INTO author (first_name, last_name) VALUES ('Jack', 'London');

$author = new Author();$author->setFirstName("Jack");$author->setLastName("London");$author->save();

Voordeel?

Voorbeeld (uitgebreid) $method = ', opsturen='.$_REQUEST['FDELIVERY'];if ( ctype_digit( $_REQUEST['FADATE'] ) ){ $method .= ', afhaling_date="'.strftime( '%Y-%m-%d’, $_REQUEST['FADATE'] ) . '"';}

mysql_query ("INSERT loket SET doc='$ID', var1='$VAR1', var2='$VAR2', var3='$VAR3', var4='$VAR4', var5='$VAR5', var6='$VAR6', var7='$VAR7', var8='$VAR8', var9='$VAR9', var10='$VAR10', var11='$VAR11', var12='$VAR12', var13='$VAR13', var14='$VAR14', var15='$VAR15', var16='$VAR16', var17='$VAR17', var18='$VAR18', var19='$VAR19', var20='$VAR20', date='$DATUM', name='$FNAME', gebdate='$GEBDATE', tel='$FTEL', organisation='$datadoc->organisation', department='$datadoc->organisation', user='$datadoc->user', users='$datadoc->users', user_level='$datadoc->user_level', email='$FEMAIL', forms_advanced_submission_id=$FORMS_ADVANCED_SUBMISSION_ID".$method.$rijksregister);

Voorbeeld (uitgebreid) $loket = new Loket();$loket->setDoc( $record->getId() );$loket->setDate( time() );foreach ( $standardFields as $field => $value ){ if ( isset( $value ) ) { $loket->setByName( $field, $value ); }}$loket->setFormsAdvancedSubmissionId( $faSid );$loket->setOrganisation( $record->getOrganisation() );$loket->setDepartment( $record->getDepartment() );$loket->setUser( $record->getUser() );$loket->setUsers( $record->getUsers() );$loket->setUserLevel( $record->getUserLevel() );if ( isset( $faDate ) ){ $loket->setOpsturen( 1 ); $loket->setAfhalingDate( $faDate );}$loket->save();

Conversielaag public function getNameNl(){ return html_entity_decode( parent::getNameNl(), ENT_COMPAT, 'UTF-8' );}

public function getUsers(){ return explode( '@', parent::getUsers() );}

public function addToHistory( $message, $eGoUser ){ $history = $this->getHistory(); $history .= '[' . $eGoUser->eGoTitle() . '] ’; $history .= $message; $history .= date( ' (d/m/y - H:i)' ); $history .= "\n------------------------------\n"; $this->setHistory( $history );}

Criteria-voorbeeld $curUserLevel = UsersLevelPeer::retrieveByPk( $GLOBALS['eGoUser']->getLevel() )->getLevel();$ulc = new Criteria();$ulc->add( UsersLevelPeer::LEVEL, $curUserLevel, Criteria::LESS_THAN );$uls = UsersLevelPeer::doSelect( $ulc );$ula = array();foreach ( $uls as $ul ){ $ula[] = $ul->getId();}$gridConfig['criteria']->add( ContactsPeer::LEVEL, $ula, Criteria::NOT_IN );

$gridConfig['criteria']->add( ContactsPeer::ID, $GLOBALS['eGoUser']->getId(), Criteria::NOT_EQUAL );

patForms

http://trac.php-tools.net/patForms

Wat is patForms?   Form-abstractie   Form-elementen als objecten

  Geen gedoe met escaping, validatie, foutafhandeling…   Werk met objecten, niet met $_POST   Voorgedefinieerde klassen die uitbreidbaar zijn voor eigen implementaties   Definitie herbruikbaar

  Geen HTML meer   “Element”-objecten worden opgebouwd   Volgt complexe business-logica   Maar wel nog mogelijk indien gewenst

  Output-onafhankelijk   HTML, maar evengoed XML, PDF, …   Gedeelde code voor gedeelde functionaliteit

Voorbeeld $elementsDefinition = array( 'username' => array( 'type' => 'String', 'attributes' => array( 'required' => 'yes', 'label' => 'Username', 'description' => 'Enter your username here.', 'maxlength' => '15', 'minlength' => '4', 'title' => 'Username’, ), ),);

$form =& patForms::createForm( $elementsDefinition, array( 'name' => 'myForm' ) );

$renderer =& patForms::createRenderer( "Array" );

$form->setRenderer( $renderer );

$form->setAutoValidate( 'save' );

$elements = $form->renderForm();

Elementen tonen (Renderers)   Gewoon in HTML plaatsen

  Beetje onhandig, maar het werkt   Nodige code (tags, labels) zit in eenvoudige array   Goed voor integratie in bestaande code

  Templating-systeem gebruiken   Code gescheiden van layout   Meer, maar simpele bestanden   Eenvoudig onafhankelijk aan te passen (en door verschillende personen)   Smarty is meest gekend, en ondersteund door patForms

Voorbeeld {panelForm title="$formTitle" id="form" icon="$iconModule"} {formRow e=Author} {foreach from=$allLanguages item=lang} {formRow e="Title`$lang`" lang=$lang} {/foreach} {formRow e=UserPublish} <div id="upt" style="display:none"> {formRow e=UserPublishText} </div> {if isset( $forms.$mainForm.elements.ChiefPublish )} {formRow e=ChiefPublish} {/if}{/panelForm}

Voorbeeld

Koppeling met Propel   Database-informatie zit in Propel

  Namen, datatypes, eventueel relaties   Automatisch formulier aanmaken

  Juiste velden voor datatypes (INT, DATE, …)   Eventueel aanpassen voor speciale elementen (afbeeldingen…)

  Automatisch formulier opslaan   Geen extra code nodig   patForms converteert naar standaard php-datatypes, Propel kan deze

inlezen

Voorbeeld $definition = patForms_Definition_Propel::create( $params );$form = &patForms::createCreator( 'Definition' )->create( $definition );

$form->setValues( array( 'Id' => $ID ) );

$storage = patForms::createStorage( 'Propel' );$storage->setStorageLocation( $form->attributes['name'].'Peer' );$form->setStorage( $storage );

Ext

http://extjs.com

Wat is Ext?   Cross-browser Javascript library   Verderzetting (extension) van de Yahoo! UI Library

  Sterke UI-widgets   Aanpasbaar en uitbreidbaar   Voorgedefinieerde klassen die uitbreidbaar zijn voor eigen implementaties

  Geen geprul meer   Verschillen tussen browsers worden weggewerkt   Ontwikkelen op hoog niveau mogelijk   Maar “gewone” Javascript is natuurlijk nog altijd mogelijk

  Goede ondersteuning   “Ext, LLC” is een bedrijf dat betaalde ondersteuning geeft   Grote gemeenschap met vrij te krijgen voorbeelden, uitbreidingen…

Voorbeeld var myDiv = document.getElementById('myDiv');myDiv.className += ' red’;

Ext.onReady(function() { var myDiv = Ext.get('myDiv'); myDiv.addClass('red’); myDiv.highlight(); myDiv.center(); myDiv.setOpacity(.25);});

Ext.onReady(function() { var myDiv = Ext.get('myDiv'); myDiv.addClass('red’);});

Koppeling met server-code   Ext is een Javascript-library, en kan dus gekoppeld

worden aan eender welke server-side configuratie   Meest gebruikte dataprotocol is JSON

  Eenvoudige structuur   Standaard-functies in PHP, maar ook in vele andere talen   Communicatie is standaard over HTTP, dus geen server-requirements

(wordt wel eens vergeten bij het kijken naar voorbeelden)

  Binnen Lithium: eGo   patForms: Handige user interface voor formulier-elementen   Propel: krachtige configuratie voor overzichtspagina’s   Eenvoudig om standaard overal beveiliging op te plakken

Voorbeelden

Voorbeelden