5,693,936 members and growing! (15,242 online)
Email Password   helpLost your password?
Web Development » Applications & Tools » Tools with source code License: The BSD License

PHP wrapper for ExtJS

By Paul Coldrey

Simple wrapper classes to allow ExtJS to be rendered from PHP objects
Javascript, CSS, HTML, XHTML, WebForms, Ajax

Posted: 27 May 2008
Updated: 27 May 2008
Views: 8,580
Bookmarked: 7 times
Announcements
Loading...



Search    
Advanced Search
Sitemap
7 votes for this Article.
Popularity: 3.69 Rating: 4.36 out of 5
0 votes, 0.0%
1
1 vote, 14.3%
2
0 votes, 0.0%
3
2 votes, 28.6%
4
4 votes, 57.1%
5
Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report This Article

Introduction

ExtJS is a really cool JavaScript library for generating web GUIs. Everything works really nicely when all you want are simple forms but it generally doesn't take long before you want to control the rendered JavaScript based on some server-based logic (ie only show these fields to "admins" or load values from an SQL database based on the selected id and show them in the form). Pretty soon you are wrapping the Javascript in PHP control structures and embedded little snippets of PHP to set values. Then, what do you know, your code looks like unmaintainable rubbish. Not to mention that if you are an emacs user (like me) it messes up all the nice syntax highlighting and auto-indenting. Hence I decided to invest an hour or two in creating a PHP-wrapper that would allow me to write PHP but render ExtJS JavaScript. It turns out it is pretty simple as my code will show.

Background

ExtJS code uses heirarchical JavaScript object structures where the objects are specialised by setting properties. A similar structure of objects can be specified in PHP and now that PHP 5 supports magic methods of __get and __set that make it is easy to set arbitrary properties of an object. This is the key to why the mapping ends up being simple.

Using the code

The included ZIP file contains a file demo.php that generates the screen shot shown at the start of this article.

Ext objects are mapped to the PHP class ExtObject. A few simple examples show the symmetry:

The PHP code:

$tab = new ExtObject('Ext.TabPanel');
$tab->renderTo = "tabs";
$tab->activeTab = 0;
$tab->autoHeight = true;
$tab->items = Array(
            new ExtObject(null, Array('title'=>'First Tab', 
                          'contentEl'=>'tab1',
                          'autoHeight'=>true
                          )
                  ),
            new ExtObject(null, Array('title'=>'Second Tab',
                          'contentEl'=>'tab2',
                          'autoHeight'=>true
                          )
                  )
            );

Generates the Javascript:

var tabs = new Ext.TabPanel({
  renderTo: 'tabs',
  activeTab: 0,
  autoHeight: true,
  items: [
    {
      title: 'First Tab',
      contentEl: 'tab1',
      autoHeight: true
    },
    {
      title: 'Second Tab',
      contentEl: 'tab2',
      autoHeight: true
    }
  ]
});  

And, the following PHP:

 $tab1->items = Array(new ExtObject(null, Array('fieldLabel' => 'Field 1',
                           'value' => ''
                           )
                   ),
             new ExtObject('Ext.form.TextArea', Array('fieldLabel' => 'Text area',
                                  'value'=> ''
                                  )
                   ),
             new ExtObject('Ext.form.Checkbox', Array('fieldLabel' => 'Check box',
                                  'value'=> true
                                  )
                   )
             );

Generates the following JavaScript:

var tab1 = new Ext.FormPanel({
  labelWidth: 150,
  url: 'part.submit.php',
  frame: true,
  bodyStyle: 'padding: 5px 5px 0',
  width: 500,
  defaults:   {
    width: 290
  },
  defaultType: 'textfield',
  items: [
    {
      fieldLabel: 'Field 1',
      value: ''
    },
    new Ext.form.TextArea({
      fieldLabel: 'Text area',
      value: ''
    }),
    new Ext.form.Checkbox({
      fieldLabel: 'Check box',
      value: true
    })
  ]
});

ExtObject also implements a method SetProperties(...) that allows an associative Array to be used to supply parameters. An example is shown below:

$tab1->SetProperties(Array('labelWidth' => 150,
               'url' => 'part.submit.php',
               'frame' => true,
               'bodyStyle' => 'padding: 5px 5px 0',
               'width' => 500,
               'defaults' => new ExtObject(null, Array('width' => 290)),
               'defaultType' => 'textfield'
               )
             );

A second object ExtPage is supplied to generate all the surrounding HTML code that is required. It has three properties:

  1. The page title
  2. The javascript code to be included in the <head> tag - the bulk to the ExtJS code
  3. Any HTML that should be included in the <body> tag

An example is shown below:

$page = new ExtPage('Demonstration');
$page->js = "
Ext.onReady(function(){
    Ext.QuickTips.init();
";
$page->js .= $tab->render('tabs');
$page->js .= $tab1->render('tab1');
$page->js .= "tab1.render('tab1');
});
";

$page->body = "<div id='tabs'>
  <div id='tab1' class='x-tab x-hide-display'></div>
  <div id='tab2' class='x-tab x-hide-display'>A tab</div>
</div>
";
$page->render(); 

Points of Interest

The crux of the code is the JSRender(...) method in the ExObject object. It decends the PHP object structure recursively to generate the equivalent JavaScript code. The static variable ExtObject::$indent is used to provide reasonable indenting for the output JavaScript code to make it easier to follow.

History

3-Jun-08 PJC: Fixed ExtJS link as per readers comment - thanks admirm :-)

License

This article, along with any associated source code and files, is licensed under The BSD License

About the Author

Paul Coldrey


Paul runs his own business providing software design and development services. By choice he would live in a Linux world but a large proportion of his work is done using Microsoft technologies.
Occupation: Software Developer (Senior)
Company: Lumient
Location: Australia Australia

Other popular Applications & Tools articles:

Article Top
Sign Up to vote for this article
You must Sign In to use this message board.
FAQ FAQ Noise ToleranceSearch Search Messages 
 Layout  Per page   
 Msgs 1 to 6 of 6 (Total in Forum: 6) (Refresh)FirstPrevNext
GeneralExcelentememberdadot28:02 18 Aug '08  
GeneralHow to use js variables?memberPer-Erik Modig0:32 4 Jul '08  
GeneralRe: How to use js variables?memberPaul Coldrey14:27 7 Jul '08  
GeneralCool articlememberRedKelvin15:09 3 Jun '08  
GeneralWrong link in text for ExtJSmemberadmirm10:36 2 Jun '08  
GeneralRe: Wrong link in text for ExtJSmemberPaul Coldrey14:12 2 Jun '08  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 27 May 2008
Editor:
Copyright 2008 by Paul Coldrey
Everything else Copyright © CodeProject, 1999-2008
Web16 | Advertise on the Code Project