Object Oriented Programming in PHP by ebd21054

VIEWS: 37 PAGES: 39

									Object Oriented Programming in
             PHP




     A framework for KEWL.NextGen
          Structure of workshop
●   Introduction
●   KEWL.NextGen framework overview
●   The Model/View/Controller design pattern
●   Writing KEWL.NextGen modules
●   Final words
                 Introduction
●   Me
●   My apps / history of PHP framework
●   Framework not finished work!
●   PHP has limitations
    KEWL framework overview




An architectural overview of the object-oriented PHP
            framework for KEWL.NextGen
          Aims of the framework
●   Easier to write modules
    (less code)
●   Easier to maintain modules
    (less boilerplate code)
●   Separation of areas of responsibility
    (contributes to both of above)
Architecture
           Roles of $objEngine
●   Load and run module controllers
●   Provide services to modules (object loading,
    template variables, generating URIs)
●   Manage display flow (content and layout
    templates)
      $objEngine: module loading
●   Module is selected by the 'module' URI query
    parameter:
                          ht t p://kngforge.uwc.ac.za/index.php?m odule= forum


●   Engine loads PHP script
    'modules/<MODULE>/controller.php'
●   Engine creates an object of class
    <MODULE>.
●   Engine calls dispatch method of object
           $objEngine: services
●   Class loading/object caching (getObject
    method)
●   Generating URIs (uri method)
                                   push/preserve/pop m echanism
●   Handling general authentication and
    authorisation
●   Handling session and template variables
          $objEngine: display flow
●   Content template contains
    page-specific content          Layout template

●   Layout template contains
    common navigational
    elements
                                   Content template
●   Content template rendered
    first, can specify non-
    default layout template plus
    page title etc
   MVC Design Pattern




The Model/View/Controller design pattern
               MVC Overview
●   MVC term was coined by inventors of
    SmallTalk, regarded by many as the original
    object-oriented language
●   Involves separation of an interactive
    application into three layers, model (the
    data), view (how the data is displayed) and
    controller (how the user interacts with the
    data)
          MVC overview (cont)
●   Several MVC frameworks for building
    traditional GUI applications (NeXTSTEP,
    MFC, wxWidgets)
●   Now perhaps even more popular as web
    architecture (Turbine, Struts, PHPMVC)
●   Also known as “model 2” especially in the
    Java world (classic ASP/PHP/JSP = model
    1)
          MVC Overview (cont 2)
●   MVC is a controversial term, with many
    conflicting views on exactly what constitutes
    a 'real' MVC architecture
●   Often hazy areas at the edges of layers
    where it is not clear into which layer a
    particular piece of code/functionality falls.
●   Guidelines not rules!
                    Why MVC?
●   Separates out both view and model logic, so
    they can be worked on independently (even if
    by same person)
●   Separates out layers by likelihood of change:
    view changes often; controller less often; and
    model relatively rarely.
●   The architecture is a good fit for web
    application flow      request -> processing ->     response

                               cont roller -> m odel -> v iew
             MVC: The Model
●   The model layer in MVC encapsulates the
    underlying data of the application and
    operations upon it.
●   In web apps usually an abstraction of access
    to the database
●   In the KEWL.NextGen framework, model
    objects usually extend 'dbTable'
              MVC: The View
●   The view layer encapsulates logic to display
    data to the user
●   In a web app usually implemented by display
    'templates'
●   In PHP the 'Smarty' template system is often
    used for this layer.
●   In KEWL.NextGen we are currently using
    PHP scripts as templates.
           MVC: The Controller
●   The controller layer handles user
    manipulation of the model
●   In some ways mediates between view and
    model (controversial)
●   In a web app handles form and URI
    parameters, manipulation of model (updating,
    filtering) and choice of view template
      Writing a module




Step-by-step guide to writing a module for
             KEWL.NextGen
              Writing a module
●   Not covered: module registration and
    uninstallation
●   Directory layout
●   Data and helper objects
●   The controller class
●   Content templates
                   Directory layout
–   modules/
     ●   controller.php
     ●   classes/
     ●   templates/
          –   content
          –   layout
     ●   register.php
     ●   uninstall.php
     ●   admin_controller.php
     ●   webservice_controller.php
         Data and helper objects
●   Defined in file named
    'CLASSNAME_class_inc.php'
●   Loaded by own module via:
     $this->getObject(“CLASSNAME”)
    or from other module via
     $this->getObject(“CLASSNAME”, “MODULE”)
           Model (data) objects
●   Derived from dbTable
●   Encapsulate details of data structure – shield
    other layers from those details
