Java程序辅导

C C++ Java Python Processing编程在线培训 程序编写 软件开发 视频讲解

客服在线QQ:2653320439 微信:ittutor Email:itutor@qq.com
wx: cjtutor
QQ: 2653320439
25/02/2015
1
CSCI110 brought you
PHP
and
More PHP
1
Now it’s time for
Still More PHP
2
What more could there be?
• Some cleanups
• Worthwhile additions
– ADOdb
• Automation of data persistence
– Smarty
• Separate display generation (view) from logic code and data
• A whole new “ball game”
– Zend framework
• A new model
• Automation of development
3
Some cleanups …
• (I’m not yet in the habit of using these – so don’t expect to 
see them in my examples!)
• “Never use $_GET again!”
–Instead, use PHP’s filter functions
– Why?
• You are less likely to miss out on sanitising your data
4
Filter functions
• You should use them (even if I don’t)
• Example “filter_input”
– Use to access $_GET, or $_POST (or $_COOKIE or 
$_SERVER)
– Request named data item
– Provide a filter function (from standard set)
• E.g FILTER_SANITIZE_EMAIL, 
FILTER_SANITIZE_NUMBER_INT, …
5
Filtering input
• Lerdorf’s name and age again …
$yourname = filter_input(INPUT_GET, ‘name’, 
FILTER_SANITIZE_SPECIAL_CHARS);
$yourage = filter_input(INPUT_GET, ‘age’, 
FILTER_SANITIZE_NUMBER_INT);
// Get NULL if variable (‘age’, ‘name’) not set
// Get FALSE if data failed by filter
6
25/02/2015
2
Other tidying up
• Namespaces – yes supported now
• “traits”
– As in Java, you can inherit from one class but you 
can “implement many interfaces” (or in PHP “use 
many traits”)
• …
7
Xdebug & Netbeans
• I think that I’ve correctly configured the lab so that 
you can use xdebug (from within Netbeans)
– Open PHP file that needs debugging (don’t they all?)
– Set some breakpoints
– Select project, right click and pick debug
8
Caveat
• Remember Drupal from CSCI110?
• Most of the examples that will be used in this 
“Still More PHP” section are relatively simple and 
could be implemented using the Drupal content 
management system and its various extension 
modules.
– Examples are kept simple so that you can learn about 
Smarty or Zend rather than some complex application 
domain.
9
Use Drupal when you can
• In practice, you should always consider Drupal 
before you commit yourself to developing new 
code for an application
– Your development time will be shorter
– Your maintenance burden will be smaller
– OK, run‐time performance might be poorer with a Drupal‐based solution; 
you do have to consider that too.
• In some cases, Drupal project performance is pretty woeful!
• Not everything can be done with Drupal or 
similar content management systems, but if they 
will suffice – use them!
10
A good programmer …
• Remember Larry Wall’s dictum
– Characteristics of a programmer
• Impatience
• Laziness
• Hubris
• You goal should be to work less while 
achieving more in less time 
– Achieved in part through use of automation tools
11
What do all web apps do?
• All (well, almost all) web apps use a relational 
database.
• What does that mean for you?
– Lots of messy SQL code
– Lots of code for copying data between your 
program’s structs/objects and SQL‐related 
structures like “prepared statements” and “result 
set rows”
– And, in conventional PHP, re‐doing it all if you 
need to work with a different database.
12
25/02/2015
3
Can we fix it?
• Database independent code
– Well that shouldn’t be too hard to fix
• Think of Java’s JDBC – same code, just different drivers 
loaded
– Try fixing this first
• Messy repetitive boring code
– Sounds like work for an automatic code generator. 
• Don’t want to have database specific code generators, 
so deal with this second
13
Can we fix it?
Yes we can
• ADOdb
– ADOdb started as a database‐neutral, procedural 
interface – something like ODBC, JDBC, or Perl’s 
DBI – which then grew into an automated “Object 
Relational Mapping” (ORM) system
There are several alternative PHP libraries that provide for database neutrality, and
lots of other PHP‐based ORM systems (we will be working mostly with the ORM created
for the Zend framework).  ADOdb is just an example.  If there is another one that you like,
or one that you learnt because your boss liked it, then use it.
http://adodb.sourceforge.net/
14
Database specific interfaces
• Database systems such as Oracle, DB2, SQLServer
etc were initially used from (C) programs through 
special libraries – e.g. the Oracle Call level 
Interface.
– These libraries defined a set of C functions and structs
(along with COBOL equivalents etc) that could be 
added to a program so that it could work with a 
database.
• Of course, each database system had a different 
library with different function names and 
different types of struct
– Your code was very much database specific
15
Database specific interfaces
• The libraries differed, but they all provided much 
the same functionality
– Connect to database
– Supply user credentials and specify schema required
– Submit SQL queries to be run by database
– Retrieve result sets, process row by row extracting 
data.
• Couldn’t a higher level abstraction capture all 
this?
16
Database neutral interfaces
Embedded SQL
• First attempt at a higher level abstraction (late 
1980s) was “Embedded SQL”
– Define a standard set of macros for those standard 
database operations
– Each database vendor provides a set of macro expansion 
templates that map onto their call level interface
• Works, but really messy and ugly
17
EXEC SQL BEGIN DECLARE SECTION;
varchar dbuser[10];
varchar dbpassword[15];
EXEC SQL END DECLARE SECTION;
strlcpy((char*)dbuser.arr, name, 9);
dbuser.len = strlen((char*)dbuser.arr);
strlcpy((char*)dbpassword.arr, password, 16);
dbpassword.len = strlen((char*)dbpassword.arr);
EXEC SQL CONNECT :dbuser IDENTIFIED BY :dbpassword;
18
25/02/2015
4
Database neutral interfaces
ODBC
• Second attempt – Open Database Connectivity
– “Open Group” (an industrial collaborative) defined a 
database‐neutral, procedural interface;
DB vendors were to provide function libraries that 
would have functions having the neutral interface that 
invoked work via the database specific call level 
interface
• Disadvantage – each database vendor very proud of the 
proprietary features and optimizations present in their own 
call level interface; these features lost when using ODBC
– Initially, only Microsoft bothered with ODBC
• Provided an implementation shortly after standard 
published in ~1992
19
ODBC copies
• ODBC model copied in other implementations 
in the 1990s
– DBI/DBD – Perl
– JDBC ‐ Java
• (The ODBC variants are very similar, differing primarily in the 
names that they give to various parts of the system – e.g. 
“database handle” or “connection”)
20
But PHP
• Traditionally, PHP programs used the database 
call level interfaces
– Remember, the PHP interpreter is in C, 
– It’s relatively easy to define a “PHP function” which is 
simply a direct call to a C function in a linked library.
• Why make the code database specific?
– Because
• It allows an application to exploit those special features and 
optimizations that the database vendors extol
• And, anyway, how often do you change your database? !
– In house developments will always use same database.
21
PHP extensions
Database neutral interfaces
• Some PHP developers did want database 
neutral interfaces
– Developing an application, e.g. a bulletin board 
system, that was intended to be configurable so 
that it would work with whatever database was 
available at site where installed
– Contract workers who develop many small 
applications and didn’t want to have to remember 
the many different call level interfaces
22
PHP variants on ODBC theme
• Several such libraries created
– ADOdb is just one
• Illustrate here with a simple web‐application
– Web application – select a toy for boy/girl in particular 
age group
– Databases (Oracle and MySQL versions) have a table 
with details of toys
• Illustrate first the database neutral bit – then move 
on to automation through Object Relational Mapping
23
ADOdb
• A generic database interface (equivalent to JDBC, 
ODBC, Perl’s DBI, …)
• Example
Static HTML form Script generated response
24
25/02/2015
5
Data table
• Same table defined in MySQL and Oracle
– MySQL version of definition:
CREATE  TABLE `mark`.`XmasStockingItems` (
`itemid` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL ,
`price` DECIMAL(8,2) NOT NULL ,
`agegroup` ENUM('Infant', 'Toddler', 'PreSchool', 
'Primary', 'Secondary') NOT NULL ,
`gender` ENUM('Boy', 'Girl', 'Either') NOT NULL ,
PRIMARY KEY (`itemid`) )
ENGINE = MyISAM
DEFAULT CHARACTER SET = latin1;
25
Oracle table
CREATE  TABLE XmasStockingItems (
itemid INT PRIMARY KEY ,
name VARCHAR(90) NOT NULL ,
price DECIMAL(8,2) NOT NULL ,
agegroup varchar(12) constraint ageconstrain
check (agegroup in ('Infant', 'Toddler', 'PreSchool', 'Primary', 'Secondary')),
gender varchar(8) constraint genderconstrain
check (gender in('Boy', 'Girl', 'Either'))
);
create sequence XmasSeq increment by 1 start with 1;
insert into XmasStockingItems values ( XmasSeq.NEXTVAL,
'Baby Einstein Take Along Tunes', 9.51, 'Infant', 'Either‘ );
insert into XmasStockingItems values ( XmasSeq.NEXTVAL,
'Yookidoo Flow N Fill Spout', 14.51, 'Infant', 'Either');
I made the prices in the two tables slightly different so that I could see from glance at results which table was being used
26
27
Database specific code: MySQL
Gift selection

A selection of suitable gifts

HEAD; if ($gender == "Either") { $stmt = $mysqli->prepare( "select name,price from XmasStockingItems where agegroup=?"); $stmt->bind_param("s", $agegroup); } else { $stmt = $mysqli->prepare( "select name,price from XmasStockingItems where agegroup=? and gender=?"); $stmt->bind_param("ss", $agegroup, $gender); } The usual – a mingling of presentation and code; will be resolved later  via Smarty 30 25/02/2015 6 Database specific code: MySQL $stmt->execute(); $stmt->bind_result($name, $price); while ($stmt->fetch()) { echo ""; } $mysqli->close(); echo << FOOT; ?> 31 Database specific code: Oracle Gift selection

A selection of suitable gifts

GiftPrice
$name\$$price
HEAD; if ($gender == "Either") { $stmt = oci_parse($myoracle, "select name,price from XmasStockingItems where agegroup= :aged"); oci_bind_by_name($stmt, ":aged", $agegroup); } else { $stmt = oci_parse( "select name,price from XmasStockingItems where agegroup= :aged and gender= :gnd"); oci_bind_by_name($stmt, ":aged", $agegroup); oci_bind_by_name($stmt, ":gnd", $gender); } Note some of SQL differences: with this version of OCI library, parameters must be named, e.g. :aged; cannot have ? parameters as in MySQL code. 34 Database specific code: Oracle … oci_execute($stmt); while ($row = oci_fetch_row($stmt)) { $name = $row[0]; $price=$row[1]; echo ""; } oci_close($myoracle); echo << FOOT; ?> 35 ADOdb: 1:  Database independence Param('age'); } else { $data['age'] = $agegroup; $data['gender'] = $gender; $sql = "select name,price from XmasStockingItems where agegroup=" . $myadodb->Param('age') . " and gender=" . $myadodb->Param('gender'); } 39 Param() when generating SQL • ADOdb has to generate different SQL for the  different databases – Its MySQL usage works with ? parameters – select name, price from XmasStockingItems where age=? – Its Oracle usage works with named parameters – select name, price form XmasStockingItems where age=:agegroup 40 ADOdb: 1:  Database independence $stmt = $myadodb->Prepare($sql); $rs = $myadodb->Execute($stmt,$data); while (!$rs->EOF) { $name = $rs->fields[0]; $price = $rs->fields[1]; echo ""; $rs->MoveNext(); } $rs->Close(); $myadodb->Close(); echo << FOOT; ?> 41 Automating data base access • Code for accessing database and retrieving data  is: – Simple – Stereotyped – Repetitious – cut & paste style – Long winded – Tiresome • Computers are supposed to help us by doing all  simple, tiresome, repetitious tasks • So get the computer to generate database access  code 42 25/02/2015 8 Automatic generation of database  access code • Quite straightforward 1. “Code generator tool” reads meta‐data from the database • Meta‐data identifies columns in a table and their data types • Meta‐data may identify things like use of database supplied  surrogate primary keys (the “record identifiers” from associated sequences or  auto‐increment numeric fields – the things Janusz tells you not to use) • Meta‐data should include “relationships” – from “foreign key”  constraints. 2. “Code generator tool” defines source code for a  programming language class corresponding to each table • Data members derived from columns of table • Accessor and mutator methods • Relationships may be modelled by “collection class” data  members 3. … 43 Automatic generation of database  access code • Quite straightforward 1. …  2. … 3. “Code generator tool” can create SQL statements that will  be used in code for data access • This code may be hidden, not exposed to developer 4. “Code generator tool” can create code used to bind‐ parameters and to extract data from a row in a result set,  putting these data into members of an instance of the  data‐object class that was defined earlier • This code may use “reflection” if this is supported by the  language (Java and some Microsoft languages) – Inefficient at run‐time, but code generation greatly simplified as  essentially the same implementation function can be used everywhere 44 Automatic code • Object‐relational mapping – Classes created by the code generator define the run‐ time objects – Relations • Objects with data members that are instances of other auto‐ generated classes • Objects with a “collection class” data member, e.g.  java.util.ArrayList, that may contain instance of other auto‐ generated classed – Code to map data between objects and SQL • Bind parameters for prepared statements • Extract data from row in result set  45 ORM • Object Relational Mapping! – We will be seeing several variants • ADOdb, and Zend’s for PHP • Java Persistence (JPA) • Started to appear in the 1990s – Java • Enterprise Java Beans 1 and 2 (1998 and later) – Version 1 – too limited; version 2 – clumsy and tied to EJB container • Hibernate, Kodo, JDO – open source ORM projects for Java (2000 and  later) • JPA – Java standard derived from Hibernate and Oracle projects – Microsoft: “Data Access Objects” for ASP and ASPX (.Net)  – PHP • Lots of variants from 2000 and later 46 ADOdb : 2: Automated Object‐Relational‐Mapping • Object‐Relational‐Mapping (ORM) – Row in table (or, sometimes, rows in tables) gets converted into object  in memory – You don’t write any SQL; instead you write code that is generally of form intermediary_object.fetch_me( the object corresponding to this key) intermediary_object.fetch_me_collection( objects with attributes satisfying this relation) … intermediary_object.save(updated object); • We will explore ORM more fully in context of Java Persistence  Architecture; ADOdb provides some ORM functionality for PHP http://phplens.com/lens/adodb/docs‐active‐record.htm 47 ADOdb_Active_Record • ADOdb_Active_Record – Class defined in ADOdb • Static methods – Handle things like setting up database connection and ORM subsystem • Base class for the classes that you will use for objects that are to  represent entities in database • So, for example, will need our own subclass of Active Record  to represent an item in the XmasStockingItems data table. include("adodb/adodb.inc.php"); include("adodb/adodb-active-record.inc.php"); class XmasStockingItem extends ADOdb_Active_Record{} 48 25/02/2015 9 Active_Record & ordinary SQL • Open a database connection, associated with the  Active_Record ORM, then use it whichever way is  best – Use it to run SQL operations • Operations that select only a few fields from table, and  operations that affect large numbers of records, are better done  using standard SQL – Use it ORM style • Retrieve individual objects or collections of objects 49 Class XmasStockingItem extends … • It is possible to define additional methods, but typically leave everything to ADOdb • ADOdb’s ORM system will use meta data in table to  determine what data members should be defined  for the class – You can view it’s definition of a class based on your table by invoking  var_dump() on an instance of the class that it generates. • object(XmasStockingItem)#5 (13) { ["_dbat"]=> int(0) ["_table"]=> string(17)  "XmasStockingItems" ["_tableat"]=> string(17) "XmasStockingItems" ["_where"]=>  NULL ["_saved"]=> bool(false) ["_lasterr"]=> bool(false) ["_original"]=> bool(false)  ["foreignName"]=> string(16) "xmasstockingitem" ["itemid"]=> NULL ["name"]=>  NULL ["price"]=> NULL ["agegroup"]=> NULL ["gender"]=> NULL } 50 ADOdb_Active_Record Find($quest); foreach($itemArray as $anitem) { echo ""; } echo << FOOT; ?> Maybe not the best API; you have to create a dummy instance of class to run the Find() method – would have been more appropriate to have a static function 54 25/02/2015 10 A slightly more elaborate object model … • An “aggregation relation” in your database – – A class whose instances each own a collection of objects from some  other class – 1‐to‐many relation • Example Schools SchoolTeachers 1 1..* Caution, ADOdb builds in some naming assumptions that can be difficult to override; you want a table Items for class Item; primary key of table should be an Int called id (This example is a small part of the schools/teachers/pupils example used to illustrate Java Persistence – see http://uow.edu.au/~nabg/399/JPA/JPA.pdf or use Google to search for Java Persistence Architecture. 55 Table definitions CREATE TABLE `homer`.`schools` ( `id` int(11) NOT NULL AUTO_INCREMENT, `schoolname` varchar(45) NOT NULL, `streetaddress` varchar(45) NOT NULL, `suburb` varchar(45) NOT NULL, `postocde` varchar(8) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1; Sorry Janusz, you cannot use this ORM system; this one insists on the use of a surrogate primary key.  In some of the more sophisticated systems, e.g. JPA, you can define a primary key class that is a composite of several simple data attributes – so Janusz, JPA should serve  you adequately (but none of the ORM systems can create code as good as your hand‐ crafted code). 56 School owns teachers. CREATE TABLE `mark`.`schoolteachers` ( `id` INT NOT NULL , `surname` VARCHAR(45) NOT NULL , `initials` VARCHAR(8) NOT NULL , `title` ENUM('Mr', 'Mrs', 'Ms', 'Miss') NOT NULL , `id_school` INT(11) NOT NULL , `role` ENUM('Principal','Kindergarten','Year-1','Year-2', 'Year-3','Year-4','Year-5','Year-6','Sport','Music and Drama', 'ESL', 'Special needs', 'Auxiliary', 'Relief') NOT NULL , PRIMARY KEY (`id`) , INDEX `fk_schoolteacher_1` (`id_school` ASC) , CONSTRAINT `fk_schoolteacher_1` FOREIGN KEY (`id_school` ) REFERENCES `homer`.`schools` (`id` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB DEFAULT CHARACTER SET = latin1; As usual, a school’s “ownership”of teachers is implicit from the foreign key constraint. 57 Data … insert into homer.schools values ( NULL, 'Kogarah Public School', '123 Dean Street', 'Kogarah', 'NSW2343'); insert into homer.schools values ( NULL, 'Hurstville Public School', '64 Market Street', 'Hurstville', 'NSW2332'); insert into homer.schoolteachers values ( 8239391, 'Green', 'M.B.', 'Mr', 2, 'Principal'); insert into mark.schoolteachers values ( 8467134,'Howard', 'P.P.', 'Mrs', 3, 'Principal'); insert into homer.schoolteachers values ( 8766523,'Pauls', 'A.S.', 'Ms', 2, 'Kindergarten'); …. 58 Application … • Dynamically generated form shows list of schools in  a  HEAD; $stmt = $db->Prepare( "select id, schoolname from mark.schools"); $rs = $db->Execute($stmt); … } Just want two fields, not complete objects, so better to use “SQL style” here 63 $stmt = $db->Prepare( "select id, schoolname from mark.schools"); $rs = $db->Execute($stmt); while (!$rs->EOF) { $id = $rs->fields[0]; $name = $rs->fields[1]; echo ""; $rs->MoveNext(); } $rs->Close(); echo <<
FOOT; }
GiftPrice
$name\$$price
$name\$$price
$anitem->name\$$anitem->price
"; foreach ($chosen->schoolteachers as $c) { echo ""; $str = $c->title . " " . $c->initials . " " . $c->surname; echo ""; echo ""; echo ""; } echo << FOOT; } $chosen‐>schoolteachers; when collection is used, ORM library code will generate and run a select query to retrieve those schoolteacher records whose foreign key, id_school, matches request 66 25/02/2015 12 ADOdb • Should be installed on machines in lab • php.ini files have to have references to the  database drivers – Typical PHP install will include MySQL driver – Need to edit the php.ini file to support Oracle • This should all have been done for machines in lab 67 The need for Smarty … • The code of those examples … – Code – Embedded echo … statements outputting strings with embedded  computed values. • PHP first sold on the premise that it was just a little code  embedded in a HTML page – So easy for a web‐designer to restyle the page • Real PHP programs have a lot of code with a some embedded  HTML and some output statements – Web‐designers will just mess things up if they attempt to restyle the page.  68 Can we separate compute and display  better? • Compute – Work out some values by combining input data and stored  information • Display – Embed computed values inside a lot of HTML and static  content text. • Maybe delegate display to a helper? 69 Model‐View‐Control • One small step toward a “Model‐View‐Control” framework – Idea dates back to Smalltalk systems created at Xerox‐Park in  the late 1970s • Model – Your data objects • View – How you display chosen data, and how your user inputs requests • Control – Receive input requests (submitted via a view) – Determine which data model they apply to and which request handler » You could have a monolithic “control” object with methods that handle all  requests and which operate on the data objects.   » Alternatively, the control object can act primarily as a dispatcher to a group of  specialized handler objects. – Decide what data are to be shown to user to confirm success of operation,  invoke appropriate view object. 70 ADOdb and Smarty • ADOdb – Essentially the “model” • Smarty – View system • Control – Ad hoc • You write your own code – With full MVC frameworks (CodeIgniter, Cake, Zend),  the “control” element is considerably elaborated and  is derived from classes provided by the framework While ADOdb and Smarty do roughly correspond to the model and view components of an MVC framework, they are somewhat simpler than typical framework components. 71 Smarty approach 1. “Template files” – HTML with a little “Smarty script code” • They are meant to be close enough to standard HTML so that  your colleagues (the ones with IT or ‘Creative Arts – Web’  degrees) can edit them with their favourite HTML editor and  make the pages all “pretty” – Smarty script code • Place value of some named variable here in the HTML • Iterate through collection of values – Generate some HTML (e.g. row of table) with current data value  here 2. Smarty object – … 72 25/02/2015 13 Smarty approach 2. “Smarty object” – Instance of class supplied by Smarty library – Has a field that you can set to contain a hash‐map  (PHP associative array) of (name, value) pairs. – “Compiles” the template into a PHP class • Methods with lots of echo statements to output the  HTML • Code to deal with things like processing members of a  collection • Code to extract values from the associative array and  output them – embedded into the standard HTML Kind of similar to way that Java Server Pages work (JSPs – which get compiled into servlet classes – are many years older, dating back to 1998). 73 Smarty object … • Smarty object – Will own a hash array (name=> value) • Your PHP code loads this with the elements whose values are to be included in the  generated web page – Is given a template • HTML and static content text • Smarty tags – “Compilation” will generate a file (that no‐one ever need see) that has these tags expanded into PHP – PHP code for smarty tags outputs selected elements from hash array etc – Is told to display the template • This is when it generates the hidden PHP file (essentially defining a subroutine with  lots of echo statements) and then loads the file and runs the subroutine. 74 Lab • Not the smartest of Smartys – The lab will have Smarty 2.6.26 as installed by  Synaptic Package Manager – Smarty 3 has been around for sometime • Improvements related to PHP‐5 • Some changes to scripting language • See http://www.smarty.net/v3_overview 75 Smarty version • With Ubuntu 14, now using Smarty 3 • One little trouble – Changes in syntax of smarty language • For 2015 have had to rework examples – (Not all examples updated; some, especially those using Smarty in the  simpler Zend related exercises will still show old syntax for Smarty for‐ loops etc) 76 Smarty language 77 http://www.smarty.net/docsv2/en/ Lab and Netbeans • Smarty plugin should be installed in the  Netbeans system in the lab – Essentially adds another specialized editor module  to Netbeans – one that is aware of the syntax of  Smarty’s scripting language – PHP code will “require_once” from standard install • Smarty requires four directories for files – templates, templates_c, configs, cache • The cache and templates_c directory need to be  writeable by the web‐server process 78 25/02/2015 14 Picking presents Smarty style • The application – HTML form file – PHP code – A template file (.tpl) • Netbeans project – Set up with all directories (little bit overkill for this  simple example) 79 Netbeans Smarty Present Chooser Directories must be given appropriate  permissions – 80 Project • HTML file – Nothing of consequence, same as first ADOdb example • PHP file – “require” code for Smarty and ADOdb – Initialize Smarty object • It needs to be told the location of the directories that Smarty  engine is to use – Retrieve data – ADOdb ORM style – Attach data to Smarty object – Tell Smarty object to use specified template to display data • Template file – Mix of HTML and Smarty scripting 81 PHP code Include the library code for ADOdb and Smarty Global smarty object Code to configure the smarty object ADOdb connection function Pick up form data, connect to chosen database, invoke function to initialize smarty object 82 PHP code Create, parameterize and run ORM style  ADOdb request Add data to the smarty object Smarty object uses template to display data 83 Template file Just name a data element that was added to Smarty object, its value will be displayed. Smarty script “foreach” loop working with “XmasStockingItem[]”; access fields of each to get values that are to be displayed. 84 25/02/2015 15 Template file • How is it working? • You can look at the “compiled” template: 85 Compiled template 86 Irritation • You may have to force recompilation of .tpl files after edits. – Remove contents of templates_c directory – Run the example again 87 Smarty script language • Duplicates/overlaps with CSS in places – You can have config files that contain data like  background colour for all your scripts • Simple flow‐control – foreach – if else 88 Some script examples from Smarty  manual • PHP (loading data) $arr = array(1000, 1001, 1002); $smarty->assign('myArray', $arr); $arr = array(9 => 'Tennis', 3 => 'Swimming', 8 => 'Coding'); $smarty->assign('myArray', $arr); • Smarty (displaying data)
    {foreach $myArray as $item}
  • {$item}
  • {/foreach}
    {foreach $myArray as $k=>$v}
  • {$k}: {$v}
  • {/foreach}
