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