●   Should be usable in any context so...
●   Data (model) objects should not contain any
    HTML or code specific to the web
    environment
                Helper objects
●   Broad category, any additional logic that it
    makes sense to split off
●   Can provide service to controller, model or
    view but only one of the three
●   Many currently core classes can become
    helper or model objects
           Helper object examples
●   Model
    –   calculation and analysis routines
●   View
    –   controls (buttons, dropdowns, menus etc)
●   Controller
    –   form validation
             The controller class
●   Inherits from (PHP=extends) class 'controller'
●   Initialised via init() method
●   Asked to process a web request via
    dispatch() method
●   dispatch() returns name of content template
●   Access to engine services via baseclass
       The controller class (cont)
●   Request (query and form) parameters should
    be retrieved by calling
    $this->getParam()
●   Session variables should be set/retrieved by
    calling
    $this->getSession() and $this->putSession()
●   Errors by calling
    $this->setErrorMessage()
               Controller example
modules/helloworld/controller.php:

class helloworld extends controller
{
       var $objLanguage;

       function init()
       {
              $this->objLanguage =& $this->getObject('language',
'language');
       }

       function dispatch($action)
       {
              switch ($action)
              {
                     case 'dosomethingelse':
                            return $this->do_somethingelse();
                     case 'showhello':
                     default:
                            return $this->do_showhello();
              }
       }

       function do_showhello($action)
       {
              $this->setVarByRef('objLanguage', $this->objLanguage);
              $this->setVar('name', “Sean”);
              return 'hello_tpl.php';
       }
            Template selection
●   Template name is returned from dispatch()
●   First templates/content subdirectory of
    module directory is searched
●   Then templates/content subdirectory of root
    directory is searched (allows for generic
    templates)
              View templates
●   Currently written in PHP (not Smarty)
●   Should contain very limited logic – only
    display. No SQL, no messing about with form
    variables, just data display.
●   IMPORTANT: All URIs (URLs) that point
    back to the application must be generated by
    calls to $objEngine->uri()
             Content templates
●   Content template name returned by
    controller's dispatch() method
●   Contains page specific content – lists, forms,
    course content, discussion forum post etc
●   Not necessarily HTML can be XML, CSV or
    any other format
●   If necessary set layout template to null
                 Template variables
●   Data and/or objects are passed between controller and
    template via template variables
●   In controller:
      $this->setVar('rows', $rowsArray);
      $this->setVarByRef('objLanguage',
                    $this->objLanguage);
●   In view template:
      foreach ($rows as $row) {
           echo $objLanguage->languageText('Name').”: “;
           echo $row['name'];
      }
●   [[[ sidenote about objLanguage: _('name') ]]]
       Example content template

modules/helloworld/templates/content/hello_tpl.php:

<?php $objEngine->setVar('pageTitle',
                  $objLanguage->languageText(“Hello Title”) ?>

<h1><?php echo $objLanguage->languageText(“Hello Title”)</h1>

<p>
  <?php echo $objLanguage->languageText(“Hello”)?>,
  <?php echo $name ?>
</p>

<a href=”<?php echo $objEngine->uri('', 'main') ?>”>
  Home Page
</a>
              Layout templates
●   Contain common navigational elements
●   At present use $objSkin to provide
    skinnability – this is under discussion
●   Include content template's output via:
     <?php $objEngine->putPageContent() ?>

●   Have access to template variables set by
    content template
        Example layout templates
templates/layout/default_layout_tpl.php:

<?php
$objSkin->skinStartPage();
$objSkin->putBody();
$objEngine->putPageContent();
$objEngine->putMessages();
$objSkin->endpage("");
?>


templates/layout/alternative_default_layout_tpl.php:

<html>
<head>
<title><?php echo $pageTitle ?></title>
<link rel=”stylesheet”
            href=”<?php echo $objSkin->stylesheet()?>” />
</head>
<body><?php putPageContent(); ?></body>
</html>
               Final words




Miscellaneous remaining topics and discussion /
                 exercises
Standard modules

●   language
●   security
●   config
●   context?
●   skin?
                      Ideas
●   Extra layer of layout templates (one for
    module, one for application)?
●   Common baseclass for helper objects?
    Access to $objEngine?
●   Derek's tablesAdmin module – dynamic form-
    building and form-validation? XML
    description of data schema?
“There is certainly nothing keeping you from doing
MVC in ASP or PHP, even though that is not the
most immediately intuitive way to work with those
systems. In light frameworks like these, it is up to
you to introduce your own standards and systems to
organize your software.”
                                             -- Ian
Bicking

								
To top