89 Also, in Smarty 3, note a “foreachelse” feature – simplifies things like showing a list orset of table rows for  a populated array, or a message “

No matching data

” for an empty array A larger example … Schoolies • Code and display largely separated • Smarty allows for “include” files so can build up  pages from different components 90 25/02/2015 16 A larger example … Schoolies • Smarty allows for “include” files in templates so can  build up pages from different components Really there are two pages – form and report.  They share the same “header” ‐ a block with an image; also, the same  “footer” – just a centred paragraph. Script: doGet() shows form, doPost() handles inputs. 91 The templates The School Board

92 The templates – form.tpl 93 This version is passed an array $schools, each entry is itself a two‐element array with school‐id and school‐name. The templates – form.tpl 94 This version is passed an associative array $schools with the school‐ids as keys and the names as values.  (This {html‐options … } construct can take additional arguments such as data defining the options(s) selected by default.) The templates – report.tpl Schoolies‐2: Teachers at your school {include file="header.tpl"}

{$schoolname}

Teachers employed
$str$c->role
{foreach $staff as $teach} {/foreach}
Teachers employed
{$teach->title}. {$teach->initials} {$teach->surname} {$teach->role}
{include file="footer.tpl"} 95 Code – with no messy outputs 97 98 doGet:SQL style get schoolnames, pass to  Smarty for use with form.tpl 99 (Shows both versions of code for the two templates $data[$id]=$name; is for the template using html_options; $data[] = array($id,$name); is for the for‐each loop version. form.tpl (as shown earlier) Schoolies-2: Pick your school {include file="header.tpl"}

Select school


{include file="footer.tpl"} 100 doPost:SQL style get schoolnames, pass to  Smarty for use with report.tpl function doPost() { global $db;global $smarty; connectToDatabase("mysqli://homer:doh@localhost/homer"); $whichone = $_POST['schoolid']; $chosen = new school(); $chosen->Load("id=?", array($whichone)); $teachers = $chosen->schoolteachers; $schoolname = $chosen->schoolname; $smarty->assign('schoolname', $schoolname); $smarty->assign('staff', $teachers); $smarty->display('report.tpl'); } 101 Smarty and ADOdb • ADOdb Active Record – automated ORM – Classes for your entities – “The Model” • Smarty – Templates – Automated View • Control? – Well it’s still in code that you write yourself  102 25/02/2015 18 Zend Framework 103 Current version (release Feb 2015) of Zend Framework 1 is 1.12.11; version for Ubuntu 14 is 1.11.11) Zend Framework • Pain! • It is “sophisticated” i.e. complicated. • There are tutorials but – For the most part, they don’t work • They miss out little but vital configuration details! – They are often unnecessarily complex • Trying to illustrate too many features in the one example. – They may be just plain wrong • Illustrating an exciting feature introduced in version x (but deprecated in  subsequent version y, and totally removed in version z) – tutorials don’t necessarily disappear from the Internet when no longer valid • So let us take this thing … slowly. 104 Simple scripts to frameworks : 1 • When you start PHP, it really is just a little bit  of script code in amongst the HTML 105 Simple scripts to frameworks : 2 • It very soon becomes “script code with little  embedded sections outputting chunks of HTML” – Output some HTML for head of page (echo from  “here” document) – Connect to database, run query, get result set – Loop through result set • Output a little standard HTML • Output some HTML with embedded values from row of result  set • Output some more standard HTML – Output more HTML for links, and for foot of page 106 Simple scripts to frameworks : 3 • Code for data access, blocks of text, code to output  text, code to embed values in blocks of text and output  result – As it grows, it all gets increasingly messy • Smarty style templates can represent a major  improvement – Code runs, builds a data structure of key=>value pairs  representing the dynamic information required by the user – Template for HTML output, template engine takes values  out of data structure and embeds them – Complete page output 107 Simple scripts to frameworks : 4 • But most realistic “web applications” involve  multiple scripts  – You are creating an application that has several  different classes of user who each have numerous  “use cases” in your original design • Often, similar but non‐identical use cases for different  classes of user – You typically end up with a PHP script (doGet => give  me the form, doPost => process my inputs) for each  use case • Quite possibly with a lot of code to check which class of user  and therefore which variant of the form, and what  differences in the handling of allowed inputs 108 25/02/2015 19 Simple scripts to frameworks : 5 • Web application – Lots of different PHP scripts • Each implements some unique aspect of the business logic (a  particular use case in your design) • But lots and lots of duplication – Authenticate user – authorize this action? – Access data base – Handle error – … • Maintenance problem – Fragmentation of code in scripts by original authors (who have  long since left the company) makes it difficult for maintenance  programmer to even find the code that has problems • Probable outcome is also partial fixes; problem fixed in one script but  not in another that has some similar buggy code. 109 Simple scripts to frameworks : 6 • Frameworks? – A whole variety • Struts (and many others) for Java since ~2000 • Rails for Ruby ~2003 • Zend, Symfony, Cake, CodeIgniter ~2005+ – On the whole, the frameworks have a similar  approach 110 Simple scripts to frameworks : 7 • A similar approach: 1. “It is a web application” • One program, not many different scripts 2. Based in some way on user inputs, it determines first  which “use case” is required and then in a standard  way performs the necessary authentication checks  and authorization controls. 3. It acts as a dispatcher to “use case handlers” that  will all be based on a standardized structure. 111 Simple scripts to frameworks : 8 • A similar approach: 4. Use case handlers will typically invoke operations of  other simpler components that will each return a  chunk of HTML;  these HTML chunks will be gathered up for later  assembly into a response page 5. Components will access persistent data through a  standardized persistence component, probably one implementing a form of Object  Relational Mapping scheme 6. A layout stage will combine the chunks of HTML  generated by the individual components into a final  presentation page based on some defined template Chunks of HTML, layout engine using a template – much the same principles as in Drupal etc 112 Simple scripts to frameworks : 9 • A similar approach: 7. All “configuration details” – what database, what  password, what collection of error messages etc – are  held in separately editable configuration files. A standard “configuration initialization” module  provided in the framework • Configures standard framework components • Can be utilized to configure application specific  structures as well 113 Complexity • Before you can use such frameworks, you need to  understand – How are use case requests recognized and dispatched? – How do you create “use case handlers”?   They are going to be concrete subclasses of some class provided  by the framework – but what class?  What methods must you define?  How are they registered with the application so that it can  recognize them? – Those components that generate chunks of HTML – again  subclasses of some framework class.   So once again, what class, what methods, how registered? How are they supposed to return “chunks of HTML”? – How does this configuration system work? 114 25/02/2015 20 Model‐View‐Control • The frameworks generally realize some form of  Model‐View‐Control partitioning of the work – The Model • Essentially, the persistent data • Generally handled as programming language classes auto‐ generated by an Object Relational Mapping Subsystem – The View • Building the content of a response page by having  components return page elements (chunks of HTML) • Using a template engine to layout the page elements and  compose the complete response page – The Control • The dispatcher and use‐case handlers 115 Model‐View‐Control • Model – Well, only a little more complex than ADOdb (and that  really wasn’t hard was it) • View – Somewhat more elaborate than Smarty • It is the two‐part nature (components building elements to go  into a final page, layout manager assembling a page) that can  make it seem more complex • Control – This is where the challenges come. 116 So, onto the Zend Framework • The framework code • An approach to mastering it 117 Zend Framework • Zend Framework – Firstly, it isn’t monolithic • There is a core framework that embodies an MVC approach to  building a PHP based web application • But there are also support libraries – Useful PHP classes (like everything else in the modern programming  world, it’s all based on classes) that can be employed in programs that  don’t require the full framework – You can slot in other subsystems • Zend Framework uses its own PHP‐based view generation  templates – but you can substitute Smarty • Zend Framework has a relatively simple Object Relational Mapping  subsystem (based on PDO – an alternative to ADOdb that is about the  same level of sophistication) but you can substitute something more  sophisticated like Doctrine http://www.doctrine‐project.org/ 118 Our approach • Explore some parts of the framework library that can  be used independently – Simple generally useful classes,  • e.g. a “paginator” that can help when a search has retrieved many  records, more than you wish to show in a single response page (the  paginator helps you show page 1 with matching records 1…10, page 2  with records 11…20 etc) – Zend’s data persistence classes (another simple ORM like  ADOdb) • These will illustrate Zend coding styles, its classes etc and illustrate its approach to configuring applications • When some basics have been covered, we can look at  the MVC framework http://www.uow.edu.au/~nabg/399/ZF/ZendFramework3.pdf 119 Zend Framework 1 Using classes from the library  independently of the overall  framework 120 25/02/2015 21 Haven’t we done this before? • We need to let persons on the Internet apply  to become members of our group and get  privileged access to our site. • But we want to keep out the spammers,  hackers, bots, and other riff‐raff 121 The application form • Data fields for name, address, email etc – all need to be  validated; email validation? How detailed? and how about a “CAPTCHA” to reduce the number of  applications by “bots” Completely Automated Public Turing test to tell Computers and Humans Apart 122 You can write it all yourself (again) • Or you can make use of standard library  classes for data validation, captcha generation  and checking etc. Example Netbeans project; Using the Zend library – classes like the CAPTCHA generator, and an email checker. Starting to adopt Zend’s approach to configuration. (Using Smarty for “view”) It is not yet a “Framework” application; none of the core framework classes used. 123 Using assorted Zend classes from PHP • Code for classes has to be added to your application – Specify library (standard) – But also then require_once(this), require_once(that), … • Made easier via the Zend “auto‐loader” class – Just create an Autoloader object in your program, it will  sort out loading of any Zend class that you use directly (or  indirectly via code in classes) 124 Application form script • GET – Create a CAPTCHA image • Zend code creates an image with a partially concealed string; it also places some data in $_SESSION (data used when checking  whether user has entered string correctly) • (Needs a writeable directory for the images) – Generate form • POST – Validate inputs • First the CAPTCHA • So the usual …   if method==Post handleApplication else displayform 125 Functions etc • smartysetup() – – the usual, configure Smarty engine for template output • display_member_form() – – select data elements, e.g. the CAPTCHA’s id, and add these to  the Smarty object, – Invoke Smarty template engine using a template for the form • rejectCandidate() – – Attach reasons for rejecting a candidate to Smarty object and  generate rejection page using a template • handle_member_application() – Validate inputs, maybe reject application, otherwise for now just  an acknowledgement 126 25/02/2015 22 generate() • Returns an id for image and places data in session state – Library code looks after the images directory, gets rid of  outdated images 128 The form Template needs script name (for “action” attribute of form) and captcha id (can compose  file name) 129 Pass id along, it is needed when checking. Smarty template file form.tpl 130 Pass id along, it is needed when checking. Image identifier Input text fields for name, email etc Smarty template file form.tpl (continued) 131 (Actually not the approved way to locate templates – and may not work in all versions of Smarty) A really simple Smarty template file! 132 25/02/2015 23 Validating inputs • Pick up the posted inputs, and check them – First, the CAPTCHA $captcha object has an isValid() method; this requires a hash map array with id of captcha and text of user input;  it is using data that Zend code placed in $_SESSION (so really need session id cookies etc – but that is all handled by the Zend library code). 133 Validating inputs • The rest of the inputs – Well typically you would • “white list” check inputs corresponding to  with options being the  names of schools as found in database Require the libraries; create a Zend “auto‐loader”, read the config file, create the Smarty template interpreter. Invoke initialization functions; then “Get” or “Post” – call appropriate handler 176 Initialization • Smarty object needs initialization as before; a  database adapter must be created. My smarty template files are actually in a project sub‐directory and not the template directory that I specified here! 177 Get ‐> display form • Run a query to get collection with all school names,  pass data to Smarty template – Here still using SQL strings composed “by hand” 178 Display form template • As shown earlier Iterate through “result set”; each row as array indexed by column‐names 179 Processing response • Pick up input from form (school name) and bind to  argument in SQL string • Run request to get teachers in that school No error checking?  Well it is meant to be an “in‐house” application and so less need for hacker defences.  (Of course, that is a poor excuse and it is really  just laziness – some hacker is bound to have enough free time to try to break it.) 180 25/02/2015 31 Teacher list template • Smarty creates a HTML