PEAR Manual

Edited by

09-03-2008

Copyright

Copyright © 2001 - 2008 by the PEAR Documentation Group. This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/).

Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder.

Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.

The PEAR Documentation Group consists of all the people that have contributed documentation to the PEAR manual. Representatives are listed on the front page of this manual. In case you would like to contact the group, please write to pear-doc@lists.php.net.

Copyright for the XML_RPC documentation

The documentation of the XML_RPC package has originally been written by Edd Dumbill as an independent document on his homepage and is published as part of the PEAR Manual under the following license restrictions:

Copyright © 1999,2000,2001 by Edd Dumbill, Useful Information Company

All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  • Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.

  • Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.

  • Neither the name of the "XML-RPC for PHP" nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.


Table of Contents
Preface
About this Manual
The structure of the Manual
Authors and Contributors
I. About PEAR
1. Introduction
2. Installation
3. Support
4. Coding Standards
5. PEAR2 Coding Standards
6. Contributing
7. FAQ - Frequently Asked Questions
8. Constitution
9. PEAR Group Administrative Documents
II. New Maintainers' Guide
10. Introduction
11. How best to contribute to PEAR
12. Joining the PEAR community
13. The formal proposal process
14. Taking over an unmaintained package
III. Developer Guide
15. Introduction
16. PEAR's meaning for developers
17. Contributing your own code
18. The package definition file package.xml
19. The package definition file package.xml, version 2.0
20. Releasing A Package
21. Supporting PEAR development
22. Recommendations
23. Writing documentation
IV. New features in PEAR 1.4
24. Introduction
25. Channels
26. Custom File Roles
27. Custom File Tasks
28. Post-installation Scripts
V. Core components
29. PEAR base classes
30. PEAR Installer classes
31. PEAR channel server REST interface
VI. Packages
32. Authentication
33. Benchmarking
34. Caching
35. Configuration
36. Console
37. Database
38. Date and Time
39. Encryption
40. Event
41. File Formats
42. File System
43. Gtk
44. Gtk2
45. HTML
46. HTTP
47. Images
48. Internationalization
49. Logging
50. Mail
51. Math
52. Networking
53. Numbers
54. Payment
55. PEAR
56. PHP
57. QA Tools
58. Science
59. Streams
60. Structures
61. System
62. Text
63. Tools and Utilities
64. Validate
65. Web Services
66. XML

Preface


About this Manual

This manual is written in XML using the DocBook XML DTD, using DSSSL (Document Style and Semantics Specification Language) for formatting. The tools used for formatting HTML versions are Jade, written by James Clark and The Modular DocBook Stylesheets written by Norman Walsh.

The basic structure is based on the great work already done by the PHP documentation group. Read About the PHP manual for more details.


The structure of the Manual

This guide explains the general structure, layout, and conventions used in the PEAR manual. The manual is divided into six main parts, they are:

  • About PEAR

    This section contains a gentle introduction to what PEAR is and has to offer. Included is general information about installing and using PEAR, support options, and answers to frequently asked PEAR related questions.

  • Developer Guide

    General information about developing and releasing PEAR-Packages.

  • Core components

    This section contains documentation about the core PEAR classes. These core components are the base to every PEAR class and understanding the basics will allow general use of the PEAR library. Topics include the PEAR base, PEAR administration, error handling through use of the PEAR_Error object, and system commands. These classes are generally shipped with every source PHP distribution.

  • Packages

    There are many PEAR packages with the number growing every day. Most every package is documented and most are not installed by default. For information on installing PEAR classes on your system, be sure to read the Installation chapter.

    Each documented class contains basic documentation about the packages publically available functions. There may also be additional information like an introduction, list of available constants, and example uses of the given package. Additional information may also exist within the package source files themselves.

    The description of each function may contain some or all of the following parts:

    • Synopsis

      Shows the structure and prototype of the function.

    • Description

      Gives a description about what the function does.

    • Parameter

      Describes each parameter for the function along with the parameter types and names. Both required and optional parameters are listed.

    • Returns

      Describes the returned value, if the function doesn't fail.

    • Throws

      Describes the returned PEAR_Error objects, if the function fails.

    • Note

      Additional notes and information about the function. An example note would be if the function can be called statically.

    • See

      Links to other related functions or manual entries.

    • Example

      An example use of the function or class.

  • Contributing to PEAR

    Contains information for writing your own PEAR Packages.


Authors and Contributors

The following is a list of people that are helping to maintain this documentation. If you would like to contact one of them, please write to pear-doc@lists.php.net.

  • Lorenzo Alberton

  • Gregory Beaver

  • David Coallier

  • Daniel Convissor

  • David Costa

  • Thomas V.V. Cox

  • Christophe Gesché

  • Ken Guest

  • Martin Jansen

  • Alan Knowles

  • Clay Loveless

  • Alexander Merz

  • Stefan Neufeind

  • Jon Parise

  • Tobias Schlitt

  • Stephan Schmidt

  • Mika Tuupola

  • Michael Wallner

  • Christian Weiske

  • Mark Wiesemann

(In alphabetic order.)

I. About PEAR


Chapter 1. Introduction

The PEAR Manifest

PEAR is dedicated to Malin Bakken, born 1999-11-21.


What is PEAR?

PEAR is short for "PHP Extension and Application Repository" and is pronounced just like the fruit. The purpose of PEAR is to provide:

PEAR is a community-driven project governed by its developers. PEAR's governing bodies are subdivided into the PEAR Group, Collectives, and a President. PEAR's constitution (adopted in March 2007) defining these groups is documented here. The PEAR project was founded in 1999 by Stig S. Bakken and quite a lot of people have joined the project.


Structured Libraries and Applications of PHP Code

The code in PEAR is partitioned in "packages". Each package is a separate project with its own development team, version number, release cycle, documentation and a defined relation to other packages (including dependencies). Packages are distributed as gzipped tar files with a description file inside, and installed on your local system using the PEAR installer.

Packages may relate to each other through explicit dependencies, but there is no automatic dependency relationship between packages based on the package name. For example, "HTTP_Post" is by default independent of "HTTP". Dependencies between packages with similar names is not forbidden, and does happen. As an example,the "DB_DataObject" package depends on the "DB" package.

A style guide, the PEAR Coding Standards (short PCS), exists to ease collaboration between PEAR developers, to enforce quality, and to enforce a consistent visual appearance of all source code distributed as a PEAR package.


Code Distribution and Package Maintenance

All PEAR packages are registered in and downloaded from a central server at pear.php.net. Other third-party servers called "channels" also distribute packages that can be installed by the PEAR Installer, see the Channels list for more information. pear.php.net does not endorse the packages from these channels, and only provides support for packages distributed from pear.php.net.

Pear.php.net provides both a human-friendly (HTML) and machine-friendly (currently REST) interface to the packages available from pear.php.net. All communication occurs over the HTTP protocol. Other functions the pear.php.net site provides are:

  • user account management (independent of the CVS server)

  • package management

  • release management

Packages are distributed as a gzipped tar file with an XML description file inside. The description file (package.xml) contains some information about the package, a list of files and their roles, and dependencies.


The PHP Extension Community Library (PECL)

PECL

PECL (pronounced "pickle") is a separate project that distributes PHP extensions (compiled code written in C, such as the PDO extension). PECL extensions are also distributed as packages and can be installed using the PEAR installer with the pecl command.

More information and all PECL packages can now be found on the PECL homepage.


Chapter 2. Installation

This chapter describes, how to install packages from PEAR.


Introduction

This chapter requires that you are already familiar with the general structure of PEAR.

The base installation that comes with the PHP distribution, contains all the stuff that is needed to run the PEAR installation tools etc. If you have a recent installation of PHP, you can relax: The PEAR base installation is already there, unless you have compiled your PHP with the ./configure flag --without-pear.

The packages that do not come with PHP can be installed with the PEAR package manager. The manager handles installation similar to Debian's "apt-get" package management utility, as well as others such as "yum". Again: If you are running a recent version of PHP (> 4.3.0) you can skip the next section. But if you are running PHP 4.2.* or earlier, you need to manually install the manager.

Apart from installing packages, the PEAR package manager also handles some other tasks: It can create new packages on your machine, manage a registry of installed packages, check dependencies and it can interact with an XML-RPC service on pear.php.net to serve some other tasks.


Getting the manager


Command line installer

Prerequisites

The following description requires the latest version of the PEAR package manager to be installed.

The command line installer is the easiest way to install PEAR packages on your system: It connects to the PEAR package server via a simple HTTP connection, loads the package on your system and installs it to the desired location.


Semi-automatic installation

If you have downloaded a package release from http://pear.php.net/ as a gzipped tar archive, you can also install it locally. To do this, run the following line on your shell:


$ pear install <file>.tgz
      

This command will automatically install the package and does not require an online connection. <file>.tgz has to be replaced with the name of the downloaded file.


Commands and Variables

Here's a list of commands available to the pear command line tool. Many of these commands may require root access to the server.

CommandDescription
buildBuild the extension from source
bundle Download and unpack a PECL extension
channel-addAdd a Channel (PEAR 1.4+)
channel-aliasSpecify an alias to a channel name (PEAR 1.4+)
channel-deleteRemove a channel from the list (PEAR 1.4+)
channel-discoverInitialize a channel from its server name (PEAR 1.4+)
channel-infoRetrieve information on a channel (PEAR 1.4+)
channel-updateUpdate an existing channel (PEAR 1.4+)
clear-cacheClear the XML-RPC cache
config-createCreate a default configuration file (PEAR 1.4+)
config-getEcho a specific configuration setting
config-helpShow information about a setting
config-setSet a specific configuration setting value
config-showShow all configuration setting values
convertConvert a package.xml 1.0 format to package.xml 2.0 format (PEAR 1.4+)
cvsdiff Execute and display a "cvs diff -u" on all files within the package
cvstagSet a CVS release tag
downloadDownload a package but not install it
download-allDownloads every available package
infoDisplay information about a package
installInstall a package, will report with success or failure
listList installed packages
list-allList all packages, packaged and/or available
list-channelsList available channels (PEAR 1.4+)
list-filesList files in an installed package (PEAR 1.4+)
list-upgradesList available upgrades for the installed packages
loginConnects and authenticates to the remote PEAR server
logoutLogs out from the remote PEAR server
makerpmBuilds a RPM spec file from a PEAR package
packageBuild a package
package-dependenciesShow package dependencies
package-validateValidate package consistency
remote-infoInformation about remote packages
remote-listList remote packages
run-scriptsRun post-install scripts bundled with a package (PEAR 1.4+)
run-testsRun regression tests
searchSearch the remote package database
shell-testDo a shell script test
signSign a package distribution file
uninstallUninstall and remove a package
update-channelsUpdate the channel list (PEAR 1.4+)
upgrade Upgrade a package to the current version (see also: preferred_state)
upgrade-allUpgrade all packages (see also: list-upgrades)

And here's a list of available PEAR configuration variables. Use the config-get, config-help, config-set, and config-show command options to use these configuration variables. While installing PEAR on the system, PEAR will attempt to replace the default values with values specific to the given server. Adjust accordingly.

Variable NameDescriptionDefault Value
bin_dirDirectory where executables are installed/usr/bin
doc_dirDirectory where documentation is installed/usr/lib/php/docs
ext_dirDirectory where loadable extensions are installed./
php_dir Directory where PHP files are installed (like PEAR files) /usr/lib/php
cache_dirPEAR installer cache directory, and used by XMLRPC/tmp/pear/cache
data_dirDirectory where data files are installed/usr/lib/php/data
php_binThe PHP CLI or CGI binary for executing scripts/usr/bin/php
test_dirDirectory where regression tests are installed/usr/lib/php/tests
cache_ttk Number of seconds that the local cache is used, and not updated (Time To Kill) 3600
preferred_state Preferred package state: stable, beta, alpha, devel, or snapshot stable
umask umask used when creating files (Unix-like systems only) 22
verboseDebug log level: 0-3 where 3 is full debug mode.1
http_proxy The optional HTTP proxy address (host:port) used when downloading packages  
remote_config Remote configuration file, used to mirror a local installation on a remote server through ftp. (PEAR 1.4+)  
auto_discoverAuto-discover new channels from command line or dependencies0
default_channelDefault channel (PEAR 1.4+)pear.php.net (pecl.php.net if using the pecl command)
preferred_mirrorPreferred channel mirror (PEAR 1.4+)pear.php.net (pecl.php.net if using the pecl command)
master_serverPEAR server [deprecated in PEAR 1.4+]pear.php.net
passwordPEAR password (used by maintainers) 
sig_binSignature handling program/sw/bin/gpg
sig_keydirSignature key directory/etc/pearkeys
sig_keyidThe key used for signing 
sig_typePackage signature type (only gpg)gpg
usernamePEAR username (used by maintainers) 


Installation of a local PEAR copy on a shared host

Many users have a shared provider that grants access to a system-wide PEAR installation. However, in many cases, it is advantageous to have a local copy of PEAR that can be used for packages that are not installed by the host provider. There are ways of installing PEAR both for users with a telnet/ssh shell access and users who only have ftp access.


Installing a local copy of PEAR through ftp/ftps/sftp

There are two ways to install a local copy of PEAR through ftp: the old, difficult way, and the new, easy way. The new, easy way requires an upgrade to version 1.4.3 or newer of PEAR.


New improved method using PEAR 1.4.3+ and PEAR_RemoteInstaller

Installing a local copy of PEAR through ftp has become a piece of cake in PEAR 1.4.3+.

One of the banes of many user's existence is trying to install PEAR on a remote host that does not have shell access. Often, the only choice is to use FTP, but even this is a problem for more complex packages that take advantage of installer features like replacements.

Here is the sequence necessary to get things running:

  1. Make sure you are running PHP 5.0 or newer on your local computer

  2. If you wish to use ftps, make sure you have enabled the openssl extension on your local computer in php.ini.

  3. If you wish to use sftp, make sure you have enabled the ssh2 extension on your local computer in php.ini.

  4. Make sure you have a working copy of the CLI version of PEAR on your local computer (the "pear" command, not the web interface)

  5. Make sure you have ftp access to the remote host, and write access through ftp. (sftp or ftps is highly recommended for security reasons).

  6. Note the full path to your home directory

  7. Create a customized configuration file for both the local and remote host

  8. Upload the remote configuration file to the remote host

  9. Using the local configuration file, set the remote_config value to the location of the configuration file on the remote host

  10. Manage packages at will using the remote-install, remote-uninstall, remote-upgrade and remote-upgrade-all commands.

1. Make sure you have a working copy of the CLI version of PEAR (the "pear" command, not the web interface)

Read The installation instructions.

2. Install package PEAR_RemoteInstaller locally if not already done.

3. Make sure you have ftp access to the remote host, and write access through ftp

This is pretty straightforward - if you can login using the ftp command in a DOS prompt or from a unix shell, you have ftp access.

Write down the user and password that you need to login.

Testing write access is easy. If you can upload a file, you have write access.

4. Note the full path to your home directory

This is also pretty straightforward. Upload this script to the root directory of your web host to find out:

<?php
echo dirname(__FILE__);
?>

Chances are, it will be something like: /home/username/htdocs or /home/username/public_html. When you log into ftp, if you can change directory to /home/username, that's great.

5. create a customized config file for both the local and the remote host

This is also quite simple. Here is how to do this on windows and unix.

Windows first:

Pick a location to store your local copy of the remote code. For example, C:\remote\pear. From a Command prompt (click Start here => Programs and search for the Command Prompt), type:

C:\> mkdir remote
C:\> cd remote
C:\remote\> mkdir pear
C:\remote\> cd pear
C:\remote\pear> pear config-create -w C:\remote\pear remote.ini
C:\remote\pear> pear config-create /home/username/pear .pearrc

In Unix, follow a similar process:

$ cd
$ mkdir remote
$ cd remote
$ mkdir pear
$ cd pear
$ pear config-create /home/mylocaluser remote.conf
$ pear config-create /home/username/pear .pearrc

6. upload the remote configuration file to the remote host

This is straightforward - in both operating systems, use ftp to upload .pearrc to /home/username/pear/.pearrc

7. using the local configuration file, set the remote_config value to the location of the configuration file on the remote host

If you wish to use unencrypted ftp (remember: this is inherently insecure), then use ftp:// as your stream. If you wish to use ftps, then use ftps:// as your stream. If you wish to use sftp, then use ssh2.sftp as your stream.

The path you use for the remote_config variable may need to be a full pathname, as in:

ssh2.sftp://user:pass@myremotehost.com/home/username/.pearrc

If the initial connection attempt fails, try a relative path as in:

ftps://user:pass@myremotehost.com/.pearrc

To set the value of the remote_config configuration variable, use this syntax:

In windows:

C:\remote\pear\> pear -c remote.ini config-set remote_config \
    ftp://user:pass@myremotehost.com/.pearrc

In Unix:

$ pear -c remote.conf config-set remote_config \
    ftp://user:pass@myremotehost.com/.pearrc

8. Manage packages at will using the remote-install, remote-uninstall, remote-upgrade and remote-upgrade-all commands.

From this point on, you can synchronize the local and the remote repositories.

How does it work?

The installer installs the package locally, and then uses ftp streams and uploads a copy of each locally installed file to its equivalent location remotely. All commands that affect installation (install, uninstall, upgrade, and upgrade-all) have corresponding remote- commands (remote-install, remote-uninstall, remote-upgrade, remote-upgrade-all). The "remote_config" option tells the installer how to retrieve the remote configuration file containing absolute paths where packages should be installed.

The remote configuration file is used for any special tasks such as replacements. In other words, if a file expects to get the path to data files through the data_dir configuration directive, then it will have the path on the remote host (/home/username/pear/data) rather than the local copy ( C:\remote\pear\data). Note that packages installed this way will not work on the local machine, and should be thought of as a backup copy. In an emergency, you can always just upload the entire contents to the remote host using ftp or scp.

It is important to note that some packages install themselves differently on windows and on unix. Be sure you know whether this is the case before installing, or ensure that your local and remote systems are the same kind of operating system. In addition, your local packages may depend on PHP extensions. To ensure these are available on the remote server, use the output of phpinfo(); to determine which extensions are available.


The traditional way of installing a local copy of PEAR through ftp

In order to install a local copy of PEAR through ftp, you must have an ftp client that can set permissions on upload. First, create a directory that is NOT in your publicly accessible web space, and name it anything you'd like. Set it to be readable and writable by any user (permissions 0777). Then, download a copy of http://pear.php.net/go-pear and save it as go-pear.php. Upload go-pear.php to a subdirectory of your publicly accessible web space. It is a very good idea to password-protect the directory containing go-pear.php with an .htaccess file.

Next, browse to the go-pear.php file. If your web address is http://www.example.com/, you have placed go-pear.php in public_html/install/go-pear.php, and http://www.example.com/ will browse to public_html/, then browse to http://www.example.com/install/go-pear.php. Follow the installation prompts. When asked where to install PEAR, choose the directory you created to be readable and writable by any user. You will need to know the location of the cli version of PHP. To find this, browse to this script and copy the output:

<?php
echo `which php`;
// if this does not work, also try echo PHP_BIN;
?>

After PEAR has been installed, you can use the web installer to install and upgrade packages just as you would with any other PEAR installation. To use the files, you must set the include path in scripts on the website.

<?php
ini_set('include_path', '~/pear/lib' . PATH_SEPARATOR
        . ini_get('include_path'));

// From PHP 4.3.0 onward, you can use the following,
// which especially useful on shared hosts:
set_include_path('~/pear/lib' . PATH_SEPARATOR
                 . get_include_path());
?>


Manual installation

Warning

We removed this section, because, today, manually installing a package requires a deeper understanding of the way how packages are organized and what happens during the installation process. You should read the section about the package.xml in the Developers Guide (Chapter 18 and Chapter 19), if you really want install a package without the PEAR installer.

If you want to install PEAR on a remote host without shell access, you should look into the Section called Installation of a local PEAR copy on a shared host.


CVS installer

This passage will describe how to install the latest development version of a PEAR package from CVS.

It is NOT recommended to run a package from CVS in working environments! Because CVS versions are not regular releases, this means:

You should use a package from CVS only, if:

  • The maintainer recommended it for you.

  • You want to help in development of a package.

  • You really need a special patch or function, which is not currently released.

If you still want to install a package from CVS, you have to do the same steps like a package maintainer creating a new release of a package. If you have problems following the next steps, take a look into the Developers Section of the manual.

  1. Get the package files from CVS like described in http://www.php.net/anoncvs.php

    The name of the module to checkout is pear/<packagename>, i.e. cvs -d :pserver:cvsread@cvs.php.net:/repository checkout pear/HTTP_Client.

  2. Check the package.xml file, especially the dir and file entries. They must match the existing files and directory structure. If they differ, contact the package maintainer and ask for an update of the package.xml.

  3. Create a valid package using the PEAR Installer pear package <path to package.xml>

  4. If you have already installed the package: remove it to avoid version conflicts: pear uninstall <package>

  5. Install your package archive: pear install <package-file>

    Now, you have a CVS version installed!

You should upgrade to an official release of the package as early as possible. Before you install the official release, uninstall the CVS version to avoid version conflicts.


Chapter 3. Support

This chapter describes, how you can get support, if you have questions concerning PEAR.


The mailing lists

Overview

As in most other open-source projects, the support is done via mailing lists. In our case, we currently have seven PEAR related mailing lists:

The first four lists are intended to help you, if you have questions. Please read below to get to know, what list fits to your needs. The CVS commit list is intended for people that are contributing to PEAR: All commits to our revision control system (CVS) are sent to this list. The core and QA lists are intended for people that want to take part in the development of PEAR.

You can subscribe to the PEAR mailing lists via this website.


The General mailing list

The PEAR general mailing list is the mailing list, where you ask, if you have a question about installing PEAR, using a certain PEAR package etc.

The list is not a support forum for questions concerning the usage of PHP. Please use php-general@lists.php.net instead.


The documentation mailing list

This list is the place where all the things concerning the PEAR documentation, the manual etc. are discussed.

If you want to help out documenting PEAR packages don't hesitate to drop a mail there.


The QA mailing list

People interested in improving the overall quality of PEAR come together on the QA list.

The Quality Assurance team is always seeking people that want to help. If you are interested, just sign up and announce yourself on the mailing list.


The core mailing list

This list is the place, where the core infrastructure of PEAR is discussed. Members of this list also come from other PHP projects such as PECL and PHP QA, since the PEAR infrastructure is also relevant to these projects (like the PEAR installer, the PEAR website etc.).

Specifically the list is concerned with the following topics:

  • New features for the PEAR website

  • PEAR installer development

  • PEAR standards definition


#PEAR on IRC

The PEAR project has its own IRC channel #PEAR, which is available on EFnet. Come along and meet the gurus, which don't have to pay for their internet connection and can hang around in IRC the whole day.


Chapter 4. Coding Standards

Note: The PEAR Coding Standards apply to code that is part of the official PEAR distribution. Coding standards often abbreviated as CS among developers and they aim to keep code consistent to be easily readable and maintainable by most of PEAR folks.


Comments

Complete inline documentation comment blocks (docblocks) must be provided. Please read the Sample File and Header Comment Blocks sections of the Coding Standards to learn the specifics of writing docblocks for PEAR packages. Further information can be found on the phpDocumentor website.

Non-documentation comments are strongly encouraged. A general rule of thumb is that if you look at a section of code and think "Wow, I don't want to try and describe that", you need to comment it before you forget how it works.

C style comments (/* */) and standard C++ comments (//) are both fine. Use of Perl/shell style comments (#) is discouraged.


Header Comment Blocks

All source code files in the PEAR repository shall contain a "page-level" docblock at the top of each file and a "class-level" docblock immediately above each class. Below are examples of such docblocks.

<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Short description for file
 *
 * Long description for file (if any)...
 *
 * PHP versions 4 and 5
 *
 * LICENSE: This source file is subject to version 3.0 of the PHP license
 * that is available through the world-wide-web at the following URI:
 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
 * the PHP License and are unable to obtain it through the web, please
 * send a note to license@php.net so we can mail you a copy immediately.
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Original Author <author@example.com>
 * @author     Another Author <another@example.com>
 * @copyright  1997-2005 The PHP Group
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    CVS: $Id:$
 * @link       http://pear.php.net/package/PackageName
 * @see        NetOther, Net_Sample::Net_Sample()
 * @since      File available since Release 1.2.0
 * @deprecated File deprecated in Release 2.0.0
 */

/*
* Place includes, constant defines and $_GLOBAL settings here.
* Make sure they have appropriate docblocks to avoid phpDocumentor
* construing they are documented by the page-level docblock.
*/

/**
 * Short description for class
 *
 * Long description for class (if any)...
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Original Author <author@example.com>
 * @author     Another Author <another@example.com>
 * @copyright  1997-2005 The PHP Group
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/PackageName
 * @see        NetOther, Net_Sample::Net_Sample()
 * @since      Class available since Release 1.2.0
 * @deprecated Class deprecated in Release 2.0.0
 */
class Foo_Bar
{
}

?>


Required Tags That Have Variable Content

Short Descriptions

Short descriptions must be provided for all docblocks. They should be a quick sentence, not the name of the item. Please read the Coding Standard's Sample File about how to write good descriptions.

PHP Versions

One of the following must go in the page-level docblock:

@license

There are several possible licenses. One of the following must be picked and placed in the page-level and class-level docblocks:

For more information, see the PEAR Group's Licensing Announcement.

@link

The following must be used in both the page-level and class-level docblocks. Of course, change "PackageName" to the name of your package. This ensures the generated documentation links back your package.

@author

There's no hard rule to determine when a new code contributor should be added to the list of authors for a given source file. In general, their changes should fall into the "substantial" category (meaning somewhere around 10% to 20% of code changes). Exceptions could be made for rewriting functions or contributing new logic.

Simple code reorganization or bug fixes would not justify the addition of a new individual to the list of authors.

@since

This tag is required when a file or class is added after the package's initial release. Do not use it in an initial release.

@deprecated

This tag is required when a file or class is no longer used but has been left in place for backwards compatibility.


Using CVS

This section applies only to packages using CVS at cvs.php.net.

Include the $Id$ CVS keyword in each file.

The rest of this section assumes that you have basic knowledge about CVS tags and branches.

CVS tags are used to label which revisions of the files in your package belong to a given release. Below is a list of the required and suggested CVS tags:

Only the RELEASE tag is required, the rest are recommended for your convenience.

Below is an example of how to tag the 1.2.0 release of the Money_Fast package:

By doing this you make it possible for the PEAR web site to take you through the rest of your release process.

Here's an example of how to create a QA branch:

The QA_2_0_0_BP tag is a "branch point" tag, which is the start point of the tag. It's always a good idea to start a CVS branch from such branch points. MAINT branches may use the RELEASE tag as their branch point.


Naming Conventions


Error Handling Guidelines


Definition of an error

An error is defined as an unexpected, invalid program state from which it is impossible to recover. For the sake of definition, recovery scope is defined as the method scope. Incomplete recovery is considered a recovery.

In this example the objective of the method is to connect to the given DSN. Since it can't do anything but ask PEAR DB to do it, whenever DB returns an error, the only option is to bail out and launch the exception.

This second example shows an exception being caught and recovered from. Although the lower level connectDB() method is unable to do anything but throw an error when one database connection fails, the upper level connect() method knows the object can go by with any one of the configured databases. Since the error was recovered from, the exception is silenced at this level and not rethrown.

The recovery produces side effects, so it is considered incomplete. However, the program may proceed, so the exception is considered handled, and must not be rethrown. As in the previous example, when silencing the exception, logging or warning should occur.


Error Signaling in PHP 5 PEAR packages

Error conditions in PEAR packages written for PHP 5 must be signaled using exceptions. Usage of return codes or return PEAR_Error objects is deprecated in favor of exceptions. Naturally, packages providing compatibility with PHP 4 do not fall under these coding guidelines, and may thus use the error handling mechanisms defined in the PHP 4 PEAR coding guidelines.

An exception should be thrown whenever an error condition is met, according to the definition provided in the previous section. The thrown exception should contain enough information to debug the error and quickly identify the error cause. Note that, during production runs, no exception should reach the end-user, so there is no need for concern about technical complexity in the exception error messages.

The basic PEAR_Exception contains a textual error, describing the program state that led to the throw and, optionally, a wrapped lower level exception, containing more info on the lower level causes of the error.

The kind of information to be included in the exception is dependent on the error condition. From the point of view of exception throwing, there are three classes of error conditions:

  1. Errors detected during precondition checks

  2. Lower level library errors signaled via error return codes or error return objects

  3. Uncorrectable lower library exceptions

Errors detected during precondition checks should contain a description of the failed check. If possible, the description should contain the violating value. Naturally, no wrapped exception can be included, as there isn't a lower level cause of the error. Example:

Errors signaled via return codes by lower level libraries, if unrecoverable, should be turned into exceptions. The error description should try to convey all information contained in the original error. One example, is the connect method previously presented:

Lower library exceptions, if they can't be corrected, should either be rethrown or bubbled up. When rethrowing, the original exception must be wrapped inside the one being thrown. When letting the exception bubble up, the exception just isn't handled and will continue up the call stack in search of a handler.

The case between rethrowing or bubbling up is one of software architecture: Exceptions should be bubbled up, except in these two cases:

  1. The original exception is from another package. Letting it bubble up would cause implementation details to be exposed, violating layer abstraction, conducing to poor design.

  2. The current method can add useful debugging information to the received error before rethrowing.


Sample File (including Docblock Comment standards)

The source code of PEAR packages are read by thousands of people. Also, it is likely other people will become developers on your package at some point in the future. Therefore, it is important to make life easier for everyone by formatting the code and docblocks in standardized ways. People can then quickly find the information they are looking for because it is in the expected location. Your cooperation is appreciated.

Each docblock in the example contains many details about writing Docblock Comments. Following those instructions is important for two reasons. First, when docblocks are easy to read, users and developers can quickly ascertain what your code does. Second, the PEAR website now contains the phpDocumentor generated documentation for each release of each package, so keeping things straight here means the API docs on the website will be useful.

Please take note of the vertical and horizontal spacing. They are part of the standard.

The "fold markers" (// {{{ and // }}}) are optional. If you aren't using fold markers, remove foldmethod=marker from the vim header.

<?php

/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */

/**
 * Short description for file
 *
 * Long description for file (if any)...
 *
 * PHP versions 4 and 5
 *
 * LICENSE: This source file is subject to version 3.0 of the PHP license
 * that is available through the world-wide-web at the following URI:
 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
 * the PHP License and are unable to obtain it through the web, please
 * send a note to license@php.net so we can mail you a copy immediately.
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Original Author <author@example.com>
 * @author     Another Author <another@example.com>
 * @copyright  1997-2005 The PHP Group
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    CVS: $Id:$
 * @link       http://pear.php.net/package/PackageName
 * @see        NetOther, Net_Sample::Net_Sample()
 * @since      File available since Release 1.2.0
 * @deprecated File deprecated in Release 2.0.0
 */

/**
 * This is a "Docblock Comment," also known as a "docblock."  The class'
 * docblock, below, contains a complete description of how to write these.
 */
require_once 'PEAR.php';

// {{{ constants

/**
 * Methods return this if they succeed
 */
define('NET_SAMPLE_OK', 1);

// }}}
// {{{ GLOBALS

/**
 * The number of objects created
 * @global int $GLOBALS['_NET_SAMPLE_Count']
 */
$GLOBALS['_NET_SAMPLE_Count'] = 0;

// }}}
// {{{ Net_Sample

/**
 * An example of how to write code to PEAR's standards
 *
 * Docblock comments start with "/**" at the top.  Notice how the "/"
 * lines up with the normal indenting and the asterisks on subsequent rows
 * are in line with the first asterisk.  The last line of comment text
 * should be immediately followed on the next line by the closing asterisk
 * and slash and then the item you are commenting on should be on the next
 * line below that.  Don't add extra lines.  Please put a blank line
 * between paragraphs as well as between the end of the description and
 * the start of the @tags.  Wrap comments before 80 columns in order to
 * ease readability for a wide variety of users.
 *
 * Docblocks can only be used for programming constructs which allow them
 * (classes, properties, methods, defines, includes, globals).  See the
 * phpDocumentor documentation for more information.
 * http://phpdoc.org/docs/HTMLSmartyConverter/default/phpDocumentor/tutorial_phpDocumentor.howto.pkg.html
 *
 * The Javadoc Style Guide is an excellent resource for figuring out
 * how to say what needs to be said in docblock comments.  Much of what is
 * written here is a summary of what is found there, though there are some
 * cases where what's said here overrides what is said there.
 * http://java.sun.com/j2se/javadoc/writingdoccomments/index.html#styleguide
 *
 * The first line of any docblock is the summary.  Make them one short
 * sentence, without a period at the end.  Summaries for classes, properties
 * and constants should omit the subject and simply state the object,
 * because they are describing things rather than actions or behaviors.
 *
 * Below are the tags commonly used for classes. @category through @version
 * are required.  The remainder should only be used when necessary.
 * Please use them in the order they appear here.  phpDocumentor has
 * several other tags available, feel free to use them.
 *
 * @category   CategoryName
 * @package    PackageName
 * @author     Original Author <author@example.com>
 * @author     Another Author <another@example.com>
 * @copyright  1997-2005 The PHP Group
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    Release: @package_version@
 * @link       http://pear.php.net/package/PackageName
 * @see        NetOther, Net_Sample::Net_Sample()
 * @since      Class available since Release 1.2.0
 * @deprecated Class deprecated in Release 2.0.0
 */
class Net_Sample
{
    // {{{ properties

    /**
     * The status of foo's universe
     *
     * Potential values are 'good', 'fair', 'poor' and 'unknown'.
     *
     * @var string
     */
    var $foo = 'unknown';

    /**
     * The status of life
     *
     * Note that names of private properties or methods must be
     * preceeded by an underscore.
     *
     * @var bool
     * @access private
     */
    var $_good = true;

    // }}}
    // {{{ setFoo()

    /**
     * Registers the status of foo's universe
     *
     * Summaries for methods should use 3rd person declarative rather
     * than 2nd person imperative, beginning with a verb phrase.
     *
     * Summaries should add description beyond the method's name. The
     * best method names are "self-documenting", meaning they tell you
     * basically what the method does.  If the summary merely repeats
     * the method name in sentence form, it is not providing more
     * information.
     *
     * Summary Examples:
     *   + Sets the label              (preferred)
     *   + Set the label               (avoid)
     *   + This method sets the label  (avoid)
     *
     * Below are the tags commonly used for methods.  A @param tag is
     * required for each parameter the method has.  The @return and
     * @access tags are mandatory.  The @throws tag is required if the
     * method uses exceptions.  @static is required if the method can
     * be called statically.  The remainder should only be used when
     * necessary.  Please use them in the order they appear here.
     * phpDocumentor has several other tags available, feel free to use
     * them.
     *
     * The @param tag contains the data type, then the parameter's
     * name, followed by a description.  By convention, the first noun in
     * the description is the data type of the parameter.  Articles like
     * "a", "an", and  "the" can precede the noun.  The descriptions
     * should start with a phrase.  If further description is necessary,
     * follow with sentences.  Having two spaces between the name and the
     * description aids readability.
     *
     * When writing a phrase, do not capitalize and do not end with a
     * period:
     *   + the string to be tested
     *
     * When writing a phrase followed by a sentence, do not capitalize the
     * phrase, but end it with a period to distinguish it from the start
     * of the next sentence:
     *   + the string to be tested. Must use UTF-8 encoding.
     *
     * Return tags should contain the data type then a description of
     * the data returned.  The data type can be any of PHP's data types
     * (int, float, bool, string, array, object, resource, mixed)
     * and should contain the type primarily returned.  For example, if
     * a method returns an object when things work correctly but false
     * when an error happens, say 'object' rather than 'mixed.'  Use
     * 'void' if nothing is returned.
     *
     * Here's an example of how to format examples:
     * <code>
     * require_once 'Net/Sample.php';
     *
     * $s = new Net_Sample();
     * if (PEAR::isError($s)) {
     *     echo $s->getMessage() . "\n";
     * }
     * </code>
     *
     * Here is an example for non-php example or sample:
     * <samp>
     * pear install net_sample
     * </samp>
     *
     * @param string $arg1  the string to quote
     * @param int    $arg2  an integer of how many problems happened.
     *                       Indent to the description's starting point
     *                       for long ones.
     *
     * @return int  the integer of the set mode used. FALSE if foo
     *               foo could not be set.
     * @throws exceptionclass  [description]
     *
     * @access public
     * @static
     * @see Net_Sample::$foo, Net_Other::someMethod()
     * @since Method available since Release 1.2.0
     * @deprecated Method deprecated in Release 2.0.0
     */
    function setFoo($arg1, $arg2 = 0)
    {
        /*
         * This is a "Block Comment."  The format is the same as
         * Docblock Comments except there is only one asterisk at the
         * top.  phpDocumentor doesn't parse these.
         */
        if ($arg1 == 'good' || $arg1 == 'fair') {
            $this->foo = $arg1;
            return 1;
        } elseif ($arg1 == 'poor' && $arg2 > 1) {
            $this->foo = 'poor';
            return 2;
        } else {
            return false;
        }
    }

    // }}}
}

// }}}

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * c-hanging-comment-ender-p: nil
 * End:
 */

?>


The PEAR toolbox

PEAR provides some tools to help developers keep their code clean and free of coding standards related errors.

For one there is PHP_CodeSniffer which can be used to detect coding standard errors in your scripts. Further, whole PEAR CVS repository is checked each night for violations - the results can be found at PEAR QA results overview page as well as on the linked subpages which explain the errors in detail.


Chapter 5. PEAR2 Coding Standards

Coding Standards to be used in PEAR2 (version 1)

Note: This document cannot be considered complete (e.g.: the future of namespaces is uncertain).

  • This document describes the coding standards and coding conventions for the new PEAR2 repository.

  • These coding standards will expire on March 1, 2008, and must be reviewed and renewed by the PEAR Group in order to continue

  • Packages that wish to be accepted into the PEAR2 repository must conform to these standards

  • The minimum PHP version supported will be the earliest version that supports namespaces, most likely PHP version 5.3.0. This RFC will be updated as soon as the exact version is known.

  • No Exceptions to this rule

  • package.xml 2.0 or newer is required for all packages


Introduction

PEAR 1.x is very successful at managing the universe of PEAR-installable code. The new Pyrus installer is designed to expand that universe to include code that can also be easily embedded in non-PEAR applications and that runs identically when simply unzipped and when installed. The PEAR2 repository must adhere to different coding conventions than the PEAR repository to make this possible. This document itemizes all the changes to existing rules and coding standards found here. Any conflict between these standards and the existing standards resolves in favor of the new standards. These standards do not affect the coding standards for PEAR packages hosted at pear.php.net, only PEAR2 packages hosted at pear2.php.net.

require_once introduces a rigidity to package structure that limits the possible uses of a PEAR package. Some of the problems:

  • require_once can introduce up to a 10% performance penalty on high-volume sites using multi-processor web servers due to increased latency. However, most users would experience at most 2% performance penalty on single-processor systems (as measured by Yahoo! engineer Gopal Vijayaraghavan)

  • include_path is required in order to use a package. This makes it difficult to bundle a PEAR package within another application with its own include_path, to create a single file containing needed classes, to move a PEAR package to a phar archive without extensive source code modification.

  • When top-level require_once is mixed with conditional require_once, this can result in code that is uncacheable by opcode caches such as APC, which will be bundled with PHP 6.

  • Relative require_once requires that include_path already be set up to the correct value, making it impossible to use a package without proper include_path.

Some of the benefits of require_once:

  • You know right away if a file is missing, with a Fatal Error: missing file X (this is mitigated by using __autoload() with PEAR2_Autoload()).

  • End-users don't need to know what files are within a package to use it (also mitigated by using __autoload() with PEAR2_Autoload()).

The removal of require_once necessitates another method for loading internal dependencies, both files within a package and external files. This proposal introduces 2 possible methods for doing this:

  • use __autoload() in conjunction with PEAR2's custom autoload solution (found here in svn)

  • construct a customized solution for loading needed files

In all cases, the onus of loading needed files is shifted to the end user. However, for beginning users, the only required step is to load PEAR2/Autoload.php, which will be always bundled with new packages, but only extracted if used as unzip-and-go (pyrus would simply install the dependency on PEAR2, which would contain the needed base files PEAR2_Exception and PEAR2_Autoload).
<?php
  require '/full/path/to/PEAR2/Autoload.php';
  // now you can start using all PEAR2 packages
?>
PEAR2/Autoload.php automatically sets up include_path if it does not contain the correct value, and also automatically declares an autoloader either using __autoload() or spl_autoload_register(), preserving existing autoloaders set up by the user.


Rules

We will describe the list of rules that form the standards


Directory structure

Follows the directory structure in the PEAR2 Subversion repository:

PEAR2/Package_Name/
    src/      <-- all role="php"
    data/     <-- all role="data"
    tests/    <-- all role="tests"
    doc/      <-- all role="doc"
    www/      <-- all role="www"
    examples/ <-- role="doc" example files 
                  (php executable files that exemplify package usage)

Note that all package.xml files must specify a baseinstalldir of "/" for the src/ directory:

<contents>
  <dir name="/">
  <dir name="src" baseinstalldir="/">
  ...
</contents>

Chapter 6. Contributing

This chapter describes the different ways in which one could contribute to PEAR.


Submitting Patches

If you have modified a package to expand its functionality or to fix a bug, you should contribute your changes back to the community (some licenses force you to do so, and it is generally considered immoral not to).

Before creating the patch, you must first obtain the latest sources of the package you wish to patch from CVS by running the commands (the package in this example is Foo_Bar):

cvs -d:pserver:cvsread@cvs.php.net:/repository login

password is phpfi

cvs -d:pserver:cvsread@cvs.php.net:/repository co pear/Foo_Bar
Now that you have the latest sources, you can edit the relevant file(s). Make sure that your patch is fully compatible with the PEAR
coding standards.

After you have finished adding/changing the code, TEST it: We will not accept code that hasn't been carefully tested. When you are absolutely sure the new code doesn't introduce bugs, create a unified diff by running:
cd pear/Foo_Bar
cvs diff -u >Foo_Bar.diff
The resulting .diff file contains your patch. This diff makes it easy for us to see what has been changed.

The next step is to submit the patch. There are basically two options to do this: The first option is to submit the patch by creating a bug report for the package in question. You can do this by visiting the package homepage on pear.php.net and clicking on the "Bugs" tab at the top of the page. Another option is sending a mail to pear-dev@lists.php.net and Cc'ing the maintainer(s) of the package. The subject of the mail should be prefixed with '[Patch]' to make it clear you are submitting a patch. Also include a verbose explanation of what the patch does. Don't forget to attach the .diff file to the mail. The maintainers of the package are usually listed in the header of each source file. Apart from that their email addresses are available on the package information page on http://pear.php.net/.

Note: If you are using Outlook or Outlook Express, please change the file extension of the diff file to .txt, because Outlook's MIME-Type detection depends on the file extension and attachments with a MIME-Type not equal to text/plain will be rejected by our mailinglist software.

Note: If your patch does break backwards compatibility, the chances are fairly good that the maintainers won't be happy about it. Thus you should always try to fix a bug in a way that does not seriously change the public API. But if there is absolutely no way to keep backwards compatibility and/or if your patch contains a groundbreaking improvement, even API changes are fine.


Reporting Bugs

If you think that you have found a bug in a PEAR package, please take care that you are using the latest version of the package and that your system does meet the packages' requirements.

If the bug still persists with the latest version of the package, don't hesitate to fill out a bug report. The easiest way is to click the link "Bugs" on the package information page for the package on the PEAR Homepage, which you think contains a bug. This will take you to a list of existing bugs of the package. Please double check if the bug hasn't already been reported! If you are unable to find it in the list, you can click on "Report new bug" to fill out the bug form.

More information and tips on how to report bugs in a proper way can be found at http://bugs.php.net/how-to-report.php.

If you have already fixed a bug that you have found in a package, please read this.


Writing & Translating Documentation

Good documentation is essential for users to fully understand any software. Several PEAR packages lack documentation or have docs which need improvement. Writing documentation provides more information about helping out on this front.

Translating documentation is another important task. Not only does new documentation need to be translated into the existing languages, additional languages are welcome. Also, existing translations need to be brought up to date because the English versions have been changed. Help on how to perform the translation process is in the Revision Tracking section of the manual.


Wishlists

Some of the PEAR developers have wishlists at Amazon or a similar service. If you appreciate the work of a certain developer, feel free to buy something for her from her wishlist. To find out if a developer has one of those wishlists, go to the account browser, look for the details of the developer and there you'll see if she has a wishlist. Buying something from people's wishlists may even speed up the time in which annoying bugs are fixed ;-).


Chapter 7. FAQ - Frequently Asked Questions


User FAQ


I have a question about PEAR. Where should I ask?

Information on subscribing this mailing lists can be found here.

On all mailing lists mentioned above the language is english and the way you ask questions should always be polite :-).


Does PEAR work on Mac OS X?

answer by Brett Bieber

All Mac OS X versions up until 10.5 come with PEAR by default. Mac OS X 10.5 (Leopard) users will need to install PEAR using the standard installation instructions.

If you are a OS X 10.4 or lower user, you may wish to upgrade to a newer version of PHP using a binary installable package such as Marc Liyanage's PHP packages. If you have installed another PHP package, you may have two versions of PHP and PEAR installed on your system. To be sure which version you are using, type which pear in your console to find out where PEAR is located, and pear -V to find out some info about the pear version, and also pear config-show to see the configuration details.

If you have not made any modifications to the default Max OS X install, the PEAR version you are running is the /usr/bin/pear which is configured for the PHP 4 version distributed with OS X. If this is the case, there are a couple options to use a PHP 5 version on your Mac.

If you're using Marc Liyanage's PHP package, you can specify the full path to your PHP5 PEAR installation. For example /usr/local/php5/bin/pear install {packagename} to install a package for your PHP 5 installation (installing/upgrading packages will probably require sudo).

Alternatively, you can change every path for the OS X provided PEAR using pear config-set. Remember to specify all paths necessary to point to your PHP 5 installation.

What I prefer to do, is remove the Apple supplied PHP 4 with sudo rm /usr/bin/php /usr/bin/pear and then symbolically link php and PEAR in /usr/bin to the location where Marc Liyanage's packages are installed: sudo ln -s /usr/local/php5/bin/php /usr/bin/php && sudo ln -s /usr/local/php5/bin/pear /usr/bin/pear. Keep in mind, Apple occasionally updates PHP on OSX, which will revert your /usr/bin/php to their distributed version. Pay attention to software update, and read the information regarding updated software bundled with OS X updates.

Note: It is uncertain if Apple will continue to distribute PHP version 4 for Mac OS X <= 10.4. So these instructions may change, and may differ for your specific version of Mac OS X. Always consult the Apple documentation to understand the default install provided before making modifications.


Why does my browser show strange warnings when logging in to the website?

You are seeing the warnings because pear.php.net uses a SSL key that is signed by CAcert, whose root certificate is unfortunately not bundled with most browsers.

If you are using a Mozilla browser, you can import the certificate on this site by clicking on the link "Root Certificate (PEM Format)". When asked if you want to trust the new Certificate Authority, you need to check at least the "Trust this CA to identify web sites." box and click "Ok".

People using Internet Explorer may find help here.

Mac OS X users must download the above mentioned PEM file. The certificate can then be imported with the "Keychain Access" utility via "Import" in the "File" menu.


Installing into customized windows folders fails

To know that the folder has a customized view, Windows sets the "read-only" attribute to the folder. The "read-only" attribute is not actually used to control write access. You can create files in a "read-only" folder. http://support.microsoft.com/default.aspx?scid=kb;en-us;326549

The PEAR Installer detects the read-only attribute and refuses to install into these folders. Unfortunately, there is no way to distinguish between customized folders and actual read-only folders on Windows.

The work-around is to avoid installing PEAR packages into customized Windows folders.


The downloaded go-pear.php isn't parsed by PHP! Why?

If you have followed the instructions for getting go-pear.php and you are using e.g. Windows and the Internet Explorer, you might get the strange effect that -- although you have named the file go-pear.php -- the file isn't parsed and the PHP source code of it is shown.

The problem is that e.g. the Internet Explorer saves the file as a HTML file with some HTML code around the PHP source code to display the code nicely.

To avoid this problem, you should use the source code view of your browser, e.g. by clicking with the right mouse key and selecting "Show source code" from the context menu. If you save now the file that is shown in your editor as go-pear.php, PHP will be able to parse the file properly.

Please note that the Windows versions of PHP have a file named go-pear.bat bundled. It is recommended to use this batch file on Windows instead of using go-pear.php.


Developer FAQ


I have written a PHP module in C. What are the rules of including this in PEAR?

The PECL project (a spin-off from PEAR) is the place where C extensions for PHP are published.


What licenses are allowed in PEAR/PECL?

Currently PEAR supports the following list of licenses:

Other licenses may be added to this list on a case-by-case basis. Please get in touch with the PEAR developers mailing list for this.

The allowed licenses were chosen to allow integration into closed source, open source as well as commercial applications. The only limitation is that the original credits must stay in the sources. For LGPL the license additionally requires that all changes to the source code must be licensed under the LGPL to anyone the source is distributed to.

From time to time people raise concerns of using PEAR packages licensed under the PHP license in GPL'ed code. In a discussion about this topic, the creator of PHP, Rasmus Lerdorf, issued the following statement:

It all comes down to semantics of what linking means. The PHP license is pretty much identical to the Apache license and you could indeed make a case for not allowing any GPL'ed software to be "linked to" from Apache either.

See http://www.apache.org/licenses/LICENSE-1.1.

The PHP license was chosen to match the Apache license because Apache and PHP are tied so closely to each other.

This hair splitting over linking, derivation and aggregation has been going on since the beginning of time. My stance is that you can indeed ship PHP licensed PEAR components on the same cd or in the same tarball as GPL'ed code because I see it as an aggregate work. This changes if you take PEAR code, modify it and copy-paste it directly into your own work. Then it moves from aggregate to derived. But the intent of the PEAR components is to be used in aggregate form. The PHP license allows you to use it in derived form as well, of course, but then you should be choosing a license other than the GPL for the derived work.

The FSF has a FAQ on aggregation here: http://www.fsf.org/licensing/licenses/gpl-faq.html#MereAggregation

That text is heavily biased towards compiled software and they talk about executables and memory spaces which don't really apply in this case. If you don't consider using a PEAR component as aggregation then it logically follows that you also cannot have Apache call your code so you will have to stipulate that nobody can use your code from Apache. I think this is an extreme interpretation that pretty much nobody out there shares.

In short, I don't see an issue here. Move along.

For PECL extensions that are linked into PHP, the license must be compatible with the PHP license. That means you can not GPL a PECL extension or you would be violating the GPL. Note also that if you write an extension that links against a GPL'ed library you will be violating the GPL. If you need to link against a GPL'ed library, get permission from the author of the library to use the library under a compatible license.

The license of any PEAR/PECL package can be found in the head of all source code files, inside the <license> tag of the package description file (package.xml) and also on the package homepage.


Documentation/translation FAQ


Is there a tool to help PEAR manual translators to track files changes?

Working on the translations is not just translating an English file and committing the results. Much of the work is needed to update the already translated ones, to get in sync with the content of the English files. To follow the modifications in the English tree, you should subscribe to the PEAR documentation mailing list to get CVS commit messages, or read the archives. If you never update your files, the translations can get useless.

Updating a foreign language file can get difficult, as you may not know when and who translated that file, so you may not know where you should look for the updates needed. We have one system for tracking the revisions and modification dates of the files in peardoc.


The Revision Comments

Instead of storing all responsibilities in a central file, the revision comment system stores them in the files they provide information about. Information about translator, revision numbers, and status information is stored in the revision comment. Let's see what would be in the header of the example file bookinfo.xml file in this case:
<!-- EN-Revision: 1.16 Maintainer: jane Status: ready -->

We can see the revision number for the last english file used to update the translation (EN-Revision: 1.16), the translator cvs account name. But we can also add some other status information in the case it is needed (eg. "partial" for incomplete translations). This revision comment system is basically about storing the information in the XML files, and not in a central place. This is extremely convenient now, as there are more than 2400 files in the English tree.

Currently, all three fields (English revision, Maintainer, Status) are needed. Maintainer is intended to be a CVS user name, or some nickname without a space, status can be anything without a space. Note, that this header is not updated by CVS (in contrast with $Revision, which is updated automatically). This is only updated when you edit the contents of the comment yourself.

You may see this as a good thing, but using these comments, you lose the quick look on the whole list of your files. No, you do not lose this, but get much more! If you would like to build a full list of you files, you can go to the /peardoc/ directory and run:
./scripts/revcheck_pear.php xx > revcheck.html
Here xx is the imaginary language code. After running this script you'll get a revcheck.html in the same directory. You can find revision comparisons and links to diffs for all the files in this language. You can also add a further restriction parameter, the maintainer name, so the script will only list the files corresponding to the given maintainer.

There are some optional extensions introduced for this script, to be available in this generated HTML page. This is why the translation.xml files are introduced. Here comes a simple translation.xml file for the imaginary xx language :
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE translation SYSTEM "../dtds/translation.dtd">

<translation>

 <intro>
  This is some introductory text for the xx language translators
  about who is the manager of the translation, and where to find
  more information. This paragraph is printed on the top of the
  generated revcheck.html page.
 </intro>

 <translators>
  <person name="Joe Doe"     email="joe@hotmail.com"
   nick="joedoe" cvs="yes" editor="yes"/>
  <person name="Jane Smith"  email="jsmith@yahoo.com"
   nick="jane"   cvs="yes"/>
  <person name="Joe Forever" email="joe@forever.net"
   nick="joefo"  cvs="no"/>
 </translators>

 <work-in-progress>
  <file name="appendices/aliases.xml" person="joedoe"
   type="working"/>
  <file name="functions/dbx.xml"      person="joefo"
   type="working"/>
 </work-in-progress>

</translation>
In this file, you can add users without a CVS account, and can assign ready documents or work-in-progress files to them. The biggest advantage of using this addon is that all this information is used to generate dynamic tables of translators and files in the revcheck.html file. All translators are linked to from the individual files they are assigned to, and there is a nice table showing the state of files for all the translators. Assigning ready files may be needed if a time consuming update is in progress on that file.

There are two optional parameters you can add to a <file>, if you would like to record it: the date and revision. Date is assumed to be the date when the work was started, revision is the checked out revision of the English file used to start the work (denoted as CO-Revision in the generated table). There is currently no fixed format for the date parameter.

Another addon to this system is just to give credit to all people who worked on one file, and not just the current maintainer. To achieve this goal, we added the credit comments. One credit comment in eg. history.xml may look like this (in case Joe Doe translated the file initially, but Jane followed him to be the maintainer):
<!-- CREDITS: joedoe -->
The credits comment can contain a comma-separated list. These comments only affect the display of the translators table in revcheck.html.



Chapter 8. Constitution

The PEAR Constitution

PEAR's constitution was adopted by majority vote of active PEAR developers on 2007-03-08, see the Official Results.


Summary of Important points

The following summary of the constitution is only intended to clarify the most important features of the constitution. The text starting with Constitution is the official Constitution of PEAR.

  • Most importantly, this document's main purpose is to enable developers to innovate in a supportive environment, to foster good will between developers, to encourage best practices and to provide a clear path for resolving disputes. PEAR is about bringing PHP developers together to provide great solutions to the problems we encounter every day through the PHP language, it is ideal if the constitution is ancillary to the main activity at pear.php.net: coding.

  • Developers have supreme power over ultimately what bugs/features will be assigned to specific roadmap versions, and to releasing package versions. Developers will have to cede some control over API decisions/QA/docs to the collective that contains their package. Developers may be expected to mentor a new developer and help introduce them to the systems within PEAR (how to package, document, test, etc.)

  • In other words, the bulk of the day-to-day power will remain with developers, but some of the QA decisions and individual ownership will be relinquished to the collective that contains the package.

  • Collectives have supreme power over packages within the collective in terms of API decisions, QA, documentation, defining the way collaboration works in the collective, choosing a collective leader or leaders, self-promotion of packages within the collective and assigning mentors to new developers of packages within the collective.

  • The PEAR Group only has power over issues that affect all of PEAR such as coding standards, CVS karma, and all major decisions made about PEAR as a whole. For example, licenses allowed and what defines a collective are two issues that only the PEAR Group can resolve.

  • The PEAR president has no power over any of the things above, except for the ability to veto a PEAR Group decision. The president cannot create policy. The president's main job is public relations, talking to people outside of PEAR like an ambassador, trying to recruit new developers or bring packages into PEAR, and to solve big emergencies in a hurry such as finding a new hosting provider should the donated space for pear.php.net disappear.


Official Constitution


IV. PEAR Group responsibilities


Communication

pear-dev@lists.php.net (or php.pear.dev newsgroup) remain the official channels for all PEAR communications. Specific enhancements to the website may of course be created in the future to facilitate better communication.


Chapter 9. PEAR Group Administrative Documents

One of the jobs of the PEAR Group is to issue administrative documents about diverse topics in PEAR. This chapter contains all of them.


Package Directory Structure

Let's assume we have a package The_Package_Name that contains one or more sub-classes (eg. The_Package_Name_Module), with some documentation (perhaps a README, copies of RFCs, etc.), a battery of test scripts (unit tests, regression tests, etc.), and it uses some data files (localization strings, etc.), the dir tree would look like:

The_Package_Name
|-- Name (contains Module.php)
|-- data
|-- docs
|   `-- examples
|-- misc
|-- scripts
`-- tests

Name refers to the last part of the The_Package_Name, all subclasses of the main class, should be put in there or subdirectories of it. You can refer to http://cvs.php.net/cvs.php/pear/Cache_Lite/ - the directory Lite as an example (this basically documents what we currently do anyway).

The data and misc directories are optional, because it will not make sense to have them for every single package in PEAR.

The directories that are required are docs/examples and tests. A package may have no extra documentation, but it should have at least one example. There must also be some basics test to be able to verify that the package is working. The preferred type of testing script system to use is PHPUnit or .phpt. But for now we would be content with any sort of test script.

Files in scripts will be installed into a directory available in $PATH, such as /usr/local/bin.

Anything that does not fit any of the above categories is placed into the misc directory.

Maintainers are expected to modify their existing packages to match this new standard.


License Announcement

The PEAR Group would like to announce the following refinement of the current license FAQ entry.

Vote result: 5 (+1), 0 (-1), 3 (+0)

The current list allows a great number of licenses which vary greatly. This means that users may have to learn the in's and out's of a lot of licenses. Also some of the license choices impose comparatively high restrictions to the standard PHP license (GPL, QPL ..). As PEAR aims to extend the functionality provided by PHP users of PHP should fairly safely be able to also use any PEAR package without licensing worries, be it for commercial or non commercial, closed or opensource use.

Therefore with this announcement the license choices are reduced to the following short list:

  • PHP License

  • Apache License

  • LGPL

  • BSD style

  • MIT License

Other licenses may be accepted on a case by case basis, but will have to fit the above criteria. This decision has been made to simplify the current situation, and as with all decisions is open to be refined in the future using the RFC proposal methodology.

All packages, which are already part of PEAR as of now, which use other licenses, do not need to follow this regulation.

Note: In the meantime the FAQ entry linked above has also been updated to reflect the decisions from this document.


New guidelines for BC breaking releases

The goal is to make it possible to be able to run multiple major versions in one script.

For this reason new major versions (BC break or when the maintainer feels it makes sense as a result of dramatic feature additions or rewrites) require a new package using the following naming convention in the following order of preference (where 'Foo' is the package name and 'X' the major version number):

  1. FooX

  2. FoovX

  3. Foo_vX

The choice should be made based on preventing current and future misleading or ambiguous names. This means good care should be taken in making the right choice for the package. Obviously the first two allow for some ambiguity (is DB2 a package for IBM's DB2 or just the major version 2 of DB? - is IPv4 a package for IPv4 or is it the 4th major release if IP?). They don't break the idea of "_" mapping to directories (the class DB_NestedSet implies that there is a nestedset.php in the DB dir). The last one prevents any ambiguity but it's the least visually pleasing and also breaks the '_' to directory mapping and is therefore the last choice.

We also came to the conclusion that the pear installer should not be clever about the relationship between two major releases aside from printing out notices about the fact that there is a newer major version when a user installs an earlier one. However all major versions of a package will be listed on one package home. This is especially important in order to not break tutorials that cover older major releases (tutorial xyz for major version 1 simply says 'pear install Foo' - if the system would then install 'Foo2' the user might be in for an unpleasant surprise).

Therefore, new major versions are for all intents and purposes new packages with the above mentioned exceptions. The names of these new packages are derived using one of the above mentioned naming conventions.


Orphaned Packages


Orphaned PEPr Proposals

II. New Maintainers' Guide


Chapter 10. Introduction

If you are planning to contribute a new package to the PEAR project, this guide will provide you with the necessary information to get you started The Right Way (tm).

We will start by describing the cases in which it makes sense to contribute and in which not. After we have ensured that the package you want to contribute fits into PEAR, we will describe how to get started with the community. Once you are confident about the inner workings of the PEAR developer community, we will explain how to start the formal process of proposing a new package and we will give some tips for making your first package as successful as possible.


Chapter 11. How best to contribute to PEAR

In this chapter the different ways of contributing to PEAR will be discussed. The most common way of contributing to PEAR is to open a bug or feature request at our Bug Tracker. You might also add a patch to an existing bug, or add a helpful note to the user manual for a package that you use regularly. If you wish to step in deeper, some packages are in need of better documentation, and you could mail suggestions in text or docbook format to pear-doc@lists.php.net. The next level of commitment to PEAR is offering to become a regular developer for a specific package that you use often. This is easily accomplished by emailing the current active developers and asking where to begin.

If you decide to take the full plunge and contribute a brand new package to PEAR, then you will need to fulfill a number of guidelines and requirements. If you are unsure if your package belongs in PEAR, contact the developers mailing list.


Cases in which it makes sense to propose a new package

As you may have already noticed while browsing the list of existing packages, the PEAR packages provide a (often abstract) solution for a general problem. Thus your code will most likely fit into PEAR if it solves a problem that will not only occur in one (e.g. your) specific application, but that occurs in a lot of (web) applications. Examples are:

  • Support for Network protocols

  • Object oriented wrappers that provide easy access to otherwise complicated or less intuitive PHP extensions.

  • Parsing different XML dialects.

    The PEAR packages that provide XML parsing functionalities can be found in the category browser.

No matter which area is covered by a package, the API should be as abstract as possible (while not becoming too complex), so that it can be utilized painlessly in as much use cases as possible.


Chapter 12. Joining the PEAR community

Welcome to the PEAR community! By this point, you have decided to contribute some of your time and effort to improving the PEAR repository. Before you go any further, we'd like to introduce you to the common practices and communication channels that PEAR developers use in order to collaborate across geographical and national divides. Additionally we will tell you the different places where you can find more information about the inner workings and rules of PEAR.


Communication with other PEAR developers

Mailing lists are the most important way to communicate in PEAR. We are running a number of public mailing lists, which are listed on the PEAR website. For starters the PEAR developers mailing list pear-dev@lists.php.net is the primary place where discuss various aspects of their packages and of the PEAR repository as a whole. pear-general@lists.php.net is a general support list that should be used for questions on using PEAR packages, installing PEAR, and other issues not directly related to the development of PEAR packages.

If you would like to get started with maintaining packages in PEAR, you are expected to be subscribed to pear-dev@lists.php.net. (Subscription instructions)

Note: During your first steps in the PEAR community, you may stumble across the term "pear-dev", which is the abbreviation for the developers mailing list in PEAR's lingo.

Some people enjoy communicating via IRC channels. We are running the #pear channel in the EFnet network. Some of the most active PEAR developers hang out regularly on this channel. However, for serious inquiries or discussions, you should email the developers mailing list pear-dev@lists.php.net, as these discussions are the only official communication method of PEAR, and are archived for future reference.


More written information

  • The PEAR Group occasionally publishes Administrative Documents, which describe the Group's decisions. You should read those documents before starting serious contributions to PEAR, because they contain important information about the inner workings of PEAR. The developers mailing list will be informed when new documents are added.

  • This manual contains the Developer Guide, which provides valuable information for using the tools of a PEAR developer.

  • The Coding Standards describe the standards which PEAR code must adhere to.


Chapter 13. The formal proposal process

In the early times of PEAR, all new packages were proposed by an informal email to the PEAR developers mailing list. Over the time, the number of new proposals increased quite dramatically, making it hard to keep track of all the proposals.

A web-based proposal handling system was established to solve these problems. The system is called PEPr. It is pronounced like the spice and stands for "PEAR Proposal system".

This chapter describes the requirements and the workflow for a PEPr-based proposal. After that we will provide you with information, on how to actually start a proposal. Finally, you will learn what to do once the proposal is finished.

After reading this chapter, you will be able to start a proposal for your code right away.


Step 1: Requirements for a proposal

The following enumeration lists the most important things that need to be done or be made available before starting a new proposal.


Step 2: Initiating a discussion

For every package you should start a proposal in PEPr as a draft to initiate discussion on the developers mailing list.

By discussing the package with the PEAR developers you will easily be able to find out if:

  • there are technical issues with the package/code

  • a package with similar functionality already exists

  • there are people working on something similar, so you can join forces

  • etc.

By reading between the lines, you should also be able to find out if you will be able to gather enough positive votes in the formal proposal process.

Be aware that people will scrutinize your code, so be prepared for criticism (both positive and negative) and save everybody a bunch of time by making sure your scripts adhere to the Coding Standards.

Please note that PEAR is an international project. People come from different cultural backgrounds where English may not be their native tongue. Misunderstandings may happen because of that, so assume the person is trying to do good. Do not worry if your English is not perfect but do try to be as clear as possible and do not hesitate to ask for advice.


Step 3: Using PEPr

To be able to use the proposal tool (PEPr), you have to apply for a PEAR website account. This account will usually be granted within one or two days. After that you can open a new proposal using the "New Package Proposal" interface.

The package proposal process is divided into 4 stages: "Draft", "Proposal", "Call for Votes" and "Finished". Every proposal has to run through all of these stages. During each stage (except for the draft stage) an email is send to you (the proposer) and the PEAR developers mailing list for any action.


Changing a proposal

In general you may not edit or delete your proposal after it has left the Proposal stage. In urgent cases you can contact the PEAR community via the developers mailing list to reach a PEAR website administrator to do a change. This is heavily discouraged however! You should have made everything clear to the community during the Proposal stage to ensure a hassle free voting process. Even if the voting has a negative result, this is no reason to delete it.


Chapter 14. Taking over an unmaintained package

If you want to become the new lead maintainer of a package that is marked as unmaintained on the PEAR website, the following section will explain to you the necessary steps for this to happen.

  1. The first thing is to inform the PEAR Quality Assurance mailing list about your intention. If you have not been involved in PEAR prior to that, it is a good idea to write a few words about you and your motivations.

  2. The QA team will then state whether you can take over the package or not, eventually explaining why. You can then apply for an account for the PEAR website unless you already have one. The PEAR Group will have to grant this account, and afterwards the QA team will assign you as the new lead maintainer for the package.

  3. If the sources of the package are kept in the PHP CVS repository, you will also need an account for this. You can sign up for it on the PHP website. Please mention in the purpose field of the request form that the PEAR QA team has told you to get an account, so that your request can be processed faster. CVS accounts are managed by the PHP Group, so PEAR unfortunately has only limited influence on this process.

    Note: If you already have a CVS account for cvs.php.net, it is only necessary for you to get additional "karma" for the module where the package resides. You can request this karma by sending an email to the PEAR Group. (Please also mention in this mail that you have already talked to the QA team.)

  4. If everything has worked out well, you should by now be the lead maintainer of the previously unmaintained package. If not, don't hesitate to ask the people on the QA mailing list for help.

III. Developer Guide


Chapter 17. Contributing your own code

PEAR is driven by an open source developer community. Thus anyone may contribute code in the form of a new package or as an improvement to an existing package. Over the years, PEAR has developed a set of conventions. Some of them are evolving, but others have solidified. This document defines those requirements that you must adhere to in order to contribute to PEAR.


Requirements for contributing code

We are making certain demands on both the code and the maintainers of packages:

  1. Code must conform to the Coding Standards.

    If you want to contribute your code to PEAR in form of a new package or as an addition to an existing package, it has to be compliant to a set of Coding Standards. There have been numerous discussions about whether those standards are good or not, and we have arbitrarily decided that they are good and that the discussion is over. Please respect this decision and don't bring up changes to the basic coding standards, or you risk being ignored mercilessly.

  2. Code must be appropriately licensed.

    Each package has to be licensed under an accepted OpenSource license. If you are unsure about the license, you should opt for the New BSD License. The PEAR Group has issued a License Announcement, which provides further details concerning this topic.

  3. Code must be available in public code repository.

    The latest revision of the package's source code has to be available in a public SCM (Source Code Management) system such as the CVS server at cvs.php.net, the Subversion repository of Google Code, or at sites such as SourceForge. Hosting at Google Code or SourceForge is freely available under their terms of use at any time. Write access to cvs.php.net is available once the package has been accepted as a PEAR package.

    All packages must have a publicly available source repository in order to honor the need for access in order to provide patches for bugs or new features.

  4. Extensible and "forward-compatible" code.

    Always keep in mind that your code should be extensible and that it has to be easy to add new features in the future. If it is easily predictable for you that there is no clean way to add new functionality to the codebase without breaking backwards compatibility, you should consider to review the code and to adapt it, before contributing it to PEAR.

    To this end, most PEAR packages make use of object oriented programming. Through concepts such as inheritance, polymorphism, patterns like singleton/factory/command, PEAR packages solve problems in elegant ways. There are numerous resources about object oriented programming all around the web and you will also find tons of books available for your reading pleasure. However we can can recommend Object-Oriented Programming Concepts on Sun's Java Homepage for a quick start.

  5. Documentation in an appropriate format (plain text, docbook)

    Your code must come with appropriate documentation in one of the following formats:

    If you write the documentation in Docbook XML and if the markup is valid, the documentation can be easily added to the official PEAR Manual, which you are reading right now.

    Note: As of August 2003, phpDocumentor is fully capable of converting in-code API documentation and external tutorials into Docbook XML. PhpDocumentor version 1.2.2 or greater is required. Install with pear install phpDocumentor. Use the XML:DocBook/peardoc2:default converter on your source code to generate output. The output should be generated directly into the peardoc/lang/package directory, where lang is en, or fr, etc.

    Be aware though that only shipping the API documentation does not suffice! Additionally your package has to come with usage examples and (even better) tutorials about its usage. More information can be found in the section describing how to write documentation

  6. Regression tests in .phpt or PHPUnit format

    All developers have experienced the frustration of bugs. They are a fact of life in programming, but fortunately there are a few systems that can be used to catch them, kill them, and prevent their return. Regression tests should be included with every stable release, so that users can run them if a bug occurs to help you debug the package. Examples of .phpt regression tests can be found as part of the PEAR package in CVS. For examples of PHPUnit tests, see the Auth package.

  7. The contributor ("you") must be willing to provide support for the package and must be willing to release future versions that at the very least fix bugs.

    If you are not willing to maintain your code over a long period of time, it makes little sense to contribute it. PEAR is the standard repository of PHP packages, and this comes with great responsibility. Maintaining means more than just providing support via the various mailing lists:

    You must be willing to not only fix bugs, but also integrate useful enhancements contributed by users of your packages, if they fit the design specifications of your package. You should expect to release new versions of your package regularly with bug fixes. If you will be unable to maintain your package for an extended period of time, it is expected that you will announce this to the PEAR developer mailing list, and assign another temporary lead maintainer or publicly document the fact that your package is temporarily unmaintained, and the approximate date that users can expect to receive support and bug fixes, if possible.

    Warning

    Code can be removed from PEAR if the lead maintainers are not willing to maintain the code anymore and if there is no other person that is willing to take over as the maintainer.


How to contribute code in practice

  1. Finding an appropriate package name

    One of the most important tasks while contributing a new package to PEAR is finding an appropriate name for your package.

    The general syntax for package names is <Category>_<Name>. The value for <Category> should be chosen from a predefined list of categories that are available in PEAR (e.g. "HTTP", "Net", "HTML"). The second part is the name of the package (like "Upload", "Portscan", "Table").

    The categories that are currently available in PEAR are represented by the bold headings at the Package Browser. If you think that your package does not fit in any of the existing categories, you can ask the on the mailing list to create a new category. (PEAR is usually reluctant to do that.)

    Apart from this general syntax, the package names can also contain more than one category name. An example for this is HTML_Template_PHPLIB: The multiple categories indicate that the package PHPLIB is part of the category Template, that again is part of the HTML category. This naming scheme is necessary here since it's possible that there are Template systems in PEAR that don't work with HTML but with another technology. (The cases where more than one "category" is used are pretty rare.)

    If you need further advice or help for finding a name for your package, you should ask on the developers mailing list.

  2. Announcing to the PEAR developers

    The second step while contributing is to announce your package in PEPr. Usually this announcement will spawn some discussion. After one week you may call for votes with PEPr and the developers will then start to vote for or against your proposal. (You are of course urged to join the upcoming discussion.) Announcing a package does of course not mean that it is already accepted! That will still take some time and likely some more efforts from your side.

    Note: The following passages are taken from the administrative document Handling Package Proposals, which describes proposing new packages in more details. Reading this document should be a mandatory step for PEAR newbies.

    Only the votes of active members of the PEAR community (must have a PEAR web account, however the proposer himself is not counted) are counted, however anyone may vote. Votes require that a final choice of package name is specified.

    The votes are added up, which means that one -1 offsets a +1. However -1 vote should always be considered to be serious and may lead to decisions being made on a case by case basis by the PEAR Group who reserves a veto (it is intended that in the future the PEAR QA team will assist the PEAR Group in such situations). Therefore a -1 vote *must* contain a comment explaining that decision, it is desirable that votes in favour (+1) should also be accompanied with an explanation when appropriate.

    A vote is accepted if the total of all votes exceeds +5.

    In case the proposal is not accepted the package can be further discussed on the list and the proposer may attempt to make another "call for vote" (it is expected that this is only done for sensible reasons).

  3. Getting the necessary accounts

    Right now one can distinguish between two types of accounts related to PEAR:

    1. Pear.php.net account

      This account is always necessary for you, if you want to release your package through PEAR. With this account you have access to the necessary infrastructure on pear.php.net in order to propose, upload and roll new releases. The PEAR Group manages PEAR accounts and pearweb karma levels (i.e.: karma to use the web site to maintain packages).

    2. PHP CVS account

      If you want to administrate your code via CVS , you can also apply for a CVS account to have access to the pear CVS module on cvs.php.net. This makes it easier for other users to contribute to your code. The PHP Group (group@php.net) manage the PHP CVS server, which is used for maintaining PEAR packages. If you already have a PHP CVS account you will ask the PEAR Group for Karma for a given package or set of packages. Please send an email to pear-group@php.net specifying what packages you need commit access along with credentials (e.g.: the package "lead" email giving you his go or a QA member email announcing you are to be given access).

      If you already have a CVS repository somewhere else (e.g. on SourceForge), or if you don't want to maintain your code via CVS, you don't need the PHP CVS account. It is highly recommended to use some kind of public repository, so that users can try out any bug fixes you apply to the code, before a new release is rolled.

    To sign up for your pear.php.net account, go to the PEAR account request page and fill out the form there. The PEAR Group will then receive your request and someone will open your account, if the request sounds reasonable. You will be notified about that via email. Please note that you do NOT need a pear.php.net account to download packages from there.

    To get a PHP CVS account, go here to sign up for it. The PHP CVS account has to be approved by the PHP Group.

  4. Registering the package

    Once you successfully went through the contribution procedure and got your pear.php.net account, you finish with registering your package. Registering does not mean that you are going to release a first version of your package. It just means that some basic information about the package will be added to the PEAR package database.

    The registration process is quite straightforward: Fill out the form on this site and submit the information. After you have done that, the PEAR Group has to finally approve your submission. This usually happens in a few hours and you will be notified about it via email.

    After having registered your package, you can create a first release, which is described here.


Chapter 18. The package definition file package.xml


Introduction to the package definition file package.xml

package.xml version 1.0 is deprecated

package.xml 1.0 is deprecated. You should really be using package.xml version 2.0. Documentation can be found at package.xml 2.0 documentation.

As of 2007-04, More than 99.8% of all PEAR installations in the wild are capable of using package.xml 2.0 files, so you should not worry about backwards compatibility.

The package definition file package.xml is, as the name already implies, a well-formed XML file that contains all information about a PEAR package.

This chapter will describe the allowed elements of the package definition file and it will discuss how to create such a file for your package.

The PEAR_PackageFileManager package simplifies the creation of package.xml. You can install PEAR_PackageFileManager via the usual command


$ pear install PEAR_PackageFileManager
      


Allowed elements

The toplevel element in package.xml is the element <package version="1.0">. The allowed sub elements are:


Validating

In order to validate package.xml files one can use the xmllint tool that comes with libxml2.

xmllint --dtdvalid http://pear.php.net/dtd/package-1.0 --noout package.xml


Creating a package definition file

This package.xml can serve as a template for you as it already contains all necessary elements. In most cases you only need to change the character data between the tags in order to use the example in your package.

In this example you get to know a very handy feature: When you have a directory in your package that only contains files of the same type, you can add to role attribute even to the <dir> tag instead of adding it to every single <file> tag.

With the knowledge you've acquired from this chapter you should now be able to produce a package definition file for your own package. If you still have questions concerning the topic, don't hesitate to ask on the mailinglist.


Defining Dependencies

The PEAR Package Manager supports checking for different system capabilities. You define those dependencies with the <dep> tag:


Chapter 19. The package definition file package.xml, version 2.0


A quick and dirty guide to version 2.0 of the package definition file package.xml

The package definition file package.xml is, as the name already implies, a well-formed XML file that contains all information about a PEAR package. Version 2.0 contains several important enhancements over version 1.0, including

For those of you with an existing package.xml version 1.0, you can create an approximate equivalent package using the


$ pear convert
     

command. Note that as of version 1.6.0, PEAR_PackageFileManager supports package.xml 2.0 with the PEAR_PackageFileManager2 class.

PECL developers: for more information on pecl-specific features, read here.

Note: package.xml version 2.0 is supported from PEAR 1.4 on. As of 2007-04, PEAR 1.4 or greater is used in more than 99.8% of all installations in the wild that downloaded packages - there is no need to support v1.0 for backwards compatibility anymore.


An example file with all elements

<?xml version="1.0"?>
<package version="2.0" xmlns="http://pear.php.net/dtd/package-2.0"
    xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd">
 <name>PEAR</name>
 <channel>pear.php.net</channel>
 <summary>Any one-line summary</summary>
 <description>any static long description.
 This text should not change very much between releases, use the "notes" tag
 for release notes
 </description>
 <lead>
  <name>Greg Beaver</name>
  <user>cellog</user>
  <email>cellog@php.net</email>
  <active>yes</active>
 </lead>
 <date>2005-02-26</date>
 <time>20:30:13</time> <-- note: <time> is optional -->
 <version>
  <release>1.4.0a2</release>
  <api>1.4.0</api>
 </version>
 <stability>
  <release>alpha</release>
  <api>alpha</api>
 </stability>
 <license uri="http://www.php.net/license/">PHP License</license>
 <notes>
 Put release notes here.
 They can be multi-line
 </notes>
 <contents>
  <dir name="/">
   <dir name="PEAR">
    <dir name="ChannelFile">
     <file name="Parser.php" role="php" />
    </dir> <!-- /PEAR/ChannelFile -->
    <file name="Dependency2.php" role="php">
     <tasks:replace from="@PEAR-VER@" to="version" type="package-info"/>
    </file>
   </dir> <!-- /PEAR -->
   <dir name="scripts" baseinstalldir="/">
    <file name="pear.bat" role="script">
     <tasks:replace from="@bin_dir@" to="bin_dir" type="pear-config" />
     <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
     <tasks:replace from="@include_path@" to="php_dir" type="pear-config" />
     <tasks:windowseol/>
    </file>
    <file name="pecl.bat" role="script">
     <tasks:replace from="@bin_dir@" to="bin_dir" type="pear-config" />
     <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
     <tasks:replace from="@include_path@" to="php_dir" type="pear-config" />
     <tasks:windowseol/>
    </file>
    <file name="pear.sh" role="script">
     <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
     <tasks:replace from="@php_dir@" to="php_dir" type="pear-config" />
     <tasks:replace from="@pear_version@" to="version" type="package-info" />
     <tasks:replace from="@include_path@" to="php_dir" type="pear-config" />
     <tasks:unixeol/>
    </file>
    <file name="pecl.sh" role="script">
     <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
     <tasks:replace from="@php_dir@" to="php_dir" type="pear-config" />
     <tasks:replace from="@pear_version@" to="version" type="package-info" />
     <tasks:replace from="@include_path@" to="php_dir" type="pear-config" />
     <tasks:unixeol/>
    </file>
    <file name="pearcmd.php" role="php">
     <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
     <tasks:replace from="@php_dir@" to="php_dir" type="pear-config" />
     <tasks:replace from="@pear_version@" to="version" type="package-info" />
     <tasks:replace from="@include_path@" to="php_dir" type="pear-config" />
    </file>
    <file name="peclcmd.php" role="php">
     <tasks:replace from="@php_bin@" to="php_bin" type="pear-config" />
     <tasks:replace from="@php_dir@" to="php_dir" type="pear-config" />
     <tasks:replace from="@pear_version@" to="version" type="package-info" />
     <tasks:replace from="@include_path@" to="php_dir" type="pear-config" />
     <tasks:footask/>
    </file>
   </dir> <!-- /scripts -->
   <file name="package.dtd" role="data" />
   <file name="postinstall.php" role="php">
    <tasks:postinstallscript/>
   </file>
   <file name="template.spec" role="foo" />
  </dir> <!-- / -->
 </contents>
 <compatible>
  <name>FooPackage</name>
  <channel>pear.php.net</channel>
  <min>1.3.0</min>
  <max>1.5.0</max>
 </compatible>
 <dependencies>
  <required>
   <php>
    <min>4.2</min>
    <max>6.0.0</max>
   </php>
   <pearinstaller>
    <min>1.4.0dev13</min>
   </pearinstaller>
   <package>
    <name>Archive_Tar</name>
    <channel>pear.php.net</channel>
    <min>1.1</min>
    <recommended>1.2</recommended>
   </package>
   <package>
    <name>Foo</name>
    <uri>http://www.example.com/Foo-1.2.0.tgz</uri>
   </package>
   <extension>
    <name>xml</name>
   </extension>
   <os>
    <name>windows</name>
    <conflicts/>
   </os>
   <arch>
    <pattern>*-i?86-*-*</pattern>
   </arch>
  </required>
  <optional>
   <package>
    <name>PEAR_Frontend_Web</name>
    <channel>pear.php.net</channel>
    <min>0.5.0</min>
   </package>
   <package>
    <name>PEAR_Frontend_Gtk</name>
    <channel>pear.php.net</channel>
    <min>0.4.0</min>
   </package>
  </optional>
  <group name="remoteinstall" hint="adds the ability to install packages to a remote ftp server">
   <package>
    <name>Net_FTP</name>
    <channel>pear.php.net</channel>
    <min>1.3.0RC1</min>
    <recommended>1.3.0</recommended>
   </package>
  </group>
  <group name="webinstaller" hint="PEAR's web-based installer">
   <package>
    <name>PEAR_Frontend_Web</name>
    <channel>pear.php.net</channel>
    <min>0.5.0</min>
   </package>
  </group>
  <group name="gtkinstaller" hint="PEAR's PHP-GTK-based installer">
   <package>
    <name>PEAR_Frontend_Gtk</name>
    <channel>pear.php.net</channel>
    <min>0.4.0</min>
   </package>
  </group>
 </dependencies>
 <usesrole>
  <role>foo</role>
  <package>Foo</package>
  <channel>pear.example.com</channel>
 </usesrole>
 <usestask>
  <task>footask</task>
  <package>Footask</package>
  <channel>pear.example.com</channel>
 </usestask>
 <phprelease>
  <installconditions>
   <os>
    <name>windows</name>
   </os>
  </installconditions>
  <filelist>
   <install as="pear.bat" name="scripts/pear.bat" />
   <install as="pecl.bat" name="scripts/pecl.bat" />
   <install as="pearcmd.php" name="scripts/pearcmd.php" />
   <install as="peclcmd.php" name="scripts/peclcmd.php" />
   <ignore name="scripts/pear.sh" />
   <ignore name="scripts/pecl.sh" />
  </filelist>
 </phprelease>
 <phprelease>
  <filelist>
   <install as="pear" name="scripts/pear.sh" />
   <install as="pecl" name="scripts/pecl.sh" />
   <install as="pearcmd.php" name="scripts/pearcmd.php" />
   <install as="peclcmd.php" name="scripts/peclcmd.php" />
   <ignore name="scripts/pear.bat" />
   <ignore name="scripts/pecl.bat" />
  </filelist>
 </phprelease>
 <changelog>
  <release>
   <version>
    <release>1.3.5</release>
    <api>1.3.0</api>
   </version>
   <stability>
    <release>stable</release>
    <api>stable</api>
   </stability>
   <date>2005-02-26</date>
   <license uri="http://www.php.net/license/3_0.txt">PHP License</license>
   <notes>
 * fix Bug #3505: pecl can't install PDO
 * enhance pear run-tests dramatically
 * fix Bug #3506: pear install should export the pear version into the environment

   </notes>
  </release>
  <release>
   <version>
    <release>1.4.0a1</release>
    <api>1.4.0</api>
   </version>
   <stability>
    <release>alpha</release>
    <api>alpha</api>
   </stability>
   <date>2005-02-26</date>
   <license uri="http://www.php.net/license/3_0.txt">PHP License</license>
   <notes>
  This is a major milestone release for PEAR.  In addition to several killer features,
  every single element of PEAR has a regression test, and so stability is much higher
  than any previous PEAR release, even with the alpha label.

  New features in a nutshell:
  * full support for channels
  * pre-download dependency validation
  * new package.xml 2.0 format allows tremendous flexibility while maintaining BC
  * support for optional dependency groups and limited support for sub-packaging
  * robust dependency support
  * full dependency validation on uninstall
  * support for binary PECL packages
  * remote install for hosts with only ftp access - no more problems with
    restricted host installation
  * full support for mirroring
  * support for bundling several packages into a single tarball
  * support for static dependencies on a url-based package

  Specific changes from 1.3.5:
  * Implement request #1789: SSL support for xml-rpc and download
  * Everything above here that you just read
   </notes>
  </release>
 </changelog>
</package>


Special information for PECL developers

extsrcrelease and extbinrelease changes for PECL developers

extsrcrelease and extbinrelease changes for PECL developers -- PECL-specific details of package.xml 2.0

Detailed Tag Reference for package.xml version 2.0

Table of Contents
<channel> -- What is a channel?
<uri> -- When should I use <uri>?
<lead>, <developer>, <contributor>, and <helper> -- Developer documentation for a release
<version> -- versioning in package.xml 2.0
<stability> -- specifying release and API stability
<license> -- specifying software license and optional reference to license text
<contents> -- specifying the contents of a release
<dir> -- documenting a directory in the <contents> tag
<file> -- documenting a file in the <contents> tag
tasks for <file>s -- specialized file installation and manipulation
<compatible> -- Alleviating strict versioning with <compatible>
<dependencies> -- Dependency Specification in package.xml 2.0
<usesrole> -- documenting custom file roles used in <contents>
<usestask> -- documenting custom tasks used in <contents>
<phprelease>, <extbinrelease>, <extsrcrelease>, <bundle> -- specifying the content type of a release

Each tag that needs further explanation is documented here (unfinished)

<channel>

<channel> -- What is a channel?

Quick introduction to channels

Channels are new in PEAR 1.4.0. Channels are a systemized way of differentiating between different download sources. One such download source is pear.php.net, another is pecl.php.net, and there are several third party channels slowly springing up around the net.

The <channel> tag should contain the full channel name, not any alias (don't use "pear", use "pear.php.net".

A good rule of thumb to use when determining what channel name to use is "where do I upload my releases to?" If the answer is pear.php.net, that is your package's channel. If the answer is pecl.php.net, then that is your channel.

If you aren't running a channel server and wish to serve your packages as well as allow other packages to remotely depend on your package, the new uri-based package distribution method is the best choice, see the <uri> tag documentation link below.

See also:

<uri>

<uri>

<uri> -- When should I use <uri>?

When to use <uri> instead of <channel>

If you do not have a channel server and wish to serve your packages so that others can depend on them, use <uri>. This should contain a static uri that links to a single package version's downloadable .tgz

If you do not need to allow external remote dependencies, then simply use the pear.php.net channel as your package's channel.

For instance, if you wish to serve package Foo version 1.1.0 from www.example.com, use the uri "http://www.example.com/Foo-1.1.0". Note that the uri must contain the full path MINUS THE EXTENSION. Provide both Foo-1.1.0.tgz and Foo-1.1.0.tar for users without gzip.

See also:

<channel>

<lead>, <developer>, <contributor>, and <helper>

<lead>, <developer>, <contributor>, and <helper> -- Developer documentation for a release

Documenting who develops a package

In package.xml 1.0, a developer was documented using the <maintainer> tag inside of a redundant <maintainers> container tag. This has been simplified in package.xml 2.0 both to slightly speed parsing and to make validation of the xml simpler. Now, the contents of the <role> tag has been extracted as 4 tags to describe the maintainers of a package.

In addition, a new internal tag <active> has been added, so that you can honor retired developers' work without having to remove them altogether from package.xml.

WARNING: tag order is important. List leads followed by developers followed by contributors and finally helpers.

<version>

<version> -- versioning in package.xml 2.0

Documenting release version and API version

In package.xml 1.0, the version was simply the version. package.xml 2.0 splits the concept of versioning into two components, release and api.

The release version is the same familiar versioning concept from package.xml 1.0. This version is validated very carefully by the packager.

The API version is informational only - the installer does not use it. It can be used for a package-time replacement by the installer. This can be very useful when implementing a reflective method such as getApiVersion(). In addition, the API version is very loosely validated, and only requires a version_compare()-compatible version number.

<stability>

<stability> -- specifying release and API stability

Documenting release stability and API stability

In package.xml 1.0, stability was known as "state" which is not the most accurate description. package.xml 2.0 introduces the term stability and like version splits the concept of stability into two components, release and api.

The release stability is the same familiar state from package.xml 1.0. It can be one of:

  1. snapshot - a frozen picture of development at a particular moment

  2. devel - a very new non-production release. Devel should be used for extremely new, practically untested code.

  3. alpha - a new non-production release. Alpha should be used for new code that has an unstable API or untested code.

  4. beta - a non-production release. Beta should be used for code that has a stable API and is nearing a fully stable release. Regresion tests and documentation should exist or soon follow to qualify as a beta release. Release candidates should use the beta stability.

  5. stable - a production release. Stable releases must have a stable API, and must have regression tests and documentation.

The API stability is informational only - the installer does not use it.

<license>

<license> -- specifying software license and optional reference to license text

Documenting release license

In package.xml 1.0, the license tag only contained the name of the license. In package.xml 2.0, there are two optional attributes, "uri" and "filesource". "uri" contains a uri that identifies the text of a license, such as "http://www.php.net/license/" for the PHP License. "filesource" can be used to specify a LICENSE file within an actual package that contains the text of the license.

<contents>

<contents> -- specifying the contents of a release

Documenting release contents

In package.xml 1.0, the contents tag was <filelist>. The purpose of the tag changed dramatically in package.xml 2.0, warranting a name change. Now, <filelist> can be found in the release section of the package.xml.

<contents> is used to describe the contents of a tarball. Nothing further. All files in the contents tag will be placed into the tarball regardless of whether they eventually get installed by the PEAR installer. This fact can be used to create a very versatile tarball, one that can be directly unzipped and work out of the box as well as be installed by the PEAR installer and work out of the box.

For most release types, contents contains a single <dir> tag that then either contains nested dir tags and/or <file> tags.

<dir>

<dir> -- documenting a directory in the <contents> tag

Documenting directories

The <dir> tag is identical to package.xml 1.0. Required attributes are name and optional attributes are baseinstalldir (the relative location where all files and subdirectories will be installed)

Note that all files must be contained in a single top-level <dir> tag. For simple packages, simply use <dir name="/"> as the directory name

<file>

<file> -- documenting a file in the <contents> tag

Documenting files

The <file> tag is almost identical to package.xml 1.0. Required attributes are name and role. Optional attributes are baseinstalldir and md5sum. Optional attributes platform and install-as have been replaced by the release tags. Specifically, <install> is used to specify install-as, and the <ignore> tag can be used in conjunction with <installconditions> to exclude packages from being installed on particular platforms.

For those familiar with the platform attribute, the way to handle this example:

<file name="scripts/foo.bat" role="script" install-as="foo.bat" platform="windows">

is to in fact create two release sections. The file tag would then look like:

<file name="scripts/foo.bat" role="script">

and the release section would look like this:

<phprelease> <installconditions> <os>windows</os> </installconditions> <install name="scripts/foo.bat" as="foo.bat"/> </phprelease> <phprelease> <ignore name="scripts/foo.bat"/> </phprelease>

Note that the second <phprelease> tag could just as easily have had an <installconditions> tag containing <os>unix</os>, but this is unnecessary, as the second release will be processed on any system that is not a windows system.

tasks for <file>s

tasks for <file>s -- specialized file installation and manipulation

Using tasks to customize file installation

Tasks provide a flexible and customizable way to manipulate file contents or to perform complex installation tasks (hence the name "tasks"). By default, PEAR comes with 4 tasks, but customized tasks can be added simply by adding a file into the PEAR/Tasks directory that follows the conventions of existing tasks. This page does not describe how to create a custom task, only how to use them in package.xml.

There are 3 basic tasks and 1 complex task distributed with PEAR. The basic tasks are "tasks:replace", "tasks:windowseol", and "tasks:unixeol". The complex task is "tasks:postinstallscript". "tasks:replace" is nearly identical to the old <replace> tag from package.xml 1.0, and does a text search-and-replace of a file's contents. "tasks:windowseol" and "tasks:unixeol" manipulate the line endings of a file to ensure that the correct line endings are in place for critical files like DOS .bat batch files and unix shell scripts. "tasks:postinstallscript" allows users to choose to run a script to perform further installation functions.

<tasks:replace> - customizing file contents

The replace task has 3 required attributes:

  1. type - This must be either package-info or pear-config. package-info replacements extract information from package.xml itself to use as the replacement text. pear-config replacements use the value of a configuration variable (as displayed by
    pear config-show
    ) as the text for replacement.

  2. from - Text to search for in a file. Traditionally, this text is enclosed in "@" to differentiate it from normal text, as in from="@version@"

  3. to - Abstract item to use as a replacement for all occurrences of "from". package-info replacements can be one of api-state, api-version, channel, date, description, license, license-uri, name, notes, release_date, release-license, release_notes, state, summary, time, version, and for some packages extends, providesextension, srcpackage, and srcuri.

Note that package-info replacements are performed at packaging time, so files contain package-info replacements inside a .tgz/.tar release. pear-config replacements can only occur on the installation system, and are performed at install-time.

<tasks:windowseol> - converting line endings to \r\n

This task can be used to enable packaging of windows-specific files (like DOS batch files) on a non-windows system, such as unix systems that convert line endings to \n. Note that this task is performed at package-time, as well as at install-time, so files will contain the correct line endings inside a .tgz/.tar release.

<tasks:unixeol> - converting line endings to \n

This task can be used to enable packaging of unix-specific files (like sh shell scripts) on a non-unix system, such as windows systems that convert line endings to \r\n. Note that this task is performed at package-time, as well as at install-time, so files will contain the correct line endings inside a .tgz/.tar release.

<tasks:postinstallscript> - extreme customization

The postinstallscript task informs the installer that the file it references is a post-installation script.

For security reasons, post-install scripts must be manually executed by the users, and as such the installer has special code that is separate from other tasks.

The <postinstallscript> tag may define parameters that are used by the installer to retrieve user input. In order to support both the web installer and the command-line installer, all processing of input is performed by PEAR and passed to the post-install script in a strict format. All you need to do is define the parameters using xml inside the <postinstallscript> tag.

Here is the xml representing a simple post-install script with parameters:

<tasks:postinstallscript>
 <tasks:paramgroup>
  <tasks:id>first</tasks:id>
  <tasks:param>
   <tasks:name>test</tasks:name>
   <tasks:prompt>Testing Thingy</tasks:prompt>
   <tasks:type>string</tasks:type>
  </tasks:param>
 </tasks:paramgroup>
</tasks:postinstallscript>

Note that the only type recognized at this stage is "string" but others will follow. A more complex example follows:

<tasks:postinstallscript>
 <tasks:paramgroup>
  <tasks:id>first</tasks:id>
  <tasks:instructions>The first group of questions relates
   primarily to your favorite color.  Answer wisely.
  </tasks:instructions>
  <tasks:param>
   <tasks:name>test</tasks:name>
   <tasks:prompt>Testing Thingy</tasks:prompt>
   <tasks:type>string</tasks:type>
   <tasks:default>hi</tasks:default>
  </tasks:param>
  <tasks:param>
   <tasks:name>test2</tasks:name>
   <tasks:prompt>Testing Thingy 2</tasks:prompt>
   <tasks:type>string</tasks:type>
  </tasks:param>
 </tasks:paramgroup>
 <tasks:paramgroup>
  <tasks:id>second</tasks:id>
  <tasks:name>first::test</tasks:name>
  <tasks:conditiontype>preg_match</tasks:conditiontype>
  <tasks:value>g+</tasks:value>
  <tasks:param>
   <tasks:name>test</tasks:name>
   <tasks:prompt>Testing Thingy a</tasks:prompt>
   <tasks:type>string</tasks:type>
   <tasks:default>hi</tasks:default>
  </tasks:param>
  <tasks:param>
   <tasks:name>test2</tasks:name>
   <tasks:prompt>Testing Thingy b</tasks:prompt>
   <tasks:type>string</tasks:type>
  </tasks:param>
 </tasks:paramgroup>
</tasks:postinstallscript>

This post-installation script has two parameter groups. The first parameter group has special instructions that are displayed to the user to assist in answering the required prompts. After the first group is processed, the second group is processed (naturally). However, in this case, the second group is a conditional parameter group. A conditional parameter group examines the user input from previous parameter groups and only displays its parameter prompts if a single parameter fits a test. The condition is defined by three tags, <tasks:name>, <tasks:conditiontype>, and <tasks:value>. Note that all three tags are required or xml validation will fail.

<tasks:name> is the parameter name from a previous parameter group. The format of name is groupID::parameterName, so as you see above, "first::test" refers to the <tasks:param> test from the <tasks:paramgroup> first.

<tasks:conditiontype> determines how the parameter input function will process the value of the parameter specified in <tasks:name>, and can be one of three values, "=" "!=" or "preg_match".

  • =: This (obviously) tests whether the parameters value is equal to the <tasks:value> tag

  • !=: This (obviously) tests whether the parameters value is not equal to the <tasks:value> tag

  • preg_match: This uses the content of the <tasks:value> tag as if it were the stuff between / and / in a preg_match() function call. Do NOT include // brackets in the regular expression. In the <tasks:paramgroup> second, the value "g+" will become:
    <?php
    preg_match('/g+/', first::test value)
    ?>

<compatible>

<compatible> -- Alleviating strict versioning with <compatible>

Working with <recommended> dependency versions and <compatible>

The <compatible> tag is designed to be used with a <package> dependency that contains a <recommended> version tag from package pear.example.com/Bar version 1.3.0 like so:

<package>
 <name>Foo</name>
 <channel>pear.example.com</channel>
 <min>1.0.0</min>
 <recommended>1.5.2</recommended>
</package>

The above dependency can be translated into English as follows: "Use the package pear.example.com/Foo, but only versions 1.0.0 or newer. If pear.example.com/Foo is not installed, install version 1.5.2. If pear.example.com/Foo is installed and is not version 1.5.2, fail unless --force is specified, or pear.example.com/Foo is compatible with me."

That last clause "...or pear.example.com/Foo is compatible with me." is controlled by the <compatible> tag. If package Foo version 1.5.3's package.xml has a <compatible> like so:

<compatible>
 <name>Bar</name>
 <channel>pear.example.com</channel>
 <min>1.2.0</min>
 <max>1.3.0</max>
 <exclude>1.2.9</exclude>
</compatible>

This will instruct the installer that pear.example.com/Foo version 1.5.3 is compatible with pear.example.com/Bar versions 1.2.0 to 1.3.0 inclusive, but is not compatible with 1.2.9.

It is very important to note that only existing versions that have been tested with the package should be mentioned in the <compatible> tag. Future versions of pear.example.com/Bar should simply upgrade the <recommended> tag.

<compatible> may contain three versioning tags. The required <min> and <max> are used to define the range of tested and compatible versions, and <exclude> is used to exclude any versions within the range. In the example above, 1.3.0 and 1.2.0 are the highest and lowest versions that may be excluded. There can be an unlimited number of <compatible> tags inside a package.xml.

<dependencies>

<dependencies> -- Dependency Specification in package.xml 2.0

Introduction to dependencies in package.xml 2.0

Dependencies are the most difficult aspect of programming. Using code written by other people can be a nightmare without simple ways to control bugs and API changes. Arguably, the handling of dependencies is PEAR's greatest strength, although there are many other nice features. Regardless of your personal opinion of the importance of dependencies, it is crucial to understand how to specify a dependency, and the different ways to ensure that your package is only used on systems that support it.

In package.xml 1.0, dependencies were relatively simple, but at the cost of usefulness. Specifying a dependency on a package for applications was actually dangerous. If you wished to limit an installed version of a package to a single version, it would mean preventing upgrade at any cost. package.xml 2.0 provides a simple way to enforce stricter dependency versioning without making upgrades onerous.

In package.xml 1.0, dependencies on PHP extensions like PECL extensions was near to a disaster. Extensions had to be present in the php.ini and loaded in memory in order to validate as being installed. This is often impossible, as a different php.ini is used for a production website versus the php.ini used for the pear installer. With package.xml 2.0, dependencies on a PECL-like extension is simple and straightforward, and only requires that the package be installed, and not that the extension be present in memory, although an older style extension dependency is also supported.

package.xml 1.0 supports two kinds of dependencies, required and optional. package.xml 2.0 also supports these two dependency types, but introduces a new kind of dependency concept: an optional dependency group. Dependency groups define a feature set. Instead of thinking "This package optionally depends on Net_FTP and optionally depends on Log" think "To remotely install packages, I need the remoteinstall feature, which needs Net_FTP and the Log package". This grouping allows defining sets of packages and extensions that comprise a feature and must be installed all at once for the feature to function properly.

package.xml 1.0 only supported php, package, and extension dependencies. package.xml 2.0 supports dependencies on php, package, extension, os, architecture, and PEAR installer. In addition, package.xml 2.0 supports depending on a static package located at a url, and depending on a package that provides an extension to PHP like PECL packages.

The PEAR installer dependency is not a dependency on the PEAR package, but a dependency on the currently running PEAR installer, and is more similar to a PHP dependency in that it requires the specified version to be running in memory. This is very useful for circumventing difficult bugs in the PEAR installer that render a package install useless.

Structure of <dependencies>

The <dependencies> tag re-organizes dependencies into groups and "extracts" attributes into tags. It also un-abbreviates words for clarity and human-readability. The following excerpt of a package.xml version 1.0:

<deps>
 <dep type="pkg" rel="ge" version="1.3.1">Archive_Tar</dep>
 <dep type="php" rel="ge" version="4.2.0"/>
 <dep type="pkg" rel="has" optional="yes">PEAR_Frontend_Web</dep>
</deps>

Approximately translates into this format in package.xml 2.0:

<dependencies>
 <required>
  <pearinstaller>
   <min>1.4.0a7</min>
  </pearinstaller>
  <php>
   <min>4.2.0</min>
   <max>6.0.0</max>
  </php>
  <package>
   <name>Archive_Tar</name>
   <channel>pear.php.net</channel>
   <min>1.3.1</min>
  </package>
 </required>
 <optional>
  <package>
   <name>PEAR_Frontend_Web</name>
   <channel>pear.php.net</channel>
  </package>
 </optional>
</dependencies>

These changes were made to simplify xml validation and parsing. Note that unlike package.xml 1.0, the <pearinstaller> and <php> dependencies are required in all package.xml. In addition the <min> tag is required in both <pearinstaller> and <php> dependencies.

<pearinstaller> dependencies

The <pearinstaller> dependency defines the minimum version of PEAR that can properly parse and install the package.xml containing it. As with all dependency tags that support versioning, these 4 tags are supported to define versioning:

  • <min> - minimum version of PEAR required to install this package.xml. This tag is required in all package.xml <pearinstaller> dependencies.

  • <max> - maximum version of PEAR installer supported. Use with caution! This tag will prevent the package from being installed by anyone with a newer version of PEAR!

  • <recommended> - recommended version of PEAR installer. This tag is used for strict version control. The installer will refuse to install a package without the --force option unless the version exactly matches recommended. This can be used to provide a level of extra security, as a package can be set to install using a version that is known to work without limiting future upgrades.

  • <exclude> - incompatible versions of PEAR installer. Use this to prevent the package from being installed by any PEAR version that cannot properly install the package. Multiple <exclude> tags may be used to exclude more than one version.

<php> dependencies

As with all dependency tags that support versioning, these 4 tags are supported to define versioning:

  • <min> - minimum version of PHP required to install this package.xml. This tag is required in all package.xml <php> dependencies.

  • <max> - maximum version of PHP supported.

  • <exclude> - incompatible versions of PHP. Use this to prevent the package from being installed by any PHP version that cannot properly work with the package. Multiple <exclude> tags may be used to exclude more than one version.

<subpackage> dependencies

Subpackage dependencies share the same xml format as package dependencies. The subpackage dependency should only be used if a package is split into more than one package. In other words, if the child package contains the same files as any earlier version of the parent package, the child package would normally conflict with the parent package because it would be attempting to overwrite the parent package's files with its own files.

A simple example should make this clear. Package Foo 1.0.0 contains Foo.php and Foo/Bar.php. Package Foo's developers decide to split Foo into two packages: Foo and Foo_Bar. Foo 1.1.0 contains foo.php, and Foo_Bar 0.1.0 contains Foo/Bar.php. Foo_Bar 0.1.0 conflicts directly with Foo 1.0.0, as both contain the file Foo/Bar.php.

If Foo has a subpackage dependency on Foo_Bar, then the installer will ignore the conflict between Foo 1.0.0's Foo/Bar.php and Foo_Bar 0.1.0's Foo/Bar.php just as it ignores the conflict between Foo 1.0.0's Foo.php and Foo 1.1.0's Foo.php.

<package> dependencies

Understandably, the <package> dependency is PEAR's most complex dependency. PEAR 1.4.0 supports 3 different kinds of package dependencies:

  1. Normal, traditional channel server-based package dependencies (same idea as package.xml 1.0).

  2. Dependencies on packages that provide PHP extensions (like PECL packages). (These can be both server-based and uri-based dependencies)

  3. Static, non-traditional uri-based package dependencies.

channel-based <package> depedendencies

The most common kind of package dependency is a channel-based dependency. This dependency from package.xml version 1.0:

<deps>
 <dep type="pkg" rel="has">PEAR</dep>
</deps>

translates to this dependency in package.xml version 2.0:

<dependencies>
 <required>
<!-- ... -->
  <package>
   <name>PEAR</name>
   <channel>pear.php.net</channel>
  </package>
 </required>
</dependencies>

Note that <channel> is a required tag for all typical package dependencies. Use pear.php.net for all packages that were packaged using package.xml 1.0, regardless of where they are downloaded from.

As with all dependency tags that support versioning, all standard versioning tags are supported (min, max, recommended, exclude). In addition, the <conflicts> tag is supported to create a negative dependency.

  • <min> - minimum version of a dependency. If the dependency package is installed, and is older than this version, installation will fail.

  • <max> - maximum version of a dependency. If the dependency package is installed, and is newer than this version, installation will fail.

  • <recommended> - recommended version of a dependency. This tag is used for strict version control. The installer will refuse to install a package without the --force option unless the version exactly matches recommended. This can be used to provide a level of extra security, as a package can be set to install using a version that is known to work without limiting future upgrades.

    Note that use of the <compatible> tag in the dependency's package.xml can be used to circumvent the installer's strictness. In essence, the <compatible> tag tells the installer that a dependent package is compatible with the current package, even though it is not the recommended version.

  • <exclude> - incompatible versions of a package. Multiple <exclude> tags may be used to exclude more than one version of a dependency.

  • <conflicts> - Negates the dependency. If the package is installed, it cannot satisfy the requirements of the dependency or installation will fail.

Here is a rough chart describing how to convert from package.xml 1.0 "rel" attributes to a package.xml 2.0 equivalent.

uri-based <package> dependencies

Let's look at uri-based package dependencies. Here is a simple example:

<package>
 <name>Foo<name>
 <uri>http://www.example.com/Foo-1.3.0</uri>
</package>

This dependency tells the installer to fetch http://www.example.com/Foo-1.3.0.tgz or http://www.example.com/Foo-1.3.0.tar (both must be available!) if the package Foo is not installed. All uri packages must contain a <uri> tag rather than a <channel> tag and will automatically belong to the pseudo-channel "__uri", but that is not important to the discussion of how to format the xml to create the uri-based package dependency.

uri-based package dependencies cannot contain any versioning information, as this is irrelevant: there is only one version possible with a static uri. uri-based dependencies can contain the <conflicts/> tag to specify an absolute conflict with the package, and the <providesextension> tag to specify an extension provided by the static package.

PEAR-style <package> dependencies vs. PECL-style <package> dependencies

package.xml 2.0 supports differentiating release types, and as such also supports dependencies on PECL-style packages that use the extbinrelease or extsrcrelease type.

To specify a dependency on a PHP extension that can be distributed as a PECL package, but could also be bundled with PHP by default, such as the PDO extension, use this dependency style:

<package>
 <name>PDO</name>
 <channel>pecl.php.net</channel>
 <min>0.3.1</min>
 <providesextension>PDO</providesextension>
</package>

The magic is in the <providesextension> tag. This tag tells the installer to take this process when validating the dependency:

  1. Is the extension "PDO" present in memory? If so, is it version 0.3.1 or higher?

  2. If not, is the user also installing pecl.php.net/PDO at the same time as this package? If so, is it version 0.3.1 or higher?

  3. If not, is pecl.php.net/PDO installed, and is the version 0.3.1 or higher?

If any of the three conditions above validate in the order specified, the dependency will be satisfied and installation will continue. This system allows users to use a different php.ini to install PHP extensions and also provides a fail-safe system to depend on extensions.

Warning

<providesextension>, like all other extension-related functions in PHP, is case-sensitive. Do not use "pdo" for the "PDO" extension, or your dependency will always fail.

<extension> dependencies

As with all dependency tags that support versioning, all standard versioning tags are supported (min, max, recommended, exclude). In addition, the <conflicts> tag is supported to create a negative dependency.

  • <min> - minimum version of PHP extension to install this package.xml.

  • <max> - maximum version of PHP extension supported.

  • <recommended> - recommended version of PHP extension. This tag is used for strict version control. The installer will refuse to install a package without the --force option unless the version exactly matches recommended. This can be used to provide a level of extra security, as a package can be set to install using a version that is known to work without limiting future upgrades.

  • <exclude> - incompatible versions of PHP extension. Multiple <exclude> tags may be used to exclude more than one version.

  • <conflicts> - Negates the dependency. If the extension is present, it cannot satisfy the requirements of the dependency or installation will fail.

<os> dependencies

The OS dependency is used to restrict a package to both a particular class of OSes (like unix) and to a specific OS (like darwin, or freebsd). Here is an example:

<os>
 <name>linux</name>
</os>

To specify that a package can be installed on every OS except the one specified, use the <conflicts/> tag:

<os>
 <name>windows</name>
 <conflicts/>
</os>

Possible OS values are:

  • windows

  • unix

  • linux

  • freebsd

  • darwin (use for Mac OS X)

  • sunos

  • irix

  • hpux

  • aix

In addition, any esoteric OS that supports the php_uname() function can be used. Note that the "unix" OS is defined as any of linux, freebsd, darwin, sunos, irix, hpux, or aix.

<arch> dependencies

The arch dependency is used to restrict a package to a specific os and processor architecture. Here is an example:

<arch>
 <pattern>linux-*-i386-*</pattern>
</arch>

To specify that a package can be installed on every architecture except the one specified, use the <conflicts/> tag:

<arch>
 <pattern>linux-*-i?86-*</pattern>
 <conflicts/>
</arch>

The arch pattern is defined by the OS_Guess->matchSignature() method, and is as follows: sysname[-release[-cpu[-extra]]]. All segments within [] are optional, and the wildcard "*" can be used in all segments instead of a value. In addition, the "?" wildcard can be used to specify a single character that can match any value. i?86 will match i386, i686, i586 and so on.

sysname is the same as the os dependency, except unix is not supported.

release is the version of the operating system.

cpu is the specific cpu, and is typically i?86, sparc, powerpc.

extra is any other stuff on the end of php_uname(), including the glibc version

<usesrole>

<usesrole> -- documenting custom file roles used in <contents>

Documenting custom file roles

Standard file roles provided by default with PEAR are:

  • php

  • data

  • doc

  • test

  • script

  • src

  • ext

If your package chooses to use a role provided by a third party that implements some more advanced file installation handling, all you need to do is specify the role in the xml for the <file> tag that contains it like so:

<file role="foo"/>

However, if a user does not have the package installed that provides the custom role "foo", then the error message on installation will simply say "unknown role 'foo'", which is not very helpful.

The <usesrole> tag instead prompts the installer to tell the user "this package uses the custom role 'foo', install package pear.example.com/Foo to use"

<usesrole>
 <role>foo</role>
 <package>Foo</package>
 <channel>pear.example.com</channel>
</usesrole>

Note that static URI packages (channel-less packages) are also supported:

<usesrole>
 <role>foo</role>
 <uri>http://pear.example.com/Foo-1.2.0</uri>
</usesrole>

<usestask>

<usestask> -- documenting custom tasks used in <contents>

Documenting custom file tasks

Standard file tasks provided by default with PEAR are documented in this location.

If your package chooses to use a task provided by a third party, all you need to do is specify the task as part of the xml for the <file> tag that contains it like so:

<file role="php">
 <tasks:foo/>
</file>

However, if a user does not have the package installed that provides the custom task "foo", then the error message on installation will simply say "unknown task 'foo'", which is not very helpful.

The <usestask> tag instead prompts the installer to tell the user "this package uses the custom task 'foo', install package pear.example.com/Foo to use"

<usestask>
 <task>foo</task>
 <package>Foo</package>
 <channel>pear.example.com</channel>
</usestask>

Note that static URI packages (channel-less packages) are also supported:

<usestask>
 <task>foo</task>
 <uri>http://pear.example.com/Foo-1.2.0</uri>
</usesrole>

<phprelease>, <extbinrelease>, <extsrcrelease>, <bundle>

<phprelease>, <extbinrelease>, <extsrcrelease>, <bundle> -- specifying the content type of a release

Documenting release type

In package.xml 1.0, there was one release type. package.xml 2.0 provides much finer control over the kind of release in order to provide three new release types: extension binary release, extension source release, and package bundle release.

All of the normal release tags (phprelease, extsrcrelease, extbinrelease) may contain two optional sections, <installconditions> and <filelist>. The purpose of these sections is to allow specification of different file install groups based on the target OS for installation, or other common install conditions.

To be clear: in package.xml, there was 1 <release> tag. package.xml 2.0 allows several adjacent release tags, each specifying a different install set. This actually simplifies complex installation filesets by separating the contents listing of the tarball from how the installer should manipulate this listing. Debugging installation file sets should be much simpler with this change.

The <filelist> tag can contain only two possible tags, <install> and <ignore>. install has two required attributes, "name" and "as". The install tag is used in the same manner as package.xml's install-as attribute for the <file>, to specify a new installation location for a file in the contents list. The ignore tag is used to completely ignore a file.

The <installconditions> tag can contain 4 tags whose format can be found in the <dependencies> section: <php>, <extension>, <os>, and <arch>. Each tag can appear exactly once except for the extension tag, which can appear limitless times.

The php tag is used to specify a php version or range of versions that an install set should be valid with.

The extension tag is used to specify extensions that must be present for an install set to be valid.

The os tag is used to specify an OS that must be present for an install set to be valid. Note that unix can be used to match all flavors, and linux can be used to match all linux-based OSes. Darwin should be used for Mac OS X, and * can be used to match all operating systems.

The arch tag is used to specify a uname string or portion of a uname string that must match in order for the install set to be valid.

<phprelease>

The phprelease release type is designed for PEAR-style PHP script package releases. It causes a few specific validation changes. First of all, the <contents> tag must contain <file> and <dir> tags. The only valid roles for files are role="php", role="data", role="doc", and role="test" plus any custom roles that the user has installed for use in php releases.

<extsrcrelease>

The extsrcrelease release type is for PECL-style PHP extension releases that must be compiled in order to be useable. It causes a few specific validation changes. First of all, the <contents> tag must contain <file> and <dir> tags. The only valid roles for files are role="src", role="data", role="doc", and role="test" plus any custom roles that the user has installed for use in extension source releases.

In addition, the <providesextension> tag must be present in order to document the name of the extension this package provides must be in the package.xml as well.

<extbinrelease>

The extbinrelease release type is for PECL-style PHP Extension binary releases that are pre-compiled. It causes a few specific validation changes. First of all, the <contents> tag must contain <file> and <dir> tags. The only valid roles for files are role="ext", role="data", role="doc", and role="test" plus any custom roles that the user has installed for use in extension binary releases.

In addition, the <srcpackage> or <srcuri> and the <providesextension> tags must be present in order to document the package that provides extension source for this binary release, and the name of the extension this package provides must be in the package.xml as well.

<bundle>

The bundle release type is designed to allow packaging several other package releases into a single bundle of packages that will all be installed at the same time. This can be used to distribute a complete application as one tarball, or to distribute a library of packages in a single tarball.

Unlike the other release types, a bundle release's <contents> tag must contain only the <bundledpackage> tag. The contents of the bundledpackage should be release names like "Foo-1.2.3.tgz"

In addition, the <bundle/> tag must be empty.


Chapter 20. Releasing A Package

The steps required from package maintainers to release a package.

Prerequisites

Rolling a new release requires that the package to which the release belongs has been approved by the PEAR developers and that you have a valid PEAR website account. Information about meeting these two requirements can be found in the chapter Contributing your own code.

Please also read the various PEAR Group regulations that cover aspects like Version Naming, File Layout and other important topics not yet discussed in this manual. Furthermore there are a number of RFC's that followed these group regulations. These can be found under R for RFC in the finished PEPr proposals. Unfortunately these documents have not yet been included in a summarized coherent format in this manual. Please ask questions if you are in doubt about any of these documents.


Chapter 21. Supporting PEAR development

How to support the PEAR community

There are numerous ways to support the PEAR project, that are described in this part of the guide.


Chapter 22. Recommendations

Why recommendations?

The following recommendations describe topics which were discussed and agreed upon by the PEAR developers on the developers mailinglist. They aren't strict rules, which you need to follow (like Coding Standards), but are intended as guidelines for a common API scheme and easier package interoperability. Please consider following them in your packages where possible.


Color Representation inside PEAR Packages

In case a package has to deal with colors, it is recommended that developers store and use an array representation of the color values in their PEAR packages. All values are in the range of 0..255.


Conversion to/between the color-representations

The PEAR-package Image_Color will (hopefully soon) contain all needed functions to convert arbitrary color formats to the internal RGBA representation and convert different color representations.

Status: Currently Image_Color already offers functions to convert color-names (e.g. "green") and hex-representations-strings (e.g. "#339900") to the PEAR-RGBA-format. We are working to get alpha- channel support added hopefully soon and will later add functions for CYMK-conversion as well.


Chapter 23. Writing documentation

This chapter provides a detailed description of how to write documentation using one of the supported formats. It is aimed at both PEAR developers that are already maintaining packages in PEAR and at people who are planning to contribute a new package.


The DocBook XML format

DocBook is an XML dialect that is used by a wide range of projects to maintain their documentation. Examples for DocBook usage in OpenSource projects are the documentations of KDE and PHP. PEAR has opted for using DocBook, because we believe that it provides a solid foundation for the technical documentation for PEAR packages.

The trade-off for using DocBook is that it is relatively hard to use. Testing documentation requires a number of tools to be installed and one needs to learn a (not very complicated) XML dialect. Once one is familiar with how DocBook works, they will enjoy writing documentation with it though.

The book [DocBook: The Definitive Guide], written by Norman Walsh and Leonard Muellner and published by O'Reilly & Associates, Inc., is available online and it makes up a great resource for people interested in learning DocBook.

Definitely check out the book's "DocBook Element Reference" section. This portion provides detailed information about each element, including which elements can (and must) be used as parents and children.


Required software

Even if DocBook XML can (like any other XML file) be written using a normal text editor, it is optimal for users to install some software on their machine in order to test the validity of the documenting efforts. A list of the required software and installation instructions can be found in the PHP Documentation HOWTO. Apart from providing information about the software, this HOWTO also provides a ton of other useful information that goes far beyond this chapter. One is encouraged to read it completely. (Chapter II can be skipped, because it only contains information that is very PHP specific.)

Installation on OS X: The PHP Documentation HOWTO advises users of Mac OS X to use packages provided by Fink. Alternatively packages from the MacPorts project can be used. After installing MacPorts, the toolchain can be installed using the following command:

Unfortunately, installing that software can be difficult under some circumstances. If you are unable to get it working, don't use that as an excuse for not writing documentation. There are two test servers that automatically download peardoc from CVS and build the manual. Any parsing errors your changes cause will show up in the logs the next time the build happens:

Build from Brett Bieber (log) (updated every two hours)
Build from TAKAGI Masahiro (log) (updated daily at 06:00 JST = 21:00 UTC)

These automatic builds also give you an idea of what your changes will look like in the actual manual. This is helpful because the manual on the PEAR website is only built once per week (Sundays ~12:00 UTC).

Warning

The manual on the PEAR website is built only once per week. Any XML validation errors will cause the build to fail. If the main build fails, the old version remains in place, meaning the manual will be out of date. Therefore, always check the test build logs to ensure your changes are valid. More importantly, do not commit updates shortly before the main build happens (Sundays ~12:00 UTC).

Once the necessary software is in place, one has to get the latest version of the XML sources from PEAR's CVS repository:


$ cvs -d :pserver:<user>@cvs.php.net:/repository login
     
     
[password]
     
     
$ cvs -d :pserver:<user>@cvs.php.net:/repository co peardoc
     

If you do not own an account for cvs.php.net, please choose cvsread as the username. When asked for the password, type phpfi.

After that the directory ./peardoc will contain a local copy ("sandbox") of the latest sources. If you are not yet familiar with CVS, then the online book "Open Source Development with CVS" will provide you with all the necessary information.


Writing documentation

Instead of a long and boring description for writing documentation using DocBook, we would like to point you to a bunch of "reference documents", from which you should be able to learn quickly:

  • peardoc/en/authoring

    The CVS tree has a complete set of DocBook XML templates. These files provide the standard of how PEAR documentation should look.

    The simplest way to utilize them is to copy them to your working directory, rename them accordingly, edit the contents to match the reality of your program and then upload them to your package's directory in the repository.

  • HTTP Request

    The documentation for HTTP_Request, which is a relatively small package, only consists of a bunch of end-user documentation, which describes all of the basic features of the package. Each feature description includes at least one example. For small packages with only a handful of methods this documentation type is absolutely enough.

  • XML Beautifier

    XML_Beautifier is a package that is also relatively compact, but which supports different configuration options. These options are described in the documentation Additionally the documentation gives usage examples and (unlike HTTP_Request) also includes API documentation for its methods.

  • DB

    DB is a large PEAR package and has excellent documentation, including usage examples. The DB docs carefully adhere to the formatting specified in peardoc/authoring. The link above goes to the DocBook source code in the CVS repository. It might be helpful to examine the HTML generated therefrom.

In addition to the examples above, you will find much more documentation examples by browsing the peardoc directory, which contains your local version of the CVS tree. Especially the directory peardoc/en/packages/ should be of interest for you. You can also browse the CVS module using the web interface, including the raw XML for the file you are presently reading.


Testing documentation

Using GNU make

Generating human-readable versions of the DocBook sources requires the existence of the above-mentioned software. The PEAR documentation system uses Unix style makefiles:


peardoc$ autoconf
peardoc$ ./configure --with-lang=en
peardoc$ make html
        

If you want to build a language other than English, change en, above, to the appropriate language code.

It may be that the DSSSL stylesheets are not found, resulting in the message

checking for docbook.dsl... defaulting - WARNING!!!
DSSSL NOT FOUND - WON'T WORK THIS WAY

In this case make sure you've installed the DSSSL packages. On a Mac using Fink, you might have to specify the location yourself: ./configure --with-dsssl=/sw/share/sgml/dsssl/docbook-dsssl-nwalsh

On Windows, the easiest way to get the DSSSL sheets is to check out the phpdoc module on cvs.php.net - they can be found in the dsssl/ subdirectory.

This will generate a "raw" HTML version of the whole manual. The result will be placed in the subdirectory html/.

The command make test does not generate any human-readable result, but it can be used to make sure that the XML is syntactically correct and that the build runs fine. And it is much faster than make html.


Using xmllint

Alternatively one can use the xmllint program that is part of the libxml2 toolkit. This is especially useful for systems where the DSSSL/make setup does not work properly.

In addition to testing the well-formedness of the DocBook sources, xmllint can also check the semantical correctness with the help of RELAX NG schemas. The schema files for DocBook are available as a ZIP package from docbook.org. After unzipping the package into the directory relaxng/ inside the peardoc source folder, one can run xmllint from the root folder of the PEAR documentation as follows:

xmllint --valid --noout --relaxng relaxng/ manual.xml


Partial builds

The build process (not the test builds, which are reasonably quick) actually takes a very long time which makes debugging and testing a very hard task. In order to increase build performance, the script make-partial.php in the root directory of the documentation module may be used. This is an interactive command line script that will enable to you to selectively include the different parts of the manual. In the following example a version of the manual is generated which only contains a certain part of the Developer's Guide and the documentation for the HTTP packages. Using these partial builds reduces the build time dramatically.


peardoc$ ./make-partial.php
Include about-pear? [NO]
Include guide-newmaint? [NO]
Include guide-developers? [NO] y
Include guide.developers.intro? [NO]
Include guide.developers.meaning? [NO]
Include guide.developers.contributing? [NO]
Include guide.developers.packagedef? [NO]
Include guide.developers.release? [NO]
Include guide.developers.supporting? [NO]
Include guide.developers.recommendations? [NO]
Include guide.developers.documentation? [NO] y
Include core? [NO]
Include packages? [NO] y
Include package.authentication? [NO]
Include package.benchmarking? [NO]
Include package.caching? [NO]
Include package.configuration? [NO]
Include package.console? [NO]
Include package.database? [NO]
Include package.datetime? [NO]
Include package.encryption? [NO]
Include package.fileformats? [NO]
Include package.filesystem? [NO]
Include package.gtk? [NO]
Include package.html? [NO]
Include package.http? [NO] y
Include package.images? [NO]
Include package.internationalization? [NO]
Include package.logging? [NO]
Include package.mail? [NO]
Include package.math? [NO]
Include package.networking? [NO]
Include package.numbers? [NO]
Include package.payment? [NO]
Include package.pear? [NO]
Include package.php? [NO]
Include package.science? [NO]
Include package.streams? [NO]
Include package.structures? [NO]
Include package.system? [NO]
Include package.text? [NO]
Include package.tools? [NO]
Include package.xml? [NO]
Include package.webservices? [NO]
CONFIG_FILES=manual.xml CONFIG_HEADERS= ./config.status
creating manual.xml
/usr/bin/jade -wno-idref  -d html.dsl -V use-output-dir -t sgml ./phpdocxml.dcl manual.xml
         

In make-partial.php, takes a long time to complete all questions. make partial with the correct parameters is much faster, e.g. make partial INCLUDE="packages package.database". The full list of IDs can be obtained by inspecting the output of make.


Tips for good documentation

This section of the chapter does not deal with the specifics of organizing documentation in the peardoc standard, but instead with how to organize documentation logically.

  1. First, every package solves a problem. What is this problem? Try to figure out what assumptions your end-users might not have about the problem (they may not realize that this is a problem that needs solving). For instance, a template package solves the problem of both separating design from code, and separating business logic from display logic. If possible, explain the problem in terms that even a novice programmer can understand.

  2. Next, how does the package uniquely solve the problem? This is something that most documentation lacks. For example, there are many template engines. All of them solve the same problem, but none of them do it in the same way. A block-based template engine does not have any logic at all, whereas a template like Smarty defines a whole new template language. Some template engines compile their templates, others don't. What is unique about your package? Can someone who has never seen the code get a good idea of how it solves the problem?

  3. Provide examples! Start right away with simple examples that show the basic feature set -- they will show users how to quickly start using the package. More complex examples will help the users in understanding advanced ways of using the package.

  4. If your package exposes complex interfaces or multiple constants that can't be fully explained in one or two examples (which is very likely), it is still important to explain them thoroughly in the documentation. Document any interfaces that users must use, such as a database DSN, command-line arguments for applications, configuration file contents, or any other non-code elements.

  5. Last, proofread your documentation. If possible, have someone else who is not as familiar with your project take a look at the documentation. They will catch assumptions that you have missed.

IV. New features in PEAR 1.4


Chapter 24. Introduction

The debut of PEAR 1.4.0 is very exciting. This chapter documents all of the differences between PEAR 1.3.x and the new features introduced in PEAR 1.4.

The most significant change in PEAR 1.4 is the addition of channels, a simple and effective method of distributing application development. This change has driven most of the other changes to PEAR, and in fact full application support is a major goal of this release.

In addition to channels, support for customization of the install process has been seriously enhanced with the addition of three essential features for application development:


Chapter 25. Channels

PEAR Channels provide a robust and effective way of distributing development. The addition of channel support to the PEAR installer as of version 1.4.0 means that it is now simpler to distribute any PHP code project using the PEAR installer than it ever was. PEAR Channels allow developers of applications to effectively depend upon packages from pear.php.net and any other source that provides a channel server. For users of these applications, this eliminates the complexity of installation and configuration. Now, all the user will need to do is to type a single pear install channel/Packagename command and go!

Before PEAR 1.4.0, the only solution to depending on code from several sources is to bundle the code. This has several bad side effects, the most obvious of which is that code size increases dramatically, and makes upgrading for a minor bug fix a complicated download for the user.

Channels allow an application developer to depend on packages from pear.php.net, a package from pear.example.com, and others. The user will only need to install/upgrade from a single source using the pear installer. With the current state of affairs, the pear installer is only really useful for installing, well, PEAR packages. Because of this difficulty (among others), traditionally very few packages are available as PEAR packages that can be installed with the PEAR installer.

PEAR 1.4.0+ aims to eliminate this and other barriers to application development.

Incomplete documentation

Documentation is not yet complete

channel.xml

channel.xml -- The channel definition file

How to describe a channel

Discovery of a channel's capabilities is extremely flexible. The XSD schema defining channel.xml can be found at http://pear.php.net/dtd/channel-1.0.xsd. Channel.xml defines:

  1. the channel name

  2. an optional suggested user alias for the channel

  3. a brief summary of the channel's purpose

  4. an optional package to perform custom validation of packages on both download and packaging

  5. a list of protocols supported by a channel (XML-RPC, SOAP, and REST are supported)

  6. a list of mirrors and the protocols they support.

Here is a sample channel.xml with all elements:

<channel version="1.0"
         xsi:schemaLocation="http://pear.php.net/channel-1.0
                             http://pear.php.net/dtd/channel-1.0.xsd">
 <name>pear.example.com</name>
 <suggestedalias>foo</suggestedalias>
 <summary>Example channel.xml</summary>
 <validatepackage version="1.3.4">Foo_Validate</validatepackage>
 <servers>
  <primary port="8080" ssl="yes">
   <xmlrpc> <!-- default path is xmlrpc.php -->
    <function version="1.0">logintest</function>
    <function version="1.0">package.listLatestReleases</function>
    <function version="1.0">package.listAll</function>
    <function version="1.0">package.info</function>
    <function version="1.0">package.getDownloadURL</function>
    <function version="1.1">package.getDownloadURL</function>
    <function version="1.0">package.getDepDownloadURL</function>
    <function version="1.1">package.getDepDownloadURL</function>
    <function version="1.0">package.search</function>
    <function version="1.0">channel.listAll</function>
   </xmlrpc>
   <rest> <!-- no default path, all must be defined in baseurl -->
    <baseurl type="REST1.0">http://pear.example.com/rest/</baseurl>
    <baseurl type="REST1.1">http://pear.example.com/rest/</baseurl>
   </rest> 
   <soap path="soapy.php"> <!-- default path is soap.php -->
    <function version="1.0">package.listAll</function>
   </soap>
  </primary>
  <mirror server="foo2.example.com/pearmirror">
   <xmlrpc path="mirrorxmlrpc.php"> <!-- default path is xmlrpc.php -->
    <function version="1.0">package.listLatestReleases</function>
    <function version="1.0">package.listAll</function>
    <function version="1.0">package.info</function>
    <function version="1.0">package.getDownloadURL</function>
    <function version="1.1">package.getDownloadURL</function>
    <function version="1.0">package.getDepDownloadURL</function>
    <function version="1.1">package.getDepDownloadURL</function>
    <function version="1.0">package.search</function>
   </xmlrpc>
   <rest> <!-- no default path, all must be defined in baseurl -->
    <baseurl type="REST1.0">http://foo2.example.com/rest/</baseurl>
   </rest> 
  </mirror>
 </servers>
</channel>

<name>

A channel's name should be the name of the server that users would browse to in order to learn more about the packages being offered. For instance, PEAR packages are located in the pear.php.net channel. PECL packages are located in the pecl.php.net channel. Note that for backwards compatibility, all existing packages based on package.xml version 1.0 are in the pear.php.net channel.

The benefit that comes from using the server name as the channel name is that auto-discovery becomes a real possibility, as well as ease of locating packages increases dramatically.

A channel need not be located in the document root, a channel can contain a path. This is a perfectly valid channel name: foo.example.com/path/to/pear. Note that users would have to type:

$ pear install foo.example.com/path/to/pear/Packagename

Unless you provide a <suggestedalias>.

The channel's definition file "channel.xml" must be placed in the root channel directory. If a channel is "pear.example.com", the channel.xml must be located in "http://pear.example.com/channel.xml". If the channel is "pear.example.com/path/to/pear", then the channel.xml must be located in "http://pear.example.com/path/to/pear/channel.xml"

<suggestedalias>

<suggestedalias> defines a shorter, more friendly name to use when installing packages from a channel. For instance, the pear.php.net channel's suggested alias is "pear". The best aliases for a channel will be no more than 6 characters long - remember, a user must type them often when installing or upgrading, and this can be tedious for longer aliases.

Rather than call this tag <alias>, as it was originally named, the tag is named <suggestedalias> in order to provide the user some latitude. If the user does not like the alias suggested by the channel owners, he or she can easily re-alias a channel through the channel-alias command.

<summary>

This tag provides a short description of what packages the user should expect to find on this channel. The summary is what users will see when the use the list-channels command.

<validatepackage>

Most channels will be satisfied with the restrictions placed upon package naming, versioning, and so on that PEAR provides by default. However, for some channels, the validation will be too strict, and others, too relaxed. The <validatepackage> tag provides the next level of customization.

If omitted, the installer assumed that the PEAR_Validate class should be used. Note that a looser version validation is provided by the PEAR_Validate_PECL class, for channels like pecl.php.net that do not wish to deal with PEAR's warnings on version transgressions.

<validatepackage> requires a version attribute and text content. The text content must be the name of a package that can be installed via:

$ pear install channelname.example.com/Packagename-version

as in:

$ pear install pear.example.com/Foo_Validate-1.3.4

for the sample channel.xml at the beginning of this section. In addition, the package must provide a single class named after the package in a file using the PEAR naming conventions (all underscores "_" converted into path separators "/" so that Foo_Validate is located in Foo/Validate.php), and this class should extend PEAR_Validate. Methods beginning with "validate" like validateVersion() are intended to be overridden by validation classes for use in extending existing validation functionality.

<servers>: <primary> and <mirror>

Mirroring is explicitly supported in channel.xml and in the PEAR installer. Users can choose their favorite mirror via the default_channel configuration option, and channel.xml can list all the possible mirrors using the (surprise) <mirror> tag.

The <primary> tag is used to define the location of protocols, and to list the protocols that are supported by the main channel server. Optional attributes can be used to modify how the PEAR installer will attempt to connect to the server. The "port" attribute can be used to define how the installer will connect to XML-RPC and SOAP services. REST services are always controlled by the individual <baseurl> tags.

<xmlrpc>, <soap>, <rest>

channel.xml knows about the XML-RPC, SOAP, and REST protocols for web services. However, the PEAR installer only supports REST currently, and may support other methods in the future. No support for SOAP is planned for the near future. However, should it ever be implemented, channel.xml is ready.

The <xmlrpc> and <soap> tags have identical formats. Both tags can contain an optional attribute "path" that tells the PEAR installer which URL to query. By default, the path is protocol.php, as in xmlrpc.php or soap.php. In other words, to access XML-RPC functions for the pear.example.com channel defined in the sample channel.xml, the installer would query https://pear.example.com:8080/xmlrpc.php for XML-RPC functions, but would query https://pear.example.com:8080/soapy.php for SOAP functions.

The <rest> tag reflects the design concept behind REST: each resource is defined by a base URL in tag <baseurl> that is then used by the installer along with hyperlinks to glean the same information that XML-RPC or SOAP would provide. Required attribute "type" tells the installer what version of the PEAR installer REST interface is provided at the base URL.

<function>

The <function> tag is quite simple. A required version attribute informs the installer what the API is, and the text content informs the installer what the name of the function is. Note that multiple functions with different versions can co-exist peacefully, as in:
<function version="1.0">package.getDownloadURL</function>
<function version="1.1">package.getDownloadURL</function>
If a newer API is backwards-compatible, always define every possible API version in order to prevent older installer versions from giving up.

Why not use a standard such as wsdl?

Some of you may be asking "why create another standard for web services discovery?" The answer is simple: channel.xml does not supplant the role that WSDL has for java, or XML-RPC introspection occupies. channnel.xml is a layer on top of these technologies. The point is to quickly list the remote protocols that are supported, not to describe what they do.

The PEAR installer is specialized enough that a generic listing of parameters and return values is entirely unnecessary: the installer knows exactly what xml-rpc function package.info version 1.0 requires and what it returns. Any other information simply adds wasted bandwidth and disk space.

XML-RPC functions

XML-RPC functions -- XML-RPC function API documentation

What XML-RPC functions are available in a standard channel?

A standard PEAR channel should support this list of XML-RPC functions:

Channels can also implement channel.listAll, but we recommend that this only be implemented by pear.php.net and pecl.php.net channels, as the command is utilized by the update-channels command to retrieve an official list of channels.

logintest

The logintest xml-rpc function is called by the login command, and should return a boolean TRUE

package.getDownloadURL

false|struct packageinfo

an array of format:

array(
        'channel' => channel name,
        'package' => package name,
        ['version' => specific version to retrieve,]
        ['state' => specific state to retrieve,]
     )

if both version and state are set, the version index should be ignored.

string preferred_state = stable

The client-side preferred_state. This should be used to exclude releases that are too unstable.

string installed_version = false

The current installed version of the package on the client-side. This will either be a version string, or false if the package is not installed. Use this to ensure that older versions are never returned (as defined by version_compare(possible_version, installed_version, "<")).

The package.getDownloadURL function should return an array with either two or three indices.

  • "version" => version of the release returned

  • "info" => the complete package.xml contents from the release

  • "url" => a URL from which to download this release. If no releases exist that fit the constraints defined by preferred_state, installed_version, and the version/state indices of packageinfo, then do not return this index, and instead return the version and package.xml of the latest release.

    The url entry should NOT append .tgz or .tar, but should be something like "http://pear.php.net/get/PEAR-1.4.0" instead of "http://pear.php.net/get/PEAR-1.4.0.tgz"

Note that version 1.0 of package.getDownloadURL did not have the installed_version parameter. Version 1.1 of package.getDownloadURL does - that is the only difference between the two versions.

package.getDepDownloadURL

string xsdversion

This should be either '1.0' or '2.0', and should match the version attribute from the top-level <package version="X.0"> tag. This should be used to determine how to process the second parameter.

struct dependency

if the first parameter xsdversion is '1.0', this should be an array of format:

array(
        'name' => package name
        'type' => 'pkg' - anything else is an error
        'rel' => 'has', 'ge', 'le', 'lt', 'le', 'not', 'ne'
        ['version' => specific version to retrieve,]
     )

if xsdversion is '2.0', this should be an array of format:

array(
        'name' => package name
        'channel' => package channel - see notes below
        ['min' => minimum version (inclusive),]
        ['max' => maximum version (inclusive),]
        ['exclude' => single version to exclude (string),
                      or array of versions to exclude,]
     )

Note that you must always verify that the channel matches your channel. If your channel server is not at pear.php.net or pecl.php.net, you must reject all xsdversion='1.0' requests, and all xsdversion='2.0' requests where the channel is not your channel.

struct parentpackage

This is information on the parent package, and is an array of format:

array(
        'channel' => channel name,
        'package' => package name,
        'version' => specific version to retrieve,
     )

string preferred_state = stable

The client-side preferred_state. This should be used to exclude releases that are too unstable.

string installed_version = false

The current installed version of the dependency on the client-side. This will either be a version string, or false if the package is not installed. Use this to ensure that older versions are never returned (as defined by version_compare(possible_version, installed_version, "<")).

Like package.getDownloadURL, package.getDepDownloadURL should return an array with either two or three indices.

  • "version" => version of the release returned

  • "info" => the complete package.xml contents from the release

  • "url" => a URL from which to download this release. If no releases exist that fit the constraints defined by preferred_state, installed_version, and the version/state indices of packageinfo, then do not return this index, and instead return the version and package.xml of the latest release.

    The url entry should NOT append .tgz or .tar, but should be something like "http://pear.php.net/get/PEAR-1.4.0" instead of "http://pear.php.net/get/PEAR-1.4.0.tgz"

Note that version 1.0 of package.getDepDownloadURL did not have the installed_version parameter. Version 1.1 of package.getDepDownloadURL does - that is the only difference between the two versions.

package.info

string package

Package name to retrieve information about

string field = null

specific field to retrieve information about. If null, this should return an array with this indices, although others could be set as well:

<?php
array(
    'name' => 'package name',
    'category' => 'category name',
    'license' => 'package license',
    'summary' => 'package summary',
    'description' => 'package description',
    'releases' =>
    array( // all releases indexed by version
        '0.1' =>
        array(
          'license' => 'release license',
          'summary' => 'release summary',
          'description' => 'release description',
          'releasedate' => 'date of release',
          'releasenotes' => 'release notes',
          'state' => 'release stability',
          // the next index is optional
          'deps' =>
          array(
            array( // release dependencies of latest release
              'type' => 'dep type from package.xml <dep>',
              'relation' => 'rel from package.xml <dep>',
              'version' => 'version from package.xml <dep>, or empty string',
              'name' => 'name from package.xml <dep>',
              'optional' => 'yes or no',
            ),
            // and so on with all deps
          ),
        ),
        // and so on with all releases
        // releases should be ordered by releasedate DESC
    ),
);
?>

The second parameter, if set, must be one of these choices:

  • authors - a current list of package maintainers in format:

    <?php
    array(
        'handle1' =>
        array(
          'name' => 'Maintainer Name',
          'email' => 'maintainer@example.com',
          'role' => 'role from package.xml (lead, developer, contributor, helper)',
        ),
        'handle2' =>
        array(
          'name' => 'Maintainer Name 2',
          'email' => 'maintainer2@example.com',
          'role' => 'role from package.xml (lead, developer, contributor, helper)',
        ),
        // etc.
    );
    ?>

  • category - the category this package is in

  • description - the description of the latest release

  • license - package license of latest release

  • notes - release notes of the latest release

  • releases - an array of the format documented above, containing information on all releases

  • summary - summary from latest release


Chapter 26. Custom File Roles

Warning

As of PEAR version 1.4.3, the required format for custom file roles has been changed due to a minor security vulnerability. All custom file roles must now define a Role.xml file in order to properly declare a custom file role. See the example below for more information.

One of the programming features that the PEAR installer enforces is the separation of files into separate categories, and the important idea that files of a similar category are always installed into the same location, or at least handled the same way, as in the case of role="src" for PECL packages.

This has been quite successful for smaller library-style packages, but complete applications cannot function without customized installation locations. For instance, some files may be intended for use in a public web frontend, others for library location. PEAR 1.4 introduces the possibility of defining custom installation roles to fill this void.


Using a customized role in a package.xml

To use a custom installation role that another programmer has written, there are three steps that are necessary. First, the <usesrole> tag should be used to define each custom role that is used in the package.xml. Next, the role should simply be used for the files it pertains to. Finally, a dependency on the package that provides the custom role should be added to the package.xml, just for completeness.

Pretty simple!


Defining a customized role for use in a package.xml

To define a custom role, you need to create a package containing a single file. Here is a sample package.xml that could be a custom role:

<?xml version="1.0"?>
<package version="2.0" xmlns="http://pear.php.net/dtd/package-2.0"
    xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd">
 <name>Chiarafoo</name>
 <channel>pear.chiaraquartet.net</channel>
 <summary>Chiarafoo role</summary>
 <description>
  The chiarafoo role installs files into your customized Foo directory
 </description>
 <lead>
  <name>Greg Beaver</name>
  <user>cellog</user>
  <email>cellog@php.net</email>
  <active>yes</active>
 </lead>
 <date>2005-03-21</date>
 <version>
  <release>1.0.0</release>
  <api>1.0.0</api>
 </version>
 <stability>
  <release>stable</release>
  <api>stable</api>
 </stability>
 <license uri="http://www.php.net/license">PHP License</license>
 <notes>
  Provides the chiarafoo file role
 </notes>
 <contents>
  <dir name="/" baseinstalldir="PEAR/Installer/Role">
   <file name="Chiarafoo.xml" role="php"/>
   <file name="Chiarafoo.php" role="php">
    <tasks:replace from="@package_version@" to="version" type="package-info"/>
   </file>
  </dir> <!-- / -->
 </contents>
 <dependencies>
  <required>
   <php>
    <min>4.2.0</min>
   </php>
   <pearinstaller>
    <min>1.4.3</min>
   </pearinstaller>
  </required>
 </dependencies>
 <phprelease/>
</package>

The XML file Chiarafoo.xml should be similar to this file:

<role version="1.0">
 <releasetypes>php</releasetypes>
 <installable>1</installable>
 <locationconfig>foo_dir</locationconfig>
 <honorsbaseinstall>1</honorsbaseinstall>
 <unusualbaseinstall />
 <phpfile>1</phpfile>
 <executable />
 <phpextension />
 <config_vars>
  <foo_dir>
   <type>directory</type>
   <default><php_dir/><constant>DIRECTORY_SEPARATOR</constant><text>Foo</text></default>
   <doc>directory where foo files are installed</doc>
   <prompt>PHP foo directory</prompt>
   <group>File Locations</group>
  </foo_dir>
 </config_vars>
</role>

The script in Chiarafoo.php is incredibly simple:

<?php
/**
 * PEAR_Installer_Role_Chiarafoo
 *
 * PHP versions 4 and 5
 *
 * LICENSE: This source file is subject to version 3.0 of the PHP license
 * that is available through the world-wide-web at the following URI:
 * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
 * the PHP License and are unable to obtain it through the web, please
 * send a note to license@php.net so we can mail you a copy immediately.
 *
 * @category   pear
 * @package    Chiarafoo
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2005 Greg Beaver
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    CVS: $Id: customroles.xml,v 1.4 2005/11/03 05:06:52 cellog Exp $
 * @link       http://pear.chiaraquartet.net/index.php?package=Chiarafoo
 * @since      File available since Release 0.1.0
 */

/**
 * @category   pear
 * @package    Chiarafoo
 * @author     Greg Beaver <cellog@php.net>
 * @copyright  2005 Greg Beaver
 * @license    http://www.php.net/license/3_0.txt  PHP License 3.0
 * @version    Release: @package_version@
 * @link       http://pear.chiaraquartet.net/index.php?package=Chiarafoo
 * @since      Class available since Release 0.1.0
 */
class PEAR_Installer_Role_Chiarafoo extends PEAR_Installer_Role_Common
{
    /**
     * @param PEAR_Installer
     * @param PEAR_PackageFile_v2
     * @param array file attributes
     * @param string relative path to file in package.xml
     */
    function setup(&$installer, $pkg, $atts, $file)
    {
        // do something special with the installer
    }
}
?>

Since PEAR 1.4.3, nothing else is necessary for a successful implementation of a file role.

The contents of the role's XML file must contain these tags:


The optional <config_vars> tag

This tag is used to define configuration variables that should be added to the installer by this custom file role. Note that the installer will not allow a custom file role to create more than 3 configuration variables. To define configuration variables, create tags with the name of the configuration variable, and then sub-tags defining information about the configuration variable.

These tags are transformed into the PHP array format expected by the PEAR_Config class using an adapted version of Stephan Schmidt's excellent XML_Unserializer class (from the XML_Serializer package). As such, it is easiest to understand the XML format by examining existing configuration variables.

array(
        'password' => array(
            'type' => 'password',
            'default' => '',
            'doc' => '(maintainers) your PEAR account password',
            'prompt' => 'PEAR password (for maintainers)',
            'group' => 'Maintainers',
            ),
        // Advanced
        'verbose' => array(
            'type' => 'integer',
            'default' => PEAR_CONFIG_DEFAULT_VERBOSE,
            'doc' => 'verbosity level
0: really quiet
1: somewhat quiet
2: verbose
3: debug',
            'prompt' => 'Debug Log Level',
            'group' => 'Advanced',
            ),
        'preferred_state' => array(
            'type' => 'set',
            'default' => PEAR_CONFIG_DEFAULT_PREFERRED_STATE,
            'doc' => 'the installer will prefer releases with this state when installing packages without a version or state specified',
            'valid_set' => array(
                'stable', 'beta', 'alpha', 'devel', 'snapshot'),
            'prompt' => 'Preferred Package State',
            'group' => 'Advanced',
            ),
         );

These sample configuration values from the actual PEAR_Config class would translate into this XML:

<config_vars>
 <password>
  <type>password</type>
  <default />
  <doc>(maintainers) your PEAR account password'</doc>
  <prompt>PEAR password (for maintainers)</prompt>
  <group>Maintainers</group>
 </password>
 <verbose>
  <type>integer</type>
  <default><constant>PEAR_CONFIG_DEFAULT_VERBOSE</constant></default>
  <doc>verbosity level
0: really quiet
1: somewhat quiet
2: verbose
3: debug</doc>
  <prompt>Debug Log Level</prompt>
  <group>Advanced</group>
 </verbose>
 <preferred_state>
  <type>set</type>
  <default><constant>PEAR_CONFIG_DEFAULT_PREFERRED_STATE</constant></default>
  <doc>the installer will prefer releases with this state when installing packages without a version or state specified</doc>
  <valid_set>stable</valid_set>
  <valid_set>beta</valid_set>
  <valid_set>alpha</valid_set>
  <valid_set>devel</valid_set>
  <valid_set>snapshot</valid_set>
  <prompt>Preferred Package State</prompt>
  <group>Advanced</group>
 </preferred_state>
</config_vars>

Note that the simple array defining the set converts each value into a separate <valid_set> tag for the preferred_state configuration variable.

The <default> tag's value can accept either a simple string, or three different kinds of tags:

For instance, this example default value:

<default><text0>hi there </text0><constant>PHP_OS</constant><text1> user, your default php_dir is </text1><php_dir/></default>

might convert into something like "hi there Linux user, your default php_dir is /usr/local/lib/php/pear".

Our example Chiarafoo role's foo_dir default value:
<default><php_dir/><constant>DIRECTORY_SEPARATOR</constant><text>Foo</text></default>

might convert into something like "/usr/local/lib/php/Foo" or "C:\php5\pear\Foo".

Note that in order to use multiple <constant> or <text> tags, you must append a numbered suffix as in the <text0> <text1> example above. Only one PEAR configuration variable may be used per default value.

Note that if you use <type>integer</type>, no matter what default value is specified, it will be casted into an integer by PEAR_Config.


Chapter 27. Custom File Tasks

For many small library packages, very little customization is needed. Just install and go. package.xml 1.0 is very good at this task. As packages grow in size and complexity, it is often necessary to make slight changes to the contents of files, and occasionally to external components such as databases.

package.xml 1.0 provides a single undocumented system of customizing file contents through the <replace> tag, like so:

<file name="blah.php" role="php">
 <replace from="@token@" to="version" type="package-info"/>
 <replace from="@anothertoken@" to="php_dir" type="pear-config"/>
</file>

This example above would scan the blah.php file at installation, and then use str_replace() to replace all occurrences of the string @token@ with the package's version number. Then, it would replace all occurrences of the string @anothertoken@ with the value of the user's php_dir configuration variable.

Although powerful, the replace tag is the only customization tag available in package.xml version 1.0. When developing package.xml version 2.0, the replace tag and innovative work of other projects such as Phing became the inspiration for an expanded kind customization called a "task".

Tasks are defined by xml children of a <file> tag. Tasks are implemented by extending the PEAR_Task_Common task.


Creating customized tasks in PHP

Creating a custom task involves creating a class that validates xml, and performs the task when called upon. Tasks can be invoked in two situations: at package-time and at install-time. Each task can control whether it should be called at package-time, install-time, or at both times.

There are two kinds of tasks: simple and multiple. Most tasks are simple tasks. Simple tasks are self-contained: all customization is limited to that file. Multiple tasks are collected during installation and processed fully as a unit after files have been committed to disk, allowing more complex processing.

All simple tasks must define 3 methods, all multiple tasks must define 4 methods. These are:


validateXml()

This method is called upon package.xml validation and should be used to validate the task's xml content. Upon error, a simple array of format array(CODE, message) must be returned. The code must be one of the following constants, as defined in PEAR/Task/Common.php:

  • PEAR_TASK_ERROR_NOATTRIBS - Attributes were expected, but none were present.

  • PEAR_TASK_ERROR_MISSING_ATTRIB - A specific attribute is not present.

  • PEAR_TASK_ERROR_WRONG_ATTRIB_VALUE - The value of an attribute is incorrect.

  • PEAR_TASK_ERROR_INVALID - Any other error in validation.

The error message should include the file name as defined by $fileAttributes['name'], and include as much useful information about the location of the validation error as possible.

PEAR_PackageFile_v2 $pkg

This is the package.xml object that contains the task.

string|array $xml

The raw parsed content of the task's xml as parsed from package.xml. Tags like <tasks:windowseol> that have no attributes or child elements will be passed an empty string ''. Otherwise, simple text content will be a string, and nested tags/attributes will be passed in as an array. Here is a list of sample xml and their parsed values:

  • <tasks:blah/>

    string("");

  • <tasks:blah>hello
    </tasks:blah>

    string("hello");

  • <tasks:blah>hello
     <tasks:boo/>
    </tasks:blah>

    array('_content' => 'hello', 'tasks:boo' => string(''))

  • <tasks:blah foo="one">
     <tasks:boo/>
    </tasks:blah>

    array('attribs' => array('foo' => 'one'), 'tasks:boo' => string(''))

PEAR_Config $config

This is the current configuration object

array $fileAttributes

The parsed attributes of the <file> tag that encloses this tag. This is guaranteed to contain indices name, specifying the file name, and role, specifying the file role. Other attributes like baseinstalldir may be present but are not required, and so will not be guaranteed to be present for every file.


init()

The init() function is called immediately prior to the startSession() method, and should be used for initialization that is not directly related to file modification. This method may move to another location in the installation process at any time. The logical separation of initialization from task action is important and the order of execution can be depended upon.

string|array $xml

The raw parsed content of the task's xml as parsed from package.xml. Tags like <tasks:windowseol> that have no attributes or child elements will be passed an empty string ''. Otherwise, simple text content will be a string, and nested tags/attributes will be passed in as an array. Here is a list of sample xml and their parsed values:

  • <tasks:blah/>

    string("");

  • <tasks:blah>hello
    </tasks:blah>

    string("hello");

  • <tasks:blah>hello
     <tasks:boo/>
    </tasks:blah>

    array('_content' => 'hello', 'tasks:boo' => string(''))

  • <tasks:blah foo="one">
     <tasks:boo/>
    </tasks:blah>

    array('attribs' => array('foo' => 'one'), 'tasks:boo' => string(''))

array $fileAttributes

The parsed attributes of the <file> tag that encloses this tag. This is guaranteed to contain indices name, specifying the file name, and role, specifying the file role. Other attributes like baseinstalldir may be present but are not required, and so will not be guaranteed to be present for every file.

string|null $lastVersion

This will be set to the string representing the version of the last installed version of this package. This is useful for determining whether the package is being upgraded or is a fresh installation. If the package is being installed for the first time, NULL will be passed in.


Chapter 28. Post-installation Scripts

Incomplete documentation

Documentation is not yet complete

The XML format for defining a post-install script in package.xml is documented here. This document describes the required elements for the PHP post-install script itself.


Structure of a post-install script

The post-install script class must contain two methods, one named init(), and the other named run(). The init() method is called at the same time as all other post-install scripts. The run() method is called at the conclusion of each parameter group in order to process the user's responses to queries.


The init() method

PEAR_Config $xml

The current configuration used for installation.

PEAR_PackageFile_v2 $self

The package.xml contents as abstracted by this object.

string|NULL $lastInstalledVersion

The last version of this package that was installed. This is a very important parameter, as it is the only way to determine whether a package is being installed from scratch, or upgraded from a previous version. Using this parameter, it is possible to determine what incremental changes, if any, need to be performed.

V. Core components


Chapter 29. PEAR base classes

The Core section provides information about the base classes in PEAR


PEAR

Table of Contents
Introduction --  How to handle the PEAR base class (destructors, error handling)
Constants -- Predefined Constants
PEAR::PEAR() -- constructor (package developer related)
PEAR::_PEAR() -- Deconstructor (package developer related)
PEAR::getStaticProperty() -- handle static properties (package developer related)
PEAR::registerShutdownFunc() -- set a shutdown function for static classes (package developer related)
PEAR::isError() -- checks for a PEAR_Error object
PEAR::raiseError() -- Create a new PEAR_Error object and optionally specify error-handling instructions
PEAR::setErrorHandling() -- sets handling of errors generated through PEAR packages
PEAR::expectError() --  add an error code for non-disabling temporary error handling
PEAR::popExpect() --  removes the last error code for non-disabling temporary error handling
PEAR::loadExtension() -- OS independent PHP extension load

PEAR provides functions for handling errors and sets the behaviour in case of error. And, it gives package developers a set of functions to make their lives easier.

Introduction

Introduction --  How to handle the PEAR base class (destructors, error handling)

Description

The PEAR base class provides standard functionality that is used by most PEAR classes. Normally you never make an instance of the PEAR class directly, you use it by subclassing it.

Its key features are:

  • request-shutdown object "destructors"

  • error handling

PEAR "destructors"

If you inherit PEAR in a class called ClassName, you can define a method in it called _ClassName (the class name with an underscore prepended) that will be invoked when the request is over. This is not a destructor in the sense that you can "delete" an object and have the destructor called, but in the sense that PHP gives you a callback in the object when PHP is done executing. See the example below.

Important!

In order for destructors to work properly, you must instantiate your class with the "=& new" operator like this:
$obj =& new MyClass();

If you only use "= new", the object registered in PEAR's shutdown list will be a copy of the object at the time the constructor is called, and it will be this copy's "destructor" that will be called upon request shutdown.

PEAR Error Handling

PEAR's base class also provides a way of passing around more complex errors than a true/false value or a numeric code. A PEAR error is an object that is either an instance of the class PEAR_Error, or some class inheriting PEAR_Error.

One of the design criteria of PEAR's errors is that it should not force a particular type of output on the user, it should be possible to handle errors without any output at all if that is desirable. This makes it possible to handle errors gracefully, also when your output format is different from HTML (for example WML or some other XML format).

The error object can be configured to do a number of things when it is created, such as printing an error message, printing the message and exiting, raising an error with PHP's trigger_error() function, invoke a callback, or none of the above. This is typically specified in PEAR_Error's constructor, but all of the parameters are optional, and you can set up defaults for errors generated from each object based on the PEAR class. See the PEAR error examples for how to use it and the PEAR_Error reference for the full details.

Examples

The example below shows how to use the PEAR's "poor man's kinda emulated destructors" to implement a simple class that holds the contents of a file, lets you append data to the object and flushes the data back to the file at the end of the request:

Note: PEAR "destructors" use PHP's shutdown callbacks (register_shutdown_function()), and in PHP < 4.1, you can't output anything from these when PHP is running in a web server. So anything printed in a "destructor" gets lost except when PHP is used in command-line mode. In PHP 4.1 and higher, output can be also generated in the destructor.

Also, see the warning about how to instantiate objects if you want to use the destructor.

The next examples illustrate different ways of using PEAR's error handling mechanism.

This example shows a wrapper to fsockopen() that delivers the error code and message (if any) returned by fsockopen in a PEAR error object. Notice that PEAR::isError() is used to detect whether a value is a PEAR error.

PEAR_Error's mode of operation in this example is simply returning the error object and leaving the rest to the user (programmer). This is the default error mode.

In the next example we're showing how to use default error modes:

Here, we set the default error mode to PEAR_ERROR_DIE, and since we don't specify any error mode in the raiseError call (that'd be the third parameter), raiseError uses the default error mode and exits if fsockopen fails.

Global Variables Used

The PEAR class uses some global variables to register global defaults, and an object list used by the "destructors". All of the global variables associated with the PEAR class have a _PEAR_ name prefix.

$_PEAR_default_error_mode

If no default error mode is set in an object, this mode will be used. Must be one of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE or PEAR_ERROR_CALLBACK.

Don't set this variable directly, call PEAR::setErrorHandling() as a static method like this:

$_PEAR_default_error_options

If the error mode is PEAR_ERROR_TRIGGER, this is the error level (one of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).

Don't set this variable directly, call PEAR::setErrorHandling() as a static method like this:

$_PEAR_default_error_callback

If no options parameter is used when an error is raised and the error mode is PEAR_ERROR_CALLBACK, the value of this variable is used as the callback. This means that you can switch the error mode temporarily and return to callback mode without specifying the callback function again. A string value represents a function, a two-element array with an object at index 0 and a string at index 1 represents a method.

Again, don't set this variable directly, call PEAR::setErrorHandling() as a static method like this:

Here is an example of how you can switch back and forth without specifying the callback function again:

Constants

Constants -- Predefined Constants

PEAR_ERROR_CALLBACK

PEAR error handling related.

See PEAR_Error, setErrorHandling()

PEAR_ERROR_DIE

PEAR error handling related.

See PEAR_Error, setErrorHandling()

PEAR_ERROR_PRINT

PEAR error handling related.

See PEAR_Error, setErrorHandling()

PEAR_ERROR_RETURN

PEAR error handling related.

See PEAR_Error, setErrorHandling()

PEAR_ERROR_TRIGGER

PEAR error handling related.

See PEAR_Error, setErrorHandling()

PEAR::PEAR()

PEAR::PEAR() -- constructor (package developer related)

Description

If you want to use the deconstructor functionality provide by PEAR, you have to call $this->PEAR() in the constructor of your class.

Parameter

  • string $errorClass - the name of the error class to use.

Note

This function can be called statically.

PEAR::_PEAR()

PEAR::_PEAR() -- Deconstructor (package developer related)

Description

Does nothing right now, but is included for forward compatibility, so subclass destructors should always call it.

PEAR::getStaticProperty()

PEAR::getStaticProperty() -- handle static properties (package developer related)

Description

If you have a class that's mostly/entirely static, and you need static properties, you can use this method to simulate them. Eg. in your method(s) do this:
$myVar = &PEAR::getStaticProperty('myVar');
You must use a reference, or they will not persist!

Parameter

  • string $class - the name of your class, where you call getStaticProperty()

  • string $var the variable to retrieve.

Return value

mixed - A reference to the variable. If not set, it will be auto initialised to NULL.

PEAR::registerShutdownFunc()

PEAR::registerShutdownFunc() -- set a shutdown function for static classes (package developer related)

Description

The indicated function is called, before the PHP interpreter will be finished.

Parameter

  • array $func - the name of the class and of the function to ccore.

  • array $var - possible required function parameters. The parameters are handed over to the function in accordance with their succession of the array.

PEAR::isError()

PEAR::isError() -- checks for a PEAR_Error object

Description

isError() examines whether a variable is a PEAR_Error object and - optional - contains a specific error message or code.

Parameter

mixed $data

variable to check

mixed $msgcode

additional error message or error code to check

Return value

mixed - returns TRUE, if the variable was a PEAR_Error and, if given, contains $msgcode

PEAR::raiseError()

PEAR::raiseError() -- Create a new PEAR_Error object and optionally specify error-handling instructions

Description

raiseError()

Parameter

string $message

Error message string or PEAR_Error object. The default message is unknown error if left blank.

integer $code

Error code. It is recommended to use an error code for even the simplest errors, in order to simplify error handling and processing.

integer $mode

Error mode. This is one of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, PEAR_ERROR_CALLBACK, or PEAR_ERROR_EXCEPTION. See setErrorHandling() for detailed information and examples of the meaning of these constants.

mixed $options

Error options. This depends on the value of $mode, and is documented in setErrorHandling().

mixed $userinfo

Optional user information. This can be used to store any error-specific information, and has an unspecified format.

string $error_class

Error class name to use as the error object. The default error class is PEAR_Error. Use this parameter to specify another class to use, such as a custom class extending PEAR_Error

boolean $skipmsg

Use this parameter if you are using a custom class that does not accept an error message in its constructor. Never use this parameter without the $error_class parameter - it will not work.

Return value

A PEAR_Error object is returned, unless PEAR_ERROR_DIE terminates execution or a PEAR_ERROR_EXCEPTION is never handled.

PEAR::setErrorHandling()

PEAR::setErrorHandling() -- sets handling of errors generated through PEAR packages

Description

setErrorHandling() can be invoked as both a standard object method ($obj->setErrorHandling) and as a static method (PEAR::setErrorHandling). If called statically, PEAR::setErrorHandling() sets the default error handling behaviour for all PEAR objects (global error handling behaviour). If called as an object method, $obj->setErrorHandling() sets the default error handling for only that object (local error handling behaviour).

Parameter

  • integer $mode - one of the following constants

    • PEAR_ERROR_RETURN If an error occurs, a PEAR_Error is returned from the error-generation method (normally raiseError().)

    • PEAR_ERROR_PRINT Like PEAR_ERROR_RETURN, but an error message will be printed additionally.

    • PEAR_ERROR_TRIGGER Like PEAR_ERROR_RETURN, but the PHP builtin-function trigger_error() will be called in PEAR_Error's constructor with the error message.

    • PEAR_ERROR_DIE The script will terminate and an error message will be printed on instantiation of a PEAR_Error.

    • PEAR_ERROR_CALLBACK If a error occurs, the callback passed to $options is called.

    • PEAR_ERROR_EXCEPTION If Zend Engine 2 is present, then an exception will be thrown using the PEAR_Error object.

  • mixed $options - the value for $options depends on $mode

    • PEAR_ERROR_PRINT and PEAR_ERROR_DIE support an optional printf() format string used when printing the error message. This format string should contain a single %s, which will be used to insert the error message into the string. Use the string to enclose the error message with other useful information not included in the error message prefix or error message.

    • PEAR_ERROR_TRIGGER requires an user error level constant used by trigger_error() (possible constants: E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). Note that if the error constant is not one of these valid error constants, a PHP warning will be triggered.

    • PEAR_ERROR_CALLBACK The callback must be a function name in the format described in the Pseudo-Type section of the PHP manual (either a string, or an array). The callback must accept a single parameter, the PEAR_Error object generated by an error condition. Note that if the callback is not a valid callback, a PHP warning will be triggered.

Here's an example of a few ways to use setErrorHandling:
<?php
require_once 'PEAR.php';
// dummy error constant for this example
define('MYCLASS_ERROR_CODE', 1);

// demonstration of default global error handling
// in this case, all PEAR Errors will trigger a PHP warning
PEAR::setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING);
// Note that the file and line number will be in the constructor of PEAR_Error
// in PEAR.php
PEAR::raiseError('test warning', MYCLASS_ERROR_CODE);

// this error specifies a mode, and overrides the default global error handling
$e = PEAR::raiseError('return only', MYCLASS_ERROR_CODE, PEAR_ERROR_RETURN);

PEAR::setErrorHandling(PEAR_ERROR_PRINT, "Gronk error: %s<br />\n");

// prints "Gronk error: test warning<br />\n"
PEAR::raiseError('test warning', MYCLASS_ERROR_CODE);

/**
 * Fake class to demonstrate error handling
 * @package myClass
 */
class myClass extends PEAR {
    /**
     * Demonstration of default local error handling
     */
    function myClass()
    {
        // object method callback
        $this->setErrorHandling(PEAR_ERROR_CALLBACK, array(&$this, 'handleErr'));
        // prints "custom handler...is working"
        PEAR::raiseError('custom handler', MYCLASS_ERROR_CODE);
        // static class method callback
        $this->setErrorHandling(PEAR_ERROR_CALLBACK,
            array('myClass', 'handleErrStatic'));
        PEAR::raiseError('custom handler', MYCLASS_ERROR_CODE);
        // function callback
        $this->setErrorHandling(PEAR_ERROR_CALLBACK, 'standardCallback');
        PEAR::raiseError('custom handler', MYCLASS_ERROR_CODE);
    }
    
    /**
     * Callback set by the constructor
     * @param PEAR_Error The error object
     */
    function handleErr($error)
    {
        $this->lastError = $error->getMessage();
        print $error->getMessage() . "...is working\n";
    }
    
    /**
     * Static callback set by the constructor
     *
     * Note that in PHP 5, $this is not set if the method is declared with
     * the "static" access modifier.  In PHP 4, $this is set, but is not
     * set to the myClass object, so don't use it!
     * @param PEAR_Error The error object
     * @static
     */
    function handleErrStatic($error)
    {
        print 'static ' . $error->getMessage() . "...is working\n";
    }
}

/**
 * @param PEAR_Error The error object
 */
function standardCallback($error)
{
    print 'normal function callback: ' . $error->getMessage();
}
// This causes the printing of three messages through error callbacks:
// "custom handler...is working"
// "static custom handler... is working"
// "normal function callback: custom handler"
$mine = new myClass;

PEAR::setErrorHandling(PEAR_ERROR_DIE);
// terminates the script with the error message "oops"
PEAR::raiseError('oops', MYCLASS_ERROR_CODE);
?>

PEAR::expectError()

PEAR::expectError() --  add an error code for non-disabling temporary error handling

Description

This method is used to tell which errors you expect to get. Expected errors are always returned with error mode PEAR_ERROR_RETURN. Expected error codes are stored in a stack, and this method pushes a new element onto it. The list of expected errors are in effect until they are popped off the stack with the popExpect() method.

Parameter

  • mixed $errorCode - the expected PEAR_Error error code or an array of error codes. If set to '*' every error is expected.

Return value

integer - the size of the error code stack.

Note

This function can not be called statically.

PEAR::popExpect()

PEAR::popExpect() --  removes the last error code for non-disabling temporary error handling

Description

This method pops one element off the expected error codes stack.

Return value

mixed - the removed error code or array of error codes

Note

This function can not be called statically.

PEAR::loadExtension()

PEAR::loadExtension() -- OS independent PHP extension load

Description

Loads an extension by name

Parameter

string $ext

The case-sensitive name of the PHP extension without filename suffix or php_ prefix.

Return value

boolean - returns TRUE, if extension could be loaded

Note

This function can be called statically.


PEAR_Exception - PHP 5 and versions above

PEAR_Exception is the recommended error handling solution for PHP 5-based packages in PEAR. PEAR_Exception is a lightweight wrapper above the built-in Exception class in PHP 5 that provides the ability to specify causes for errors, register observers, and many more features.

Exceptions in general should be used only for exceptional circumstances - for error conditions that require termination of execution. PEAR_Exception should mainly be used for transmitting error information outside the existing package, and not for normal flow control. Use Control Structures in favor of exceptions wherever possible.

Using PEAR_Exception for advanced error handling in PHP 5+

Using PEAR_Exception for advanced error handling in PHP 5+  --  Using PEAR_Exception

Introduction

This class is available as part of the PEAR package. Features include:

  • Nestable exceptions (
    <?php throw new PEAR_Exception($msg, $prev_exception); ?>
    )

  • Subject/Observer pattern, triggered when an exception is instantiated

  • Clear, detailed and attractively formatted error messages

  • Extra context information available compared to built-in Exception. For instance, a cause of the exception (PEAR_Error/PEAR_ErrorStack/another Exception).

  • Exception cause can be a PEAR_Error object, PEAR_Exception object or an array of mixed PEAR_Exceptions/PEAR_ErrorStack warnings

  • callbacks for specific exception classes and their children

Usage example:
<?php
require_once 'PEAR/Exception.php';

class Test {
	function foo() {
		throw new PEAR_Exception('Error Message', ERROR_CODE);
    }
}

function myLogger($pear_exception) {
    echo $pear_exception->getMessage();
}
// each time a exception is thrown the 'myLogger' will be called
// (its use is completely optional)
PEAR_Exception::addObserver('myLogger');
$test = new Test;
try {
    $test->foo();
} catch (PEAR_Exception $e) {
    print $e;
}
?>

API documentation is documented in the documentation for the PEAR package generated by phpDocumentor. The class is very simple, examine the source in the PEAR package to get a better idea of how it works.


PEAR_ErrorStack

Table of Contents
Introduction to using PEAR_ErrorStack for advanced error handling --  Using PEAR_ErrorStack to do both simple and advanced error handling
constructor PEAR_ErrorStack::PEAR_ErrorStack() -- Set up a new error stack instance
PEAR_ErrorStack::getErrorMessage() -- Standard error message generation callback
PEAR_ErrorStack::getErrorMessageTemplate() -- Standard Error Message Template generator from error code
PEAR_ErrorStack::getErrors() -- Retrieve all errors since last purge
PEAR_ErrorStack::getFileLine() -- Standard file/line number/function/class context callback
PEAR_ErrorStack::getMessageCallback() -- Get an error code => error message mapping callback
PEAR_ErrorStack::hasErrors() -- Determine whether there are any errors on the stack
PEAR_ErrorStack::pop() -- Pop an error off of the error stack
PEAR_ErrorStack::popCallback() -- Remove a callback from the error callback stack
PEAR_ErrorStack::push() -- Add an error to the stack
PEAR_ErrorStack::pushCallback() -- Set an error Callback If set to a valid callback, this will be called every time an error is pushed onto the stack. The return value will be used to determine whether to allow an error to be pushed or logged.
PEAR_ErrorStack::raiseError() -- emulate PEAR::raiseError()
PEAR_ErrorStack::setContextCallback() --  Set a callback that generates context information (location of error) for an error stack
PEAR_ErrorStack::setDefaultCallback() --  Sets a default callback to be used by all error stacks
PEAR_ErrorStack::setDefaultLogger() --  Set up a PEAR::Log object for all error stacks that don't have one
PEAR_ErrorStack::setErrorMessageTemplate() -- Set the Error Message Template array
PEAR_ErrorStack::setLogger() --  Set up a PEAR::Log object for this error stack
PEAR_ErrorStack::setMessageCallback() --  Set an error code => error message mapping callback
PEAR_ErrorStack::singleton() -- Return a single error stack for this package.
PEAR_ErrorStack::staticGetErrors() --  Get a list of all errors since last purge, organized by package
PEAR_ErrorStack::staticHasErrors() --  Determine whether there are any errors on any error stack
PEAR_ErrorStack::staticPop() --  Static version of pop()
PEAR_ErrorStack::staticPopCallback() -- Remove a callback from every error callback stack
PEAR_ErrorStack::staticPush() --  Static version of push()
PEAR_ErrorStack::staticPushCallback() --  Set an error Callback for every package's error stack
PEAR_ErrorStack::_log() -- Log an error using PEAR::Log
Package PEAR_ErrorStack Constants -- Constants defined in and used by PEAR_ErrorStack

PEAR_ErrorStack is an experimental error raising and handling implementation for PEAR that is designed to replace PEAR_Error when it has stabilized. PEAR_ErrorStack is both backwards compatible with PEAR_Error and forward compatible with PHP 5's PEAR_Exception class. There are many other features, all described in the Introduction.

Usage:
1      // global error stack
2      $global_stack = &PEAR_ErrorStack::singleton('MyPackage');
3      // local error stack
4      $local_stack = new PEAR_ErrorStack('MyPackage');

Introduction to using PEAR_ErrorStack for advanced error handling

Introduction to using PEAR_ErrorStack for advanced error handling  --  Using PEAR_ErrorStack to do both simple and advanced error handling

Introduction

This class is available as part of the PEAR package. Features include:

  • Fully unit-tested and documented

  • blazingly fast - blows PEAR_Error out of the water

  • Package-specific errors

  • Error levels (notice/warning/error/exception)

  • Error context data is saved separate from error message

  • Error cascading - parent errors can be specified

  • Dynamic error message generation allows generation of multiple and distinct error messages from the same error object

  • Sophisticated callbacks are available for error message generation, error context generation, and error handling functionality, see Error Context Display, Custom Error Message Generation, and controlling error generation

PEAR_ErrorStack implements error raising and handling using a stack pattern. This has tremendous advantages over the PEAR_Error Implementation. PEAR_Error centralizes all error creation and handling in the constructor of the PEAR_Error object. Once an object has been created, all handling must have been completed, either through checking the return value of a method, or through a single global callback. In addition, it is nearly impossible to determine the source of an error, and the baggage of all of the PEAR base class's bulky, slow methods accompanies every error creation.

<?php
// traditional PEAR_Error usage
require_once 'PEAR.php';
class myobj
{
    // there is no way to know where $err comes from
    function errorCallback($err)
    {
        $this->display($err->getMessage());
        $this->log($err->getMessage());
    }

    function log($msg)
    {
        error_log($msg, 3, 'somefile.log')
    }

    function display($msg)
    {
        echo $msg . '<br />';
    }
}

$myobj = new myobj;

// using a callback
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, array(&$myobj, 'errorCallback'));

$ret = SomePackage::doSomething();
if (PEAR::isError($ret)) {
    // do some handling - this error is also displayed and logged
}
PEAR::pushErrorHandling(PEAR_ERROR_RETURN);

$ret = SomePackage::doSomething();
if (PEAR::isError($ret)) {
    // do some handling - this error is not displayed or logged
}
PEAR::popErrorHandling();
?>

The PEAR_ErrorStack class has built in knowledge of the Log package, can easily differentiate and even automatically re-package errors with little to no difficulty.

<?php
// PEAR_ErrorStack error handling
require_once 'PEAR/ErrorStack.php';
require_once 'Log.php';
define('MYPACKAGE_ERROR_DBERROR', 1);
class myobj
{
    var $_stack;
    function myobj()
    {
        $this->_stack = &PEAR_ErrorStack::singleton('MyPackage');
    }

    function errorCallback($err)
    {
        switch($err['package']){
            case 'MyPackage':
                // tell the error stack to log the error only
                // it will not be pushed onto the stack
                return PEAR_ERRORSTACK_LOG;
                break;
            case 'InternalDbPackage':
                // re-package these errors as a mypackage error fit
                // for enduser consumption
                $this->_stack->push(MYPACKAGE_ERROR_DBERROR, 'error',
                    array('dbmessage' => $err['message'],
                          'dbcode' => $err['code'],
                          'We are having Connection problems, please' .
                          'try again in a few moments'),
                    '', $err); // include the error as re-packaged
                // tell the internal DB error stack to ignore this error,
                // as if it never happened
                return PEAR_ERRORSTACK_IGNORE;
                break;
        } // switch
    }
}

$myobj = &new myobj;
// separate error stacks for my package, and the internal DB package
$dbstack = &PEAR_ErrorStack::singleton('InternalDbPackage');
$mystack = &PEAR_ErrorStack::singleton('MyPackage');
// set up a file log using PEAR::Log
$log = &Log::Factory('file', 'somefile.log', 'MyPackage error log');
$mystack->setLogger($log);
// set up a default log to use for all error stacks
PEAR_ErrorStack::setDefaultLogger($log);

// any errors returned by MyPackage are logged
$ret = SomePackage::doSomething();

// Note that $ret need not be checked for any error condition - errors are
// totally separate from code
if ($dbstack->hasErrors()) {
    var_dump($dbstack->getErrors();
}

// sets a default callback for all errors
PEAR_ErrorStack::setDefaultCallback(array(&$myobj, 'errorCallback'));

// any db errors are transparently repackaged as
// user-friendly MyPackage errors now
$ret = SomePackage::doSomething();

?>

Why write a new error-handling routine when PEAR_Error already exists? There are several problems with PEAR_Error. Although an error message is present in an error class, processing this error message automatically is excessively difficult for computers. In addition, the error message cannot easily be translated once it has been placed into the PEAR_Error. There is also no standard facility for storing error-related data in the error class. On top of error message-related issues, there is no way to automatically determine which package a PEAR_Error object comes from, or the severity of an error. Fatal errors look exactly the same as non-fatal errors.

The largest flaw with PEAR_Error object is the single-error type design. Every PEAR_Error object is just a PEAR_Error object. There is no differentiating between the severity of an error, or its origin. The only way to determine the severity is to use PEAR_ERROR_TRIGGER and E_USER_NOTICE/E_USER_WARNING/E_USER_ERROR constants from php's trigger_error. But using this functionality does not justify 900 lines of code, simply because trigger_error() is built into PHP itself!

Now, to start using your newly created error objects, change all of your PEAR::raiseError() or PEAR::throwError() calls from this...

<?php
require_once 'PEAR.php';
// old way:
$error_specific_info = 'bad';
$e = PEAR::raiseError("error message - very " . $error_specific_info .
    " way to do things", MYPACKAGE_ERROR_FOO);
// another old way:
$e = PEAR::throwError("error message - very " . $error_specific_info .
    " way to do things", MYPACKAGE_ERROR_FOO);
?>

...to something like this:

<?php
require_once 'PEAR/ErrorStack.php';
// new way
// version 1: stack instance access
$stack = &PEAR_ErrorStack::singleton('MyPackage');
$stack->push(MYPACKAGE_ERROR_DBERROR, 'error',
    array('query' => $query, 'dsn' => $dsn),
    'Critical Database Error: Contact Administrator immediately');
// version 2: static singleton access (slightly slower)
PEAR_ErrorStack::staticPush('MyPackage', MYPACKAGE_ERROR_DBERROR, 'error',
    array('query' => $query, 'dsn' => $dsn),
    'Critical Database Error: Contact Administrator immediately');
?>

For basic use, this is all that is needed to use the PEAR_ErrorStack package in place of PEAR_Error.

Advanced Features

Error Context Display

In some cases, you may want to customize error generation. For instance, for many exceptions, it is useful to include file, line number, and class/function context information in order to trace an error. A default option is available which will be sufficient for most cases, and that is PEAR_ErrorStack::getFileLine().

Not all package errors occur in the PHP source file. For instance, compiling template engines errors can occur in the template source files. Database errors can occur in the text of a query, or internal to the database server. Internet package errors can occur on another server. All of this information can be included in an error message using a context grabbing callback.

<?php
require_once 'PEAR/ErrorStack.php';
class DatabaseClass
{
    var $_dbError;
    var $_dbErrorMsg;
    var $_dbQuery;
    var $_dbPos;
    /**
     * Context grabber for the Database package
     * @param integer Error Code
     * @param array   Error parameters passed into {@link PEAR_ErrorStack::push()}
     * @param array   Output of debug_backtrace() (not used in this callback)
     */
    function getErrorContext($code, $params, $backtrace)
    {
        $context = array(
            'errorcode' => $this->_dbError,
            'errormsg' => $this->_dbErrorMsg,
            'query' => $this->_dbQuery,
            'pos' => $this->_dbPos,
        );
        return $context;
    }
}
$db = new DatabaseClass;
PEAR_ErrorStack::staticSetContextCallback('Database', array(&$db, 'getErrorContext'));
?>

The context information is formatted to be easily processed by an external application. If you wish context information to be in the error message, the error message callback should be used to add the information in a human-readable format to the error message, as described in the next section.

Custom Error Message Generation

There are three methods of PEAR_ErrorStack designed for use with generating error messages efficiently. To use them, you must do one of three things:

  • Call PEAR_ErrorStack::setErrorMessageTemplate(), and set an array mapping error codes to error message templates, like so:

    <?php
    define('ERROR_ONE', 1);
    define('ERROR_TWO', 2);
    define('ERROR_THREE', 3);
    define('ERROR_FOUR', 4);
    require_once 'PEAR/ErrorStack.php';
    $stack = &PEAR_ErrorStack::singleton('mypackage');
    $messages = array(
        ERROR_ONE => 'The gronk number %num% dropped a %thing%',
        ERROR_TWO => 'The %list% items were missing',
        ERROR_THREE => 'I like chocolate, how about %you%?',
        ERROR_FOUR => 'and a %partridge% in a pear %tree%',
    );
    $stack->setErrorMessageTemplate($messages);
    ?>

    Substitution is done using str_replace, and is very simple. Basically, if a variable name is enclosed in percent signs (%), it will be replaced with the value passed in the associative array. If an array
    array('varname' => 'value');
    is passed to either method, all occurrences of %varname% will be replaced by value.

    In addition, if values are objects, the methods will search for a method named "__toString()" and if found, will use that to convert the object to a string. If an array of strings is passed in, they will be joined by commas.
    <?php
    array('varname' => array('first', 'second', 'third'));
    // this will become 'first, second, third'
    ?>

  • Call PEAR_ErrorStack::setMessageCallback(), and set a custom error message generating function or method. This is probably the best option for the majority of complex situations, as it allows users to override or even extend the existing error message callback using PEAR_ErrorStack::getMessageCallback(). For example:
    <?php
    require_once 'PEAR/ErrorStack.php';
    class foo
    {
        var $_oldcallback;
        function callback(&$stack, $err)
        {
            $message = call_user_func_array($this->_oldcallback, array(&$stack, $err));
            $message .= "File " . $err['context']['file'];
            return $message;
        }
    }
    $a = new foo;
    $stack = &PEAR_ErrorStack::singleton('otherpackage');
    $a->_oldcallback = $stack->getMessageCallback('otherpackage');
    $stack->setMessageCallback(array(&$a, 'callback'));
    ?>

  • Extend PEAR_ErrorStack with your own class, and override PEAR_ErrorStack::getErrorMessageTemplate() or PEAR_ErrorStack::getErrorMessage(). To guarantee that this class will be used by other packages/applications, use this code right after the class declaration:

    <?php
    PEAR_ErrorStack::singleton('mypackage', false, null, 'MyPEAR_ErrorStack');
    ?>

Controlling error generation

There are many scenarios in which fine-grained control over error raising is absolutely necessary. A generic error handling callback means that every single error raised will be handled in the same error callback. Although PEAR_ErrorStack is designed to operate with independent callbacks for each package, generic error handling is possible through the PEAR_ErrorStack::staticPushCallback() method. This is no different from PEAR_Error's PEAR_ERROR_CALLBACK error handling mode.

PEAR_ErrorStack's real strength comes from the callback itself. PEAR_Error's callback has no actual effect on the error message - all error handling must happen in the callback method or function itself. PEAR_ErrorStack's callback can influence the error through the use of three constants:

PEAR_ERRORSTACK_IGNORE informs the stack to ignore the error, as if it never occurred. The error will be neither logged, nor pushed on the stack. It will, however, be returned from PEAR_ErrorStack::push()

PEAR_ERRORSTACK_PUSH informs the stack to push the error onto the error stack, but not to log the error.

PEAR_ERRORSTACK_LOG informs the stack not to push the error onto the error stack, but only to log the error.

<?php
define('ERROR_CODE_ONE',1);
define('ERROR_CODE_TWO',2);
define('ERROR_CODE_THREE',3);
require_once 'PEAR/ErrorStack.php';
require_once 'Log.php';
function somecallback($err)
{
    switch($err['code']){
        case ERROR_CODE_ONE:
                return PEAR_ERRORSTACK_IGNORE;
                break;
        case ERROR_CODE_TWO:
                return PEAR_ERRORSTACK_PUSH;
                break;
        case ERROR_CODE_THREE:
                return PEAR_ERRORSTACK_LOG;
                break;
    } // switch
}
$log = &Log::factory('display');
$stack = &PEAR_ErrorStack::singleton('mypackage');
$stack->setLogger($log);
$stack->pushCallback('somecallback');
$stack->push(ERROR_CODE_ONE);
$stack->push(ERROR_CODE_TWO);
$stack->push(ERROR_CODE_THREE);
var_dump(PEAR_ErrorStack::staticGetErrors());

// simulate PEAR_ERROR_CALLBACK, with specific callback for mypackage
// every other package will only log errors, only mypackage's errors
// are pushed on the stack, conditionally
class myclass {
    function acallback($err)
    {
        return PEAR_ERRORSTACK_LOG;
    }
}
$stack2 = PEAR_ErrorStack::singleton('anotherpackage');
$stack3 = &PEAR_ErrorStack::singleton('thirdpackage');
PEAR_ErrorStack::setDefaultCallback(array('myclass', 'acallback'));
?>

Repackaging errors from one package to another

The most obvious usage for an error callback involves a common scenario in many user-level applications that use system-level packages. If you write a Content Management System (CMS) with the PEAR DB package, it is usually a bad idea to display database-level errors when a user clicks on a link to add a message to a forum. PEAR_ErrorStack can be used to repackage this error as a MyPackage error.

<?php
define('MYPACKAGE_ERROR_DBDOWN',1);
require_once 'PEAR/ErrorStack.php';
function repackage($err)
{
    if ($err['package'] == 'DB') {
        $mystack = &PEAR_ErrorStack::singleton('mypackage');
        $mystack->push(MYPACKAGE_ERROR_DBDOWN, 'error', array('olderror' => $err));
        // ignore the DB error, but save it in the mypackage error, for logging
        return PEAR_ERRORSTACK_IGNORE;
    }
}
?>

Emulating the @ operator

One of the difficult-to-use strengths of PEAR_Error involves the PEAR::expectError() method. With regular PHP errors, it is possible to silence them using the @ operator like so:

<?php
@file_get_contents();
?>

Emulating this behavior with PEAR_ErrorStack is simple.

<?php
define('ERROR_CODE_SOMETHING', 1);
require_once 'PEAR/ErrorStack.php';
function silence($err)
{
    // ignore all errors
    return PEAR_ERRORSTACK_IGNORE;
}
$stack = &PEAR_ErrorStack::singleton('mypackage');
$stack->pushCallback('silence');
$stack->push(ERROR_CODE_SOMETHING);
?>

PEAR_ErrorStack can take this one step further, and only log errors or only put errors on the error stack, using the other two constants. Finally, particular errors can be singled out, and all others ignored.

<?php
define('SOMEPACKAGE_ERROR_THING', 1);
require_once 'PEAR/ErrorStack.php';
function silenceSome($err)
{
    if ($err['package'] != 'somepackage') {
        // ignore all errors from other packages
        return PEAR_ERROR_IGNORE;
    }
    if ($err['code'] != SOMEPACKAGE_ERROR_THING) {
        // ignore all other error codes
        return PEAR_ERRORSTACK_IGNORE;
    }
}
$stack = &PEAR_ErrorStack::singleton('mypackage');
$stack->pushCallback('silenceSome');
$stack->push(ERROR_CODE_SOMETHING);
?>

Backwards compatibility with PEAR_Error, Forward compatibility with PHP 5 Exception and PEAR_Exception

PEAR_ErrorStack can also be programmed to automatically raise a PEAR_Error using PEAR::raiseError(), simply pass in true to the PEAR_Error compatibility like so:

<?php
require_once 'PEAR/ErrorStack.php';
$stack = &PEAR_ErrorStack::singleton('mypackage', false, false, true);
?>

PEAR_ErrorStack can coordinate with the new PEAR_Exception class to convert into an exception with this code: You can set the exception class name that will be returned using the following code:

<?php
require_once 'PEAR/ErrorStack.php';
require_once 'PEAR/Exception.php';
$stack = &PEAR_ErrorStack::singleton('mypackage');
$stack->push(1, 'test error');
throw new PEAR_Exception('did not work', $stack->pop());
?>

constructor PEAR_ErrorStack::PEAR_ErrorStack()

constructor PEAR_ErrorStack::PEAR_ErrorStack() -- Set up a new error stack instance

Backwards Compatibility Warning

Warning

As of PEAR 1.3.2, PEAR_ErrorStack no longer instantiates and returns an Exception object in PHP5, and the last parameter has been removed. Code that relies upon this behavior will break.

Description

Creates a new private PEAR_ErrorStack. To access a universal stack, use PEAR_ErrorStack::singleton()

Parameter

string $package

name of the package this error stack represents

callback $msgCallback

callback used for error message generation

callback $contextCallback

callback used for context generation, defaults to getFileLine()

boolean $throwPEAR_Error

string $exceptionClass

exception class to instantiate if in PHP 5

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::getErrorMessage()

PEAR_ErrorStack::getErrorMessage() -- Standard error message generation callback

Description

This method may also be called by a custom error message generator to fill in template values from the params array, simply set the third parameter to the error message template string to use

The special variable %__msg% is reserved: use it only to specify where a message passed in by the user should be placed in the template, like so:

Error message: %msg% - internal error

If the message passed like so:

<?php
$stack->push(ERROR_CODE, 'error', array(), 'server error 500');
?>

The returned error message will be "Error message: server error 500 - internal error"

Parameter

PEAR_ErrorStack &$stack

array $err

string|false $template

Pre-generated error message template

Throws

throws no exceptions thrown

Note

This function should be called statically.

PEAR_ErrorStack::getErrorMessageTemplate()

PEAR_ErrorStack::getErrorMessageTemplate() -- Standard Error Message Template generator from error code

Description

Standard Error Message Template generator from error code

Parameter

mixed $code

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::getErrors()

PEAR_ErrorStack::getErrors() -- Retrieve all errors since last purge

Description

Retrieve all errors since last purge, or filter all errors and only return errors of a particular error level, leaving the rest on the stack.

Parameter

boolean $purge

set in order to empty the error stack

string $level

Level name to check for a particular severity. Use this to determine whether only a particular class of errors has occurred, such as whether any warnings have occurred (errors will be ignored)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::getFileLine()

PEAR_ErrorStack::getFileLine() -- Standard file/line number/function/class context callback

Description

This function uses a backtrace generated from debug_backtrace and so will not work at all in PHP < 4.3.0. The frame should reference the frame that contains the source of the error.

Parameter

array $code

Results of debug_backtrace()

unused $params

integer $backtrace

backtrace frame.

Return value

returns either array('file' => file, 'line' => line, 'function' => function name, 'class' => class name) or if this doesn't work, then false

Throws

throws no exceptions thrown

Note

This function should be called statically.

PEAR_ErrorStack::getMessageCallback()

PEAR_ErrorStack::getMessageCallback() -- Get an error code => error message mapping callback

Description

This method returns the current callback that can be used to generate error messages

Return value

returns Callback function/method or false if none

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::hasErrors()

PEAR_ErrorStack::hasErrors() -- Determine whether there are any errors on the stack

Description

Determine whether there are any errors on the stack

Parameter

string $level

Level name to check for a particular severity. Use this to determine whether only a particular class of errors has occurred, such as whether any warnings have occurred (errors will be ignored)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::pop()

PEAR_ErrorStack::pop() -- Pop an error off of the error stack

Description

Pop an error off of the error stack

Throws

throws no exceptions thrown

Note

since 0.4alpha it is no longer possible to specify a specific error level to return - the last error pushed will be returned instead.

Note

This function can not be called statically.

PEAR_ErrorStack::popCallback()

PEAR_ErrorStack::popCallback() -- Remove a callback from the error callback stack

Description

Remove a callback from the error callback stack

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::push()

PEAR_ErrorStack::push() -- Add an error to the stack

Backwards Compatibility Warning

Warning

As of PEAR 1.3.2, PEAR_ErrorStack no longer instantiates and returns an Exception object in PHP5. Code that relies upon this behavior will break.

Description

If the message generator exists, it is called with 2 parameters.

  • the current Error Stack object

  • an array that is in the same format as an error. Available indices are 'code', 'package', 'time', 'params', 'level', and 'context'

Next, if the error should contain context information, this is handled by the context grabbing method. Finally, the error is pushed onto the proper error stack

Parameter

integer $code

Package-specific error code

string $level

Error level. This is NOT spell-checked

array $params

associative array of error parameters

string $msg

Error message, or a portion of it if the message is to be generated

array $repackage

If this error re-packages an error pushed by another package, place the array returned from pop() in this parameter

array $backtrace

Protected parameter: use this to pass in the http://www.php.net/manual-lookup.php?pattern=debug_backtrace that should be used to find error context.

Return value

returns if compatibility mode is on, a PEAR_Error is also thrown. If the class Exception exists, then one is returned to allow code like:
<?php
1      throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob')));
?>

The errorData property of the exception class will be set to the array that would normally be returned. If a PEAR_Error is returned, the userinfo property is set to the array

Otherwise, an array is returned in this format:
<?php
1      array(
2         'code' => $code,
3         'params' => $params,
4         'package' => $this->_package,
5         'level' => $level,
6         'time' => time(),
7         'context' => $context,
8         'message' => $msg,
9      //['repackage' => $err] repackaged error array
10     );
?>

Throws

No exceptions thrown.

Note

This function can not be called statically.

PEAR_ErrorStack::pushCallback()

PEAR_ErrorStack::pushCallback() -- Set an error Callback If set to a valid callback, this will be called every time an error is pushed onto the stack. The return value will be used to determine whether to allow an error to be pushed or logged.

Description

The return value must be one of the PEAR_ERRORSTACK_* constants.

This functionality can be used to emulate PEAR's pushErrorHandling, and the PEAR_ERROR_CALLBACK mode, without affecting the integrity of the error stack or logging

Parameter

string|array $cb

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ErrorStack::raiseError()

PEAR_ErrorStack::raiseError() -- emulate PEAR::raiseError()

Description

See PEAR::raiseError()

Throws

No exceptions thrown.

Note

This function can be called statically.

PEAR_ErrorStack::setContextCallback()

PEAR_ErrorStack::setContextCallback()  --  Set a callback that generates context information (location of error) for an error stack

Description

This method sets the callback that can be used to generate context information for an error. Passing in NULL will disable context generation and remove the expensive call to debug_backtrace()

Parameter

mixed $contextCallback

A valid callback as defined by is_callable()

Throws

No exceptions thrown.

Note

This function can not be called statically.

PEAR_ErrorStack::setDefaultCallback()

PEAR_ErrorStack::setDefaultCallback()  --  Sets a default callback to be used by all error stacks

Description

This method sets the callback that can be used to generate error messages for a singleton

Parameter

array|string $callback

Callback function/method

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::setDefaultLogger()

PEAR_ErrorStack::setDefaultLogger()  --  Set up a PEAR::Log object for all error stacks that don't have one

Description

Set up a PEAR::Log object for all error stacks that don't have one

Parameter

Log &$log

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::setErrorMessageTemplate()

PEAR_ErrorStack::setErrorMessageTemplate()  -- Set the Error Message Template array

Description

The array format must be: array(error code => 'message template',...)

Error message parameters passed into push() will be used as input for the error message. If the template is 'message %foo% was %bar%', and the parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will be 'message one was six'

Parameter

mixed $template

Throws

No exceptions thrown.

Note

This function can not be called statically.

PEAR_ErrorStack::setLogger()

PEAR_ErrorStack::setLogger()  --  Set up a PEAR::Log object for this error stack

Description

Set a PEAR::Log object to use for a specific error stack instance

Parameter

Log &$log

Throws

No exceptions thrown.

Note

This function can not be called statically.

PEAR_ErrorStack::setMessageCallback()

PEAR_ErrorStack::setMessageCallback()  --  Set an error code => error message mapping callback

Description

This method sets the callback that can be used to generate error messages for any PEAR_ErrorStack instance

Parameter

mixed $msgCallback

Throws

No exceptions thrown.

Note

This function can not be called statically.

PEAR_ErrorStack::singleton()

PEAR_ErrorStack::singleton() -- Return a single error stack for this package.

Synopsis

require_once 'PEAR/ErrorStack.php';

PEAR_ErrorStack & PEAR_ErrorStack::singleton (string $package [, callback $msgCallback = FALSE [, callback $contextCallback = FALSE [, boolean $throwPEAR_Error = FALSE, string [$stackClass = 'PEAR_ErrorStack']]]])

Backwards Compatibility Warning

Warning

As of PEAR 1.3.2, PEAR_ErrorStack no longer instantiates and returns an Exception object in PHP5, and the second-to-last parameter has been removed. Code that relies upon this behavior will break.

Description

Note that all parameters are ignored if the stack for package $package has already been instantiated

Parameter

string $package

name of the package this error stack represents

callback $msgCallback

callback used for error message generation

callback $contextCallback

callback used for context generation, defaults to getFileLine()

boolean $throwPEAR_Error

If TRUE, then PEAR::raiseError() will be called and a PEAR_Error object will be returned from calls to PEAR_ErrorStack::push()

string $stackClass

class to instantiate

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::staticGetErrors()

PEAR_ErrorStack::staticGetErrors() --  Get a list of all errors since last purge, organized by package

Backwards Compatibility Warning

Warning

As of PEAR 1.3.2, the second parameter is a new parameter $level. Any code that relies on $merge being the second parameter will break.

Description

Static version of PEAR_ErrorStack::getErrors() , returns all errors from all singleton stacks.

Parameter

boolean $purge

Set to purge the error stack of existing errors

string $level

Level name to check for a particular severity. Use this to determine whether only a particular class of errors has occurred, such as whether any warnings have occurred (errors will be ignored)

boolean $merge

Set to return a flat array, not organized by package

array $sortfunc

Function used to sort a merged array - default sorts by time, and should be good for most cases

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::staticHasErrors()

PEAR_ErrorStack::staticHasErrors()  --  Determine whether there are any errors on any error stack

Description

Static version of PEAR_ErrorStack::hasErrors(). Returns TRUE if any singleton stack has any errors pending. Since PEAR 1.3.2, If $package is specified, it will call PEAR_ErrorStack::hasErrors for the singleton error stack of that package. If level is specified, hasErrors will ignore any errors not conforming to the error level specified. Use this to simulate error_reporting(E_NOTICE), for example

Parameter

string|FALSE $package

Package name to retrieve error information from, or false to retrieve error information from all singleton stacks

string $level

Level name to check for a particular severity. Use this to determine whether only a particular class of errors has occurred, such as whether any warnings have occurred (errors will be ignored)

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::staticPop()

PEAR_ErrorStack::staticPop()  --  Static version of pop()

Description

Pop an error off of the error stack, static method

Parameter

string $package

Package name to retrieve error message from

Return value

returns if compatibility mode is on, a PEAR_Error is also thrown.

Note

since PEAR 1.5.0a1

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::staticPopCallback()

PEAR_ErrorStack::staticPopCallback() -- Remove a callback from every error callback stack

Description

Pop a callback from every Error Stack. No check is made to determine whether this is a good idea, so use with discretion.

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::staticPush()

PEAR_ErrorStack::staticPush()  --  Static version of push()

Description

Parameter

string $package

Package name this error belongs to

integer $code

Package-specific error code

string $level

Error level. This is NOT spell-checked

array $params

associative array of error parameters

string $msg

Error message, or a portion of it if the message is to be generated

array $repackage

If this error re-packages an error pushed by another package, place the array returned from pop() in this parameter

array $backtrace

Protected parameter: use this to pass in the debug_backtrace that should be used to find error context

Return value

returns if compatibility mode is on, a PEAR_Error is also thrown.

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::staticPushCallback()

PEAR_ErrorStack::staticPushCallback()  --  Set an error Callback for every package's error stack

Description

Set an error callback for every package's singleton error stack.

Parameter

string|array $cb

Throws

No exceptions thrown.

Note

This function should be called statically.

PEAR_ErrorStack::_log()

PEAR_ErrorStack::_log() -- Log an error using PEAR::Log

Description

This is a protected function, and should only be called by child classes that extend PEAR_ErrorStack

Parameter

array $err

Error array

array $levels

Error level => Log constant map

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package PEAR_ErrorStack Constants

Package PEAR_ErrorStack Constants -- Constants defined in and used by PEAR_ErrorStack

PEAR_Error [deprecated]

Table of Contents
PEAR_Error::addUserInfo() -- add user information
PEAR_Error::getCallback() -- get callback function name
PEAR_Error::getCode() -- get error code
PEAR_Error::getMessage() -- get error message
PEAR_Error::getMode() -- get error mode
PEAR_Error::getDebugInfo() -- get debug information
PEAR_Error::getType() -- get error type
PEAR_Error::getUserInfo() -- get additional user-supplied information
PEAR_Error::PEAR_Error() -- constructor
PEAR_Error::toString() -- make string representation

PEAR_Error is an object created by every function in PEAR in case of a failure. It provides information on why a function fails.

How you get the object depends on PEAR::SetErrorHandling()

PEAR_Error::addUserInfo()

PEAR_Error::addUserInfo() -- add user information

Description

Adds an user information to the error object.

Parameter

  • string - user info

Note

This function can not be called statically.

PEAR_Error::getCallback()

PEAR_Error::getCallback() -- get callback function name

Description

Returns the name of the function called in case of throwing a PEAR_Error object.

Return value

string - function name

Note

This function can not be called statically.

PEAR_Error::getCode()

PEAR_Error::getCode() -- get error code

Description

Returns the error code coming with the error object.

Return value

integer - error number

Note

This function can not be called statically.

PEAR_Error::getMessage()

PEAR_Error::getMessage() -- get error message

Description

Returns the error message coming with the error object.

Return value

string - error message

Note

This function can not be called statically.

PEAR_Error::getMode()

PEAR_Error::getMode() -- get error mode

Description

Returns the error mode used for throwing the error object.

Return value

integer - error mode

Note

This function can not be called statically.

PEAR_Error::getDebugInfo()

PEAR_Error::getDebugInfo() -- get debug information

Description

Returns debug information about an error

Return value

string - error debug information

Note

This function can not be called statically.

PEAR_Error::getType()

PEAR_Error::getType() -- get error type

Description

Returns the name of the error class of the object.

Return value

string - error class name

Note

This function can not be called statically.

PEAR_Error::getUserInfo()

PEAR_Error::getUserInfo() -- get additional user-supplied information

Description

Returns additional information about an error

Return value

string - error information

Note

This function can not be called statically.

PEAR_Error::PEAR_Error()

PEAR_Error::PEAR_Error() -- constructor

Description

Constructor

Parameter

  • string $message - the error message. A brief description of the occured failure or problem.

  • string $code - the error code. An error specific number.

  • integer $mode - the error mode

  • mixed $options - error mode specific options

  • string $userinfo - a string for additional user or debug info

Note

This function can be called statically.

PEAR_Error::toString()

PEAR_Error::toString() -- make string representation

Description

Makes a string representation of the error object.

Return value

string - object representation

Note

This function can not be called statically.


System

Table of Contents
Introduction -- General usage informations
System::rm -- remove files
System::mkDir -- create directories
System::&cat -- concatenate files
System::mktemp -- Create temporary files or directories
System::tmpdir -- Get path of temporal directory
System::which -- show full path of a command

Commandline functions

System provides an API for cross platform compatible commandline programs.

Introduction

Introduction -- General usage informations

Command line style

The System functions are called like there commandline pendants
if (!System::rm('-r file1 dir1')) {
	print "Could not delete all the files";
}
The arguments of the functions can be introduced as string or array:
System::rm(array('-r', 'file1', 'dir1'));
System works like any other PHP function and will return FALSE, when the operation could not be completed entirely or partially. System won't stop when a error is found, it will try to continue. For example, if you are trying to delete three files and the first one can't be deleted, the next two files will be deleted but the function will return FALSE.

Errors will be printed out using the PHP function trigger_error()() so all the System methods can be silenced prefix a '@' sign before the function call (for example: @System::mkdir('-p dir1/dir2/dir3');).

Compatibility

System provides file system functions. They are named like the file system commands on Unix systems and supports the same options independent of your operation system.

At the moment the functions are tested under Linux and Windows. Further reports about compatibility on other systems are welcome.

Warning

In earlier versions of PHP 4, unlink() may fail on Windows. This bug is already fixed in up-to-date versions.

Man Pages

This manual describes the parameters of the System functions, most only a string. The arguments and options of the specific command are not documented in the manual. Please take a look on the man-pages on unix-like systems
man commandname
or when man-pages not available on your system, visit the On-line UNIX manual pages

System::rm

System::rm -- remove files

Description

The rm command for removing files. Supports multiple files and dirs and also recursive deletes.

Parameter

  • string $args - the arguments for rm

Return value

mixed - TRUE for success

Note

This function can be called statically.

System::mkDir

System::mkDir -- create directories

Description

Creates directories.

Parameter

  • string $args - the name of the directory/-ies to create

Return value

bool - TRUE for success

Note

This function can be called statically.

System::&cat

System::&cat -- concatenate files

Description

Concatenate files. The method uses fopen(), URLs should work too.

Parameter

  • string $args - the arguments

Return value

boolean - TRUE on success

Note

This function can be called statically.

System::mktemp

System::mktemp -- Create temporary files or directories

Description

Creates temporary files or directories. This function will remove the created files when the scripts finish its execution.

Parameter

  • string $args - The arguments

    • prefix - The string that will be prepended to the temp name (defaults to tmp)

    • -d - A temporary dir will be created instead of a file.

    • -t - The target dir where the temporary file or directory will be created. If this parameter is missing, by default the environment vars TMP on Windows or TMPDIR on Unix will be used. If these vars are also missing c:\windows\temp or /tmp will be used.

Return value

mixed - the full path of the created file or dir, or FALSE

Note

This function can be called statically.

System::tmpdir

System::tmpdir -- Get path of temporal directory

Description

Get the path of the temporal directory set in the system by looking in its environments variables.

Return value

string - The temporal directory on the system

Note

This function can be called statically.

php.ini-recommended removes the E from the variables_order setting, making unavailable the $_ENV array

System::which

System::which -- show full path of a command

Description

The command shows the full path of a command.

Parameter

  • string $program - the command to search for

  • boolean $fallback - value to return in case of program not found

Return value

mixed - A string with the full path or FALSE if not found

Note

This function can be called statically.


Chapter 30. PEAR Installer classes

The PEAR Installer classes provides an API for the administration and management of PEAR Packages.

Warning

Documentation is not fully up-to-date with PEAR version 1.4.0.


PEAR_Autoload

Table of Contents
PEAR_Autoloader::addAggregateObject() -- Add an aggregate object to object.
PEAR_Autoloader::addAutoload() -- Add one or more autoload entries
PEAR_Autoloader::removeAggregateObject() -- Remove an aggregate object
PEAR_Autoloader::removeAutoload() -- Remove an autoload entry
PEAR_Autoloader::__call() -- Overloaded object call handler

This class is for objects where you want to separate the code for some methods into separate classes. This is useful if you have a class with not-frequently-used methods that contain lots of code that you would like to avoid always parsing.

Class Trees for PEAR_Autoloader

  • PEAR

    • PEAR_Autoloader

PEAR_Autoloader::addAggregateObject()

PEAR_Autoloader::addAggregateObject() -- Add an aggregate object to object.

Description

Add an aggregate object to this object. If the specified class is not defined, loading it will be attempted following PEAR's file naming scheme. All the methods in the class will be aggregated, except private ones (name starting with an underscore) and constructors.

Parameter

string $classname

what class to instantiate for the object.

Note

This function can not be called statically.

PEAR_Autoloader::addAutoload()

PEAR_Autoloader::addAutoload() -- Add one or more autoload entries

Description

Add one or more autoload entries.

Parameter

string $method

which method to autoload

string $classname

which class to find the method in. If the $method parameter is an array, this parameter may be omitted (and will be ignored if not), and the $method parameter will be treated as an associative array with method names as keys and class names as values.

Note

This function can not be called statically.

PEAR_Autoloader::removeAggregateObject()

PEAR_Autoloader::removeAggregateObject() -- Remove an aggregate object

Description

Remove an aggregate object.

Parameter

string $classname

the class of the object to remove

Return value

bool Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Autoloader::removeAutoload()

PEAR_Autoloader::removeAutoload() -- Remove an autoload entry

Description

Remove an autoload entry.

Parameter

string $method

which method to remove the autoload entry for

Return value

bool Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Autoloader::__call()

PEAR_Autoloader::__call() -- Overloaded object call handler

Description

Overloaded object call handler, called each time an undefined/aggregated method is invoked. This method repeats the call in the right aggregate object and passes on the return value.

Parameter

string $method

which method that was called

string $args

An array of the parameters passed in the original call

mixed &$retval

Return value

mixed - The return value from the aggregated method, or a PEAR_Error if the called method was unknown.

Note

This function can not be called statically.


PEAR_Builder

Table of Contents
PEAR_Builder::PEAR_Builder() -- constructor
PEAR_Builder::build() -- Build an extension from source
PEAR_Builder::log() -- 
PEAR_Builder::phpizeCallback() -- Message callback function when running phpize

Class to handle building (compiling) extensions.

Class Trees for PEAR_Builder

  • PEAR_Common

    • PEAR_Builder

PEAR_Builder::PEAR_Builder()

PEAR_Builder::PEAR_Builder() -- constructor

Description

PEAR_Builder constructor

Parameter

object &$ui

user interface object (instance of PEAR_Frontend_*)

Note

This function can be called statically.

PEAR_Builder::build()

PEAR_Builder::build() -- Build an extension from source

Description

Build an extension from source. Runs phpize in the source directory, but compiles in a temporary directory (/var/tmp/pear-build-USER/PACKAGE-VERSION).

Parameter

string $descfile

path to XML package description file

mixed $callback

callback function used to report output

Return value

array - an array of associative arrays with built files, format:
array( array( 'file' => '/path/to/ext.so',
                    'php_api' => YYYYMMDD,
                    'zend_mod_api' => YYYYMMDD,
                    'zend_ext_api' =>; YYYYMMDD ),
       ... )

See

PEAR_Common::infoFromDescriptionFile

Note

This function can not be called statically.

PEAR_Builder::log()

PEAR_Builder::log() -- 

Description

This package is not documented yet.

Parameter

mixed $level

mixed $msg

Note

This function can not be called statically.

PEAR_Builder::phpizeCallback()

PEAR_Builder::phpizeCallback() -- Message callback function when running phpize

Description

Message callback function used when running the phpize program. Extracts the API numbers used. Ignores other message types than "cmdoutput".

Parameter

string $what

the type of message

mixed $data

the message

Note

This function can not be called statically.


PEAR_ChannelFile

Table of Contents
Class Summary PEAR_ChannelFile -- The Channel handling class
constructor PEAR_ChannelFile::PEAR_ChannelFile() -- PEAR_ChannelFile
PEAR_ChannelFile::addFunction() -- Add a protocol to the provides section
PEAR_ChannelFile::addMirror() -- addMirror
PEAR_ChannelFile::addMirrorFunction() -- Add a protocol to a mirror's provides section
PEAR_ChannelFile::fromAny() -- Returns channel information from different sources
PEAR_ChannelFile::fromArray() -- fromArray
PEAR_ChannelFile::fromXmlFile() --  Parse a channel.xml file. Expects the name of a channel xml file as input.
PEAR_ChannelFile::fromXmlString() -- fromXmlString
PEAR_ChannelFile::getAlias() -- Return the suggested alias users can use to refer to this channel on the command-line.
PEAR_ChannelFile::getBaseURL() -- Get the URL to access a base resource.
PEAR_ChannelFile::getErrors() -- Wrapper to PEAR_ErrorStack::getErrors()
PEAR_ChannelFile::getFunction() -- getFunction
PEAR_ChannelFile::getFunctions() -- Retrieve a list of all xmlrpc/soap functions
PEAR_ChannelFile::getMirror() -- Get the unserialized XML representing a mirror
PEAR_ChannelFile::getMirrors() -- Retrieve a list of all mirrors and their contents
PEAR_ChannelFile::getName() -- retrieve the channel name
PEAR_ChannelFile::getPath() -- getPath
PEAR_ChannelFile::getPort() -- retrieve the socket port used to connect to the server
PEAR_ChannelFile::getServer() -- Retrieve the channel server
PEAR_ChannelFile::getSSL() -- get SSL support for a channel or mirror
PEAR_ChannelFile::getSummary() -- Get channel summary
PEAR_ChannelFile::getValidationObject() -- Retrieve the object that can be used for custom validation
PEAR_ChannelFile::getValidationPackage() -- Retrieve the name of the validation package for this channel
PEAR_ChannelFile::isIncludeable() -- Determine whether a file exists in the include_path and is readable
PEAR_ChannelFile::lastModified() -- This function is used by the channel updater and retrieves a value set by the registry, or the current time if it has not been set
PEAR_ChannelFile::resetFunctions() -- Empty all protocol definitions
PEAR_ChannelFile::resetREST() -- Since REST does not implement RPC, provide this as a logical wrapper around resetFunctions for REST
PEAR_ChannelFile::setAlias() -- Set the channel alias
PEAR_ChannelFile::setBaseURL() -- set the base URL for a REST resource, or set of REST resources
PEAR_ChannelFile::setDefaultPEARProtocols() -- Set a channel's protocols to the protocols supported by pearweb
PEAR_ChannelFile::setName() -- setName
PEAR_ChannelFile::setPath() -- Set the file path for xmlrpc or soap
PEAR_ChannelFile::setPort() -- Set the socket number (port) that is used to connect to this channel
PEAR_ChannelFile::setServer() -- set the Channel server
PEAR_ChannelFile::setSSL() -- Sets whether SSL is used to connect to this channel
PEAR_ChannelFile::setSummary() -- set the summary of a channel's purpose
PEAR_ChannelFile::setValidationPackage() --  Set the package validation object if it differs from PEAR's default.
PEAR_ChannelFile::supports() -- determines whether a webservices function is supported by a channel
PEAR_ChannelFile::supportsREST() --  Determines whether a channel supports any Representational State Transfer (REST) resources
PEAR_ChannelFile::toArray() -- return the channel representation in array format
PEAR_ChannelFile::toXml() -- Return an XML document based on the internal representation of this channel
PEAR_ChannelFile::validate() -- Validate channel information.
PEAR_ChannelFile::validChannelServer() -- Test whether a string contains a valid channel server.
Package PEAR Constants -- Constants defined in and used by PEAR

Class Summary PEAR_ChannelFile

Class Summary PEAR_ChannelFile  -- The Channel handling class

The Channel handling class

Represents channel.xml

Class Trees for PEAR_ChannelFile

  • PEAR_ChannelFile

constructor PEAR_ChannelFile::PEAR_ChannelFile()

constructor PEAR_ChannelFile::PEAR_ChannelFile()  -- PEAR_ChannelFile

Description

Simply creates the local error stack for the PEAR_ChannelFile object.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::addFunction()

PEAR_ChannelFile::addFunction()  -- Add a protocol to the provides section

Description

Adds a supported xml-rpc or SOAP function to a channel definition file. The type should be xmlrpc or soap in lower-cased letters. No validation is performed on insert. For example:

<?php
require_once 'PEAR/ChannelFile.php';
$chan = new PEAR_ChannelFile;
$chan->setName('foo.example.com');
$chan->setSummary('demonstrate addFunction');
$chan->addFunction('xmlrpc', '1.0', 'people.list');
$chan->addFunction('oops', '1.0', 'bad.type');
?>

The oops protocol will be successfully created, but will fail upon validation.

Adding a function to a mirror simply validated to ensure that the mirror already exists.

<?php
require_once 'PEAR/ChannelFile.php';
$chan = new PEAR_ChannelFile;
$chan->setName('foo.example.com');
$chan->setSummary('demonstrate addFunction');
// fails: mirror not found
$chan->addFunction('soap', '1.0', 'people.list', 'mirror.example.com');
$chan->addMirror('mirror.example.com');
// succeeds
$chan->addFunction('soap', '1.0', 'people.list', 'mirror.example.com');
?>

Parameter

string $type

protocol type

string $version

protocol version

string $name

protocol name, if any

string $mirror

mirror name, if this is a mirror's protocol

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::addMirror()

PEAR_ChannelFile::addMirror()  -- addMirror

Description

Add a mirror server. Note that mirrors must be added to a channel.xml in order for users to use them. Unofficial mirrors are not allowed without user intervention.

Parameter

string $server

mirror server

integer $port

mirror http port

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::addMirrorFunction()

PEAR_ChannelFile::addMirrorFunction()  -- Add a protocol to a mirror's provides section

Description

This is a direct way to add a xmlrpc or soap function to a mirror. See docs for addFunction().

Parameter

string $mirror

mirror name (server)

string $type

protocol type

string $version

protocol version

string $name

protocol name, if any

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::fromAny()

PEAR_ChannelFile::fromAny()  -- Returns channel information from different sources

Description

Parse data from either a string or a channel.xml file.

Parameter

string $info

Filename of the source, or the source itself

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::fromArray()

PEAR_ChannelFile::fromArray()  -- fromArray

Synopsis

require_once '/ChannelFile.php';

PEAR_ChannelFile |false PEAR_ChannelFile::fromArray (array $data, mixed [$compatibility = FALSE], mixed [$stackClass = 'PEAR_ErrorStack'])

Description

Use this method with caution. This is intended to allow easy import of a pre-parsed channel.xml from another PEAR_ChannelFile class. It also makes possible the registry storage of channel.xml.

Parameter

array $data

The pre-parsed channel data

mixed $compatibility

mixed $stackClass

Return value

returns false if invalid

Throws

throws no exceptions thrown

Note

This function should be called statically.

PEAR_ChannelFile::fromXmlFile()

PEAR_ChannelFile::fromXmlFile()  --  Parse a channel.xml file. Expects the name of a channel xml file as input.

Description

Parse the contents of a channel.xml and store in the current PEAR_ChannelFile object.

Parameter

string $descfile

name of channel xml file

Return value

returns success of parsing

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::fromXmlString()

PEAR_ChannelFile::fromXmlString()  -- fromXmlString

Description

Parse the contents of a channel.xml and store in the current PEAR_ChannelFile object.

Parameter

string $data

contents of package.xml file

Return value

returns success of parsing

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getAlias()

PEAR_ChannelFile::getAlias()  -- Return the suggested alias users can use to refer to this channel on the command-line.

Description

This returns the channel alias. For instance, channel pear.php.net's alias is pear, channel pecl.php.net's alias is pecl.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getBaseURL()

PEAR_ChannelFile::getBaseURL()  -- Get the URL to access a base resource.

Description

Hyperlinks in the returned xml will be used to retrieve the proper information needed. This allows extreme extensibility and flexibility in implementation

Parameter

string $resourceType

Resource Type to retrieve

mixed $mirror

Mirror name, or false for primary server.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getErrors()

PEAR_ChannelFile::getErrors()  -- Wrapper to PEAR_ErrorStack::getErrors()

Description

Retrieve any errors from the last validation attempt.

Parameter

boolean $purge

determines whether to purge the error stack after retrieving

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getFunction()

PEAR_ChannelFile::getFunction()  -- getFunction

Description

Retrieve the xml representation of a function. If found, the array is of format:

<?php
array(
 '_content' => 'functionname',
 'attribs' => array('version' => 'version.number')
);
?>

Parameter

string $type

Protocol type

string $name

Function name (NULL to return the first protocol of the type requested)

string $mirror

Mirror name, if any

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getFunctions()

PEAR_ChannelFile::getFunctions()  -- Retrieve a list of all xmlrpc/soap functions

Description

This retrieves an array of all defined xmlrpc and soap functions. Use getBaseURL() to access rest base URLs.

The format of each function is the same as is returned by getFunction()

Parameter

string $protocol

protocol type (xmlrpc, soap)

string $mirror

Mirror name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getMirror()

PEAR_ChannelFile::getMirror()  -- Get the unserialized XML representing a mirror

Description

This returns the entire contents of the <mirror> tag as unserialized by the parser.

Parameter

mixed $server

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getMirrors()

PEAR_ChannelFile::getMirrors()  -- Retrieve a list of all mirrors and their contents

Description

This returns an array of mirror information in the format defined by getMirror()

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getName()

PEAR_ChannelFile::getName()  -- retrieve the channel name

Description

Note that the channel name is the channel server.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getPath()

PEAR_ChannelFile::getPath()  -- getPath

Description

Retrieve the relative path to access the protocol desired. If the channel is named foo.example.com and xmlrpc is accessed at foo.example.com/xml/rpc then path will be xml/rpc.

Parameter

string $protocol

xmlrpc or soap

string|FALSE $mirror

mirror name or FALSE for primary server

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getPort()

PEAR_ChannelFile::getPort()  -- retrieve the socket port used to connect to the server

Description

web services are served through http servers, and so most servers use port 80. This function can be used to determine if a non-standard port is in use at a channel.

Parameter

mixed $mirror

Mirror name or FALSE for primary server

Return value

returns port number to connect to

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getServer()

PEAR_ChannelFile::getServer()  -- Retrieve the channel server

Description

This is an alias for getName().

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getSSL()

PEAR_ChannelFile::getSSL()  -- get SSL support for a channel or mirror

Description

This function can be used to determine whether a channel or mirror requires a secure connection through SSL in order to access the packages.

Parameter

string|FALSE $mirror

Mirror name or false for primary server

Return value

returns Determines whether secure sockets layer (SSL) is used to connect to this channel

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getSummary()

PEAR_ChannelFile::getSummary()  -- Get channel summary

Description

Return the brief description of a channel's purpose.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getValidationObject()

PEAR_ChannelFile::getValidationObject()  -- Retrieve the object that can be used for custom validation

Description

Retrieve the channel validation object. The package parameter is intended to notify getValidationObject() of the package to be validated. If the package is in fact the channel validation package, then PEAR_Validate will be used for validation. This prevents an endless loop that would otherwise occur.

Parameter

string|FALSE $package

The name of the package to validate. If the package is the channel validation package, PEAR_Validate is returned.

Return value

returns false is returned if the validation package cannot be located

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::getValidationPackage()

PEAR_ChannelFile::getValidationPackage()  -- Retrieve the name of the validation package for this channel

Description

Retrieve the name of the channel's validation package as defined in channel.xml

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::isIncludeable()

PEAR_ChannelFile::isIncludeable()  -- Determine whether a file exists in the include_path and is readable

Description

Determine whether a file exists in the include_path and is readable

Parameter

string $path

Relative path to file.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::lastModified()

PEAR_ChannelFile::lastModified()  -- This function is used by the channel updater and retrieves a value set by the registry, or the current time if it has not been set

Description

\ This method is used by the channel-update command in order to determine whether the local copy of channel.xml is up-to-date.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::resetFunctions()

PEAR_ChannelFile::resetFunctions()  -- Empty all protocol definitions

Description

Clear all functions defined in the channel.xml, in order to start adding a new list.

Parameter

string $type

protocol type (xmlrpc, soap)

string|FALSE $mirror

mirror name, if any

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::resetREST()

PEAR_ChannelFile::resetREST()  -- Since REST does not implement RPC, provide this as a logical wrapper around resetFunctions for REST

Description

Similar to resetFunctions(), resetREST() removes all REST base URLs in order to start adding new REST functions to a channel.

Parameter

string|FALSE $mirror

mirror name, if any

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setAlias()

PEAR_ChannelFile::setAlias()  -- Set the channel alias

Description

Set the suggested alias that users can use on the command-line as a shortcut access to this channel. For instance, channel pear.php.net's alias is pear.

Parameter

string $alias

The alias

boolean $local

determines whether the alias is in channel.xml or local. If local, then this is the result of a pear channel-alias command.

Return value

returns success

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setBaseURL()

PEAR_ChannelFile::setBaseURL()  -- set the base URL for a REST resource, or set of REST resources

Description

Set the base URL that users should use to access a REST resource or set of REST resources.

Parameter

string $resourceType

Resource Type this url links to

string $url

URL

string|FALSE $mirror

mirror name, if this is not a primary server REST base URL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setDefaultPEARProtocols()

PEAR_ChannelFile::setDefaultPEARProtocols()  -- Set a channel's protocols to the protocols supported by pearweb

Description

This method sets up a channel's xmlrpc protocols to match that of pearweb (pear.php.net). Note that it does not configure REST resources, that must be done manually through setBaseURL().

Parameter

string $version

version of pearweb protocols to use.

string|FALSE $mirror

Mirror name or false for primary server.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setName()

PEAR_ChannelFile::setName()  -- setName

Description

Set the primary server (and name) of the channel.

Parameter

string $name

Channel name.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setPath()

PEAR_ChannelFile::setPath()  -- Set the file path for xmlrpc or soap

Description

Set the relative location to the channel that should be used to connect to the selected protocol. Defaults are xmlrpc.php for xml-rpc and soap.php for SOAP.

Parameter

string $protocol

xmlrpc or soap

string|FALSE $path

name of the mirror server, or FALSE for the primary

string|FALSE $mirror

Mirror name or false for primary server.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setPort()

PEAR_ChannelFile::setPort()  -- Set the socket number (port) that is used to connect to this channel

Description

As web services connect to channels through web servers, this can be used to set the port that should be used to connect. Default is 80 for regular webservers, and 443 for SSL secure servers.

Parameter

integer $port

port number

string|FALSE $mirror

name of the mirror server, or FALSE for the primary server

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setServer()

PEAR_ChannelFile::setServer()  -- set the Channel server

Description

This is an alias to setName().

Parameter

string $server

Server name

string|FALSE $mirror

Mirror server name or FALSE for primary server.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setSSL()

PEAR_ChannelFile::setSSL()  -- Sets whether SSL is used to connect to this channel

Description

This function is used to inform the PEAR installer to use SSL when connecting to this channel server.

Parameter

boolean $ssl

Determines whether to turn on SSL support or turn it off

string|FALSE $mirror

name of the mirror server, or FALSE for the primary server

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setSummary()

PEAR_ChannelFile::setSummary()  -- set the summary of a channel's purpose

Description

This sets a human-readable description of a channel's purpose.

Parameter

string $summary

The channel summary

Return value

returns success

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::setValidationPackage()

PEAR_ChannelFile::setValidationPackage()  --  Set the package validation object if it differs from PEAR's default.

Description

The class must be either in memory (PEAR_Validate or PEAR_Validate_PECL) or be available for include_once() via a simple formula: Transform the underscores (_) into directory separators (/), append .php and include.

A validation class named Foo_Bar_Baz should be available for inclusion via this code:

<?php
include_once 'Foo/Bar/Baz.php';
?>

In addition, the validation package must be available for installation from the channel with the version number to install specified by the $version parameter.

Parameter

string|FALSE $validateclass

pass in FALSE to reset to the default packagename regex

string $version

The package version that must be installed for this channel to validate properly.

Return value

returns success

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::supports()

PEAR_ChannelFile::supports()  -- determines whether a webservices function is supported by a channel

Description

This is used in the installer to determine whether a protocol is supported before attempting to connect to a remote server and invoke the function needed.

Parameter

string $type

protocol type (xmlrpc or soap)

string $name

function name (like package.info)

string|FALSE $mirror

Mirror server name or FALSE for primary server

string $version

function version

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::supportsREST()

PEAR_ChannelFile::supportsREST()  --  Determines whether a channel supports any Representational State Transfer (REST) resources

Description

This does not check to see which REST resources are supported, use getBaseURL() to check specific REST resource or resource group support.

Parameter

string|FALSE $mirror

Mirror server name or FALSE for the primary server.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::toArray()

PEAR_ChannelFile::toArray()  -- return the channel representation in array format

Description

This function should not be used to directly manipulate data, but instead as a means to serialize and transport the data in a more efficient manner than as the original xml.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::toXml()

PEAR_ChannelFile::toXml()  -- Return an XML document based on the internal representation of this channel

Description

This should be used to generate a channel.xml based on the data stored in the PEAR_ChannelFile class.

Return value

returns XML data

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::validate()

PEAR_ChannelFile::validate()  -- Validate channel information.

Description

Specific errors can be retrieved post-validation with the getErrors() method. Errors are stored by the PEAR_ErrorStack class, more information on the format of the array can be found in the documentation for PEAR_ErrorStack.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_ChannelFile::validChannelServer()

PEAR_ChannelFile::validChannelServer()  -- Test whether a string contains a valid channel server.

Description

determines whether a channel server is a valid servername.

Parameter

string $server

Server name. May contain subpaths as in foo.example.com/path/to/channel

Throws

throws no exceptions thrown

Note

This function can be called statically.

Package PEAR Constants

Package PEAR Constants -- Constants defined in and used by PEAR

PEAR_Command

Table of Contents
PEAR_Command::factory() -- get object for executing a command.
PEAR_Command::getCommands() -- get list of currently supported commands
PEAR_Command::getDescription() -- get description for a command
PEAR_Command::getGetoptArgs() -- compiles arguments for getopt
PEAR_Command::getHelp() -- get help for command
PEAR_Command::getShortcuts() -- get list of command shortcuts.
PEAR_Command::registerCommands() -- scan the command directory

PEAR command class, a simple factory class for administrative commands.

PEAR_Command::factory()

PEAR_Command::factory() -- get object for executing a command.

Description

Get the right object for executing a command.

Parameter

string $command

The name of the command

object &$config

Instance of PEAR_Config object

Return value

object the command object

Note

This function should be called statically.

PEAR_Command::getCommands()

PEAR_Command::getCommands() -- get list of currently supported commands

Description

Get the list of currently supported commands, and what classes implement them.

Return value

array command => implementing class

Note

This function should be called statically.

PEAR_Command::getDescription()

PEAR_Command::getDescription() -- get description for a command

Description

Get description for a command.

Parameter

string $command

Name of the command

Return value

string command description

Note

This function should be called statically.

PEAR_Command::getGetoptArgs()

PEAR_Command::getGetoptArgs() -- compiles arguments for getopt

Description

Compiles arguments for getopt.

Parameter

string $command

command to get optstring for

string &$short_args

(reference) short getopt format

array &$long_args

(reference) long getopt format

Note

This function should be called statically.

PEAR_Command::getHelp()

PEAR_Command::getHelp() -- get help for command

Description

Get help for command.

Parameter

string $command

Name of the command to return help for

Return value

string help text

Note

This function should be called statically.

PEAR_Command::getShortcuts()

PEAR_Command::getShortcuts() -- get list of command shortcuts.

Description

Get the list of command shortcuts.

Return value

array shortcut => command

Note

This function should be called statically.

PEAR_Command::registerCommands()

PEAR_Command::registerCommands() -- scan the command directory

Description

Scan through the Command directory looking for classes and see what commands they implement.

Parameter

boolean $merge

if FALSE (default), the new list of commands should replace the current one. If TRUE, new entries will be merged with old.

string $dir

where (what directory) to look for classes, defaults to the Command subdirectory of the directory from where this file (__FILE__) is included.

Return value

bool TRUE on success

Note

This function should be called statically.


PEAR_Common

Table of Contents
PEAR_Common::PEAR_Common() -- PEAR_Common constructor
PEAR_Common::addTempFile() -- register a temporary file or directory
PEAR_Common::analyzeSourceCode() -- analyze the source code of the given PHP file
PEAR_Common::buildProvidesArray() -- Build a array
PEAR_Common::downloadHttp() -- Download a file through HTTP
PEAR_Common::infoFromAny() -- Returns package information from different sources
PEAR_Common::infoFromDescriptionFile() -- Returns information about a package file
PEAR_Common::infoFromString() -- Returns information about a package file
PEAR_Common::infoFromTgzFile() -- Returns information about a package file
PEAR_Common::log() -- Logging method
PEAR_Common::mkDirHier() -- Create a directory and necessary parent directories
PEAR_Common::mkTempDir() -- Create and register a temporary directory.
PEAR_Common::setFrontendObject() -- Set object representing frontend to use.
PEAR_Common::validatePackageInfo() -- Validate XML package definition file
PEAR_Common::validPackageName() -- Test whether a string is a valid package name
PEAR_Common::xmlFromInfo() -- Return an XML document based on the package info

Class providing common functionality for PEAR administration classes.

Class Trees for PEAR_Common()

  • PEAR

    • PEAR_Common

PEAR_Common::PEAR_Common()

PEAR_Common::PEAR_Common() -- PEAR_Common constructor

Description

PEAR_Common constructor

Note

This function can be called statically.

PEAR_Common::addTempFile()

PEAR_Common::addTempFile() -- register a temporary file or directory

Description

Register a temporary file or directory. When the destructor is executed, all registered temporary files and directories are removed.

Parameter

string $file

name of file or directory

Note

This function can be called statically.

PEAR_Common::analyzeSourceCode()

PEAR_Common::analyzeSourceCode() -- analyze the source code of the given PHP file

Description

Analyze the source code of the given PHP file

Parameter

string $file

Filename of the PHP file

Return value

array - hash list of declared_classes, declared_methods, declared_functions and used_classes

Note

This function can be called statically.

PEAR_Common::buildProvidesArray()

PEAR_Common::buildProvidesArray() -- Build a array

Description

Build a "provides" array from data returned by analyzeSourceCode(). The format of the built array is like this:
array(
        'class;MyClass' => 
           array(
           'type' => 'class',
           'name' => 'MyClass'
           ),
           ...  
        )

Parameter

array $srcinfo

array with information about a source file as returned by the analyzeSourceCode() method.

Note

This function can not be called statically.

PEAR_Common::downloadHttp()

PEAR_Common::downloadHttp() -- Download a file through HTTP

Description

Download a file through HTTP. Considers suggested file name in Content-disposition: header and can run a callback function for different events. The callback will be called with two parameters: the callback type, and parameters. The implemented callback types are:

  • 'setup' - called at the very beginning, parameter is a UI object that should be used for all output

  • 'message' - the parameter is a string with an informational message

  • 'saveas' - may be used to save with a different file name, the parameter is the filename that is about to be used. If a 'saveas' callback returns a non-empty string, that file name will be used as the filename instead. Note that $save_dir will not be affected by this, only the basename of the file.

  • 'start' - download is starting, parameter is number of bytes that are expected, or -1 if unknown

  • 'bytesread' - parameter is the number of bytes read so far

  • 'done' - download is complete, parameter is the total number of bytes read

  • 'connfailed' - if the TCP connection fails, this callback is called with
    array(host,port,errno,errmsg)

  • 'writefailed' - if writing to disk fails, this callback is called with
    array(destfile,errmsg)

If an HTTP proxy has been configured (http_proxy PEAR_Config setting), the proxy will be used.

Parameter

string $url

the URL to download

object &$ui

PEAR_Frontend_* instance

string $save_dir

directory to save file in

mixed $callback

function/method to call for status updates

object $config

PEAR_Config instance

Return value

string - Returns the full path of the downloaded file or a PEAR error on failure. If the error is caused by socket-related errors, the error object will have the fsockopen error code available through getCode().

Note

This function can not be called statically.

PEAR_Common::infoFromAny()

PEAR_Common::infoFromAny() -- Returns package information from different sources

Description

Returns package information from different sources. This method is able to extract information about a package from a .tgz archive or from a XML package definition file.

Parameter

string $info

Filename of the source ('package.xml', '<package>.tgz')

Return value

string - Package information

Note

This function can not be called statically.

PEAR_Common::infoFromDescriptionFile()

PEAR_Common::infoFromDescriptionFile() -- Returns information about a package file

Description

Returns information about a package file. Expects the name of a package xml file as input.

Parameter

string $descfile

name of package xml file

Return value

array - array with package information

Note

This function can not be called statically.

PEAR_Common::infoFromString()

PEAR_Common::infoFromString() -- Returns information about a package file

Description

Returns information about a package file. Expects the contents of a package xml file as input.

Parameter

string $data

content of package xml file

Return value

array - array with package information

Note

This function can not be called statically.

PEAR_Common::infoFromTgzFile()

PEAR_Common::infoFromTgzFile() -- Returns information about a package file

Description

Returns information about a package file. Expects the name of a gzipped tar file as input.

Parameter

string $file

name of .tgz file

Return value

array - array with package information

Note

This function can not be called statically.

PEAR_Common::log()

PEAR_Common::log() -- Logging method

Description

Logging method.

Parameter

integer $level

log level (0 is quiet, higher is noisier)

string $msg

message to write to the log

Note

This function can not be called statically.

PEAR_Common::mkDirHier()

PEAR_Common::mkDirHier() -- Create a directory and necessary parent directories

Description

Wrapper to System::mkDir(), creates a directory as well as any necessary parent directories.

Parameter

string $dir

directory name

Return value

bool - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

PEAR_Common::mkTempDir()

PEAR_Common::mkTempDir() -- Create and register a temporary directory.

Description

Create and register a temporary directory.

Parameter

string $tmpdir

Directory to use as tmpdir. Will use system defaults (for example /tmp or c:\windows\temp) if not specified.

Return value

string name of created directory

Note

This function can not be called statically.

PEAR_Common::setFrontendObject()

PEAR_Common::setFrontendObject() -- Set object representing frontend to use.

Description

Set object that represents the frontend to be used.

Parameter

object $ui

Reference of the frontend object

Note

This function can not be called statically.

PEAR_Common::validatePackageInfo()

PEAR_Common::validatePackageInfo() -- Validate XML package definition file

Description

Validate XML package definition file.

Parameter

string $info

Filename of the package archive or of the package definition file

array $errors

Array that will contain the errors

array $warnings

Array that will contain the warnings

string $dir_prefix

directory where source files may be found, or empty if they are not available

Return value

bool - TRUE if valid

Note

This function can not be called statically.

PEAR_Common::validPackageName()

PEAR_Common::validPackageName() -- Test whether a string is a valid package name

Description

Test whether a string contains a valid package name.

Parameter

string $name

the package name to test

Return value

bool - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Common::xmlFromInfo()

PEAR_Common::xmlFromInfo() -- Return an XML document based on the package info

Description

Return an XML document based on the package info (as returned by the PEAR_Common::infoFrom*() methods).

Parameter

array $pkginfo

package info

Return value

string - XML data

Note

This function can not be called statically.


PEAR_Config

Table of Contents
PEAR_Config::PEAR_Config() -- Constructor
PEAR_Config::apiVersion() -- return API version (1.1 as of PEAR 1.4.0)
PEAR_Config::definedBy() -- Tells what config layer that gets to define a key
PEAR_Config::deleteChannel() -- deleteChannel
PEAR_Config::get() -- Returns a configuration value
PEAR_Config::getConfFile() -- Gets the file used for storing the config for a layer
PEAR_Config::getDefaultChannel() -- Retrieve the default channel.
PEAR_Config::getDocs() -- Get the documentation for a config value
PEAR_Config::getFTP() -- The ftp server is set in readFTPConfigFile(). It exists only if a remote configuration file has been specified
PEAR_Config::getGroup() -- Get the parameter group for a config key
PEAR_Config::getGroupKeys() -- Get the list of the parameters in a group
PEAR_Config::getGroups() -- Get the list of parameter groups
PEAR_Config::getKeys() -- Get all the current config keys
PEAR_Config::getLayers() -- Returns the layers defined
PEAR_Config::getPrompt() -- Get short documentation for a config value
PEAR_Config::getRegistry() -- getRegistry
PEAR_Config::getRemote() -- getRemote
PEAR_Config::getREST() -- getREST
PEAR_Config::getSetValues() -- Get the list of allowed set values for a config value
PEAR_Config::getType() -- Get the type of a config value
PEAR_Config::isDefined() -- Tells whether a key exists as config value
PEAR_Config::isDefinedLayer() -- Tells whether a config layer exists
PEAR_Config::mergeConfigFile() -- Merges data into a config layer from a file
PEAR_Config::noRegistry() -- noRegistry
PEAR_Config::readConfigFile() -- Reads configuration data from a file
PEAR_Config::readFTPConfigFile() -- readFTPConfigFile
PEAR_Config::remove() -- Remove a config key from a config layer
PEAR_Config::removeLayer() -- Temporarily remove an entire config layer
PEAR_Config::set() -- Set config value in specific layer
PEAR_Config::setChannels() -- Set the list of channels.
PEAR_Config::setInstallRoot() -- setInstallRoot
PEAR_Config::setRegistry() -- This is to allow customization like the use of installroot
PEAR_Config::singleton() -- Return a reference of a PEAR_Config object
PEAR_Config::store() -- Stores configuration data in a layer
PEAR_Config::toDefault() -- Revert value of config key to the system-defined one
PEAR_Config::validConfiguration() -- Determine whether any configuration files have been detected, and whether a registry object can be retrieved from this configuration.
PEAR_Config::writeConfigFile() -- Write data into config layer from file

Class Trees for PEAR_Config()

  • PEAR

    • PEAR_Config

PEAR_Config::PEAR_Config()

PEAR_Config::PEAR_Config() -- Constructor

Description

Constructor

Parameter

string $user_file

file to read user-defined options from

string $system_file

file to read system-wide defaults from

Note

This function can not be called statically.

PEAR_Config::apiVersion()

PEAR_Config::apiVersion() -- return API version (1.1 as of PEAR 1.4.0)

Description

Returns API version (1.1 as of PEAR 1.4.0).

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::definedBy()

PEAR_Config::definedBy() -- Tells what config layer that gets to define a key

Description

Tells what config layer that gets to define a key.

Parameter

string $key

config key

Return value

string - the config layer, or an empty string if not found

Note

This function can not be called statically.

PEAR_Config::deleteChannel()

PEAR_Config::deleteChannel() -- deleteChannel

Description

remove a channel's configuration entirely.

Parameter

string $channel

Channel name to delete (channel server).

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::get()

PEAR_Config::get() -- Returns a configuration value

Description

Returns a configuration value, prioritizing layers as per the layers property.

Parameter

string $key

config key

mixed $layer

layer key

Return value

mixed the config value, or NULL if not found

Note

This function can not be called statically.

PEAR_Config::getConfFile()

PEAR_Config::getConfFile() -- Gets the file used for storing the config for a layer

Description

Use this to retrieve the name of the configuration file that provides values for a particular configuration layer.

Parameter

string $layer

user, system, or ftp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::getDefaultChannel()

PEAR_Config::getDefaultChannel() -- Retrieve the default channel.

Description

On startup, channels are not initialized, so if the default channel is not pear.php.net, then initialize the config.

Parameter

string $layer

layer from which to retrieve the registry, or null for the first to match

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::getDocs()

PEAR_Config::getDocs() -- Get the documentation for a config value

Description

Get the documentation for a config value.

Parameter

string $key

config key

Return value

string - documentation string

Note

This function can not be called statically.

PEAR_Config::getFTP()

PEAR_Config::getFTP() -- The ftp server is set in readFTPConfigFile(). It exists only if a remote configuration file has been specified

Description

returns the object that can be used for accessing the remote FTP server, or false if none should be used.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::getGroup()

PEAR_Config::getGroup() -- Get the parameter group for a config key

Description

Get the parameter group for a config key.

Parameter

string $key

config key

Return value

string - parameter group

Note

This function can not be called statically.

PEAR_Config::getGroupKeys()

PEAR_Config::getGroupKeys() -- Get the list of the parameters in a group

Description

Get the list of the parameters in a group.

Parameter

string $group

parameter group

Return value

array list of parameters in $group

Note

This function can not be called statically.

PEAR_Config::getGroups()

PEAR_Config::getGroups() -- Get the list of parameter groups

Description

Get the list of parameter groups.

Return value

array - list of parameter groups

Note

This function can not be called statically.

PEAR_Config::getKeys()

PEAR_Config::getKeys() -- Get all the current config keys

Description

Get all the current config keys

Return value

array - simple array of config keys

Note

This function can not be called statically.

PEAR_Config::getLayers()

PEAR_Config::getLayers() -- Returns the layers defined

Description

Returns the layers defined, except the 'default' one

Return value

array the defined layers

Note

This function can not be called statically.

PEAR_Config::getPrompt()

PEAR_Config::getPrompt() -- Get short documentation for a config value

Description

Get the short documentation for a config value.

Parameter

string $key

config key

Return value

string short documentation string

Note

This function can not be called statically.

PEAR_Config::getRegistry()

PEAR_Config::getRegistry() -- getRegistry

Description

This package is not documented yet.

Parameter

string $use

This parameter determines which layer will be used to retrieve a registry based on the php_dir configuration variable for that layer. The default value of null will use the first layer that contains a valid php_dir, whereas if specified as user, system or ftp, it will attempt to return the registry for that layer.

On failure to retrieve a registry, it returns false

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::getRemote()

PEAR_Config::getRemote() -- getRemote

Description

This returns a PEAR_Remote based on the current PEAR_Config object.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::getREST()

PEAR_Config::getREST() -- getREST

Description

This package is not documented yet.

Parameter

string $version

This should be 1.0 in PEAR 1.4.0.

array $options

options for the PEAR_REST constructor

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::getSetValues()

PEAR_Config::getSetValues() -- Get the list of allowed set values for a config value

Description

Get the list of allowed set values for a config value. Returns NULL for config values that are not sets.

Parameter

string $key

config key

Return value

array - enumerated array of set values, or NULL if the config key is unknown or not a set

Note

This function can not be called statically.

PEAR_Config::getType()

PEAR_Config::getType() -- Get the type of a config value

Description

Get the type of a config value.

Parameter

string $key

config key

Return value

string - type, one of "string", "integer", "file", "directory", "set" or "password".

Note

This function can not be called statically.

PEAR_Config::isDefined()

PEAR_Config::isDefined() -- Tells whether a key exists as config value

Description

Tells whether a given key exists as a config value.

Parameter

string $key

config key

Return value

bool - whether $key exists in this object

Note

This function can not be called statically.

PEAR_Config::isDefinedLayer()

PEAR_Config::isDefinedLayer() -- Tells whether a config layer exists

Description

Tells whether a given config layer exists.

Parameter

string $layer

config layer

Return value

bool - whether $layer exists in this object

Note

This function can not be called statically.

PEAR_Config::mergeConfigFile()

PEAR_Config::mergeConfigFile() -- Merges data into a config layer from a file

Description

Merges data into a config layer from a file. Does the same thing as readConfigFile(), except it does not replace all existing values in the config layer.

Parameter

string $file

file to read from

boolean $override

whether to overwrite existing data

string $layer

config layer to insert data into ('user' or 'system')

Return value

bool - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

PEAR_Config::noRegistry()

PEAR_Config::noRegistry() -- noRegistry

Description

Use this method to disable automatic creation of PEAR_Registry objects when reading from a configuration file or changing php_dir configuration variable.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::readConfigFile()

PEAR_Config::readConfigFile() -- Reads configuration data from a file

Description

Reads configuration data from a file. All existing values in the config layer are discarded and replaced with data from the file.

Parameter

string $file

file to read from, if NULL or not specified, the last-used file for the same layer (second param) is used

string $layer

config layer to insert data into ('user' or 'system')

Return value

bool - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

PEAR_Config::readFTPConfigFile()

PEAR_Config::readFTPConfigFile() -- readFTPConfigFile

Description

Process a ftp configuration file by connecting to the server, retrieving the configuration file and parsing it normally. This function uses Net_FTP through the PEAR_FTP class.

Parameter

string $path

url to the remote config file, like ftp://www.example.com/pear/config.ini

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::remove()

PEAR_Config::remove() -- Remove a config key from a config layer

Description

Remove a config key from a specific config layer.

Parameter

string $key

config key

string $layer

config layer

Return value

bool - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

PEAR_Config::removeLayer()

PEAR_Config::removeLayer() -- Temporarily remove an entire config layer

Description

Temporarily remove an entire config layer. USE WITH CARE!

Parameter

string $layer

config key

Return value

bool - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Config::set()

PEAR_Config::set() -- Set config value in specific layer

Description

Set a config value in a specific layer (defaults to 'user'). Enforces the types defined in the configuration_info array. An integer config variable will be cast to int, and a set config variable will be validated against its legal values.

Parameter

string $key

config key

string $value

config value

string $layer

config layer

Return value

bool - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Config::setChannels()

PEAR_Config::setChannels() -- Set the list of channels.

Description

This should be set via a call to PEAR_Registry::listChannels(). A call to this function sets up empty arrays for each channel in configurations.

Parameter

array $channels

a simple list of channel names.

boolean $merge

if true, then the list of channel is merged with the existing list, otherwise it replaces the existing list.

Return value

returns success of operation

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::setInstallRoot()

PEAR_Config::setInstallRoot() -- setInstallRoot

Description

This is used to implement the --installroot option for installation. In earlier PEAR versions, this was implemented in PEAR_Installer::install(), but this makes it more difficult to track with the introduction of channels, and to satisfy better encapsulation, it has been moved to PEAR_Config.

Pass in a full path. On retrieving any directory configuration variable, the value will be prepended with the installroot specified in this method. For example, if php_dir is /usr/lib/php, and setInstallRoot() is used with /hoopla/boo, the value returned from get() would be /hoopla/boo/usr/lib/php. Use an empty string '' to reset an installroot.

Parameter

string|FALSE $root

installation directory to prepend to all _dir variables, or FALSE to disable

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::setRegistry()

PEAR_Config::setRegistry() -- This is to allow customization like the use of installroot

Description

Use this to override the automatic registry creation performed whenever the php_dir configuration variable is modified.

If noRegistry() has been called, this call will be ignored and FALSE returned. In addition, it is not possible to set the registry for the ftp layer.

Parameter

PEAR_Registry|false &$reg

The PEAR_Registry that will be used, or false to reset the registry.

string $layer

This must be either user or system

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::singleton()

PEAR_Config::singleton() -- Return a reference of a PEAR_Config object

Description

If you want to keep only one instance of this class in use, this method will give you a reference to the last created PEAR_Config object if one exists, or create a new object.

Parameter

string $user_file

file to read user-defined options from

string $system_file

file to read system-wide defaults from

Return value

object - an existing or new PEAR_Config instance

Note

This function should be called statically.

PEAR_Config::store()

PEAR_Config::store() -- Stores configuration data in a layer

Description

Stores configuration data in a layer.

Parameter

string $layer

config layer to store

Return value

bool - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

PEAR_Config::toDefault()

PEAR_Config::toDefault() -- Revert value of config key to the system-defined one

Description

Unset the user-defined value of a config key, reverting the value to the system-defined one.

Parameter

string $key

config key

Return value

bool - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Config::validConfiguration()

PEAR_Config::validConfiguration() -- Determine whether any configuration files have been detected, and whether a registry object can be retrieved from this configuration.

Description

This method can be used to ward off any real problems with the default configuration.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Config::writeConfigFile()

PEAR_Config::writeConfigFile() -- Write data into config layer from file

Description

Writes data into a config layer from a file.

Parameter

string $file

file to read from

boolean $layer

whether to overwrite existing data

Return value

bool - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.


PEAR_Dependency

Table of Contents
PEAR_Dependency::PEAR_Dependency() -- constructor
PEAR_Dependency::callCheckMethod() -- Maps the xml dependency definition
PEAR_Dependency::checkExtension() -- Check Extension dependency
PEAR_Dependency::checkOS() -- Check Operating system dependency
PEAR_Dependency::checkPackage() -- check Package dependency
PEAR_Dependency::checkPHP() -- Check PHP version
PEAR_Dependency::checkProgram() -- Check external program
PEAR_Dependency::checkSAPI() -- Check SAPI backend
PEAR_Dependency::checkZend() -- Check Zend version

This class is deprecated by PEAR_Dependency2 in PEAR 1.4.0

PEAR_Dependency::PEAR_Dependency()

PEAR_Dependency::PEAR_Dependency() -- constructor

Description

Constructor

Parameter

object &$registry

a PEAR_Registry instance

Note

This function can not be called statically.

PEAR_Dependency::callCheckMethod()

PEAR_Dependency::callCheckMethod() -- Maps the xml dependency definition

Description

This method maps the xml dependency definition to the PEAR_Dependency one.

Parameter

mixed &$errmsg

this variable will contains an error message, if check fail

array $opts

An Array with all Dependency entries from the parsed XML package definition, ie:
$opts => Array
   (
       ['type'] => 'pkg',
       ['rel'] => 'ge',
       ['version'] => '3.4',
       ['name'] => 'HTML_Common'
    );

Return value

mixed - FALSE if all dependencies could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependencies.

Note

This function can not be called statically.

PEAR_Dependency::checkExtension()

PEAR_Dependency::checkExtension() -- Check Extension dependency

Description

Extension dependencies check method

Parameter

mixed &$errmsg

this variable will contains an error message, if check fail

string $name

Name of the extension to test

string $req

Required extension version to compare with

string $relation

How to compare versions with eachother

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of an unresolved dependency.

Note

This function can not be called statically.

PEAR_Dependency::checkOS()

PEAR_Dependency::checkOS() -- Check Operating system dependency

Description

Operating system dependencies check method

Parameter

string &$errmsg

this variable will contains an error message, if check fail

string $os

Name of the operating system

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependency.

Note

This function can not be called statically.

PEAR_Dependency::checkPackage()

PEAR_Dependency::checkPackage() -- check Package dependency

Description

Package dependencies check method

Parameter

string &$errmsg

this variable will contains an error message, if check fail

string $name

Name of the package to test

string $req

Required package version to compare with

string $relation

How to compare versions with eachother

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependency.

Note

This function can not be called statically.

PEAR_Dependency::checkPHP()

PEAR_Dependency::checkPHP() -- Check PHP version

Description

PHP version check method

Parameter

mixed &$errmsg

this variable will contains an error message, if check fail

string $req

which version to compare

string $relation

how to compare the version

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependency.

Note

This function can not be called statically.

PEAR_Dependency::checkProgram()

PEAR_Dependency::checkProgram() -- Check external program

Description

External program check method. Looks for executable files in directories listed in the PATH environment variable.

Parameter

mixed &$errmsg

this variable will contains an error message, if check fail

string $program

which program to look for

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependency.

Note

This function can not be called statically.

PEAR_Dependency::checkSAPI()

PEAR_Dependency::checkSAPI() -- Check SAPI backend

Description

SAPI backend check method. Version comparison is not yet available here.

Parameter

mixed &$errmsg

this variable will contains an error message, if check fail

string $name

name of SAPI backend

string $req

which version to compare (currently unused)

string $relation

how to compare versions (currently hardcoded to 'has')

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependency.

Note

This function can not be called statically.

PEAR_Dependency::checkZend()

PEAR_Dependency::checkZend() -- Check Zend version

Description

Zend version check method

Parameter

mixed &$errmsg

this variable will contains an error message, if check fail

string $req

which version to compare

string $relation

how to compare the version

Return value

mixed - FALSE if dependency could be resolved successfully(!); or an PEAR_DEPENDENCY_* constant in case of unresolved dependency.

Note

This function can not be called statically.


PEAR_Dependency2

Table of Contents
Class Summary PEAR_Dependency2 -- Dependency check for PEAR packages
constructor PEAR_Dependency2::PEAR_Dependency2() -- PEAR_Dependency2
PEAR_Dependency2::normalizeDep() -- Convert a 1.0 dep into a 2.0 dep
PEAR_Dependency2::validateArchDependency() --  Specify a complex dependency on an OS/processor/kernel version, Use OS for simple operating system dependency.
PEAR_Dependency2::validateDependency1() -- validate a package.xml 1.0 dependency
PEAR_Dependency2::validateExtensionDependency() -- validate a dependency on a PHP extension
PEAR_Dependency2::validateOsDependency() --  Specify a dependency on an OS. Use arch for detailed os/processor information
PEAR_Dependency2::validatePackage() -- validatePackage
PEAR_Dependency2::validatePackageDependency() -- validatePackageDependency
PEAR_Dependency2::validatePackageUninstall() -- validatePackageUninstall
PEAR_Dependency2::validatePearinstallerDependency() -- validatePearinstallerDependency
PEAR_Dependency2::validatePhpDependency() -- validatePhpDependency
PEAR_Dependency2::validateSubpackageDependency() -- validateSubpackageDependency

Class Summary PEAR_Dependency2

Class Summary PEAR_Dependency2  -- Dependency check for PEAR packages

Dependency check for PEAR packages

This class handles both version 1.0 and 2.0 dependencies and supersedes PEAR_Dependency since PEAR 1.4.0

Class Trees for PEAR_Dependency2

  • PEAR_Dependency2

constructor PEAR_Dependency2::PEAR_Dependency2()

constructor PEAR_Dependency2::PEAR_Dependency2()  -- PEAR_Dependency2

Description

This package is not documented yet.

Parameter

PEAR_Config &$config

Current configuration object.

array $installoptions

installation options

array $package

The current package. For installation dependencies, this is the package that contains dependencies. For uninstallation dependencies, this is the package that is going to be uninstalled.

format of PEAR_Registry::parsedPackageName()

integer $state

installation state (one of PEAR_VALIDATE_*)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::normalizeDep()

PEAR_Dependency2::normalizeDep()  -- Convert a 1.0 dep into a 2.0 dep

Description

This converts an old-style package.xml 1.0 <dep> tag into the format used by package.xml 2.0. package.xml 2.0 can represent every kind of <dep> tag in its new syntax.

Parameter

array $dep

The package.xml 1.0 <dep> as parsed from xml.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validateArchDependency()

PEAR_Dependency2::validateArchDependency()  --  Specify a complex dependency on an OS/processor/kernel version, Use OS for simple operating system dependency.

Description

This is the only dependency that accepts an ereg()able pattern. The pattern will be matched against the php_uname() output parsed by OS_Guess As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies (and the arch dependency is required). If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

array $dep

Contents of the dependency, as parsed from xml.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validateDependency1()

PEAR_Dependency2::validateDependency1()  -- validate a package.xml 1.0 dependency

Description

Validate a package.xml version 1.0 <dep> dependency.

Parameter

array $dep

The contents of the <dep> tag as parsed from xml

array $params

The list of PEAR_Downloader_Package objects that will be installed.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validateExtensionDependency()

PEAR_Dependency2::validateExtensionDependency()  -- validate a dependency on a PHP extension

Description

This validates against actual in-memory extensions, and will not attempt to locate extensions on disk. To do this, a dependency should be a package dependency with the <providesextension> tag.

As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies. If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

array $dep

dependency contents as parsed from xml

boolean $required

Whether this is a required or optional dependency

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validateOsDependency()

PEAR_Dependency2::validateOsDependency()  --  Specify a dependency on an OS. Use arch for detailed os/processor information

Description

There are two generic OS dependencies that will be the most common, unix and windows. Other options are linux, freebsd, darwin (OS X), sunos, irix, hpux, aix. As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies (and the OS dependency is required). If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

array $dep

Dependency contents as parsed from xml

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validatePackage()

PEAR_Dependency2::validatePackage()  -- validatePackage

Description

As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies (and the PEAR installer dependency is required). If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

array|PEAR_PackageFile_v2|PEAR_Downloader_Package $pkg

Either an array of format array('channel' => channelname, 'package' => package) or one of these objects.

PEAR_Common &$dl

Any object with a log() method that matches the signature of PEAR_Common

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validatePackageDependency()

PEAR_Dependency2::validatePackageDependency()  -- validatePackageDependency

Description

Validate a package-style dependency. Validation is performed in this sequence:

  1. If the dependency package provides an extension through the <providesextension> tag, then see if it passes the extension validation test first and return if so.

  2. If the list of packages to be installed contains a match for the dependency, use that to validate the dependency and return.

  3. If the dependency package is already installed, make sure the installed version passes the conditions.

  4. At this point, the dependency has failed. If the dependency is required, return a PEAR_Error containing the failure error message, otherwise return an array containing the error message.

Parameter

array $dep

dependency array as defined by package.xml 2.0

boolean $required

whether this is a required or optional dependency

array $params

array of PEAR_Downloader_Package objects representing packages to be downloaded that can be used to validate dependencies

boolean $depv1

if TRUE, then deps on pear.php.net that fail will also check against pecl.php.net packages to accommodate extensions that have moved to pecl.php.net from pear.php.net

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validatePackageUninstall()

PEAR_Dependency2::validatePackageUninstall()  -- validatePackageUninstall

Description

As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies (and the PEAR installer dependency is required). If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

PEAR_Installer &$dl

This method retrieves the list of packages to be uninstalled from the PEAR_Installer object, and makes sure no dependencies with existing packages would be broken if the current package were to be uninstalled.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validatePearinstallerDependency()

PEAR_Dependency2::validatePearinstallerDependency()  -- validatePearinstallerDependency

Description

Validate the running PEAR version against the dependency. This dependency is designed to prevent PEAR versions incompatible with the current package.xml from attempting to install it. As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies (and the PEAR installer dependency is required). If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

mixed $dep

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validatePhpDependency()

PEAR_Dependency2::validatePhpDependency()  -- validatePhpDependency

Description

Validate the running PHP version against the dependency. The implicit assumption is that the installer's PHP version is the same as the final script's PHP version. As with all dependency validation, true is returned on success, PEAR_Error on failure for required dependencies (and the PHP dependency is required). If the soft, force or ignore-errors options are specified, an array containing the error message will be returned instead.

Parameter

array $dep

The dependency xml as represented in parsing

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Dependency2::validateSubpackageDependency()

PEAR_Dependency2::validateSubpackageDependency()  -- validateSubpackageDependency

Description

Validate a subpackage-style dependency. This is identical to a package dependency from a validation perspective, and so documentation for validatePackageDependency() should be referenced for details.

Parameter

array $dep

dependency array as defined by package.xml 2.0

boolean $required

whether this is a required or optional dependency

array $params

array of PEAR_Downloader_Package objects representing packages to be downloaded that can be used to validate dependencies

Throws

throws no exceptions thrown

Note

This function can not be called statically.


PEAR_DependencyDB

Table of Contents
Class Summary PEAR_DependencyDB -- Track dependency relationships between installed packages
PEAR_DependencyDB::assertDepsDB() --  Create the dependency database, if it doesn't exist. Error if the database is newer than the code reading it.
PEAR_DependencyDB::dependsOn() -- Determine whether $parent depends on $child, near or deep
PEAR_DependencyDB::getDependencies() -- Get a list of dependencies of this installed package
PEAR_DependencyDB::getDependentPackageDependencies() --  Get a list of the actual dependencies of installed packages that depend on a package.
PEAR_DependencyDB::getDependentPackages() -- Get a list of installed packages that depend on this package
PEAR_DependencyDB::hasWriteAccess() -- determines whether a dependency DB can be modified
PEAR_DependencyDB::installPackage() -- Register dependencies of a package that is being installed or upgraded
PEAR_DependencyDB::rebuildDB() -- Rebuild the dependency DB by reading registry entries.
PEAR_DependencyDB::setConfig() -- Set up the registry/location of dependency DB
PEAR_DependencyDB::singleton() -- Get a raw dependency database. Calls setConfig() and assertDepsDB()
PEAR_DependencyDB::uninstallPackage() -- Remove dependencies of a package that is being uninstalled, or upgraded.

Class Summary PEAR_DependencyDB

Class Summary PEAR_DependencyDB  -- Track dependency relationships between installed packages

Track dependency relationships between installed packages

This provides sophisticated dependency handling relationships between installed packages and downloaded to-be-installed packages.

Class Trees for PEAR_DependencyDB

  • PEAR_DependencyDB

PEAR_DependencyDB::assertDepsDB()

PEAR_DependencyDB::assertDepsDB()  --  Create the dependency database, if it doesn't exist. Error if the database is newer than the code reading it.

Description

Assert that the dependency database exists, and attempt to create it if it doesn't.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::dependsOn()

PEAR_DependencyDB::dependsOn()  -- Determine whether $parent depends on $child, near or deep

Description

This method is the central method of DependencyDB. Through the dependency database, it is possible to determine whether any two packages share a dependency relationship independent of how tightly bound the two packages are. In other words, if package A depends on package B depends on package C, this method can be used to determine that package A indirectly depends on package C.

Parameter

array|PEAR_PackageFile_v2|PEAR_PackageFile_v2 $parent

The parent package (as in package A in the example above)

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

array|PEAR_PackageFile_v2|PEAR_PackageFile_v2 $child

The child package (as in package B or package C in the example above)

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::getDependencies()

PEAR_DependencyDB::getDependencies()  -- Get a list of dependencies of this installed package

Description

get an array of all immediate package dependencies of an installed package.

Parameter

PEAR_PackageFile_v1|PEAR_PackageFile_v2|array &$pkg

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::getDependentPackageDependencies()

PEAR_DependencyDB::getDependentPackageDependencies()  --  Get a list of the actual dependencies of installed packages that depend on a package.

Description

This returns the complete tree of extended dependencies of a single installed package.

For instance, a real-world example. package SOAP depends on Mail_Mime, HTTP_Request, Net_URL, Net_DIME. package HTTP_Request depends on Net_URL, Net_Socket. This method will return an array similar to:

<?php
array(
    'pear.php.net' =>
        array(
            'mail_mime' =>
                array('name' => 'Mail_Mime',
                      'channel' => 'pear.php.net'),
            'http_request' =>
                array('name' => 'HTTP_Request',
                      'channel' => 'pear.php.net'),
            'net_url' =>
                array('name' => 'Net_URL',
                      'channel' => 'pear.php.net',
                      'min' => '1.0.12'),
            'net_dime' =>
                array('name' => 'Net_DIME',
                      'channel' => 'pear.php.net'),
            'net_socket' =>
                array('name' => 'Net_Socket',
                      'channel' => 'pear.php.net'),
        ),
);
?>

Note that this should not be relied upon for exact dependencies. In the example above, the returned dependency will be that of HTTP_Request upon Net_URL, which is stricter than SOAP's dependency upon Net_URL. In other words, if there are two similar dependencies, the last one encountered will be returned.

Parameter

PEAR_PackageFile_v1|PEAR_PackageFile_v2|array &$pkg

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::getDependentPackages()

PEAR_DependencyDB::getDependentPackages()  -- Get a list of installed packages that depend on this package

Description

This is most useful at uninstall-time. A list of installed packages that depend upon the package can be used to prevent uninstallation, and to emit warnings for optional dependencies.

Parameter

PEAR_PackageFile_v1|PEAR_PackageFile_v2|array &$pkg

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::hasWriteAccess()

PEAR_DependencyDB::hasWriteAccess()  -- determines whether a dependency DB can be modified

Description

This method is used by the installer to prevent attempts to create/modify the dependency DB if the current user does not have write access to the registry. Without this method, simple read-only commands like pear info would not work.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::installPackage()

PEAR_DependencyDB::installPackage()  -- Register dependencies of a package that is being installed or upgraded

Description

This method is used by the registry when a package is installed or upgraded to register the package's dependencies in the dependency database.

Parameter

PEAR_PackageFile_v2|PEAR_PackageFile_v2 &$package

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::rebuildDB()

PEAR_DependencyDB::rebuildDB()  -- Rebuild the dependency DB by reading registry entries.

Description

This is used to create or re-create the dependency database by reading registry entries for each installed file to extract dependencies and save them in the dependency database.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::setConfig()

PEAR_DependencyDB::setConfig()  -- Set up the registry/location of dependency DB

Description

This crucial method is used to set the PEAR_Config object that should be used to retrieve both configuration information and a PEAR_Registry class for internal manipulation.

Parameter

PEAR_Config|FALSE &$config

string|FALSE $depdb

full path to the dependency database, or FALSE to use default

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_DependencyDB::singleton()

PEAR_DependencyDB::singleton()  -- Get a raw dependency database. Calls setConfig() and assertDepsDB()

Synopsis

require_once '/DependencyDB.php';

PEAR_DependencyDB |PEAR_Error & PEAR_DependencyDB::singleton (PEAR_Config &$config, string|false [$depdb = FALSE])

Description

Return a single dependency database based on the location of the database on disk. In other words, 1 dependency database is created for each registry location.

Parameter

PEAR_Config &$config

PEAR_Config object

string|$false; $depdb

full path to the dependency database, or FALSE to use default

Throws

throws no exceptions thrown

Note

This function should be called statically.

PEAR_DependencyDB::uninstallPackage()

PEAR_DependencyDB::uninstallPackage()  -- Remove dependencies of a package that is being uninstalled, or upgraded.

Description

This method is used by the registry when a package is uninstalled or upgraded to remove the package's dependencies from the dependency database.

Upgraded packages first uninstall, then install

Parameter

PEAR_PackageFile_v1|PEAR_PackageFile_v2|array &$pkg

This parameter, if an array, should be in format:

<?php
array(
  'package' => 'packagename',
  'channel' => 'channelname'
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.


PEAR_Frontend

Table of Contents
Class Summary PEAR_Frontend -- Singleton-based frontend for PEAR user input/output
PEAR_Frontend::addTempFile() -- This can be overridden to allow session-based temporary file management
PEAR_Frontend::isIncludeable() -- isIncludeable
PEAR_Frontend::log() -- log
PEAR_Frontend::setConfig() -- setConfig
PEAR_Frontend::setFrontendClass() -- setFrontendClass
PEAR_Frontend::singleton() -- Retrieve the frontend object

Class Summary PEAR_Frontend

Class Summary PEAR_Frontend  -- Singleton-based frontend for PEAR user input/output

Singleton-based frontend for PEAR user input/output (since PEAR 1.4.0)

This is also the base class for all frontends.

Class Trees for PEAR_Frontend

  • PEAR

    • PEAR_Frontend

PEAR_Frontend::addTempFile()

PEAR_Frontend::addTempFile()  -- This can be overridden to allow session-based temporary file management

Description

By default, all files are deleted at the end of a session. The web installer needs to be able to sustain a list over many sessions in order to support user interaction with install scripts

Parameter

mixed $file

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Frontend::isIncludeable()

PEAR_Frontend::isIncludeable()  -- isIncludeable

Description

Simple utility class used to determine whether a file can be included via include_path

Parameter

string $path

relative or absolute include path

Throws

throws no exceptions thrown

Note

This function can be called statically.

PEAR_Frontend::log()

PEAR_Frontend::log()  -- log

Description

Log a message in a frontend-specific way. By default, nothing is done.

Parameter

integer $level

string $msg

boolean $append_crlf

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Frontend::setConfig()

PEAR_Frontend::setConfig()  -- setConfig

Description

Set the configuration object used by this frontend.

Parameter

PEAR_Config &$config

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Frontend::setFrontendClass()

PEAR_Frontend::setFrontendClass()  -- setFrontendClass

Description

Set the kind of frontend that should be retrieved from the singleton() method. If the class does not exist, the method changes all underscores (_) into directory separators (like PEAR_Frontend_CLI to PEAR/Frontend/CLI) and appends .php and then checks to see if the file can be included. If the class does exist after all of this, a simple check is made to see if the userConfirm() method exists, and then a new frontend object is returned. Any failure causes a PEAR_Error to be returned.

Parameter

string $uiclass

the full classname (like PEAR_Frontend_Web)

Throws

throws PEAR_Error on any problem

Note

This function can not be called statically.

PEAR_Frontend::singleton()

PEAR_Frontend::singleton()  -- Retrieve the frontend object

Description

Get a single unique copy of the current PEAR frontend object.

Parameter

string|NULL $type

if being called for the first time, the user can specify the kind of frontend to return. Otherwise, this parameter is ignored, and the existing single frontend is returned.

Throws

throws no exceptions thrown

Note

This function can be called statically.


PEAR_Installer

Administration class used to install PEAR packages and maintain the installed package database.

Class Trees for PEAR_Installer()

  • PEAR_Common

    • PEAR_Installer

PEAR_Installer::PEAR_Installer()

PEAR_Installer::PEAR_Installer() -- constructor

Description

PEAR_Installer constructor.

Parameter

object &$ui

user interface object (instance of PEAR_Frontend_*)

Note

This function can not be called statically.

PEAR_Installer::install()

PEAR_Installer::install() -- Installs package files

Description

Installs the files within the package file specified.

Parameter

string $pkgfile

path to the package file

array $options

installating options, to enable an option use the option name as array key and TRUE or 1 as value.

  • $options['force'] = 1 - force installation

  • $options['register-only'] = 1 - update registry but don't install files

  • $options['upgrade'] = 1 - upgrade existing install

  • $options['soft'] = 1 - fail silently

Return value

array package info if successful

Note

This function can not be called statically.


PEAR

Table of Contents
Class Summary PEAR_PackageFile -- Abstraction for the package.xml package description file
constructor PEAR_PackageFile::PEAR_PackageFile() -- PEAR_PackageFile
PEAR_PackageFile::factory() -- factory
PEAR_PackageFile::fromAnyFile() -- Returns package information from different sources
PEAR_PackageFile::fromArray() -- Return a packagefile object from its toArray() method
PEAR_PackageFile::fromPackageFile() --  Returns information about a package file. Expects the name of a package.xml file as input.
PEAR_PackageFile::fromTgzFile() -- fromTgzFile
PEAR_PackageFile::fromXmlString() -- fromXmlString
PEAR_PackageFile::parserFactory() -- parserFactory
PEAR_PackageFile::rawReturn() -- Turn off validation - return a parsed package.xml without checking it for errors
PEAR_PackageFile::setLogger() -- setLogger
Package PEAR Constants -- Constants defined in and used by PEAR

Class Summary PEAR_PackageFile

Class Summary PEAR_PackageFile  -- Abstraction for the package.xml package description file

Abstraction for the package.xml package description file

Parse and retrieve a package.xml object from various sources.

Class Trees for PEAR_PackageFile

  • PEAR_PackageFile

constructor PEAR_PackageFile::PEAR_PackageFile()

constructor PEAR_PackageFile::PEAR_PackageFile()  -- PEAR_PackageFile

Description

Prepare for parsing one or more package.xml files.

Parameter

PEAR_Config &$config

The configuration to use for parsing and channel registry (needed for channel-specific validators).

boolean $debug

The debug logging level (this is usually the value of the verbose configuration variable).

string $tmpdir

The temporary directory to extract files in. By default, a new temporary directory is created using System::mktemp().

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::factory()

PEAR_PackageFile::factory()  -- factory

Description

Retrieve a raw PEAR_PackageFile_vX object where X is either 1 or 2.

Parameter

string $version

The package.xml version represented (1 or 2)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::fromAnyFile()

PEAR_PackageFile::fromAnyFile()  -- Returns package information from different sources

Description

This method is able to extract information about a package from a .tgz archive or from a XML package definition file.

Parameter

string $info

path to a file containing a package.xml (package archive or package.xml)

integer $state

package state (one of PEAR_VALIDATE_* constants)

Throws

throws no exceptions thrown

Note

This function should be called statically.

PEAR_PackageFile::fromArray()

PEAR_PackageFile::fromArray()  -- Return a packagefile object from its toArray() method

Description

Warning

WARNING: no validation is performed, the array is assumed to be valid, always parse from xml if you want validation.

Parameter

array $arr

Contents of a previously parsed package.xml object.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::fromPackageFile()

PEAR_PackageFile::fromPackageFile()  --  Returns information about a package file. Expects the name of a package.xml file as input.

Description

parse and return a package.xml object from a package.xml file, or a PEAR_Error object upon error.

Parameter

string $descfile

name of package.xml file

integer $state

package state (one of PEAR_VALIDATE_* constants)

string|FALSE $archive

full path to the full package .tgz file containing the package.xml, or false for none.

Return value

returns array with package information

Throws

throws no exceptions thrown

Note

This function should be called statically.

PEAR_PackageFile::fromTgzFile()

PEAR_PackageFile::fromTgzFile()  -- fromTgzFile

Description

parse and return a package.xml object from a packaged archive, or a PEAR_Error object upon error.

Parameter

string $file

name of packaged .tgz or .tar to extract and parse package.xml from

integer $state

package state (one of PEAR_VALIDATE_* constants)

Return value

returns success of parsing

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::fromXmlString()

PEAR_PackageFile::fromXmlString()  -- fromXmlString

Description

parse and return a package.xml object, or a PEAR_Error object upon error.

Parameter

string $data

contents of package.xml file

integer $state

package state (one of PEAR_VALIDATE_* constants)

string $file

full path to the package.xml file (and the files it references)

string|FALSE $archive

full path to the full package .tgz file containing the package.xml, or false for none.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::parserFactory()

PEAR_PackageFile::parserFactory()  -- parserFactory

Description

Return a package.xml parsing object appropriate for the selected package.xml version.

Parameter

string $version

The package.xml version represented (1 or 2)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::rawReturn()

PEAR_PackageFile::rawReturn()  -- Turn off validation - return a parsed package.xml without checking it for errors

Description

This is used by the package-validate command

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFile::setLogger()

PEAR_PackageFile::setLogger()  -- setLogger

Description

set a logging class that matches the signature of PEAR_Common's log() method.

Parameter

PEAR_Common &$l

The PEAR_Common object.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package PEAR Constants

Package PEAR Constants -- Constants defined in and used by PEAR

PEAR_Packager

Administration class used to make a PEAR release tarball.

Class Trees for PEAR_Packager

  • PEAR_Common

    • PEAR_Packager

PEAR_Packager::PEAR_Packager()

PEAR_Packager::PEAR_Packager() -- constructor

Description

constructor

Note

This function can be called statically.

PEAR_Packager::package()

PEAR_Packager::package() -- Create Package archive

Description

Creates a Package archive from package definition file and package files

Parameter

string $pkgfile

path to package definition file

boolean $compress

if TRUE package archive will be compessed using gzip

Return value

string - name of the created package archive

Note

This function can not be called statically.


PEAR_Registry

Table of Contents
PEAR_Registry::PEAR_Registry() -- constructor
PEAR_Registry::addPackage() -- Registers a package to the registry
PEAR_Registry::checkFileMap() -- Test whether a file belongs to a package
PEAR_Registry::deletePackage() -- Remove Package from registry
PEAR_Registry::listPackages() -- List all registered Packages
PEAR_Registry::packageExists() -- Check for Package
PEAR_Registry::packageInfo() -- Get Package information
PEAR_Registry::rebuildDepsFile() -- Rebuild dependencies file
PEAR_Registry::rebuildFileMap() -- Rebuild file map
PEAR_Registry::removePackageDep() -- Remove dependency information of a Package
PEAR_Registry::setPackageDep() -- Update or insert dependencies of a Package
PEAR_Registry::updatePackage() -- Update Package information

Administration class used to maintain the installed package database.

Class Trees for PEAR_Registry

  • PEAR

    • PEAR_Registry

PEAR_Registry::PEAR_Registry()

PEAR_Registry::PEAR_Registry() -- constructor

Description

constructor

Parameter

string $pear_install_dir

PEAR install directory (for .php files)

Note

This function can not be called statically.

PEAR_Registry::addPackage()

PEAR_Registry::addPackage() -- Registers a package to the registry

Description

Adds a Package entry to the registry

Parameter

string $package

Package name

array $info

additional information for the package entry

Return value

boolean - FALSE if Package is already registered;

Note

This function can not be called statically.

PEAR_Registry::checkFileMap()

PEAR_Registry::checkFileMap() -- Test whether a file belongs to a package

Description

Test whether a file belongs to a package.

Parameter

string $path

file path, absolute or relative to the pear install dir

Return value

string - name of the package the file belongs to, or an empty string if the file does not belong to an installed package

Note

This function can not be called statically.

PEAR_Registry::deletePackage()

PEAR_Registry::deletePackage() -- Remove Package from registry

Description

Removes a Package entry from the registry.

Parameter

string $package

Package name

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

PEAR_Registry::listPackages()

PEAR_Registry::listPackages() -- List all registered Packages

Description

List all Packages registered in the registry.

Return value

array - list of package names

Note

This function can not be called statically.

PEAR_Registry::packageExists()

PEAR_Registry::packageExists() -- Check for Package

Description

Checks wether a Package is registered in the registry or not.

Parameter

string $package

Package name

Return value

boolean - TRUE if package is registered

Note

This function can not be called statically.

PEAR_Registry::packageInfo()

PEAR_Registry::packageInfo() -- Get Package information

Description

Returns (specific) information stored in the registry about a Package.

Parameter

string $package

Package name

string $key

the name of a specific information to get

Return value

mixed - an array with all information, or a key specific information, if $key was used; NULL if Package or specific information does not exist

Note

This function can not be called statically.

PEAR_Registry::rebuildDepsFile()

PEAR_Registry::rebuildDepsFile() -- Rebuild dependencies file

Description

Rebuilds the dependencies file of the registry. Use this function if had trouble while installing Packages or a damaged registry.

Note

This function can not be called statically.

PEAR_Registry::rebuildFileMap()

PEAR_Registry::rebuildFileMap() -- Rebuild file map

Description

Rebuilds the registry filemap. Use this function if had trouble while installing Packages or a damaged registry.

Note

This function can not be called statically.

PEAR_Registry::removePackageDep()

PEAR_Registry::removePackageDep() -- Remove dependency information of a Package

Description

Removes the dependency information of a Package from the registry.

Parameter

string $package

Package name

Return value

mixed - TRUE if successful; or an array with a list of Packages depending on this Package

Note

This function can not be called statically.

PEAR_Registry::setPackageDep()

PEAR_Registry::setPackageDep() -- Update or insert dependencies of a Package

Description

Update or insert a the dependencies of a package, prechecking that the package won't break any dependency in the process. (Dependencies of type 'pkg' only.

Parameter

string $package

Package name

string $new_version

Version of the Package

array $rel_deps

Package dependencies

Return value

mixed - TRUE if no dependencies found; or array with names of missing or outdated Packages

Note

This function can not be called statically.

PEAR_Registry::updatePackage()

PEAR_Registry::updatePackage() -- Update Package information

Description

Updates the existing information of a Package in the registry.

Parameter

string $package

Package name

array $info

information to update

mixed $merge

if FALSE the old informations will be deleted completly an replaced with the new; if TRUE update only - unchanged values will remain.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.


PEAR_Remote

Table of Contents
PEAR_Remote::PEAR_Remote() -- constructor
PEAR_Remote::call() -- Execute a server function

This is a class for doing remote operations against a PEAR Package Server.

Class Trees for PEAR_Remote()

  • PEAR

    • PEAR_Remote

PEAR_Remote::PEAR_Remote()

PEAR_Remote::PEAR_Remote() -- constructor

Description

constructor

Parameter

object &$config

an instance of PEAR_Config

Note

This function can not be called statically.

PEAR_Remote::call()

PEAR_Remote::call() -- Execute a server function

Description

Sends a remote procedure call to a package server and returns the result.

Parameter

string $method

Name of the server method

mixed $args,...

server method specific parameters

Return value

mixed - result of the executed server method

Note

This function can not be called statically.


PEAR_REST

Table of Contents
Class Summary PEAR_REST --  Intelligently retrieve data, following hyperlinks if necessary, and re-directing
constructor PEAR_REST::PEAR_REST() -- PEAR_REST
PEAR_REST::downloadHttp() --  Efficiently Download a file through HTTP. Returns downloaded file as a string in-memory This is best used for small files
PEAR_REST::getCache() -- getCache
PEAR_REST::getCacheId() -- getCacheId
PEAR_REST::retrieveCacheFirst() -- Retrieve REST data, but always retrieve the local cache if it is available.
PEAR_REST::retrieveData() -- Retrieve a remote REST resource
PEAR_REST::saveCache() -- Save the value retrieved from a remote REST resource in the local cache.
PEAR_REST::useLocalCache() -- useLocalCache

Class Summary PEAR_REST

Class Summary PEAR_REST  --  Intelligently retrieve data, following hyperlinks if necessary, and re-directing

Intelligently retrieve data, following hyperlinks if necessary, and re-directing (since PEAR 1.4.0)

as well

Class Trees for PEAR_REST

  • PEAR_REST

constructor PEAR_REST::PEAR_REST()

constructor PEAR_REST::PEAR_REST()  -- PEAR_REST

Description

This package is not documented yet.

Parameter

PEAR_Config &$config

Configuration object

array $options

options passed to commands like install/download. The only option that affects PEAR_REST is offline, which causes all retrievals to look in the local cache without trying to retrieve a remote resource.

Note

This function can not be called statically.

PEAR_REST::downloadHttp()

PEAR_REST::downloadHttp()  --  Efficiently Download a file through HTTP. Returns downloaded file as a string in-memory This is best used for small files

Description

If an HTTP proxy has been configured (http_proxy PEAR_Config setting), the proxy will be used.

Parameter

string $url

the URL to download

FALSE|string|array $lastmodified

header values to check against for caching use FALSE to return the header values from this download

FALSE|array $accept

Accept headers to send. This should be a list of MIME types like text/xml, frog/legs, etc.

string $save_dir

directory to save file in

Return value

returns Returns the contents of the downloaded file or a PEAR error on failure. If the error is caused by socket-related errors, the error object will have the fsockopen error code available through getCode(). If caching is requested, then return the header values.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_REST::getCache()

PEAR_REST::getCache()  -- getCache

Description

Retrieve the cache contents for a remote resource, or a PEAR_Error if the resource was not cached.

Parameter

string $url

REST resource URL

Throws

throws PEAR_Error object returned on error.

Note

This function can not be called statically.

PEAR_REST::getCacheId()

PEAR_REST::getCacheId()  -- getCacheId

Description

Retrieve the HTTP caching information for a REST resource, or FALSE if no cache is found.

Parameter

string $url

REST resource URL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_REST::retrieveCacheFirst()

PEAR_REST::retrieveCacheFirst()  -- Retrieve REST data, but always retrieve the local cache if it is available.

Description

This is useful for elements that should never change, such as information on a particular release

Parameter

string $url

full URL to this resource

array|FALSE $accept

contents of the accept-encoding header

boolean $forcestring

if TRUE, xml will be returned as a string, otherwise, xml will be parsed using PEAR_XMLParser

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_REST::retrieveData()

PEAR_REST::retrieveData()  -- Retrieve a remote REST resource

Description

retrieve the contents of a remote resource.

Parameter

string $url

full URL to this resource

array|false $accept

contents of the accept-encoding header

boolean $forcestring

if TRUE, xml will be returned as a string, otherwise, xml will be parsed using PEAR_XMLParser

Throws

throws PEAR_Error objects are returned on error.

Note

This function can not be called statically.

PEAR_REST::saveCache()

PEAR_REST::saveCache()  -- Save the value retrieved from a remote REST resource in the local cache.

Description

Use this to save a resource after retrieving. Since the cache_ttl configuration variable is used in determining when to check the remote server, and HTTP caching is used as well, it is possible for this scenario to arise:

  1. retrieve REST resource

  2. cache the resource

  3. a few days later, retrieve the REST resource again

  4. HTTP caching returns 304 not modified

In this situation, it doesn't make much sense to save the resource contents redundantly. Instead, the last access time can be saved in the cache id by passing true into the last parameter.

Parameter

string $url

The REST resource's URL

mixed $contents

Contents retrieved from the REST resource (ignored if the last parameter is true)

array $lastmodified

The ETag and LastModified headers retrieved from the remote server, used for HTTP caching.

mixed $nochange

If false, the cache is saved normally. If true, only the $lastmodified parameter is saved in the cache id file, registering an HTTP cache hit.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_REST::useLocalCache()

PEAR_REST::useLocalCache()  -- useLocalCache

Description

Retrieve the contents of the local cached copy of a remote URL. FALSE is returned if there are any problems, under the assumption that REST contents will always be larger than a simple boolean due to HTTP overhead.

Parameter

string $url

The URL to retrieve data for.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


PEAR

Table of Contents
Class Summary PEAR_RunTest -- Simplified version of PHP's test suite
constructor PEAR_RunTest::PEAR_RunTest() -- Instantiate a PEAR_RunTest object.
PEAR_RunTest::generate_diff() -- generate_diff
PEAR_RunTest::run() -- run

Class Summary PEAR_RunTest

Class Summary PEAR_RunTest  -- Simplified version of PHP's test suite

Simplified version of PHP's test suite

Try it with:

$ php -r 'include "../PEAR/RunTest.php"; $t=new PEAR_RunTest; \
  $o=$t->run("./pear_system.phpt");print_r($o);'

Class Trees for PEAR_RunTest

  • PEAR_RunTest

constructor PEAR_RunTest::PEAR_RunTest()

constructor PEAR_RunTest::PEAR_RunTest()  -- Instantiate a PEAR_RunTest object.

Description

If no logger is specified, a new PEAR_Common object will be instantiated and used to print output to the screen.

Parameter

PEAR_Common|NULL $logger

A class that contains a log() method matching the signature of PEAR_Common.

array $options

Currently supported options are simple and quiet. The simple option causes tests to simply print the title of the test and not the full path to the test file. The quiet option causes output of only failed tests.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_RunTest::generate_diff()

PEAR_RunTest::generate_diff()  -- generate_diff

Description

Returns differences by line between the expected output ($wanted) and the actual output ($output). In addition, the value returned from the script can also be tested. The test should be performed outside generate_diff(). If the return value is as expected, pass in FALSE, otherwise pass in an array where the first element is the expected return value and the second is the actual return value.

Parameter

string $wanted

Expected output

string $output

Actual output

array|FALSE $return_value

False if return value was correct, otherwise an array of format:

<?php
array(
    1, // expected return
    2, // actual return value
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_RunTest::run()

PEAR_RunTest::run()  -- run

Description

Run a unit test. The return value is one of:

  • PASSED

  • SKIPPED

  • WARNED

  • FAILED

Parameter

string $file

Full path to the test file to run.

string $ini_settings

Additional customized settings to pass on the command-line to the PHP instance used for testing. For example, requesting disabling use of php.ini or a testing php.ini can be specified. For a full list of possible settings, type:

$ php -h

Throws

throws no exceptions thrown

Note

This function can not be called statically.


PEAR_Validate

Table of Contents
Class Summary PEAR_Validate --  Validation class for package.xml - channel-level advanced validation
PEAR_Validate::_addFailure() -- _addFailure
PEAR_Validate::_addWarning() -- _addWarning
PEAR_Validate::getFailures() -- getFailures
PEAR_Validate::getValidStates() -- Get a list of valid stability levels
PEAR_Validate::setPackageFile() -- setPackageFile
PEAR_Validate::validate() -- validate
PEAR_Validate::validateChangelog() -- validateChangelog
PEAR_Validate::validateDate() -- validateDate
PEAR_Validate::validateDependencies() -- for package.xml 2.0 only - channels can't use package.xml 1.0
PEAR_Validate::validateDeps() -- validateDeps
PEAR_Validate::validateDescription() -- validateDescription
PEAR_Validate::validateFilelist() -- validateFilelist
PEAR_Validate::validateLicense() -- validateLicense
PEAR_Validate::validateMainFilelist() -- for package.xml 2.0 only
PEAR_Validate::validateMaintainers() -- validateMaintainers
PEAR_Validate::validateNotes() -- validateNotes
PEAR_Validate::validatePackageName() -- validatePackageName
PEAR_Validate::validateReleaseFilelist() -- for package.xml 2.0 only
PEAR_Validate::validateStability() -- validateStability
PEAR_Validate::validateState() -- validateState
PEAR_Validate::validateSummary() -- validateSummary
PEAR_Validate::validateTime() -- validateTime
PEAR_Validate::validateVersion() -- protected function to validate a version
PEAR_Validate::validGroupName() --  This validates a dependency group name, and dependency group names must conform to the PEAR naming convention, so the method is final and static.
PEAR_Validate::validPackageName() -- utility method to validate a package name string
PEAR_Validate::validState() -- Determine whether $state represents a valid stability level
PEAR_Validate::validVersion() --  Determine whether a version is a properly formatted version number that can be used by version_compare()
PEAR_Validate::_validPackageName() -- Override this method to handle validation of normal package names
Package PEAR Constants -- Constants defined in and used by PEAR

Class Summary PEAR_Validate

Class Summary PEAR_Validate  --  Validation class for package.xml - channel-level advanced validation

Validation class for package.xml - channel-level advanced validation

This package is not documented yet.

Class Trees for PEAR_Validate

  • PEAR_Validate

PEAR_Validate::_addFailure()

PEAR_Validate::_addFailure()  -- _addFailure

Description

add a validation warning from one of the channel validation functions. Use this for a non-fatal warning of a potential problem situation.

Parameter

string $field

The package.xml section being validated (such as version or dependencies)

string $reason

A human-readable reason that validation failed.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::_addWarning()

PEAR_Validate::_addWarning()  -- _addWarning

Description

add a validation warning from one of the channel validation functions. Use this for a non-fatal warning of a potential problem situation.

Parameter

string $field

The package.xml section being validated (such as version or dependencies)

string $reason

A human-readable reason that validation failed.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::getFailures()

PEAR_Validate::getFailures()  -- getFailures

Description

Returns a list of failures recorded by the last validation attempt. The list is in format:

<?php
array(
    'error' =>
        array(
            array('field' => 'name', 'name must contain only letters, numbers or underscore'),
        ),
    'warning' =>
        array(
            array('field' => 'version', 'version should be less than 2.0'),
        )
);
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::getValidStates()

PEAR_Validate::getValidStates()  -- Get a list of valid stability levels

Description

Utility function for future extensibility of the list of valid stability levels.

Throws

throws no exceptions thrown

Final

final - this method must not be overridden

Note

This function should be called statically.

PEAR_Validate::setPackageFile()

PEAR_Validate::setPackageFile()  -- setPackageFile

Description

Sets the packagefile object that will be used to retrieve data for validation.

Parameter

PEAR_PackageFile_v1|PEAR_PackageFile_v2 &$pf

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validate()

PEAR_Validate::validate()  -- validate

Description

Validate the package.xml passed into setPackageFile(). The parameter passed in is the installer state that should be used, and is one of PEAR_VALIDATE_INSTALLING, PEAR_VALIDATE_DOWNLOADING, PEAR_VALIDATE_NORMAL, PEAR_VALIDATE_UNINSTALLING, or PEAR_VALIDATE_PACKAGING.

Parameter

integer $state

one of the PEAR_VALIDATE_* constants

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateChangelog()

PEAR_Validate::validateChangelog()  -- validateChangelog

Description

Override this in a channel-specific validator to validate the contents of the <changelog> tag.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateDate()

PEAR_Validate::validateDate()  -- validateDate

Description

Override this in a channel-specific validator to validate the contents of the <date> tag.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateDependencies()

PEAR_Validate::validateDependencies()  -- for package.xml 2.0 only - channels can't use package.xml 1.0

Description

Override this in a channel-specific validator to validate the <dependencies> tag of a package.xml 2.0-based release.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateDeps()

PEAR_Validate::validateDeps()  -- validateDeps

Description

Override this in a channel-specific validator to validate the contents of <deps> in a package.xml 1.0-based release.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateDescription()

PEAR_Validate::validateDescription()  -- validateDescription

Description

Override this in a channel-specific validator to validate the contents of the <description> tag.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateFilelist()

PEAR_Validate::validateFilelist()  -- validateFilelist

Description

Override this in a channel-specific validator to validate the contents of the <filelist> tag in a package.xml 1.0-based release.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateLicense()

PEAR_Validate::validateLicense()  -- validateLicense

Description

Override this method in a channel-specific validator to validate the contents of the <license> tag.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateMainFilelist()

PEAR_Validate::validateMainFilelist()  -- for package.xml 2.0 only

Description

Override this in a channel-specific validator to validate the contents of the <contents> tag in package.xml 2.0-based releases.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateMaintainers()

PEAR_Validate::validateMaintainers()  -- validateMaintainers

Description

Override this in a channel-specific validator to validate the contents of <maintainers> in a package.xml 1.0-based release.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateNotes()

PEAR_Validate::validateNotes()  -- validateNotes

Description

Override this in a channel-specific validator to validate the contents of release notes in a <notes> tag.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validatePackageName()

PEAR_Validate::validatePackageName()  -- validatePackageName

Description

Override this in a channel-specific validator to validate a package name.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateReleaseFilelist()

PEAR_Validate::validateReleaseFilelist()  -- for package.xml 2.0 only

Description

Use this to validate the contents of a <filelist> tag in a package.xml 2.0-based package.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateStability()

PEAR_Validate::validateStability()  -- validateStability

Description

Override this in a channel-specific validator to validate the <stability> tag of a package.xml 2.0-based release.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateState()

PEAR_Validate::validateState()  -- validateState

Description

Override this in a channel-specific validator to validate the contents of a <state> tag in a package.xml 1.0-based release.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateSummary()

PEAR_Validate::validateSummary()  -- validateSummary

Description

Override this in a channel-specific validator to validate the <summary> tag.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateTime()

PEAR_Validate::validateTime()  -- validateTime

Description

Override this method to validate the <time> tag in a channel-specific validator.

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validateVersion()

PEAR_Validate::validateVersion()  -- protected function to validate a version

Description

Override this function in a channel validator in order to apply a different version validation scheme. An example of this use is in the PEAR_Validate_PECL class, which overrides validateVersion() to be less strict than the default PEAR_Validate::validateVersion().

Errors should be reported using _addFailure() method, and non-fatal errors (warnings) should be reported using the _addWarning() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_Validate::validGroupName()

PEAR_Validate::validGroupName()  --  This validates a dependency group name, and dependency group names must conform to the PEAR naming convention, so the method is final and static.

Description

Dependency groups are documented here

Parameter

string $name

Dependency group name to validate

Throws

throws no exceptions thrown

Final

final - this method should not be overridden.

Note

This function should be called statically.

PEAR_Validate::validPackageName()

PEAR_Validate::validPackageName()  -- utility method to validate a package name string

Description

Validate a package name string. The second parameter should be the name of the channel validation package, as defined by channel.xml for the current channel. If the package name being validated is the same as the validation package (case-insensitive), then it will be validated using the default rules for PEAR packages.

Parameter

string $name

package name to validate

string $validatepackagename

name of channel-specific validation package

Throws

throws no exceptions thrown

Final

final - this method should not be overridden.

Note

This function can not be called statically.

PEAR_Validate::validState()

PEAR_Validate::validState()  -- Determine whether $state represents a valid stability level

Description

This utility method can be used to determine whether a string is a valid state. Currently, states must be one of snapshot, devel, alpha, beta, and stable.

Parameter

string $state

State string to validate.

Throws

throws no exceptions thrown

Final

final - this method should not be overridden.

Note

This function should be called statically.

PEAR_Validate::validVersion()

PEAR_Validate::validVersion()  --  Determine whether a version is a properly formatted version number that can be used by version_compare()

Description

Use this method to test the validity of a version number string. All versions must be testable with PHP's version_compare().

Parameter

string $ver

Version string

Throws

throws no exceptions thrown

Final

final - this method should not be overridden.

Note

This function should be called statically.

PEAR_Validate::_validPackageName()

PEAR_Validate::_validPackageName()  -- Override this method to handle validation of normal package names

Description

This protected method can be used to change the normal package validation scheme. By default, all packages must begin with a letter and contain only letters, numbers and underscores. Using this method, it is possible to change this entirely to enforce another scheme.

For instance, enforcing java-style com.blah.package package names can be done simply by this code:

<?php
require_once 'PEAR/Validate.php';
class MyChannel_Validate extends PEAR_Validate
{
    function _validPackageName($name)
    {
        return preg_match('/[a-zA-Z][a-zA-Z0-9_]*(\.[a-zA-Z0-9_]+)*/', $name);
    }
}
?>

Then, by using a customized channel validation package, the installer will enforce java-style package names for your channel.

Parameter

string $name

package name string to test for validity.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package PEAR Constants

Package PEAR Constants -- Constants defined in and used by PEAR

PEAR

Table of Contents
Class Summary PEAR_XMLParser -- Parser for any xml file
PEAR_XMLParser::getData() -- getData
PEAR_XMLParser::parse() -- parse
PEAR_XMLParser::preProcessStupidSaxon() -- pre-process xml to weed out characters/entities that would kill parsing

Class Summary PEAR_XMLParser

Class Summary PEAR_XMLParser  -- Parser for any xml file

Parser for any xml file

This package is not documented yet.

Class Trees for PEAR_XMLParser

  • PEAR_XMLParser

PEAR_XMLParser::getData()

PEAR_XMLParser::getData()  -- getData

Description

Return the array representation of XML as parsed by parse().

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_XMLParser::parse()

PEAR_XMLParser::parse()  -- parse

Description

Return an array that matches the XML parsed. This code is lifted from Stephan Schmidt's XML_Unserializer class in the XML_Serializer package. As such, tags are represented by an associative array. Multiple tags are represented with a 0-based array of tag contents, and attributes are represented by an array index named attribs. If attributes are present, the array index _contents is used to hold the contents of the xml tag.

Parameter

string $data

xml content

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_XMLParser::preProcessStupidSaxon()

PEAR_XMLParser::preProcessStupidSaxon()  -- pre-process xml to weed out characters/entities that would kill parsing

Description

This method examines xml data prior to parsing and replaces all entities like &agrave; with their equivalent (&#224; in this case). It also scans the file for any non-ascii characters like à and replaces them with their entity equivalent (&#224).

This prevents saxon in PHP 4 and PHP 5 from choking on non-ISO-8859-1 characters.

Parameter

string $data

The xml data.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Chapter 31. PEAR channel server REST interface

This manual section describes how the REST interface of a PEAR channel server works, as well as the files and their formats look like.



Directory structure

A REST channel server simply delivers files in a certain directory structure. The content of those files is static. Their location is relative to the URLs given in the channel.xml baseurl tags.

The following table lists all known files, a tiny description as well as the version they appeared in first.


File formats

Here you will find detailled description of the file formats used for the REST interface.

In general, the files try to be as small as possible so that only little bandwidth is required to fetch them. That's why all of the xml files (except the original package.xml have only tag names of one or two characters. Remember that operations like pear list-all download a large number of files, so every saved bit helps.


channel.xml

Information about the channel

This is the main file for a channel; nothing works without it. When discovering a channel, this file is retrieved. It defines the REST directory locations as well as mirrors.

The channel <name> is a full qualified domain name and is used as part of the URL when e.g. updating the channel.xml file.

PEAR provides aliases for channels as shortcuts in the daily work of your user's lifes. The <suggestedalias> should be a short and easy to write word. Benefit is that, instead of
pear install pear.mynicelittlespaceon.example.org/package
they just can type
pear install nice/package
if the alias was nice.


Example

<?xml version="1.0" encoding="utf-8"?>
<channel version="1.0"
         xmlns="http://pear.php.net/channel-1.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://pear.php.net/channel-1.0
                             http://pear.php.net/dtd/channel-1.0.xsd"
>
 <name>pear.example.org</name><!-- URL, used to update channel.xml and such -->
 <suggestedalias>example</suggestedalias>
 <summary>Simple demo channel server</summary>
 <servers>
  <primary>
   <!-- you can ignore xmlrpc, it's deprecated anyway -->
   <xmlrpc>
    <function version="1.0">logintest</function>
    <function version="1.0">package.listLatestReleases</function>
    <function version="1.0">package.listAll</function>
    <function version="1.0">package.info</function>
    <function version="1.0">package.getDownloadURL</function>
    <function version="1.1">package.getDownloadURL</function>
    <function version="1.0">package.getDepDownloadURL</function>
    <function version="1.1">package.getDepDownloadURL</function>
    <function version="1.0">package.search</function>
    <function version="1.0">channel.listAll</function>
   </xmlrpc>
   <rest>
    <baseurl type="REST1.0">http://pear.example.org/rest/</baseurl>
    <baseurl type="REST1.1">http://pear.example.org/rest/</baseurl>
    <baseurl type="REST1.2">http://pear.example.org/rest/</baseurl>
    <baseurl type="REST1.3">http://pear.example.org/rest/</baseurl>
   </rest>
  </primary>

  <mirror host="us.pear.example.org">
   <rest>
    <baseurl type="REST1.0">http://us.pear.example.org/rest/</baseurl>
    <baseurl type="REST1.1">http://us.pear.example.org/rest/</baseurl>
    <baseurl type="REST1.2">http://us.pear.example.org/rest/</baseurl>
    <baseurl type="REST1.3">http://us.pear.example.org/rest/</baseurl>
   </rest>
  </mirror>

  <mirror host="de.pear.example.org" ssl="yes" port="3452">
   <rest>
    <baseurl type="REST1.0">https://de.pear.example.org:3452/rest/</baseurl>
    <baseurl type="REST1.1">https://de.pear.example.org:3452/rest/</baseurl>
    <baseurl type="REST1.2">https://de.pear.example.org:3452/rest/</baseurl>
    <baseurl type="REST1.3">https://de.pear.example.org:3452/rest/</baseurl>
   </rest>
  </mirror>

 </servers>
</channel>

categories.xml

List of all categories

Provides a names and links to for all categories known on the server. Links are URL-encoded.


Example

<?xml version="1.0" encoding="utf-8" ?>
<a xmlns="http://pear.php.net/dtd/rest.allcategories"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.allcategories
                       http://pear.php.net/dtd/rest.allcategories.xsd"
>
 <ch>pear.example.org</ch>
 <c xlink:href="/rest/c/Tools/info.xml">Tools</c>
 <c xlink:href="/rest/c/Garbage%2Band%2BStuff/info.xml">Garbage and Stuff</c>
</a>

info.xml (category)

Information about a category

Here, the category is explained in detail. The file lists the name (<n>), channel server (<c>), alias (<a>) and a longer description of the category (<d>).


Example

<?xml version="1.0" encoding="utf-8" ?>
<c xmlns="http://pear.php.net/dtd/rest.category"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.category
                       http://pear.php.net/dtd/rest.category.xsd"
>
 <n>Tools</n>
 <c>pear.example.org</c>
 <a>Tools and Utilities</a>
 <d>This category holds all sorts of packages that might help you when
  trying to dominate the world.</d>
</c>

packages.xml (category)

List of all packages in category

The file simply contains a list of names and links to each package in the category.


Example

<?xml version="1.0" encoding="utf-8" ?>
<l xmlns="http://pear.php.net/dtd/rest.categorypackages"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.categorypackages
                       http://pear.php.net/dtd/rest.categorypackages.xsd"
>
 <p xlink:href="/rest/p/earth">Earth</p>
 <p xlink:href="/rest/p/worlddominator">WorldDominator</p>
</l>

packagesinfo.xml

Extendet information about all packages

packagesinfo.xml is a collection of information about packages in the category. It contains the contents of the package's info.xml, release information from allreleases.xml and dependency information for each version.

Every package information piece is wrapped in an <pi> tag.


Example

<?xml version="1.0" encoding="utf-8" ?>
<f xmlns="http://pear.php.net/dtd/rest.categorypackageinfo"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.categorypackageinfo
                       http://pear.php.net/dtd/rest.categorypackageinfo.xsd"
>
<pi>
<?xml version="1.0" encoding="UTF-8" ?>
<p xmlns="http://pear.php.net/dtd/rest.package"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.package
                       http://pear.php.net/dtd/rest.package.xsd"
>
 <n>WorldDominator</n>
 <c>pear.example.org</c>
 <!-- Full contents of p/${packagename}/info.xml follow -->
</p>
<a>
 <r><v>1.1.2</v><s>stable</s></r>
 <r><v>0.1.2</v><s>beta</s></r>
 <r><v>0.0.1</v><s>devel</s></r>
</a>
<deps>
 <v>0.1.2</v>
 <d><!-- serialized dependency information like deps.0.1.2.txt --></d>
</deps>
<deps>
 <v>0.0.1</v>
 <d><!-- serialized dependency information like deps.0.1.2.txt --></d>
</deps>
</pi>
</f>

allmaintainers.xml

Lists all maintainers

Simply lists names and links to all developers of any package on the server.

FIXME: full names or just nicks? FIXME: lowercased nicks?


Example

<?xml version="1.0" encoding="utf-8" ?>
<m xmlns="http://pear.php.net/dtd/rest.allmaintainers"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.allmaintainers
                       http://pear.php.net/dtd/rest.allmaintainers.xsd"
>
 <h xlink:href="/rest/m/pinky">pinky</h>
 <h xlink:href="/rest/m/thebrain">the brain</h>
</m>

info.xml (maintainer)

Information about a maintainer

Contains maintainer information like handle (nickname, <h>), full name (<n>) and URL (<u>) to the developer's homepage.


Example

<?xml version="1.0" encoding="utf-8" ?>
<m xmlns="http://pear.php.net/dtd/rest.maintainer"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.maintainer
                       http://pear.php.net/dtd/rest.maintainer.xsd"
>
 <h>thebrain</h>
 <n>The Brain</n>
 <u>http://pinkyandthebrain.example.org</u>
</m>

packages.xml (p)

List of all packages

This file lists all packages in this channel, together with the channel server name itself.

FIXME: rules for spaces


Example

<?xml version="1.0" encoding="utf-8" ?>
<a xmlns="http://pear.php.net/dtd/rest.allpackages"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.allpackages
                       http://pear.php.net/dtd/rest.allpackages.xsd"
>
 <c>pear.example.org</c>
 <p>Earth</p>
 <p>WorldDominator</p>
</a>

info.xml (package)

Information about a package

This file contains general version-independent information about the package: License, category, summary, description and a link to the release directory.


Example

<?xml version="1.0" encoding="utf-8" ?>
<p xmlns="http://pear.php.net/dtd/rest.package"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.package
                       http://pear.php.net/dtd/rest.package.xsd"
>
 <n>WorldDomination</n>
 <c>pear.example.org</c>
 <ca xlink:href="/rest/c/Tools">Tools</ca>
 <l>Dictatoric License</l>
 <s>Tool to dominate the world</s>
 <d>
  Helps you dominating the world by fulfilling various tasks:
  - Feed the cats
  - Lock the doors after 23:42
 </d>
 <r xlink:href="/rest/r/worlddomination"/>
</p>

maintainers.xml

Lists all developers on the package

All package developers are listed in this file, regardless if active or inactive.

Each maintainer's handle (<h>) and activity state (<a>, 0 for inactive, 1 for active) is provided.


Example

<?xml version="1.0" encoding="utf-8" ?>
<m xmlns="http://pear.php.net/dtd/rest.packagemaintainers"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.packagemaintainers
                       http://pear.php.net/dtd/rest.packagemaintainers.xsd"
>
 <p>WorldDominator</p>
 <c>pear.example.org</c>
 <m>
  <h>pinky</h>
  <a>1</a>
 </m>
 <m>
  <h>thebrain</h>
  <a>1</a>
 </m>
 <m>
  <h>deadcow</h>
  <a>0</a>
 </m>
</m>

maintainers2.xml

Lists package developers

Same as maintainers.xml, except that the developer's role is written down, too.

Valid role names are lead, developer, contributor and helper.


Example

<?xml version="1.0" encoding="utf-8" ?>
<m xmlns="http://pear.php.net/dtd/rest.packagemaintainers"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.packagemaintainers
                       http://pear.php.net/dtd/rest.packagemaintainers.xsd"
>
 <p>WorldDominator</p>
 <c>pear.example.org</c>
 <m>
  <h>pinky</h>
  <a>1</a>
  <r>developer</r>
 </m>
 <m>
  <h>thebrain</h>
  <a>1</a>
  <r>lead</r>
 </m>
 <m>
  <h>deadcow</h>
  <a>0</a>
  <r>helper</r>
 </m>
</m>

allreleases.xml

List of all package versions

This file lists all known versions of a package, together with its stability.

Releases in this file are ordered, the latest version has to be first.


Example

<?xml version="1.0" encoding="utf-8" ?>
<a xmlns="http://pear.php.net/dtd/rest.allreleases"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.allreleases
                       http://pear.php.net/dtd/rest.allreleases.xsd"
>
 <p>WorldDominator</p>
 <c>pear.example.org</c>
 <r><v>0.8.1</v><s>beta</s></r>
 <r><v>0.0.2</v><s>alpha</s></r>
</a>

allreleases2.xml

List of all package versions with PHP version

Same as allreleases.xml, but with information about the minimum version of PHP required.


Example

<?xml version="1.0" encoding="utf-8" ?>
<a xmlns="http://pear.php.net/dtd/rest.allreleases2"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.allreleases2
                       http://pear.php.net/dtd/rest.allreleases2.xsd"
>
 <p>WorldDominator</p>
 <c>pear.example.org</c>
 <r><v>0.8.1</v><s>beta</s><m>4.4.2</m></r>
 <r><v>0.0.2</v><s>alpha</s><m>5.2.3</m></r>
</a>

0.1.2.xml (release)

Short xml file about the release

This file is a special size-optimized version of the full package.xml with only necessary information.

As in package.xml, the tag order is important and may not be shuffled.


Example

<?xml version="1.0" encoding="utf-8" ?>
<r xmlns="http://pear.php.net/dtd/rest.release"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.release
                       http://pear.php.net/dtd/rest.release.xsd"
>
 <p xlink:href="/rest/p/worlddominator">WorldDominator</p>
 <c>pear.example.org</c>
 <v>0.1.2</v>
 <st>beta</st>
 <l>Dictatoric License</l>
 <m>thebrain</m>
 <s>Tool to dominate the world</s>
 <d>Helps you dominating the world by fulfilling various tasks:
  - Feed the cats
  - Lock the doors after 23:42</d>
 <da>2007-12-24 23:42:00</da>
 <n>* Fix atomic X-mas bug [thebrain]</n>
 <f>19588</f>
 <g>http://pear.example/get/WorldDominator-0.1.2</g>
 <x xlink:href="package.0.1.2.xml"/>
</r>

v2.0.1.2.xml

Short xml file about the release, version 2

Same as 0.1.2.xml , but with additional API and minimum PHP version.


Example

<?xml version="1.0" encoding="utf-8" ?>
<r xmlns="http://pear.php.net/dtd/rest.release2"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:xlink="http://www.w3.org/1999/xlink"
   xsi:schemaLocation="http://pear.php.net/dtd/rest.release2
                       http://pear.php.net/dtd/rest.release2.xsd"
>
 <p xlink:href="/rest/p/worlddominator">WorldDominator</p>
 <c>pear.example.org</c>
 <v>0.1.2</v>
 <a>0.1.2</a>
 <mp>5.2.3</mp>
 <st>beta</st>
 <l>Dictatoric License</l>
 <m>thebrain</m>
 <s>Tool to dominate the world</s>
 <d>Helps you dominating the world by fulfilling various tasks:
  - Feed the cats
  - Lock the doors after 23:42</d>
 <da>2007-12-24 23:42:00</da>
 <n>* Fix atomic X-mas bug [thebrain]</n>
 <f>19588</f>
 <g>http://pear.example/get/WorldDominator-0.1.2</g>
 <x xlink:href="package.0.1.2.xml"/>
</r>

deps.0.1.2.txt

Serialized dependency information

The file contains an array of dependency information, serialized with PHP's serialize() function.

FIXME: Explain array format


Example of an unserialized dependency array

array(2) {
  ["required"]=>
  array(2) {
    ["php"]=>
    array(1) {
      ["min"]=>
      string(5) "5.2.3"
    }
    ["pearinstaller"]=>
    array(1) {
      ["min"]=>
      string(7) "1.7.1"
    }
  }
  ["optional"]=>
  array(1) {
    ["package"]=>
    array(2) {
      ["name"]=>
      string(4) "Toolbox"
      ["channel"]=>
      string(12) "pear.example.org"
    }
  }
}

Use cases

This section shows common actions on a channel server and what to do then.

The idea and initial cases have been taken from Jean-Lou Dupont's "PEAR Channel on Google Code" presentation.

VI. Packages


Chapter 32. Authentication

Provides Packages for authentication management



Auth

Table of Contents
Introduction -- A usage example
Auth Options -- Options for controlling the behaviour of Auth
Logging -- Introduction
Storage drivers -- Introduction
Auth_Container_Array -- Authenticate against an array of usernames and passwords
Auth_Container_DB -- Authenticate against a database using DB
Auth_Container_DBLite -- Authenticate against a database using DB
Auth_Container_File -- Authenticate a password file using File_Passwd
Auth_Container_IMAP -- Authenticate against an IMAP server
Auth_Container_KADM5 -- Authenticate against a Kerberos 5 server
Auth_Container_LDAP -- Authenticate against an LDAP server
Auth_Container_MDB -- Authenticate against a database using MDB
Auth_Container_MDB2 -- Authenticate against a database using MDB2
Auth_Container_Multiple -- Authenticate against multiple Auth_Containers
Auth_Container_PEAR -- Authenticate against the PEAR website
Auth_Container_POP3 -- Authenticate against a POP3 server
Auth_Container_RADIUS -- Authenticate against a RADIUS server
Auth_Container_SAP -- Authenticate against a SAP server
Auth_Container_SMBPasswd -- Authenticate a SAMBA smbpasswd file using File_SMBPasswd
Auth_Container_SOAP -- Authenticate against a SOAP service
Auth_Container_SOAP5 -- Authenticate against a SOAP service
Auth_Container_vpopmail -- Authenticate against a vpopmail service
Custom Auth_Container -- Build a custom storage container
Auth_Frontend_HTML -- Default login form
Constants -- predefined constants
Auth::Auth() -- constructor
Auth::addUser() -- add a new user
Auth::attachLogObserver() -- Attach a log observer instance to the internal Log object
Auth::changePassword() -- change the password of a user
Auth::checkAuth() --  check if a session with valid authentication information exists
Auth::getAuth() -- check for an authenticated user
Auth::getAuthData() -- retrieve extra information stored within the auth session
Auth::getStatus() -- get the current status of the auth session
Auth::getUsername() -- get the username of the authenticated user
Auth::listUsers() -- list available users
Auth::logout() -- logout an authenticated user
Auth::removeUser() -- remove a user account
Auth::setAdvancedSecurity() -- Enables advanced security features. Turned off by default
Auth::setAllowLogin() -- Controls if the user will be allowed to login. Turned on by default
Auth::setAuth() -- set a specific user to be marked as logged in
Auth::setAuthData() -- store extra information with the Auth session
Auth::setCheckAuthCallback() -- set a callback to run when ever session validity is checked
Auth::setExpire() -- set expiration time for authentication
Auth::setFailedLoginCallback() -- set a callback for failed login attempts
Auth::setIdle() -- set maximum idle time for authentication
Auth::setLoginCallback() -- set a callback for successful login attempts
Auth::setLogoutCallback() -- set a callback for successful logout attempts
Auth::setSessionName() -- set a custom name for the Auth session variable
Auth::setShowLogin() -- controls if the login form will be displayed. Turned on by default
Auth::sessionValidThru() --  get the time up to the session is valid
Auth::start() -- start authentication

Provides a framework for user authentication.

Introduction

Introduction -- A usage example

Auth tutorial

Our goal during this "mini tutorial" is to set up a system that secures your site with an easy to use authentication mechanism.

At the top of the site to secure, place the following code snippet:

Example 32-1. Typical usage example for PEAR::Auth

require_once "Auth.php";

// Takes three arguments: last attempted username, the authorization
// status, and the Auth object. 
// We won't use them in this simple demonstration -- but you can use them
// to do neat things.
function loginFunction($username = null, $status = null, &$auth = null)
{
    /*
     * Change the HTML output so that it fits to your
     * application.
     */
    echo "<form method=\"post\" action=\"test.php\">";
    echo "<input type=\"text\" name=\"username\">";
    echo "<input type=\"password\" name=\"password\">";
    echo "<input type=\"submit\">";
    echo "</form>";
}

$options = array(
  'dsn' => "mysql://user:password@localhost/database",
  );
$a = new Auth("DB", $options, "loginFunction");

$a->start();

if ($a->checkAuth()) {
    /*
     * The output of your site goes here.
     */
}

This few lines of code instantiate the authentication system.

The first line in the above script includes the file from your PEAR directory. It contains all the necessary code to run PEAR::Auth. Next, we define a function to display the login form which the visitor of your page has to use to enter his login data. You can change all the HTML formatting in this function.

Since we want to use a database to verify the login data, we now create the variable $dsn, it contains a valid DSN string that will be used to connect to the database via PEAR::DB. For the default database table schema or to use a different storage container, please see below for more information.

After that we create the authentication object. The first parameter defines the name of the storage container. Because we want to use a database driven storage container, we pass "DB" here. The second parameter is the connection parameter for the container driver. We use the previously defined DSN string. The third parameter is the name of our function that we defined at the beginning of the script. It prints the login form.

Now our authentication object is initialized and we need to check if the user is logged in. This is done via the method checkAuth(). If it returns TRUE, we can pass the content of our page to the user.

In the following passages we cover more detailed information about the functions of PEAR::Auth.

This SQL statement creates a table usable under the default database authentication scheme using MySQL:

CREATE TABLE auth (
   username VARCHAR(50) default '' NOT NULL,
   password VARCHAR(32) default '' NOT NULL,
   PRIMARY KEY (username),
   KEY (password)
);

These are the table and field names necessary for working authentication. When hashing the passwords with the MD5 algorithm, which is the default encryption method in PEAR::Auth, the password column must be at least 32 characters long. When using another encryption method like DES ("UNIX crypt"), the column size has to be changed correspondingly.

Auth Options

Auth Options -- Options for controlling the behaviour of Auth

Logging

Logging -- Introduction

Overview

Since version 1.5.0 PEAR::Auth provides a facility for retrieving logs of its internal behaviour. This is implemented using PEAR::Log and its log observer components.

Auth provides two levels of log messages which map to the Log priority levels PEAR_LOG_INFO and PEAR_LOG_DEBUG.

PEAR_LOG_INFO messages provide basic information about Auth's decisions, for example user authentication successful/failed, rendering login screen.

PEAR_LOG_DEBUG messages provide detailed information about what is happening within the internals of Auth, for example which functions are called, logic tracking for the Authentication method, what SQL queries are being run against the database backends.

Example

Example 32-1. Typical usage example for accessing the logs from PEAR::Auth

require_once "Auth.php";
require_once 'Log.php';
require_once 'Log/observer.php';

// Callback function to display login form
function loginFunction($username = null, $status = null, &$auth = null)
{
	/*
	 * Change the HTML output so that it fits to your
	 * application.
	 */
	echo "<form method=\"post\" action=\"".$_SERVER['PHP_SELF']."\">";
	echo "Username: <input type=\"text\" name=\"username\"><br/>";
	echo "Password: <input type=\"password\" name=\"password\"><br/>";
	echo "<input type=\"submit\">";
	echo "</form>";
}

class Auth_Log_Observer extends Log_observer {

	var $messages = array();

	function notify($event) {

		$this->messages[] = $event;

	}

}

$options = array(
		'enableLogging' => true,
		'cryptType' => 'md5',
		'users' => array(
			'guest' => md5('password'),
			),
		);
$a = new Auth("Array", $options, "loginFunction");

$infoObserver = new Auth_Log_Observer(PEAR_LOG_INFO);

$a->attachLogObserver($infoObserver);

$debugObserver = new Auth_Log_Observer(PEAR_LOG_DEBUG);

$a->attachLogObserver($debugObserver);

$a->start();

if ($a->checkAuth()) {
	/*
	 * The output of your site goes here.
	 */
	print "Authentication Successful.<br/>";
}

print '<h3>Logging Output:</h3>'
	.'<b>PEAR_LOG_INFO level messages:</b><br/>';

foreach ($infoObserver->messages as $event) {
	print $event['priority'].': '.$event['message'].'<br/>';
}

print '<br/>'
	.'<b>PEAR_LOG_DEBUG level messages:</b><br/>';

foreach ($debugObserver->messages as $event) {
	print $event['priority'].': '.$event['message'].'<br/>';
}

print '<br/>';

To enable logging pass the option "enableLogging" with the value TRUE in the options array in the second parameter to the Auth constructor.

To retrieve the log messages from Auth create a new subclass of Log_Observer that implements a notify() function to perform whatever actions you want on the log messages.

Once defined pass an instance of your new Log_Observer instance to Auth::attachLogObserver().

To limit the types of messages you receive in the Log_Observer pass either PEAR_LOG_INFO or PEAR_LOG_DEBUG as the first parameter to the Log_Observer. The default is PEAR_LOG_INFO. For more information on this filtering see the Log Documentation.

$observer = new My_Log_Observer(PEAR_LOG_DEBUG);

Note

This container has only been available since version 1.5.0.

Storage drivers

Storage drivers -- Introduction

Overview

PEAR::Auth uses a number of so called storage containers to store the login data. The following passages describe all of them. If the containers that come with the package don't fit your needs, it is easy to create custom ones, also.

Available Containers

Array

Storage container using a PHP Array.

DB

Storage container using PEAR DB.

DBLite

A simplified version of the DB container that only provides user authentication. No user management functions are provided.

File

Storage container using PEAR File_Passwd.

IMAP

Storage container for use against IMAP servers.

KADM5

Storage container for use against Kerberos V servers.

LDAP

Storage container for use against LDAP servers.

MDB

Storage container using PEAR MDB.

MDB2

Storage container using PEAR MDB2.

Multiple

Storage container for using multiple Auth_Containers in a fall through manner.

PEAR

Storage container for use against the PEAR website.

POP3

Storage container for use against a POP3 server.

RADIUS

Storage container for use against a RADIUS server.

SAP

Storage container for use against a SAP server.

SMBPasswd

Storage container using PEAR File_SMBPasswd.

SOAP

Storage container for use against a SOAP service using PEAR SOAP as the client.

SOAP5

Storage container for use against a SOAP service using PHP5 SOAP as the client.

vpopmail

Storage container using vpopmail.

Custom

Instructions on creating a custom storage container.

Auth_Container_Array

Auth_Container_Array -- Authenticate against an array of usernames and passwords

Auth_Container_DB

Auth_Container_DB -- Authenticate against a database using DB

Auth_Container_DBLite

Auth_Container_DBLite -- Authenticate against a database using DB

Auth_Container_File

Auth_Container_File -- Authenticate a password file using File_Passwd

Auth_Container_IMAP

Auth_Container_IMAP -- Authenticate against an IMAP server

Auth_Container_KADM5

Auth_Container_KADM5 -- Authenticate against a Kerberos 5 server

Auth_Container_LDAP

Auth_Container_LDAP -- Authenticate against an LDAP server

LDAP Container

This storage container makes use of the ldap extension to load user data from an LDAP server.

The storage-specific argument for the Auth constructor() is an array of options.

Table 32-1. Available Options

OptionData TypeDefault valueDescription
"host" string "localhost" The host name or IP-adress to access
"port" integer 389 The port of the LDAP server to access
"url" string "" A fully qualified URL for specifying the protocol, url and port to connect to. It is useful for specifying ldaps://. Takes precedence over "host" and "port" options. Only works if PHP has been compiled against OpenLDAP 2+ libraries.
"version" integer 2 LDAP version to use, usually 2 (default) or 3, must be an integer!
"referrals" boolean TRUE If set, determines whether the LDAP library automatically follows referrals returned by LDAP servers or not.
"binddn" string "" If set, searching for user will be done after binding as this user, if not set the bind will be anonymous. This is reported to make the container work with MS Active Directory, but should work with any server that is configured this way. This has to be a complete dn for now (basedn and userdn will not be appended).
"bindpw" string "" The password to use for binding with binddn.
"basedn" string "" The base DN of your server.
"userdn" string "" Gets prepended to basedn when searching for users.
"userscope" string "sub" Scope for user searching: one, sub (default), or base.
"userattr" string "uid" Defines the attribute to search for.
"userfilter" string "(objectClass=posixAccount)" Filter that will be added to the search filter this way: (&(userattr=username)(userfilter)).
"attributes" array array('') Array of additional attributes to fetch from entry. These will added to auth data and can be retrieved via Auth::getAuthData() . An empty array will fetch all attributes, array('') will fetch no attributes at all (default). If you add 'dn' as a value to this array, the user's DN that was used for binding will be added to auth data as well.
"attrformat" string "AUTH"

The returned format of the additional data defined in the 'attributes' option. Two formats are available.

LDAP returns data formatted in a multidimensional array where each array starts with a 'count' element providing the number of attributes in the entry, or the number of values for attributes. When set to this format, the only way to retrieve data from the Auth object is by calling getAuthData('attributes'). This was the default format before version 1.3.0.

AUTH returns data formatted in a structure more compliant with other Auth Containers, where each attribute element can be directly called by getAuthData() method from Auth. This became the default as of 1.3.0.

"groupdn" string "" Gets prepended to basedn when searching for group.
"groupattr" string "cn" The group attribute to search for.
"groupfilter" string "(objectClass=groupOfUniqueNames)" Filter that will be added to the search filter when searching for a group: (&(groupattr=group)(memberattr=username)(groupfilter)).
"memberattr" string "uniqueMember" The attribute of the group object where the user dn may be found.
"memberisdn" boolean TRUE Whether the memberattr is the dn of the user (default) or the value of userattr (usually uid).
"group" string "" The name of the group users have to be a member of to authenticate successfully.
"groupscope" string "sub" Scope for group searching: one, sub (default), or base.
"start_tls" boolean "false" Enable/disable the use of START_TLS encrypted connection.
"try_all" boolean FALSE If multiple entries are returned by the search attempt to authenticate against each entry in order or just the first one (default).
"debug" boolean FALSE Enable debug output.

When talking to a Microsoft ActiveDirectory server you have to use 'samaccountname' as the 'userattr' and follow special rules to translate the ActiveDirectory directory names into 'basedn'. The 'basedn' for the default 'Users' folder on an ActiveDirectory server for the ActiveDirectory Domain (which is not related to its DNS name) "win2000.example.org" would be: "CN=Users, DC=win2000, DC=example, DC=org" where every component of the domain name becomes a DC attribute of its own. If you want to use a custom users folder you have to replace "CN=Users" with a sequence of "OU" attributes that specify the path to your custom folder in reverse order. So the ActiveDirectory folder "win2000.example.org\Custom\Accounts" would become "OU=Accounts, OU=Custom, DC=win2000, DC=example, DC=org"

It seems that binding anonymously to an Active Directory is not allowed, so you have to set binddn and bindpw for user searching.

LDAP Referrals need to be set to false for AD to work sometimes.

Note also that if you want an encrypted connection to an MS LDAP server, then, on your webserver, you must specify "TLS_REQCERT never" in /etc/ldap/ldap.conf or in the webserver user's ~/.ldaprc (which may or may not be read depending on your configuration).

Auth_Container_MDB

Auth_Container_MDB -- Authenticate against a database using MDB

Auth_Container_MDB2

Auth_Container_MDB2 -- Authenticate against a database using MDB2

Note

By default, MDB2's default portability setting of MDB2_PORTABILITY_ALL is used. This setting may cause unexpected behaviour, such as field names being converted to lowercase regardless of their definition in the database schema. The "db_options" option can be used to override this, as shown in the following example.

Auth_Container_Multiple

Auth_Container_Multiple -- Authenticate against multiple Auth_Containers

Multiple

This container provides a facility to attempt to authenticate against multiple Auth_Containers in order.

If a container's getAuthData() returns true Auth_Container_Multiple will return true.

When a container's getAuthData() returns false Auth_Container_Multiple will continue on through the list of available containers until a successful login is found or the list of containers is expired.

On receipt of an error from getAuthData() Auth_Container_Multiple will abort checking further containers and return the error.

The storage-specific argument for the Auth constructor() is an array of container configurations. Each container configuration has the following options:

Example 32-1. Example usage of Auth_Container_Multiple

require_once "Auth.php";
require_once 'Log.php';
require_once 'Log/observer.php';

// Callback function to display login form
function loginFunction($username = null, $status = null, &$auth = null)
{
	/*
	 * Change the HTML output so that it fits to your
	 * application.
	 */
	echo "<form method=\"post\" action=\"".$_SERVER['PHP_SELF']."\">";
	echo "Username: <input type=\"text\" name=\"username\"><br/>";
	echo "Password: <input type=\"password\" name=\"password\"><br/>";
	echo "<input type=\"submit\">";
	echo "</form>";
}

class Auth_Log_Observer extends Log_observer {

	var $messages = array();

	function notify($event) {

		$this->messages[] = $event;

	}

}

$options = array(
	'enableLogging' => true,
	array(
		'type' => 'Array',
		'options' => array(
			'cryptType' => 'md5',
			'users' => array(
				'guest' => md5('password'),
			),
		),
	),
	array(
		'type' => 'Array',
		'options' => array(
			'cryptType' => 'md5',
			'users' => array(
				'admin' => md5('password'),
			),
		),
	),
);
$a = new Auth("Multiple", $options, "loginFunction");

$infoObserver = new Auth_Log_Observer(PEAR_LOG_INFO);

$a->attachLogObserver($infoObserver);

$debugObserver = new Auth_Log_Observer(PEAR_LOG_DEBUG);

$a->attachLogObserver($debugObserver);

$a->start();

if ($a->checkAuth()) {
	/*
	 * The output of your site goes here.
	 */
	print "Authentication Successful.<br/>";
}

print '<h3>Logging Output:</h3>'
	.'<b>PEAR_LOG_INFO level messages:</b><br/>';

foreach ($infoObserver->messages as $event) {
	print $event['priority'].': '.$event['message'].'<br/>';
}

print '<br/>'
	.'<b>PEAR_LOG_DEBUG level messages:</b><br/>';

foreach ($debugObserver->messages as $event) {
	print $event['priority'].': '.$event['message'].'<br/>';
}

print '<br/>';

Note

This container has only been available since version 1.5.0.

Auth_Container_PEAR

Auth_Container_PEAR -- Authenticate against the PEAR website

PEAR Container

This container provides authentication services against the PEAR website (http://pear.php.net/) and the developer accounts. The HTTP_Client package must be installed for this container to operate, as of Auth 1.5.3.

This container does not take an storage specific options.

Auth_Container_POP3

Auth_Container_POP3 -- Authenticate against a POP3 server

Auth_Container_RADIUS

Auth_Container_RADIUS -- Authenticate against a RADIUS server

RADIUS Container

You need Auth_RADIUS and the PECL radius in order to get this container to work.

The storage-specific argument for the Auth constructor() is an array of options.

Table 32-1. Available Options

OptionData TypeDefault valueDescription
"servers" array array("localhost", 0, "testing123", 3, 3)

Array of RADIUS servers, containing: host, port, shared secret, timeout, maxtries.

The host parameter specifies the server host, either as a fully qualified domain name or as a dotted-quad IP address in text form.

The port parameter specifies the UDP port to contact on the server. If port is given as 0, the library looks up the radius/udp entry in the network services database, and uses the port found there. If no entry is found, the library uses the standard RADIUS port for authentication (1812).

The shared secret for the server host is passed to the secret parameter. The RADIUS protocol ignores all but the leading 128 bytes of the shared secret.

The timeout for receiving replies from the server is passed to the timeout parameter, in units of seconds.

The maximum number of repeated requests to make before giving up is passed into the maxtries parameter.

At most 10 servers may be specified. When multiple servers are given, they are tried in round-robin fashion until a valid response is received, or until each server's maxtries limit has been reached.

"authtype" string "PAP"

The authentication method for validating the request. Possible values are: PAP, CHAP_MD5, MSCHAPv1, MSCHAPv2.

There are dependencies for the different methods. For all authentication methods except PAP you need the Crypt_CHAP package, when you are using MS-CHAP you need also the mhash extension.

Auth_Container_SAP

Auth_Container_SAP -- Authenticate against a SAP server

SAP Container

This container allows authentication against a SAP server using the SAPRFC extension available at http://saprfc.sourceforge.net/.

The storage-specific argument for the Auth constructor() is an array of options which are passed directly to the SAPRFC extension. None of the options are used internally, for more details see the SAPRFC's documentation.

Auth_Container_SMBPasswd

Auth_Container_SMBPasswd -- Authenticate a SAMBA smbpasswd file using File_SMBPasswd

SMBPasswd Container

This storage container provides authentication against SAMBA smbpasswd files. It makes use of the PEAR File_SMBPasswd package.

The storage-specific argument for the Auth constructor() is a string containing the filename of the SAMBA smbpasswd file to use.

Auth_Container_SOAP

Auth_Container_SOAP -- Authenticate against a SOAP service

Auth_Container_SOAP5

Auth_Container_SOAP5 -- Authenticate against a SOAP service

SOAP5 Container

This container makes use of the PHP SOAP extension's client to provide authentication against a SOAP service.

The storage-specific argument for the Auth constructor() is an array of options. In addition to the below options all options for the PHP SOAP Client can be passed in this array and they will be passed onto the client.

Auth_Container_vpopmail

Auth_Container_vpopmail -- Authenticate against a vpopmail service

vpopmail Container

This container uses an existing vpopmail service to validate the username and the password.

It does not require any storage-specific argument.

Custom Auth_Container

Custom Auth_Container -- Build a custom storage container

Auth_Frontend_HTML

Auth_Frontend_HTML -- Default login form

Overview

PEAR::Auth_Frontend_HTML provides a generic default login page for use with PEAR::Auth. When building your own login page it is a reasonable place to start as it includes all the required elements of the login form.

Constants

Constants -- predefined constants

AUTH_IDLED

-1

Returned if a session exceeds its idle time.

AUTH_EXPIRED

-2

Returned if a session has expired.

AUTH_WRONG_LOGIN

-3

Returned if the Auth Container in use is unable to validate the username/password pair supplied.

AUTH_METHOD_NOT_SUPPORTED

-4

Returned if the requested function is not implemented by the Auth Container in use.

AUTH_SECURITY_BREACH

-5

Returned if the advanced security checking detects a breach.

AUTH_CALLBACK_ABORT

-6

Returned if the checkAuth callback function aborted the session.

Auth::Auth()

Auth::Auth() -- constructor

Description

Constructor for the authentication system.

The constructor will ensure that the PHP session management is started by calling session_start(). This is done as Auth requires a session to be active to operate correctly.

Parameter

string $storageDriver

Name of the storage driver that should be used, alternatively you can pass a custom Auth_Container object.

mixed $options

Array containing the options for both Auth itself and the storage driver. See Auth Options for global options and each storage driver's documentation for specific options.

string $loginFunction

The name of a user-defined function that prints the login screen. This function is passed three parameters when called $username, $status, &$auth. These are in order the previously attempted username, the status code that caused the previous auth attempt to fail and a reference to the Auth object itself.

boolean $showLogin

Defines if the login is optional or not.

Note

This function can not be called statically.

Example

This example shows you how you can specifiy alternative names for the database table and the column names. In our example, we use the table myAuth, select the username from the field myUserColumn and the password from the field myPasswordColumn. The default values for this fields are auth, username and password. Note that you can also specify an existing DB object with the dsn parameter instead of a DSN.

This feature is necessary if you want to use PEAR::Auth with a database layout that is different from the one PEAR::Auth uses by default.

Example

This example shows you how you can pass your own storage container to Auth.

If the storage containers supplied with Auth are not capable of fulfilling your requirements, you can easliy create your own storage container. Read the storage containers section for more info Introduction - The storage drivers

Auth::addUser()

Auth::addUser() -- add a new user

Description

Add a new user to the Auth Container.

Parameter

string $username

the username of the new user

string $password

the password of the new user

mixed $additional = ''

additional options to be passed to the creation of the new user. Each Auth_Container has different options for these, please see the containers documentation for what is supported.

Return value

mixed - TRUE on success, a PEAR Error on failure.

Note

This function can not be called statically.

Not all Auth Containers implement this functionality.

Auth::attachLogObserver()

Auth::attachLogObserver() -- Attach a log observer instance to the internal Log object

Description

Attach an instance of a Log_Observer to the internal Log object. This allows the internal logs to be accessed and used as you wish within your application.

Parameter

object &$observer

The instance of the Log_Observer to attach to the internal Log object.

Note

This function can not be called statically.

This function has only been available since version 1.5.0.

Auth::changePassword()

Auth::changePassword() -- change the password of a user

Description

Change the password of a user within the Auth Container.

Parameter

string $username

the username of the user

string $password

the new password for the user

Return value

mixed - TRUE on success, a PEAR Error on failure.

Note

This function can not be called statically.

Not all Auth Containers implement this functionality.

Auth::checkAuth()

Auth::checkAuth() --  check if a session with valid authentication information exists

Description

Checks if a session exists that contains valid authentication information.

Return value

boolean - If a session with valid authentication information exists, the function return TRUE. Otherwise it returns FALSE.

Note

This function can not be called statically.

Auth::getAuth()

Auth::getAuth() -- check for an authenticated user

Description

Check if the user has been authenticated.

Return value

boolean - If the user has already been authenticated, the function returns TRUE. Otherwise it returns FALSE.

Note

This function can not be called statically.

Auth::getAuthData()

Auth::getAuthData() -- retrieve extra information stored within the auth session

Description

This function retrieves the value of a previously registered data field.

Parameter

string $name

the name of the data field

Note

This function can not be called statically.

Auth::getStatus()

Auth::getStatus() -- get the current status of the auth session

Description

Get the current status of the authentication session.

Return value

int - An Auth constant representing the current session state.

Note

This function can not be called statically.

Auth::getUsername()

Auth::getUsername() -- get the username of the authenticated user

Description

Get the username of the logged in user.

Return value

string - The username of the logged in user.

Note

This function can not be called statically.

Auth::listUsers()

Auth::listUsers() -- list available users

Description

List all the users currently available within the current Auth Container.

Return value

array - An array of user details. Currently no consistency, see each Auth Container for details on how and what they return.

Note

This function can not be called statically.

Not all Auth Containers implement this functionality.

Auth::logout()

Auth::logout() -- logout an authenticated user

Description

Logout any currently logged in user.

Note

This function can not be called statically.

Auth::removeUser()

Auth::removeUser() -- remove a user account

Description

Remove a user from the Auth Container.

Parameter

string $username

the username of the user to remove

Return value

mixed - TRUE on success, a PEAR Error on failure.

Note

This function can not be called statically.

Not all Auth Containers implement this functionality.

Auth::setAdvancedSecurity()

Auth::setAdvancedSecurity() -- Enables advanced security features. Turned off by default

Description

Enables advanced security features to make man in the middle attacks and session hijacking much harder. Cookies and java script must be enabled on the client browser for some of these features to function correctly.

Enables the following security features of auth

  • Detection of client ip address change or User-Agent header change if such a change is detected the user will be logged out

  • Each client request a special unique cookie is given to the client. He must present this cookie on his next request. This cookie changes on every request. If client does not present the valid cookie he will be logged out.

  • Enables challenge responce for the default login screen of auth. The user password will be hashed with javascript before sent back to the server. Prevents the user password being stolen using password sniffing tools. Password is hashed with a random key so the md5 hash is not subject to brute force password cracking. This will only work for storage containers which support challenge responce password authenthication. Currently only the DB, MDB and MDB2 containers support this for md5 and clear text passwords

Note: This method is available since 1.3.0

Parameter

boolean $flag

TRUE if you want to enable advanced security features FALSE if you want to disable them.

Note

This function can not be called statically.

Auth::setAllowLogin()

Auth::setAllowLogin() -- Controls if the user will be allowed to login. Turned on by default

Description

Controls if auth will process the post variables and attempt to login the user from those pages. For better security of your application it is recomended to disable login in all pages except your login page.

Parameter

boolean $allowLogin

If you want to allow login set this to TRUE otherwise set it to FALSE.

Note

This function can not be called statically.

This method is available since 1.3.0

Auth::setAuth()

Auth::setAuth() -- set a specific user to be marked as logged in

Description

Mark the session up to indicate that the username supplied has successfully logged in. Although normally used for internal purposes this function can be used to fake a login.

Parameter

string $name

the name of the data field

Note

This function can not be called statically.

This function will also call session_regenerate_id() so as to prevent session fixation attacks.

Auth::setAuthData()

Auth::setAuthData() -- store extra information with the Auth session

Description

This function allows the registration of extra information to be stored allowing with the authentication data.

Parameter

string $name

the name of the data field

mixed $value

the value of the data field

boolean $overwrite

whether to overwrite the value of the data field if it already exists.

Note

This function can not be called statically.

Auth::setCheckAuthCallback()

Auth::setCheckAuthCallback() -- set a callback to run when ever session validity is checked

Description

This function sets a callback function which is called whenever the validity of a logged in session is checked. This callback can be used to perform actions like checking the authentication source to see if the logged in user is still enabled.

The callback function will be passed two parameters, the username that successfully logged in and a reference to the Auth object. The callback function should return a boolean depending upon whether the session should continue or not. TRUE to allow the session to continue, FALSE to abort the session.

If the session is aborted by this callback the status will be set to AUTH_CALLBACK_ABORT.

Parameter

string $checkAuthCallback

the call back function to use

Note

This function can not be called statically.

Auth::setExpire()

Auth::setExpire() -- set expiration time for authentication

Description

With this function you can set the maximum expire time that is used by auth to a new value.

Parameter

integer $time

expiration time, number of seconds

boolean $add

if TRUE $time is added to the existing expiration time, if FALSE the exitsing time value will be replaced.

Note

This function can not be called statically.

Auth uses PHP's session mechanism to recognize users between http calls. Setting Auth's expiry time larger than the session timeout will still expire the session to the time the php session expires.

Auth::setFailedLoginCallback()

Auth::setFailedLoginCallback() -- set a callback for failed login attempts

Description

This function sets a callback function which is called upon failed login of a user account.

The callback function will be passed two parameters, the username that failed to login and a reference to the Auth object.

Parameter

string $loginFailedCallback

the call back function to use

Note

This function can not be called statically.

Auth::setIdle()

Auth::setIdle() -- set maximum idle time for authentication

Description

With this function one can set the maximum idle time to a new value. The term "idle time" describes the maximum time interval (in seconds) between two actions by the user. If the maximum idle time is reached, the user will be automatically logged out. If on the other hand the user performs any action within the maximum idle time interval, the idle time is reset.

Parameter

integer $time

idle time in seconds

boolean $add

if TRUE $time is added to the existing idle time, if FALSE the existing time value will be replaced.

Note

This function can not be called statically.

Auth::setLoginCallback()

Auth::setLoginCallback() -- set a callback for successful login attempts

Description

This function sets a callback function which is called upon successful login of a user account.

The callback function will be passed two parameters, the username that successfully logged in and a reference to the Auth object.

Parameter

string $loginCallback

the call back function to use

Note

This function can not be called statically.

Auth::setLogoutCallback()

Auth::setLogoutCallback() -- set a callback for successful logout attempts

Description

This function sets a callback function which is called upon successful logout of a user account.

The callback function will be passed two parameters, the username that successfully logged out and a reference to the Auth object.

Parameter

string $loginCallback

the call back function to use

Note

This function can not be called statically.

Auth::setSessionName()

Auth::setSessionName() -- set a custom name for the Auth session variable

Description

This function is used to set the name of the session variable used to store the user's authentication details. The default for the session variable name is _authsession.

Parameter

string $name

the session variable name to use

Note

This function can not be called statically.

You have to use setSessionName(), if you are running two or more different applications with Auth on the same domain. If you don't use this function, a user who has once logged in at one of the applications can also use the other applications without logging in again!

Auth::setShowLogin()

Auth::setShowLogin() -- controls if the login form will be displayed. Turned on by default

Description

Controls if the login page will be displayed to the user. Normally you might need to display the login form only on a certain page of your web application.

Parameter

boolean $showLogin

true if you want to display the login form and false if you want to hide it.

Note

This function can not be called statically.

This is equivalent to the 4th paramether of Auth::Auth()

Auth::sessionValidThru()

Auth::sessionValidThru() --  get the time up to the session is valid

Description

This method returns the time in seconds after which the idle time of the current authentication session has reached its limit, which will cause the user to be logged out automatically. If no maximum idle time is set, which is the default configuration of PEAR::Auth, this method will return 0.

Note

This function can not be called statically.

Auth::start()

Auth::start() -- start authentication

Description

Start the authentication process. To do this Auth checks for an existing session and checks its validity. If there is no existing session or the previous session has been ended for some reason then the login form is generated either via the specified callback or using the default form implemented in Auth_Frontend_HTML.

Note

This function can not be called statically.


Auth_HTTP

Table of Contents
Introduction -- to HTTP based authentication
Auth_HTTP::Auth_HTTP() -- constructor
Auth_HTTP Example -- Example: A simple password protected page
Auth_HTTP Example 2 -- Example: A password protected page with multiple rows fetch and md5 password
Auth_HTTP::getAuth() -- check for an authenticated user
Auth_HTTP::getStatus() -- returns informations about the current authentication status
Auth_HTTP::start() -- start authentication

Provides a framework for user authentication (aka an "User-Login") based on the HTTP

Introduction

Introduction -- to HTTP based authentication

Instead of generating an HTML driven form like PEAR::Auth does, this class sends header commands to the clients which cause them to present a login box like they are e.g. used in Apache's .htaccess mechanism.

Starting with Auth_HTTP 2.1.0, HTTP Digest Authentication (RFC2617) is experimentally supported.

Auth_HTTP::Auth_HTTP()

Auth_HTTP::Auth_HTTP() -- constructor

Description

Constructor for the authentication system

Parameter

string $storageDriver

name of the storage driver that should be used

mixed $options

a string containing some login information or an array containing a bunch of options for the storage driver

Note

This function can not be called statically.

Auth_HTTP Example

Auth_HTTP Example -- Example: A simple password protected page

Example

<?php

// example of Auth_HTTP basic implementation 

require_once("Auth/HTTP.php");

// setting the database connection options
$AuthOptions = array(
'dsn'=>"pgsql://test:test@localhost/testdb",
'table'=>"testable",                            // your table name 
'usernamecol'=>"username",			// the table username column
'passwordcol'=>"password",			// the table password column
'cryptType'=>"none",				// password encryption type in your db
);


$a = new Auth_HTTP("DB", $AuthOptions);

$a->setRealm('yourrealm');			// realm name
$a->setCancelText('<h2>Error 401</h2>');        // error message if authentication fails
$a->start();					// starting the authentication process


if($a->getAuth())				// checking for autenticated user 
{
	echo "Hello $a->username welcome to my secret page";
	
};

?>

Auth_HTTP Example 2

Auth_HTTP Example 2 -- Example: A password protected page with multiple rows fetch and md5 password

Example

<?php  
// example of Auth_HTTP implementation with encrypted password and multiple columns fetch

require_once("Auth/HTTP.php");

// setting the database connection options
$AuthOptions = array(
'dsn'=>"pgsql://test:test@localhost/testdb",
'table'=>"testable",                            // your table name 
'usernamecol'=>"username",			// the table username column
'passwordcol'=>"password",			// the table password column
'cryptType'=>"md5",				// password encryption type in your db
'db_fields'=>"*",				// enabling fetch for other db columns
);


$a = new Auth_HTTP("DB", $AuthOptions);

$a->setRealm('yourrealm');			// realm name
$a->setCancelText('<h2>Error 401</h2>');        // error message if authentication fails
$a->start();					// starting the authentication process


if($a->getAuth())				// checking for autenticated user 
{
	echo "Hello $a->username welcome to my secret page <BR>";
	echo "Your details on file are: <BR>";
	echo $a->getAuthData('userid');		// retriving other details from the database row
	echo $a->getAuthData('telephone');      // in this example the user id, telephone number
	echo $a->getAuthData('email');		// and email address
};
?>

Auth_HTTP::getAuth()

Auth_HTTP::getAuth() -- check for an authenticated user

Description

Check if the user has been authenticated.

Return value

boolean - If the user has already been authenticated, the function returns TRUE. Otherwise it returns FALSE.

Note

This function can not be called statically.

Auth_HTTP::getStatus()

Auth_HTTP::getStatus() -- returns informations about the current authentication status

Description

This function returns the current status of PEAR::Auth. The return values are constants that are defined by PEAR Auth.

Return value

string - possible values are AUTH_IDLED, AUTH_EXPIRED, AUTH_EXPIRED

Note

This function can not be called statically.

Auth_HTTP::start()

Auth_HTTP::start() -- start authentication

Description

Start the authentication process.

Note

This function can not be called statically.


Auth_PrefManager

Table of Contents
Introduction to Auth_PrefManager --  Auth_PrefManager is a simple class to manage user or application preferences from a DB compatible database.
Tutorial --  A short guide to using Auth_PrefManager
constructor Auth_PrefManager::Auth_PrefManager() -- Constructor
Auth_PrefManager::clearCache() -- Cleans out the cache.
Auth_PrefManager::deleteDefaultPref() -- Deletes a preference for the default user.
Auth_PrefManager::deletePref() -- Deletes a preference for the specified user.
Auth_PrefManager::getDefaultPref() --  Retrieves a default value.
Auth_PrefManager::getPref() --  Get a preference.
Auth_PrefManager::setDefaultPref() -- Set the default value for a preference.
Auth_PrefManager::setPref() -- Set a preference.
Auth_PrefManager::setReturnDefaults() --  Set whether to return default values.
Auth_PrefManager::useCache() -- Sets whether the cache should be used.

Provides a framework for managing preferences in applications.

Introduction to Auth_PrefManager

Introduction to Auth_PrefManager  --  Auth_PrefManager is a simple class to manage user or application preferences from a DB compatible database.

A simple preference manager.

Supported features include:

  • Setting of default values.

  • Serialization of values before saving to the database.

  • Support for any database supported by DB

Tutorial

Tutorial  --  A short guide to using Auth_PrefManager

Setting up the database

The first step is to setup a database to store the values in. For this tutorial it's assumed that you already know the basics of using the PEAR DB class.

To set up the default table layout run the following SQL statement:

Setting and displaying default preferences

Now that we have a PrefManager object, we can make use of it to set some preferences.

For this tutorial we're going to allow users to specify their country, and assume that any user who hasn't set their country is somewhere on Earth.

First we need to set the default value, using setDefaultPref.

Now that the default is set, we can create a (very) basic page, welcoming users with a customised message.

Currently this message will only ever display "Welcome to the people of Earth!", since no users have their country set.

Full sourcecode

constructor Auth_PrefManager::Auth_PrefManager()

constructor Auth_PrefManager::Auth_PrefManager()  -- Constructor

Description

The $properties property should be an associative array, with the structure below. Any options not set will be set to the default.

'table'

The table to retrieve preferences from. [preferences]

'userColumn'

The field to use for matching user IDs. [user_id]

'nameColumn'

The field to use for matching preference names. [pref_name]

'valueColumn'

The field to retrieve preference values from. [pref_value]

'defaultUser'

The user ID to use for retrieving default values. [__default__]

'cacheName'

The key to use for the cache in $_SESSION. [prefsCache]

'useCache'

Should values be cached for later use. [true]

'serialize'

Should values be serialized before saving to the database, and unserialized on retrieval. [false]

Parameter

string $dsn

The DSN of the database connection to make, or a DB object.

array $properties

An array of properties to set.

string $defaultUser

The default user to manage for.

Return value

returns Success or failure.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Users with preferences created using Auth_PrefManager 1.0.4 or earlier shouldn't enable the serialize option, as it may result in data loss.

Auth_PrefManager::clearCache()

Auth_PrefManager::clearCache()  -- Cleans out the cache.

Description

Clears the cache of preferences stored in the current user's session.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::deleteDefaultPref()

Auth_PrefManager::deleteDefaultPref()  -- Deletes a preference for the default user.

Description

Deletes the default value for the preference passed as $pref_id.

Parameter

string $pref_id

The preference to delete.

Return value

returns Success/Failure

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::deletePref()

Auth_PrefManager::deletePref()  -- Deletes a preference for the specified user.

Description

Deletes the preference $pref_id for $user_id if one is set.

Parameter

string $user_id

The userid of the user to delete from.

string $pref_id

The preference to delete.

Return value

returns Success/Failure

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::getDefaultPref()

Auth_PrefManager::getDefaultPref()  --  Retrieves a default value.

Description

Retrieves the default value for $pref_id, even if there is currently a user ID set for the object being used.

Parameter

string $pref_id

The name of the preference to get.

Return value

returns The value if it's found, or NULL if it isn't.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::getPref()

Auth_PrefManager::getPref()  --  Get a preference.

Description

Retrieves the preference specified for a user, or, if returning default values is enabled, the default.

Parameter

string $user_id

The user to get the preference for.

string $pref_id

The preference to get.

boolean $showDefaults

Should default values be searched (overrides the global setting).

Return value

returns The value if it's found, or NULL if it isn't.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::setDefaultPref()

Auth_PrefManager::setDefaultPref()  -- Set the default value for a preference.

Description

Sets the default value for $pref_id, which will be retrieved if a user doesn't have the preference set.

Parameter

string $pref_id

The name of the preference to set.

mixed $value

The value to set it to.

Return value

returns Success or failure.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::setPref()

Auth_PrefManager::setPref()  -- Set a preference.

Description

Sets the value for $pref_id.

Parameter

string $user_id

The user to set for.

string $pref_id

The preference to set.

mixed $value

The value it should be set to.

Return value

returns Success or failure.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Auth_PrefManager::setReturnDefaults()

Auth_PrefManager::setReturnDefaults()  --  Set whether to return default values.

Description

Set whether a default value should be returned by getPref() if no value was set for the specified user.

Parameter

mixed $returnDefaults

Throws

No exceptions thrown.

Note

This function can not be called statically.

getDefaultPref() will always return the default value.

Auth_PrefManager::useCache()

Auth_PrefManager::useCache()  -- Sets whether the cache should be used.

Description

Sets whether the caching system should be used or not.

If the cache is enabled then any values retrieved will be saved in the user's session to reduce load on the database.

Parameter

boolean $use

Should the cache be used.

Throws

No exceptions thrown.

Note

This function can not be called statically.


Auth_RADIUS

Table of Contents
Introduction --  Basic usage of Auth_RADIUS

Client implementation of RADIUS. This package contains wrapper classes for the RADIUS PECL extension. Provides RADIUS Authentication (RFC2865) and RADIUS Accounting (RFC2866).

Introduction

Introduction --  Basic usage of Auth_RADIUS

What is Auth_RADIUS?

Auth_RADIUS is a php wrapper around the php radius extension. If you are unfamiliar with the RADIUS protocol, the Wikipedia article provides an excellent introduction.

Auth_RADIUS is structured around the facilities built into the radius extension. Understanding Auth_RADIUS generally first requires a basic understanding of how the radius extension is designed. Documentation of the radius extension is available through the PHP manual at http://www.php.net/manual/en/ref.radius.php

There are different Classes for the different authentication methods available through RADIUS. If you are using CHAP-MD5 or MS-CHAP authentication, you will also need the Crypt_CHAP package. In addition, if using MS-CHAP authentication, you will need to enable the mhash and mcrypt extension in php.ini, or compile them in statically.

Note that if you have the latest radius extension (version 1.2 or newer), you will not need to enable the mcrypt extension.

How do I use Auth_RADIUS?

Basic usage examples follow, pulled from the package itself.

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
/*
Copyright (c) 2003, Michael Bretterklieber <michael@bretterklieber.com>
All rights reserved.

Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions 
are met:

1. Redistributions of source code must retain the above copyright 
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright 
   notice, this list of conditions and the following disclaimer in the 
   documentation and/or other materials provided with the distribution.
3. The names of the authors may not be used to endorse or promote products 
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This code cannot simply be copied and put under the GNU Public License or 
any other GPL-like (LGPL, GPL2) License.

    $Id: intro.xml,v 1.1 2006/11/21 00:08:03 cellog Exp $
*/

require_once 'Auth/RADIUS.php';
require_once 'Crypt/CHAP.php';

//$type = 'PAP';
//$type = 'CHAP_MD5';
$type = 'MSCHAPv1';
//$type = 'MSCHAPv2';

$username = 'sepp';
$password = 'sepp';

$classname = 'Auth_RADIUS_' . $type;
$rauth = new $classname($username, $password);
$rauth->addServer('localhost', 0, 'testing123');
$rauth->setConfigfile('/etc/radius.conf');
$rauth->username = $username;

switch($type) {
case 'CHAP_MD5':
case 'MSCHAPv1':
    $classname = $type == 'MSCHAPv1' ? 'Crypt_CHAP_MSv1' : 'Crypt_CHAP_MD5';
    $crpt = new $classname;
    $crpt->password = $password;
    $rauth->challenge = $crpt->challenge;
    $rauth->chapid = $crpt->chapid;
    $rauth->response = $crpt->challengeResponse();
    $rauth->flags = 1;
// If you must use deprecated and weak LAN-Manager-Responses use this:
//    $rauth->lmResponse = $crpt->lmChallengeResponse();
//    $rauth->flags = 0;
    break;
  
case 'MSCHAPv2':
    $crpt = new Crypt_CHAP_MSv2;
    $crpt->username = $username;
    $crpt->password = $password;
    $rauth->challenge = $crpt->authChallenge;
    $rauth->peerChallenge = $crpt->peerChallenge;
    $rauth->chapid = $crpt->chapid;
    $rauth->response = $crpt->challengeResponse();
    break;
    
default:
    $rauth->password = $password;
    break;
}

if (!$rauth->start()) {
    printf("Radius start: %s<br>\n", $rauth->getError());
    exit;
}

$result = $rauth->send();
if (PEAR::isError($result)) {
    printf("Radius send failed: %s<br>\n", $result->getMessage());
    exit;
} else if ($result === true) {
    printf("Radius Auth succeeded<br>\n");
} else {
    printf("Radius Auth rejected<br>\n");
}

// get attributes, even if auth failed
if (!$rauth->getAttributes()) {
    printf("Radius getAttributes: %s<br>\n", $rauth->getError());
} else {
    $rauth->dumpAttributes();
}

$rauth->close();


?>

Here is the second example:

<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
/*
Copyright (c) 2003, Michael Bretterklieber <michael@bretterklieber.com>
All rights reserved.

Redistribution and use in source and binary forms, with or without 
modification, are permitted provided that the following conditions 
are met:

1. Redistributions of source code must retain the above copyright 
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright 
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. The names of the authors may not be used to endorse or promote products 
   derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

This code cannot simply be copied and put under the GNU Public License or 
any other GPL-like (LGPL, GPL2) License.

    $Id: intro.xml,v 1.1 2006/11/21 00:08:03 cellog Exp $
*/

require_once 'Auth/RADIUS.php';
require_once 'Crypt/CHAP.php';
$username = 'sepp';

$starttime = time();

$racct = new Auth_RADIUS_Acct_Start;
$racct->addServer('localhost', 0, 'testing123');
$racct->username = $username;
// RADIUS_AUTH_RADIUS => authenticated via Radius
// RADIUS_AUTH_LOCAL => authenicated local
// RADIUS_AUTH_REMOTE => authenticated remote
$racct->authentic = RADIUS_AUTH_LOCAL;
$status = $racct->start();
if(PEAR::isError($status)) {
    printf("Radius start: %s<br>\n", $status->getMessage());
    exit;
}
// you can put any additional attributes here
// $racct->putAttribute(RADIUS_ACCT_INPUT_PACKETS, 45236);
// $racct->putAttribute(RADIUS_ACCT_OUTPUT_PACKETS, 1212);
$result = $racct->send();
if (PEAR::isError($result)) {
    printf("Radius send failed: %s<br>\n", $result->getMessage());
    exit;
} else if ($result === true) {
    printf("Radius Acounting succeeded<br>\n");
} else {
    printf("Radius Acounting rejected<br>\n");
}

$racct->close();

// Wait a bit, that we can put the session-time
sleep(2);

// send an accounting update
$racct = new Auth_RADIUS_Acct_Update;
$racct->addServer('localhost', 0, 'testing123');
$racct->username = $username;
$racct->session_time = time() - $starttime;
$status = $racct->start();
if(PEAR::isError($status)) {
    printf("Radius start: %s<br>\n", $status->getMessage());
    exit;
}
$result = $racct->send();
if (PEAR::isError($result)) {
    printf("Radius send failed: %s<br>\n", $result->getMessage());
    exit;
} else if ($result === true) {
    printf("Radius Acounting succeeded<br>\n");
} else {
    printf("Radius Acounting rejected<br>\n");
}

// Wait a bit, that we can put the session-time
sleep(2);

// send the stop
$racct = new Auth_RADIUS_Acct_Stop;
$racct->addServer('localhost', 0, 'testing123');
$racct->username = $username;
$racct->session_time = time() - $starttime;
$status = $racct->start();
if(PEAR::isError($status)) {
    printf("Radius start: %s<br>\n", $status->getMessage());
    exit;
}
// you can put any additional attributes here
// $racct->putAttribute(RADIUS_ACCT_TERMINATE_CAUSE, RADIUS_TERM_SESSION_TIMEOUT);
$result = $racct->send();
if (PEAR::isError($result)) {
    printf("Radius send failed: %s<br>\n", $result->getMessage());
    exit;
} else if ($result === true) {
    printf("Radius Acounting succeeded<br>\n");
} else {
    printf("Radius Acounting rejected<br>\n");
}

$racct->close();

?>


LiveUser

Table of Contents
Introduction --  About LiveUser
Setting it up --  Making the package and examples work

Introduction

Introduction  --  About LiveUser

About LiveUser

LiveUser is an advanced authentication and permission framework that comes with a large array of out of the box features which can be used optionally. The base class is called LiveUser and is often referred to as the "client" and is what will be commonly be used to authenticate a specific user and then optionally make permission checks on this user.

LiveUser provides the following key features: The LiveUser class takes care of the login process and can be configured to use a certain permission container and one or more different auth containers. That means, you can have your users' data scattered amongst many data containers and have the LiveUser class try each defined container until the user is found. For example, you can have all website users who can apply for a new account online on the webserver's local database. Also, you want to enable all your company's employees to login to the site without the need to create new accounts for all of them. To achieve that, a second container can be defined to be used by the LiveUser class.

You can also define a permission container of your choice that will manage the rights for each user. Depending on the container, you can implement any kind of permission schemes for your application while having one consistent API.

Using different permission and auth containers, it's easily possible to integrate newly written applications with older ones that have their own ways of storing permissions and user data. Just make a new container type and you're ready to go!

Currently available are containers using: PEAR::DB, PEAR::MDB, PEAR::MDB2, ext/PDO, PEAR::XML_Tree, Session and PEAR::Auth.

There is also an external wiki dedicated to LiveUser:

At this point LiveUser is still in beta stage. Even so LiveUser is already being used on a wide range of production websites. A non exhaustive list can be found here.

The current roadmap for LiveUser can be viewed here.

A detailed introduction to the core concepts of LiveUser can be found in the following phpmag article.

This article was published in april 2004 and is therefore not entirely uptodate. However the core principles remain unchanged and most of the recent changes resolve around making the API more consistent and flexible. As a result the API examples are mostly out of date. The article also fails to mention the fact that the permission containers are now separated in a logic and a storage layer. This was done to remove logic duplication as well as to allow the implementation of a stackable storage approach, where users could configure LiveUser to first call a cache storage layer, which in turn would fetch the necessary data on demand from the actual storage layer.

A more recent article providing a step by step guide to LiveUser and the different permission containers can be found here.

Before you can use LiveUser you will need to setup the necessary data structures for the chosen container. Through the use of the configuration options it is possible to customize alot of the aspects of the storage layer. Most notably it is possible to alias field and table names. This should make it possible to integrate any legacy data into LiveUser. Depending on the container chosen you may have to use the database schema installer. The installer requires the MDB2_Schema and MDB2 packages and is able to handle most configuration options properly to be able to install the database schema directly into your database. You can find the install class in "[PEAR]/data/misc/schema/install.php". There is some sample code which is partially commented out at the top. Basically it's a two step process for both the auth and perm: (1) generate the schema xml file, (2) install the schema.

During the installation process the installer will create backup files of the installed schema. These files will enable the installer to attempt to alter the database if run again with a different configuration. However if these files exist the installer will always attempt to alter instead of creating the tables from scratch as long as you are using the sam DSN. If for some reason you need to create the tables from scratch again then please delete the backup files with the matching DSN. You can find the installer inside the data directory of your pear install directory. Its called install.php and at the top of the file you will find a number of sample API calls which are commented out.

An ER diagram of the database structure can be found here.

The diagram details what tables are needed for what permission complexity level. If you want to prevent the installer from installing tables you don't need you can modify the "tables" property of the instance of the permission container you pass to the generateSchema() method in the installer.

In order to get started with LiveUser the following two articles should help in getting off the ground.

The observer support in LiveUser allows users to automatically have LiveUser call certain callbacks on a number of internal events. It is documented here.

LiveUser also ship with a wide range of examples. These will be installed into the "docs" directory in your PEAR install directory. They try to illustrate various usage scenarios. The database examples come with a schema file please see the demodata.php in the examples root folder of the LiveUser package for details on how to install these schema files from the command line or from a browser. You will once again need MDB2_Schema to be able to install the schema files.

LiveUser package:

  • example1 illustrates using only a single authentication source (in this case XML) with several aliased fields and a custom field.

  • example2 illustrates using a single authentication with permissions (in this case XML) with the optional remember me feature and several aliased fields

  • example4 illustrates using multiple authentication sources (XML and database) with permissions (database) in a more real world news administration scenario

  • example5 illustrates using single authentication sources (database) with permissions (database) in a more real world news administration scenario

Setting it up

Setting it up --  Making the package and examples work

Example Steps for Getting the Examples Going

Getting the LiveUser examples working can be somewhat difficult for developers who are new to PHP and PEAR. Here is a list of steps necessary to get the example4 and GVN examples working with a MySQL database in LiveUser 0.16.12.

  1. Install PHP and MySQL OR Sign up with a web host that provides PHP and MySQL.

  2. Install PEAR. This is done either with the command line installer, or by uploading go-pear.php to your web host through FTP.

  3. Now install the PEAR packages LiveUser, MDB2, MDB2_Driver_mysql, HTML_Template_IT, HTML_QuickForm, and Var_Dump. Command line will be something like pear install --alldeps LiveUser-beta (repeat for each package). If you used the go-pear.php, there's some web-based way to install packages through that, but I haven't used it.

  4. Now create your empty database in MySQL.

  5. Now copy the files of example4 to your web root. On my Linux system the examples ended up in /usr/share/pear/docs/LiveUser/docs/examples and my Apache web root is at /var/www. You can find out where the examples are by executing pear list-files LiveUser.

  6. Create the database by viewing the demodata.php through your web browser with a URL like http://www.example.com/LU/demodata.php?dsn=mysql://dbuser:pwd@localhost/databasename&file=/var/www/LU/demodata.xml&create=1. You must replace the file path values and the database user, password, host, and database name with values appropriate for your own system. If this gives you a "success" message and you have phpMyAdmin or something, you should be able to look at the database now and see tables with data in them.

    Warning

    It is reported that on some systems, you must make alterations to the demodata.xml file before this will run properly. Within all <is_active>..</is_active> tags replace the value "Y" with "1" and "N" with "0".

  7. Edit the conf.php file and enter your database information.

  8. At this point you should be able to view the index.html page through a web browser and log in and use example4.

  9. To get the GVN samples going, first create a "GVN" folder under your web root.

  10. Go through the GVN tutorials, starting from the beginning because there are dependencies, and save all of the sample files.

  11. In most of the files I found that the include to LiveUser/LiveUser.php had to be corrected to just be LiveUser.php.

  12. Copy the file Auth_XML.xml from example4 into the GVN folder.

  13. Copy your database information and the LiveUser configuration array from example4/conf.php into GVN's conf.php and conf_admin.php files.

  14. In example4, the users that are in the database are deactivated for some reason... in the peoples table change the values in the isactive column to 1.

The above steps got me to the point where I have the working sample app and pages that demonstrate adding users, etc.


LiveUser_Admin

LiveUser_Admin class which provides various ways to manage all relevant data used in LiveUser, like users, groups/roles, rights and their relations.

LiveUser_Admin provides the following key features: It can associate data from multiple authentication containers with a single permission container. Using different permission and auth containers, it's easily possible to integrate newly written applications with older ones that have their own ways of storing permissions and user data. Just make a new container type and you're ready to go! Currently available are containers using: PEAR::DB, PEAR::MDB, PEAR::MDB2, ext/PDO. LiveUser_Admin provides the following key features You'll be able to add/edit/delete/get things like:

There is also an external wiki dedicated to LiveUser.

At this point LiveUser_Admin is still in beta stage. Even so LiveUser_Admin is already being used on a wide range of production websites. A non exhaustive list can be found here.

The current roadmap for LiveUser_Admin can be viewed here.

A detailed introduction to the core concepts of LiveUser can be found in the following phpmag article: http://www.php-mag.net/magphpde/magphpde_article/psecom,id,595,nodeid,21.html

This article was published in april 2004 and is therefore not entirely uptodate. The article also does not mention the SQL generator used in the LiveUser_Admin package. This feature has made the API much more flexible since now the entire storage schema is configurable and extensible. It also means that more or less any sort of filtering can be applied with on demand joining. On overview of this API can be found here: http://wiki.pooteeweet.org/LiveUser/AdminFilters

A more recent article providing a step by step guide to LiveUser and the different permission containers can be found here.

An ER diagram of the database structure can be found here.

The diagram details what tables are needed for what permission complexity level. If you want to prevent the installer from installing tables you don't need you can modify the "tables" property of the instance of the permission container you pass to the generateSchema() method in the installer.

In order to get started with LiveUser the following two articles should help in getting off the ground.

LiveUser_Admin also ship with a wide range of examples. These will be installed into the "docs" directory in your PEAR install directory. They try to illustrate various usage scenarios. The database examples come with a schema file please see the demodata.php in the examples root folder of the LiveUser package for details on how to install these schema files from the command line or from a browser. You will once again need MDB2_Schema to be able to install the schema files.

LiveUser_Admin package:

  • example 1 illustrates various API calls to most methods in the admin API and custom fields

  • example3 illustrates using single authentication sources (database) with permissions (database) and the optional remember me feature in a more real world restricted page access scenario


Chapter 33. Benchmarking

Provides Packages for Benchmarking and Profiling



Benchmarking_Benchmark

Table of Contents
Introduction -- About Benchmarking_Benchmark
Benchmark_Timer -- About Benchmark_Timer
Benchmark_Profiler -- About Benchmark_Profiler
Benchmark_Iterate -- About Benchmark_Iterate

Provides a simple framework for profiling and benchmarking your PHP applications.

Introduction

Introduction -- About Benchmarking_Benchmark

About Benchmarking_Benchmark

Benchmark is a simple framework that allows you time, profile and benchmark your PHP scripts and applications. Benchmark provides you with three classes to enable you to profile: Benchmark_Timer, Benchmark_Profiler and Benchmark_Iterate.

The package is very easy to use. We'll discuss each of the three classes in detail, but some concepts are common. You basically instantiate one of the classes, begin your script (or portion of code that you want to profile) and analyze the results afterward.

All the three classes have two modes of operation: automatic and manual. In the automatic mode of operation, the profiling is automatically started and stopped, and results displayed. In the manual mode, you are responsible for starting, stopping and displaying the results.

The automatic mode makes sense in cases where you want to quickly test a fixed portion of code like a script or a single function. The manual mode offers you more control, which means arbitrary portions of code can be profiled, and the results can be carefully analyzed before being displayed. In the automatic mode of operation, the results are always displayed; while in the manual mode you have the option of logging them or storing them in a database.

If you wish to operate a class in automatic mode, simply pass the TRUE parameter to its constructor. Instantiating a class without a parameter or with the FALSE parameter sets the mode of operation to manual for that class.

Which class to choose?

Benchmark_Timer is the most fundamental class in the package. It performs the simple function of recording the amount of time it takes for a fixed amount of code to execute.

Benchmark_Profiler behaves just like Benchmark_Timer with the exception that you are allowed to specify sections between the start and stop times, at which point the timing details are recorded. This provides the ability to nest timers and profile functions which are called multiple times.

Benchmark_Iterate is a class that runs a particular function several times over and records the amount of time it took for each iteration to execute.

Benchmark_Timer

Benchmark_Timer -- About Benchmark_Timer

About Benchmark_Timer

As mentioned before, this class simply records the time taken for a particular snippet of code to execute. In the automatic mode, this means the code remaining after the class's instantiation. In manual mode, the snippet of code to be timed is specified between calls to the start() and stop() methods of the class.

Additionally, you may specify markers between the snippet of code to be timed. The timing information is recorded wherever markers are defined.

An example will make this clear.

The example above will generate an output as shown below when run with the PHP CLI SAPI. Running it with the Apache SAPI will produce the same results, but formatted as HTML.

In most cases however, you would like to do something with that information. When you run the timer in manual mode, you can obtain the results as an associative array using the getProfiling() method. To display the information (as shown above) use the display() method. More information on the methods that Benchmark_Timer implements is available in the API Documentation.

Benchmark_Profiler

Benchmark_Profiler -- About Benchmark_Profiler

About Benchmark_Profiler

This class behaves mostly like Benchmark_Timer with the exception that you are allowed to specify the beginning and end of sections within the code to be profiled. sections are different from markers (markers) don't have ends in the sense that they are stateful and remember how many times they have been entered.

Timing information is recorded at the beginning and end of the code to be profiled and at the beginning and end of every section everytime it is encountered. An example follows.

The example above will generate an output as shown below when run with the PHP CLI SAPI. Running it with the Apache SAPI will produce the same results, but formatted as HTML.

As you can see, the default output may not be too helpful. You can obtain detailed section by section profiling information in manual mode through methods like getSectionInformations() and getAllSectionsInformations(). Refer to the API documentation for more information.

Benchmark_Iterate

Benchmark_Iterate -- About Benchmark_Iterate

About Benchmark_Iterate

This class is useful when you want to iterate over a single piece of code (a function) several times over. Timing information is recorded for every iteration. An example follows.

The example above will generate an output as shown below when run with the PHP CLI SAPI.

You can display formatted results either by running the script in automatic mode or by using the display() method. For more information of the methods this class implements, refer to the API documentation.


Chapter 34. Caching

Provides Packages for creating caches



Cache_Lite

Table of Contents
Introduction -- Introduction to Cache_Lite
constructor Cache_Lite::Cache_Lite() -- Constructor
Cache_Lite::get() -- Test if a cache is available and (if yes) return it
Cache_Lite::save() -- Save some data in a cache file
Cache_Lite::remove() -- Remove a cache file
Cache_Lite::clean() -- Clean the cache
Cache_Lite::setToDebug() -- Set to debug mode
Cache_Lite::setLifeTime() -- Set a new life time
Cache_Lite::saveMemoryCachingState() -- 
Cache_Lite::getMemoryCachingState() -- 
Cache_Lite::lastModified() -- Return the cache last modification time
Cache_Lite::raiseError() -- Trigger a PEAR error
Cache_Lite::extendLife() -- Extend the life of a valid cache file
constructor Cache_Lite_Output::Cache_Lite_Output() -- Constructor
Cache_Lite_Output::start() -- Test if a cache is available and (if yes) return it to the browser. Else, the output buffering is activated.
Cache_Lite_Output::end() -- Stop the output buffering started by the start() method and store the output to a cache file
constructor Cache_Lite_Function::Cache_Lite_Function() -- Constructor
Cache_Lite_Function::call() -- Calls a cacheable function or method (or not if there is already a cache for it)
Cache_Lite_Function::drop() -- Drop a cache file
constructor Cache_Lite_File::Cache_Lite_File() -- Constructor
Cache_Lite_File::get() -- Test if a cache is available and (if yes) return it

Cache_Lite provides a fast, light and safe cache system. It's optimized for file containers and protected against cache corruptions (because it uses file locking and/or hash tests).

Introduction

Introduction -- Introduction to Cache_Lite

Description

PEAR::Cache_Lite is a little cache system. It's optimized for high traffic websites so it is really fast and safe (because it uses file locking and/or anti-corruption tests).

Note : An independent documentation of Cache_Lite is available in chinese on this page.

Goals and technical details

speed

Before all, PEAR::Cache_Lite has to be extremely fast. That returns the use of PEAR possible on sites with high traffic without falling in hi-level hardware solutions.

You can find more details about cache_lite technical choices on this document, but the main idea is to include PEAR.php file ONLY when an error occurs (very rare).

simplicity

Because the cache system is often embedded in the application layer, PEAR::Cache_Lite kernel has to be small and flexible with an adapted licence (LGPL). Advanced functionality can be found in files that extend the core.

security

On high traffic websites, the cache system has to be really protected against cache files corruptions (because of concurrent accesses in read/write mode). Very few cache systems offer a protection against this problem.

File locking is not a perfect solution because it is useless with NFS or multithreaded servers. So in addition to it, PEAR::Cache_Lite offers two fully transparent mechanisms (based on hash keys) to guarantee the security of the data in all circumstances. Just have a look at the link given in the previous paragraph for more details.

Usage

general usage

Every module of Cache_Lite follows the same philosophy.

Parameters (others than default ones) are passed to the constructor by using an associative array.

A cache file is identified by a cache ID (and eventually a group). For obvious flexibility reasons, the logic of IDs choice is left to the developer.

In the following, we will use the term "group" as a pool of cache files and the term "block" as a piece of an HTML page.

core

Let's start with a simple example : the page is built, then recovered with a unique variable (string):
<?php

// Include the package
require_once('Cache/Lite.php');

// Set a id for this cache
$id = '123';

// Set a few options
$options = array(
    'cacheDir' => '/tmp/',
    'lifeTime' => 3600
);

// Create a Cache_Lite object
$Cache_Lite = new Cache_Lite($options);

// Test if thereis a valide cache for this id
if ($data = $Cache_Lite->get($id)) {

    // Cache hit !
    // Content is in $data
    // (...)

} else { // No valid cache found (you have to make the page)

    // Cache miss !
    // Put in $data datas to put in cache
    // (...)
    $Cache_Lite->save($data);

}

?>

If you wish use a cache per block and not a global cache, take as example the following script:
<?php
require_once('Cache/Lite.php');

$options = array(
    'cacheDir' => '/tmp/',
    'lifeTime' => 3600
);

// Create a Cache_Lite object
$Cache_Lite = new Cache_Lite($options);

if ($data = $Cache_Lite->get('block1')) {
    echo($data);
} else {
    $data = 'Data of the block 1';
    $Cache_Lite->save($data);
}

echo('<br><br>Non cached line !<br><br>');

if ($data = $Cache_Lite->get('block2')) {
    echo($data);
} else {
    $data = 'Data of the block 2';
    $Cache_Lite->save($data);
}

?>

core

However, it is not always possible to recover all the contents of a page in a single string variable. Thus Cache_Lite_Output comes to our aid :
<?php

require_once('Cache/Lite/Output.php');

$options = array(
    'cacheDir' => '/tmp/',
    'lifeTime' => 10
);

$cache = new Cache_Lite_Output($options);

if (!($cache->start('123'))) {
    // Cache missed...
    for($i=0;$i<1000;$i++) { // Making of the page...
        echo('0123456789');
    }
    $cache->end();
}

?>

The idea is the same for a per block usage :
<?php

require_once('Cache/Lite/Output.php');

$options = array(
    'cacheDir' => '/tmp/',
    'lifeTime' => 10
);

$cache = new Cache_Lite_Output($options);

if (!($cache->start('block1'))) {
    // Cache missed...
    echo('Data of the block 1 !');
    $cache->end();
}

echo('Non cached line !');

if (!($cache->start('block2'))) {
    // Cache missed...
    echo('Data of the block 2 !');
    $cache->end();
}

?>

IMPORTANT NOTE

For a maximum efficiency with Cache_Lite, do not systematically include every package the page needs. ONLY load the modules you need when the page is not in the cache (and has to be recomputed) by using a conditional inclusion.

The BAD way :
<?php
   require_once("Cache/Lite.php");
   require_once("...")
   require_once("...")
   // (...)
   $cache = new Cache_Lite();
   if ($data = $Cache_Lite->get($id)) { // cache hit !
       echo($data);
   } else { // page has to be (re)constructed in $data
       // (...)
       $Cache_Lite->save($data);
   }
?>

Here is the good way (often more than twice faster) :
<?php
   require_once("Cache/Lite.php");
   // (...)
   $cache = new Cache_Lite();
   if ($data = $Cache_Lite->get($id)) { // cache hit !
       echo($data);
   } else { // page has to be (re)constructed in $data
       require_once("...")
       require_once("...")
       // (...)
       $Cache_Lite->save($data);
   }
?>

Conclusion

To go further with Cache_Lite, have a look at examples and technical details bundled with the package.

constructor Cache_Lite::Cache_Lite()

constructor Cache_Lite::Cache_Lite() -- Constructor

Description

The constructor of the Cache_Lite core class. You can give an associative array as an argument to set a lot of options.

Parameter

array $options

associative array to set a lot of options

Table 34-1.

OptionData TypeDefault ValueDescription
cacheDir string /tmp/ directory where to put the cache file (with a trailing slash at the end)
caching boolean TRUE enable / disable caching
lifeTime integer 3600 cache lifetime in seconds (since 1.6.0beta 1, you can use a null value for an eternal cache lifetime)
fileLocking boolean TRUE enable / disable fileLocking. Can avoid cache corruption under bad circumstances.
writeControl boolean TRUE enable / disable write control. Enable write control will lightly slow the cache writing but not the cache reading. Write control can detect some corrupt cache files but maybe it's not a perfect control.
readControl boolean TRUE enable / disable read control. If enabled, a control key is embeded in cache file and this key is compared with the one calculated after the reading
readControlType string crc32 Type of read control (only if read control is enabled). Must be 'md5' (for a md5 hash control (best but slowest)), 'crc32' (for a crc32 hash control (lightly less safe but faster)) or 'strlen' (for a length only test (fastest))
pearErrorMode integer CACHE_LITE_ERROR_RETURN pear error mode (when raiseError is called) (CACHE_LITE_ERROR_RETURN for just returning a PEAR_Error object or CACHE_LITE_ERROR_DIE for immediate stop of the script (good for debug) )
fileNameProtection boolean TRUE file Name protection (if set to true, you can use any cache id or group name, if set to false, it can be faster but cache ids and group names will be used directly in cache file names so be careful with special characters...)
automaticSerialization boolean FALSE enable / disable automatic serialization (allows non-string data to be saved, with a small performance decrease)
memoryCaching boolean FALSE enable / disable "Memory Caching" (NB : there is no lifetime for memory caching, only the end of the script)
onlyMemoryCaching boolean FALSE enable / disable "Only Memory Caching" (if enabled, files are not used anymore)
memoryCachingLimit integer 1000 max number of records to store into memory caching
automaticCleaningFactor integer 0 Disable / Tune the automatic cleaning process. The automatic cleaning process destroy too old (for the given life time) cache files when a new cache file is written. 0 means "no automatic cache cleaning", 1 means "systematic cache cleaning" (slow), x>1 means "automatic cleaning randomly 1 times on x cache writes". A value between 20 and 200 is maybe a good start.
hashedDirectoryLevel integer 0 Set the hashed directory structure level. 0 means "no hashed directory structure", 1 means "one level of directory", 2 means "two levels"... This option can speed up Cache_Lite only when you have many thousands of cache file. Only specific benchs can help you to choose the perfect value for you. Maybe, 1 or 2 is a good start.
errorHandlingAPIBreak boolean FALSE If set to true, it introduces a little API break but the error handling is better in CACHE_LITE_ERROR_RETURN mode (especially with the save() method which can return a PEAR_Error object).

Throws

No exceptions thrown.

Note

This function can not be called statically.

Cache_Lite::get()

Cache_Lite::get() -- Test if a cache is available and (if yes) return it

Description

One of the main method of Cache_Lite : test the validity of a cache file and return it if it's available (FALSE else)

Parameter

string $id

cache id

string $group

name of the cache group

boolean $doNotTestCacheValidity

if set to TRUE, the cache validity won't be tested

Return value

returns data of the cache (or false if no cache available)

Note

This function can not be called statically.

Cache_Lite::save()

Cache_Lite::save() -- Save some data in a cache file

Description

save the given data (which has to be a string if automaticSerialization is set to FALSE (default)).

Parameter

string $data

data to put in a cache file (can be another type than strings if automaticSerialization is TRUE).

string $id

cache id

string $group

name of the cache group

Return value

returns true if no problem

Note

This function can not be called statically.

Cache_Lite::remove()

Cache_Lite::remove() -- Remove a cache file

Description

remove the given cache file (specified with its id and group)

Parameter

string $id

cache id

string $group

name of the cache group

Return value

returns true if no problem

Note

This function can not be called statically.

Cache_Lite::clean()

Cache_Lite::clean() -- Clean the cache

Description

if no group is specified all cache files will be destroyed ; else only cache files of the specified group will be destroyed

Parameter

string $group

name of the cache group

string $mode

flush cache mode : 'old' (clean too old cache files for the current lifetime), 'ingroup' (clean all cache files for the given group), 'notingroup' (clean all the cache files except for the given group), [since 1.5.0 beta] 'callback_myFunc' (call the function 'myFunc' with the complete path file and the group in parameters, if the callback return 'true', the cache file is deleted).

Return value

returns true if no problem

Note

This function can not be called statically.

Cache_Lite::setToDebug()

Cache_Lite::setToDebug() -- Set to debug mode

Description

when an error is found, the script will stop and the message will be displayed (in debug mode only) ; same effect than pearErrorMode option in the constructor

Note

This function can not be called statically.

Cache_Lite::setLifeTime()

Cache_Lite::setLifeTime() -- Set a new life time

Description

change the cache life time

Parameter

integer $newLifeTime

new life time (in seconds)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Cache_Lite::saveMemoryCachingState()

Cache_Lite::saveMemoryCachingState() -- 

Description

save the current state of the memory caching array into a classical cache file

Parameter

string $id

cache id

string $group

name of the cache group

Note

This function can not be called statically.

Cache_Lite::getMemoryCachingState()

Cache_Lite::getMemoryCachingState() -- 

Description

load a previously saved state of a memory caching array from a classical cache file

Parameter

string $id

cache id

string $group

name of the cache group

boolean $doNotTestCacheValidity

if set to TRUE, the cache validity won't be tested

Note

This function can not be called statically.

Cache_Lite::lastModified()

Cache_Lite::lastModified() -- Return the cache last modification time

Description

[ONLY FOR CACHE_LITE HACKERS] return the cache last modification time

Return value

returns last modification time

Note

This function can not be called statically.

Cache_Lite::raiseError()

Cache_Lite::raiseError() -- Trigger a PEAR error

Description

include dynamically the PEAR.php file and trigger a PEAR error

To improve performances, the PEAR.php file is included dynamically. The file is so included only when an error is triggered. So, in most cases, the file isn't included and perfs are much better.

Parameter

string $msg

error message

integer $code

error code

Note

This function can not be called statically.

Cache_Lite::extendLife()

Cache_Lite::extendLife() -- Extend the life of a valid cache file

Description

[since Cache_Lite-1.7.0beta2] Extend the life of an existent cache file. The cache file is "touched", so it starts a new lifetime period. See this feature request for more details.

Throws

No exceptions thrown.

Note

This function can not be called statically.

constructor Cache_Lite_Output::Cache_Lite_Output()

constructor Cache_Lite_Output::Cache_Lite_Output() -- Constructor

Description

The constructor of the Cache_Lite_Output class. You can give an associative array as an argument to set a lot of options.

Parameter

array $options

associative array to set a lot of options (see Cache_Lite constructor for details)

Note

This function can not be called statically.

Cache_Lite_Output::start()

Cache_Lite_Output::start() -- Test if a cache is available and (if yes) return it to the browser. Else, the output buffering is activated.

Description

Test if a cache is available and (if yes) return it to the browser. Else, the output buffering is activated.

Parameter

string $id

cache id

string $group

name of the cache group

boolean $doNotTestCacheValidity

if set to TRUE, the cache validity won't be tested

Return value

returns true if the cache is hit (false else)

Note

This function can not be called statically.

Cache_Lite_Output::end()

Cache_Lite_Output::end() -- Stop the output buffering started by the start() method and store the output to a cache file

Description

Stop the output buffering started by the start() method and store the output to a cache file

Note

This function can not be called statically.

constructor Cache_Lite_Function::Cache_Lite_Function()

constructor Cache_Lite_Function::Cache_Lite_Function() -- Constructor

Description

The constructor of the Cache_Lite_Output class. You can give an associative array as an argument to set a lot of options.

Note

This function can not be called statically.

Cache_Lite_Function::call()

Cache_Lite_Function::call() -- Calls a cacheable function or method (or not if there is already a cache for it)

Description

call the given function with given arguments only if there is no cache about it ; else, the output of the function is read from the cache then send to the browser and the return value if read also from the cache and returned.

Return value

returns result of the function/method

Note

This function can not be called statically.

Cache_Lite_Function::drop()

Cache_Lite_Function::drop() -- Drop a cache file

Description

[since Cache_Lite 1.6.0beta1] Drop the cache file of the corresponding function call with given arguments.

Return value

returns true if ok

Note

This function can not be called statically.

constructor Cache_Lite_File::Cache_Lite_File()

constructor Cache_Lite_File::Cache_Lite_File() -- Constructor

Description

The constructor of the Cache_Lite_File class. You can give an associative array as an argument to set a lot of options.

Parameter

array $options

associative array to set a lot of options (see Cache_Lite constructor for details). Be careful, with Cache_Lite_File, there is an additional "mandatory option" described on the following table.

Note

This function can not be called statically.

Cache_Lite_File::get()

Cache_Lite_File::get() -- Test if a cache is available and (if yes) return it

Description

test the validity of a cache file and return it if it's available (FALSE else)

Parameter

string $id

cache id

string $group

name of the cache group

Return value

returns data of the cache (or false if no cache available)

Note

This function can not be called statically.


Chapter 35. Configuration

Provides Packages for managing configurations



Config

Table of Contents
Introduction --  What Config can do
Editing a configuration --  How to manipulate your configuration content
Available Containers --  Supported formats
Config::Config() -- constructor
Config::getRoot() -- Return root container for config object
Config::isConfigTypeRegistered() -- Returns TRUE if container is registered
Config::parseConfig() -- Parse datasource contents
Config::registerConfigType() -- Registers a custom Config container
Config::setRoot() -- Set content of root Config_container object
Config::writeConfig() -- Write container content to datasource
Config_Container::Config_Container() -- Constructor
Config_Container::addItem() -- Add item to this item.
Config_Container::countChildren() -- Count children of container
Config_Container::createBlank() -- Add blank line to item
Config_Container::createComment() -- Add comment to item
Config_Container::createDirective() -- Add directive to item
Config_Container::createItem() -- Create new child for section item
Config_Container::createSection() -- Add section to item
Config_Container::getAttribute() -- Get attribute value of item
Config_Container::getAttributes() -- Get item attributes
Config_Container::getChild() -- Return child object at specified index.
Config_Container::getContent() -- Get item content
Config_Container::getItem() -- Tries to find specific items
Config_Container::getItemIndex() -- Return item index in its parent children array
Config_Container::getItemPosition() -- Return item rank in its parent children array
Config_Container::getName() -- Get item name
Config_Container::getParent() -- Return item parent object
Config_Container::getType() -- Get item type
Config_Container::isRoot() -- Check for root item
Config_Container::removeItem() -- Deletes an item from the object
Config_Container::searchPath() -- Finds a node using XPATH like format
Config_Container::setAttributes() -- Set item attributes
Config_Container::setContent() -- Set item content
Config_Container::setDirective() -- Set child directive content or create new directive
Config_Container::setName() -- Set item name
Config_Container::setType() -- Set item type
Config_Container::toArray() -- Return key/value pair array of container and its children
Config_Container::toString() -- Return string representation
Config_Container::updateAttributes() -- Update item attributes
Config_Container::writeDatasrc() -- Write item to file

The Config package provides methods for configuration manipulation.

Introduction

Introduction --  What Config can do

Introduction

Config helps you manipulate your configuration whether they are stored in XML files, PHP arrays or other kind of datasources. It supports these features:

  • Parse different configuration formats.

  • Manipulate sections, directives, comments, blanks the way you want.

  • Write them back to a datasource in your preferred format.

The Config object acts as a container for other Config_Container objects. It doesn't do much but makes handling IO operations easier. It contains the root Config_Container object which in turn contains a child Config_Container object. Config_Container objects store references to their parent and have an array of children. This structure makes it easy to access the different containers and their contents.

A Config_Container object can be of different type:

  • Section: a section contains other Config_Container objects.

  • Directive: a directive does not contain any other object but has content and a name. See them as key-value pairs.

  • Comment: just like directives, comments have content but they don't have a name. They are rendered in a special way according to the configuration type you choosed.

  • Blank: they don't have neither content or name but are used to indicate blank lines if your renderer uses them.

When using the Config package, most of the work is done with Config_Container objects.

The above example illustrates how Config and Config_Container can interact. There are other ways. You could have for example first created the Config object and then used $config->getRoot() to add sections and directives to the returned object reference.

For more information, You can read API doc, sample of package, tests of package, and a great tutorial of DevShed about the Config package.

Editing a configuration

Editing a configuration --  How to manipulate your configuration content

Create configuration content

There are many ways to create content in your Config object. You can simply pass it an array like it is shown in the example below:

You can also ask Config to look for a file on your filesystem and try to parse it. You would then do it like this. This example assumes you have a valid XML file:
At the moment, Config can parse XML, PHP arrays, ini files, Apache conf and other generic type of configurations with comments and key-value pairs.

Of course, it is also possible to create the configuration from scratch as shown in the previous section example.

Available Containers

Available Containers --  Supported formats

Available Containers

Apache

Parses and saves Apache configuration files. No options are provided by this container.

GenericConf

Generic configuration files. The equals, comment start and new line characters in the parser can be customised to match your preferred configuration format.

IniCommented

Parses standard INI files, maintaining comments within the file. No options are available for this container.

IniFile

Parse standard INI files using PHP's in built parse_ini_file(). Does not read in comments. No options are available for this container.

PHPArray

Parses PHP Array structures. Can read from a PHP Source file or from an in memory array. Due to technical limitations, this container does not parse blank lines or comments when reading from a configuration file, therefore any information contained within PHP comments will be lost.

Warning

Since config files containing php arrays are just included using the standard php methods, code comments and structure will be lost when saving.

PHPConstants

Parses a set of PHP define() from a PHP source file. Comments are maintained by this container, although blank lines will be lost. There are no options for this container.

XML

Parses a XML file using XML_Parser.

Config::Config()

Config::Config() -- constructor

Description

The Config constructor, it creates a config object.

The next thing you should do is getting the root Config_Container object with getRoot() .

Config::getRoot()

Config::getRoot() -- Return root container for config object

Description

This method returns a reference to the root Config_Container object in the Config object. Use the returned Config_Container object reference to manipulate your configuration data.

Return value

object - a reference to config's root container object

Note

This function can not be called statically.

Config::isConfigTypeRegistered()

Config::isConfigTypeRegistered() -- Returns TRUE if container is registered

Description

This method checks if the required container type exists in $GLOBALS['CONFIG_TYPES'].

Parameter

string $configType

Type of config (php array, xml, inifile...)

Return value

bool - TRUE if registered, FALSE otherwise.

Note

This function can not be called statically.

Config::parseConfig()

Config::parseConfig() -- Parse datasource contents

Description

This method will parse the datasource given and fill the root Config_Container object with other Config_Container objects. It will return a reference to the root Config_Container object or a PEAR_Error if something went wrong.

Parameter

mixed $datasrc

Datasource to parse. For most containers, it is a file path. For the PHP array parser, it can be an array too.

string $configType

Type of configuration to parse

array $options

Options for the parser

Return value

object - a reference to Config_Container object

Note

This function can not be called statically.

Config::registerConfigType()

Config::registerConfigType() -- Registers a custom Config container

Description

This method registers a new container type with the Config class.

Parameter

string $configType

The name of the configuration type.

array $configInfo

An array defining the file containing the container's class definition and the class name. The format for this array is as follows:
$configInfo = array('path/to/Name.php',             // The path to the source file for the class.
                    'Config_Container_Class_Name'   // The name of the container class.
                   );

If omitted, the default values are:
$configInfo = array("Config/Container/$configType.php",
                    "Config_Container_$configType"
                   );

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Config::setRoot()

Config::setRoot() -- Set content of root Config_container object

Description

This method will replace the current child of the root Config_Container object by the given object.

Parameter

object $rootContainer

Container to be used as the first child of root

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Config::writeConfig()

Config::writeConfig() -- Write container content to datasource

Description

This method will call the root Config_Container::writeDatasrc() method which in turn will try to write the Config contents to the datasource.

Parameter

mixed $datasrc

Datasource to write to

string $configType

Type of configuration for writer

array $options

Options for writer

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Config_Container::Config_Container()

Config_Container::Config_Container() -- Constructor

Description

Creates a new Config_Container and returns it by reference.

Parameter

string $type

Type of container object, should be something among 'section', 'comment', 'directive', 'blank'.

string $name

Name of container object. The name is required for sections and directives, not for blanks or comments.

string $content

Content of container object. The content is used in directives and comments.

array $attributes

Array of attributes for container object. Optionally, you can add attributes to your container. These can be used by the chosen parser.

Return value

object - A reference to the created object.

Note

This function can not be called statically.

Config_Container::addItem()

Config_Container::addItem() -- Add item to this item.

Description

This method will add a Config_Container child to the current container children. Thus, addItem() can only be called one a section type container. If a position is specified, the object will be added at this position. If 'before' or 'after' are specified as position, a target object is required. The object will then be added before or after the target object position in the current container.

Parameter

object &$item

a container object

string $where

choose a position 'bottom', 'top', 'after', 'before'

object $target

needed if you choose 'before' or 'after' in $where. $target must be one of this container's children. ZendEngine2 will accept references with default. It will then be possible to have &$target instead.

Return value

object - A reference to the added object

Note

This function can not be called statically.

Config_Container::countChildren()

Config_Container::countChildren() -- Count children of container

Description

This method will return the number of children this container has. If either $name or $type, it will affine its search just to return the number of children corresponding to these parameters.

Parameter

string $type

Type of children to count.

string $name

Name of children to count.

Return value

int - number of children found

Note

This function can not be called statically.

Config_Container::createBlank()

Config_Container::createBlank() -- Add blank line to item

Description

The current item must be a section. This is a helper method that calls createItem()

Parameter

string $where

Where to create the new item ('top', 'bottom', 'before', 'after')

object $target

Required only if 'before' or 'after' is used for $where

Return value

object - reference to new item

Note

This function can not be called statically.

Config_Container::createComment()

Config_Container::createComment() -- Add comment to item

Description

The current item must be a section. This is a helper method that calls createItem()

Parameter

string $content

Comment content

string $where

Where to create the new item ('top', 'bottom', 'before', 'after')

object $target

Required only if 'before' or 'after' is used for $where

Return value

object - reference to new item

Note

This function can not be called statically.

Config_Container::createDirective()

Config_Container::createDirective() -- Add directive to item

Description

The current item must be a section. This is a helper method that calls createItem()

Parameter

string $name

Name of new directive

string $content

Content of new directive

mixed $attributes

Directive attributes

string $where

Where to create the new item ('top', 'bottom', 'before', 'after')

object $target

Required only if 'before' or 'after' is used for $where

Return value

object - reference to new item

Note

This function can not be called statically.

Config_Container::createItem()

Config_Container::createItem() -- Create new child for section item

Description

This method must be called on a section, the created item can be anything. It adds a new child to the current item. If a position is specified, the child will be created at there. It is recommended to use the helper methods instead of calling this method directly.

Parameter

string $type

type of item: directive, section, comment, blank...

mixed $item

item name

string $content

item content

array $attributes

item attributes

string $where

choose a position 'bottom', 'top', 'after', 'before'

object $target

needed if you choose 'before' or 'after' for $where

Return value

object - reference to new item

Note

This function can not be called statically.

Config_Container::createSection()

Config_Container::createSection() -- Add section to item

Description

Must be called on a section. This is a helper method that calls createItem()

Parameter

string $name

Name of new section

array array $attributes

Section attributes

string $where

Where to create the new item ('top', 'bottom', 'before', 'after')

object $target

Required only if 'before' or 'after' is used for $where

Return value

object - reference to new item

Note

This function can not be called statically.

Config_Container::getAttribute()

Config_Container::getAttribute() -- Get attribute value of item

Description

This method returns the value associated with the key attribute. To get all attributes, see method getAttributes().

Parameter

string $attribute

Attribute key

Return value

mixed - item's attribute value

Note

This function can not be called statically.

Config_Container::getAttributes()

Config_Container::getAttributes() -- Get item attributes

Description

This method returns an array containing the attributes of this container.

Return value

array - item's attributes

Note

This function can not be called statically.

Config_Container::getChild()

Config_Container::getChild() -- Return child object at specified index.

Description

Children are stored in an array. This method returns the Config_Container object at the specified index.

Parameter

integer $index

Child index

Return value

mixed - returns reference to child object or FALSE if child does not exist

Note

This function can not be called statically.

Config_Container::getContent()

Config_Container::getContent() -- Get item content

Description

Accessor method. Returns the item content.

Return value

mixed - item's content

Note

This function can not be called statically.

Config_Container::getItem()

Config_Container::getItem() -- Tries to find specific items

Description

This method tries to find the items that respond to the specified parameters.

This method can only be called on an object of type 'section'. Note that root is a section. This method is not recursive and tries to keep the current structure.

Parameter

string $type

type of item: directive, section, comment, blank...

string $name

item name

mixed $content

find item with this content

array $attributes

find item with attribute set to the given value

integer $index

index of the item in the returned object list. If it is not set, will try to return the last item with this name.

Return value

mixed - reference to item found or FALSE when not found

Note

This function can not be called statically.

Config_Container::getItemIndex()

Config_Container::getItemIndex() -- Return item index in its parent children array

Description

Children Config_Container objects are stored in an array. This method will return the index of this item in its parent array.

Return value

mixed - returns int or NULL if root object

Note

This function can not be called statically.

Config_Container::getItemPosition()

Config_Container::getItemPosition() -- Return item rank in its parent children array

Description

Returns the item rank in its parent children array according to other items with same type and name.

Return value

mixed - returns int or NULL if root object

Note

This function can not be called statically.

Config_Container::getName()

Config_Container::getName() -- Get item name

Description

Return the name of this item.

Return value

string - item's name

Note

This function can not be called statically.

Config_Container::getParent()

Config_Container::getParent() -- Return item parent object

Description

Returns the item parent object.

Return value

object - reference to parent object or NULL if root object

Note

This function can not be called statically.

Config_Container::getType()

Config_Container::getType() -- Get item type

Description

Gets this item's type.

Return value

string - item type

Note

This function can not be called statically.

Config_Container::isRoot()

Config_Container::isRoot() -- Check for root item

Description

There is only one root item. It has no parent, no name, no content and is of type 'section'. The root item is not used in the parsers, only its children.

Return value

bool - TRUE if item is the root item

Note

This function can not be called statically.

Config_Container::removeItem()

Config_Container::removeItem() -- Deletes an item from the object

Description

This method removes the current item. References to its children are removed as well. This method does not accept parameters yet.

Return value

boolean - TRUE if object was removed, FALSE if not, or PEAR_Error if root

Note

This function can not be called statically.

Config_Container::searchPath()

Config_Container::searchPath() -- Finds a node using XPATH like format

Description

This method tries to find an item by following a given path from the current container.

This method can only be called on an object of type 'section'. Note that root is a section. This method is recursive.

This method takes as many parameters as is needed to define your path to the requested item. The format is array (item1, item2, ..., itemN). Items can be strings or arrays. Strings will match the item name, while arrays will match 'name' and/or 'attributes' properties of the requested item.

Parameter

mixed $args

Strings or arrays of item to match in the order they will be matched, separated by commas

Return value

mixed - reference to item found or FALSE when not found

Note

This function can not be called statically.

Config_Container::setAttributes()

Config_Container::setAttributes() -- Set item attributes

Description

Attributes are stored in an array. They are used in some containers like PHP Array, XML, Apache. In IniFile or IniCommented containers, attributes are not used. See examples in getAttributes() method to have an idea of the attributes output. This method will replace existing attributes. Use updateAttributes() if you just want to change some of them.

Parameter

array $attributes

Array of attributes

Note

This function can not be called statically.

Config_Container::setContent()

Config_Container::setContent() -- Set item content

Description

Set this item's content.

Parameter

mixed mixed $content

Item's content

Note

This function can not be called statically.

Config_Container::setDirective()

Config_Container::setDirective() -- Set child directive content or create new directive

Description

This is an helper method that will first try to find the item with the desired name using getItem(). If the item is found, it will call its setContent() method. If not, it will just create a new directive at the bottom with the given name and content.

Parameter

string $name

Name of the directive to look for

mixed $content

New content, usually a string

integer $index

Index of the directive to set, in case there are more than one directive with the same name

Return value

object - Newly set directive

Note

This function can not be called statically.

Config_Container::setName()

Config_Container::setName() -- Set item name

Description

Set this item's name.

Parameter

string $name

Item name

Note

This function can not be called statically.

Config_Container::setType()

Config_Container::setType() -- Set item type

Description

Set this item's type.

Parameter

string $type

item type

Note

This function can not be called statically.

Config_Container::toArray()

Config_Container::toArray() -- Return key/value pair array of container and its children

Description

This method returns an array representation of the Config tree. The format is
$section[directive][index] = value
If the container has attributes, it will use '@' as key for attributes and '#' for values. index is here because multiple directives and sections can have the same name, the toArray() method takes care of that.

Return value

array - an array representation of the Config_Container tree

Note

This function can not be called statically.

Config_Container::toString()

Config_Container::toString() -- Return string representation

Description

This method will call the toString() method in the choosen config type. It will return a string representation of the Config_Container and its children.

Parameter

string $configType

Type of configuration used to generate the string

array $options

Specify special options used by the parser

Return value

string - the generated string

Note

This function can not be called statically.

Config_Container::updateAttributes()

Config_Container::updateAttributes() -- Update item attributes

Description

If the specified attributes are already set, they are overwritten. New attributes are set. The ones that are not set in the given parameter array are left untouched.

Parameter

array $attributes

Array of attributes

Note

This function can not be called statically.

Config_Container::writeDatasrc()

Config_Container::writeDatasrc() -- Write item to file

Description

By default, this method will write a new string generated with the toString() method to a file. If a writeDatasrc() method exists in the chosen config type, this method will be called instead. This allows for more flexibility and makes it possible to add your own save handlers.

Parameter

mixed $datasrc

Info on datasource such as path to the configuraton file or dsn...

string $configType

Type of configuration

array $options

Options for writer

Return value

boolean - TRUE on success

Note

This function can not be called statically.


Chapter 36. Console

Provides Packages for PHP-based command-line applications like the pear installer.



Console_Color

Table of Contents
Introduction -- How to use Console_Color
Color codes -- Tabular reference

Console_Color allows you to easily use ANSI console colors in your application to colorize the output.

Introduction

Introduction -- How to use Console_Color

Basics

Console_Color provides methods to convert complete strings tagged with special markers into ANSI-compatible color code representations, and methods that directly return those codes for certain colors.

The method used most often is convert(). It takes a string, e.g.
%bHello World!%n\n
or
3 out of 4 people make up about %r75%% %n
and returns the ANSI representation. The characters following a percentage sign (%) do have special meanings. See color codes to get an overview.

To reset the colors to normal, use %n.

Further, there is an escape() method that prevents special chars from being treated as markers.

Methods bgcolor(), color(), fgcolor() and style() directly return ANSI control codes for the given color or style value.

Example

<?php
require 'Console/Color.php';
//make it blue
print Console_Color::convert("%bHello World!%n\n");
//more colors
print Console_Color::convert("%rred%n, %ggreen%n, %yyellow%n\n");
?>

Color codes

Color codes -- Tabular reference

Console_Getopt

Table of Contents
Introduction - Options -- Defining and processing options
Console_Getopt::getopt -- fetch the command-line options
Console_Getopt::readPHPArgv -- read the predefined $argv array

Console_Getopt provides functions for easily fetching and processing command-line arguments.

Introduction - Options

Introduction - Options -- Defining and processing options

The returned options array

The return value is an array of two elements: the list of parsed options and the list of non-option command-line arguments. Each entry in the list of parsed options is a pair of elements - the first one specifies the option, and the second one specifies the option argument, if there was one, else the value is NULL.

Console_Getopt::getopt

Console_Getopt::getopt -- fetch the command-line options

Description

Parses the command-line options and returns them.

Parameter

  • array $args - an array of command-line arguments

  • string $shortoptions - specifies the list of allowed short options. See the "Options" section for more information.

  • array $longoptions - specifies the list of allowed long options. Default is NULL. See the "Options" section for more information.

Return value

array - two-element array containing the list of parsed options and the non-option arguments or a PEAR_Error.

Note

This function can not be called statically.

Console_Getopt::readPHPArgv

Console_Getopt::readPHPArgv -- read the predefined $argv array

Description

Reads the $argv PHP array across different PHP configurations. Will take care of the register_globals and register_argc_argv ini directives.

Return value

array - array containing the options and parameters or PEAR_Error

Note

This function can not be called statically.


Console_ProgressBar

Console_ProgressBar displays a customizable progress bar in the console/terminal.

Things to setup

  1. require_once "Console/ProgressBar.php"

  2. Create a new instance of Console_ProgressBar.

  3. Call update() whenever some progress has been made.

  4. (optional) erase(). after you're finished.


Creating the bar

In the example we create the progress bar instance with five parameters: The format string, bar string, empty string, console width and the target number.

The first parameter, format string, defines the layout of the whole progress bar. It may contain any character and has some variables that get replaced:

The second argument is the string that is going to fill the progress bar. In the above example, the string "=>" was used. If the string you pass is too short (like "=>" in this example), the leftmost character is used to pad it to the needed size. If the string you pass is too long, excessive characters are stripped from the left.

The third argument is the string that fills the "empty" space in the progress bar. In the above example, that would be "-". If the string you pass is too short (like "-" in this example), the rightmost character is used to pad it to the needed size. If the string you pass is too long, excessive characters are stripped from the right.

The fourth argument specifies the width of the display. A normal console/terminal is 80 chars, so pass 80 here. Currently there is no method to determine the current width of a terminal.

The fifth argument is the target number of the progress bar. For example, if you wanted to display a progress bar for a download of a file that is 115 KB big, you would pass 115 here.


Console_Table

Table of Contents
constructor Console_Table::Console_Table() -- Constructor
Console_Table::addCol() -- Adds a column to the table
Console_Table::addData() -- Adds data to the table.
Console_Table::addRow() -- Adds a row to the table
Console_Table::getTable() -- Returns the table in wonderful ASCII art
Console_Table::insertRow() -- Inserts a row after a given row number in the table.
Console_Table::setHeaders() -- Sets the headers for the columns

Console_Table provides methods to build console tables

constructor Console_Table::Console_Table()

constructor Console_Table::Console_Table() -- Constructor

Description

Constructor

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Console_Table::addCol()

Console_Table::addCol() -- Adds a column to the table

Description

Adds a column to the table

Parameter

array $col_data

The data of the column. Can be numeric or associative array

integer $col_id

The column index to populate

integer $row_id

If starting row is not zero, specify it here

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Console_Table::addData()

Console_Table::addData() -- Adds data to the table.

Description

Adds data to the table. Argument should be a two dimensional array containing the data to be added.

Parameter

array $data

The data to add to the table

integer $col_id

Optional starting column ID

integer $row_id

Optional starting row ID

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Console_Table::addRow()

Console_Table::addRow() -- Adds a row to the table

Description

Adds a row to the table

Parameter

array $row

The row data to add

array $append

Whether to append or prepend the row

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Console_Table::getTable()

Console_Table::getTable() -- Returns the table in wonderful ASCII art

Description

Returns the table in wonderful ASCII art

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Console_Table::insertRow()

Console_Table::insertRow() -- Inserts a row after a given row number in the table.

Description

Inserts a row after a given row number in the table. If $row_id is not given it will prepend the row.

Parameter

array $row

The data to insert

integer $row_id

Row number to insert before

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Console_Table::setHeaders()

Console_Table::setHeaders() -- Sets the headers for the columns

Description

Sets the headers for the columns

Parameter

array $headers

The column headers

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Chapter 37. Database

Provides database-related Packages



DB

Table of Contents
Introduction - DSN -- The Data Source Name
Introduction - Connect -- Connecting and disconnecting a database
Introduction - Query -- Performing queries
Introduction - Results -- Obtaining data from query results
Introduction - Prepare & Execute -- Prepare and execute SQL statements
Introduction - autoPrepare & autoExecute -- Automatically prepare and execute SQL statements
Introduction - Portability -- Database portability features
Introduction - Sequences -- Sequences and auto-incrementing
DB -- Main class
DB::connect() -- Connects to a database
DB::isError() -- Determines if a variable is a DB_Error object
DB_common -- Interface for database access
DB_common::affectedRows() -- Finds number of rows affected by a data changing query
DB_common::autoCommit() -- Turns auto-commit on or off
DB_common::autoExecute() --  Prepares and runs an INSERT or UPDATE query based on variables you supply
DB_common::autoPrepare() --  Prepares an INSERT or UPDATE statement based on variables you supply
DB_common::commit() -- Commits the current transaction
DB_common::createSequence() -- Creates a new sequence
DB_common::disconnect() -- Disconnects from a database
DB_common::dropSequence() -- Deletes a sequence
DB_common::escapeSimple() -- Escapes a string according to the current DBMS's standards
DB_common::execute() -- Executes a prepared SQL statement
DB_common::executeMultiple() -- Runs a prepared SQL statement for each element of an array
DB_common::freePrepared() -- Releases resources associated with a prepared SQL statement
DB_common::getAll() -- Runs a query and returns all the data as an array
DB_common::getAssoc() -- Runs a query and returns the data as an array
DB_common::getCol() -- Runs a query and returns the data from a single column
DB_common::getListOf() -- Views database system information
DB_common::getOne() -- Runs a query and returns the first column of the first row
DB_common::getOption() --  Determines current state of a PEAR DB configuration option
DB_common::getRow() -- Runs a query and returns the first row
DB_common::limitQuery() -- Sends a LIMIT query to the database
DB_common::nextId() -- Returns the next number from a sequence
DB_common::nextQueryIsManip() -- Informs the DB driver that the next query is a manipulation query
DB_common::prepare() -- Prepares a SQL statement for later execution
DB_common::provides() -- Checks if the DBMS supports a particular feature
DB_common::query() -- Sends a query to the database
DB_common::quote() -- DEPRECATED: Quotes a string
DB_common::quoteIdentifier() -- Formats a string so it can be safely used as an identifier
DB_common::quoteSmart() -- Formats input so it can be safely used as a literal
DB_common::rollback() -- Rolls back the current transaction
DB_common::setFetchMode() -- Sets the default fetch mode
DB_common::setOption() -- Sets run-time configuration options for PEAR DB
DB_common::tableInfo() -- Gets info about columns in a table or a query result
DB_result -- DB result set
DB_result::fetchInto() -- Fetches a row of a result set into a variable
DB_result::fetchRow() -- Fetches a row from a result set
DB_result::free() -- Releases a result set
DB_result::nextResult() -- Gets result sets from multiple queries
DB_result::numCols() -- Gets number of columns in a result set
DB_result::numRows() -- Gets number of rows in a result set
DB_Error -- DB Error object

Warning

This package has been superseded. Please use MDB2 for new projects.

A unified API for accessing SQL databases

Introduction - DSN

Introduction - DSN -- The Data Source Name

Description

To connect to a database through PEAR::DB, you have to create a valid DSN - data source name. This DSN consists in the following parts:

phptype: Database backend used in PHP (i.e. mysql , odbc etc.)
dbsyntax: Database used with regards to SQL syntax etc. When using ODBC as the phptype, set this to the DBMS type the ODBC driver is connecting to. Examples: access, db2, mssql, navision, solid, etc.
protocol: Communication protocol to use ( i.e. tcp, unix etc.)
hostspec: Host specification (hostname[:port])
database: Database to use on the DBMS server
username: User name for login
password: Password for login
proto_opts: Maybe used with protocol
option: Additional connection options in URI query string format. options get separated by &

The format of the supplied DSN is in its fullest form:
phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value

Most variations are allowed:
phptype://username:password@protocol+hostspec:110//usr/db_file.db
phptype://username:password@hostspec/database
phptype://username:password@hostspec
phptype://username@hostspec
phptype://hostspec/database
phptype://hostspec
phptype:///database
phptype:///database?option=value&anotheroption=anothervalue
phptype(dbsyntax)
phptype

The currently supported database backends are:
dbase  -> dBase
fbsql  -> FrontBase (functional since DB 1.7.0)
ibase  -> InterBase (functional since DB 1.7.0)
ifx    -> Informix
msql   -> Mini SQL (functional since DB 1.7.0)
mssql  -> Microsoft SQL Server (NOT for Sybase. Compile PHP --with-mssql)
mysql  -> MySQL (for MySQL <= 4.0)
mysqli -> MySQL (for MySQL >= 4.1) (requires PHP 5) (since DB 1.6.3)
oci8   -> Oracle 7/8/9
odbc   -> ODBC (Open Database Connectivity)
pgsql  -> PostgreSQL
sqlite -> SQLite
sybase -> Sybase

With an up-to-date version of DB, you can use a second DSN format
phptype(syntax)://user:pass@protocol(proto_opts)/database

If your database, option values, username or password contain characters used to delineate DSN parts, you can escape them via URI hex encodings:
: = %3a   / = %2f   @ = %40
+ = %2b   ( = %28   ) = %29
? = %3f   = = %3d   & = %26

Warning

Please note, that some features may be not supported by all database backends. Please refer to the PEAR DB extensions status document located at: /pear/base/dir/DB/doc/STATUS to get a detailed list about what features are supported by which backend.

Introduction - Connect

Introduction - Connect -- Connecting and disconnecting a database

Description

To connect to a database you have to use the function connect(), which requires a valid DSN as the first parameter. This parameter can either be a string or an array. If using an array, the array used gets merged with the default information:
$dsn = array(
    'phptype'  => false,
    'dbsyntax' => false,
    'username' => false,
    'password' => false,
    'protocol' => false,
    'hostspec' => false,
    'port'     => false,
    'socket'   => false,
    'database' => false,
);
Any elements you set override the defaults and the remainder stay at their defaults.

The second parameter is the optional $options array that can contain runtime configuration settings for this package. See setOption() for more information on the available settings.

In case of success you get a new instance of the database class. It is strongly recommended to check this return value with isError().

To disconnect use the method disconnect() from your database class instance.

Introduction - Query

Introduction - Query -- Performing queries

Description

PEAR DB provides several methods for querying databases. The most direct method is query(). It takes a SQL query string as an argument. There are three possible returns: a new DB_result object for queries that return results (such as SELECT queries), DB_OK for queries that manipulate data (such as INSERT queries) or a DB_Error object on failure.

query() can be used instead of prepare() and execute(), if you set the $params parameter and your query uses placeholders.

Introduction - Results

Introduction - Results -- Obtaining data from query results

Description

Formats of Fetched Rows

The data from the row of a query result can be placed into one of three constructs: an ordered array (with column numbers as keys), an associative array (with column names as keys) or an object (with column names as properties).

DB_FETCHMODE_ORDERED (default)
Array
(
    [0] => 28
    [1] => hi
)

DB_FETCHMODE_ASSOC
Array
(
    [a] => 28
    [b] => hi
)

DB_FETCHMODE_OBJECT
stdClass Object
(
    [a] => 28
    [b] => hi
)

NOTE: When a query contains the same column name more than once (such as when joining tables which have duplicate column names) and the fetch mode is DB_FETCHMODE_ASSOC or DB_FETCHMODE_OBJECT, the data from the last column with a given name will be the one returned. There are two immediate options to work around this issue:

Use aliases in your query, for example People.Name AS PersonName
Change the fetch mode to DB_FETCHMODE_ORDERED

TIP: If you are running into this issue, it likely indicates poor planning of the database schema. Either data is needlessly being duplicated or the same names are being used for different kinds of data.

Fetch Rows by Number

The PEAR DB fetch system also supports an extra parameter to the fetch statement. So you can fetch rows from a result by number. This is especially helpful if you only want to show sets of an entire result (for example in building paginated HTML lists), fetch rows in an special order, etc.

Getting Entire Result Sets

The DB_common object provides several methods that make data retrieval easy by combining the processes of running of the query string you provide, putting the returned information into a PHP data structure and freeing the results. These methods include getOne(), getRow(), getCol(), getAssoc() and getAll().

Freeing Result Sets

Once you finish using a result set, if your script continues for a while, it's a good idea to save memory by freeing the result set via Use free().

Getting More Information From Query Results

With DB there are four ways to retrieve useful information about the query result sets themselves:

Example 37-6. numRows() tells how many rows are in a SELECT query result

<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numRows();
?>

Example 37-7. numCols() tells how many columns are in a SELECT query result

<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM phptest');
echo $res->numCols();
?>

Example 37-8. affectedRows() tells how many rows were altered by a data change query (INSERT, UPDATE or DELETE)

<?php
// remember that this statement won't return a result object
$db->query('DELETE * FROM clients');
echo 'I have deleted ' . $db->affectedRows() . ' clients';
?>

Example 37-9. tableInfo() returns an associative array with information about the columns in a SELECT query result

<?php
// Once you have a valid DB object named $db...
$res =& $db->query('SELECT * FROM phptest');
print_r($db->tableInfo($res));

// That usage works for DB 1.6.0 or later.
// Below is the syntax for earlier versions:
print_r($res->tableInfo());
?>

Checking for Errors

Don't forget to use isError() to check if your actions return a DB_Error object.

Introduction - Prepare & Execute

Introduction - Prepare & Execute -- Prepare and execute SQL statements

Description

Purpose

prepare() and execute*() give you more power and flexibilty for query execution. Prepare/execute mode is helpful when you have to run the same query several times but with different values in it, such as adding a list of addresses into a database.

Another place prepare/execute is useful is supporting databases which have different SQL syntaxes. Imagine you want to support two databases with different INSERT syntax:
db1: INSERT INTO tbl_name (col1, col2) VALUES (expr1, expr2)
db2: INSERT INTO tbl_name SET col1=expr1, col2=expr2
Correspondending to create multi-lingual scripts you can create a array with queries like this:
$statement['db1']['INSERT_PERSON'] = 'INSERT INTO person
    (surname, name, age) VALUES (?, ?, ?)';

$statement['db2']['INSERT_PERSON'] = 'INSERT INTO person
    SET surname=?, name=?, age=?';

Prepare

To use the features above, you have to do two steps. Step one is to prepare the statement and the second is to execute it.

To start out, you need to prepare() a generic SQL statement. Create a generic statement by writing the SQL query as usual:
SELECT surname, name, age
    FROM person
    WHERE name = 'name_to_find' AND age < age_limit
Then substitute "placeholders" for the literal values which will be provided at run time:
SELECT surname, name, age
    FROM person
    WHERE name = ? AND age < ?
Then pass this SQL statement to prepare(), which returns a statement handle to be used when calling execute().

prepare() can handle different types of placeholders (a.k.a. wildcards).

? - (recommended) stands for a scalar value like strings or numbers. The value will be automatically escaped and quoted according to the current DBMS's requirements.
! - stands for a scalar value and will inserted into the statement "as is".
& - requires an existing filename, the content of this file will be included into the statement (i.e. for saving binary data of a graphic file in a database)

Use backslashes to escape placeholder characters if you don't want them to be interpreted as placeholders:
UPDATE foo SET col=? WHERE col='over \& under'

Execute

After preparing the statement, you can execute the query. This means to assign the variables to the prepared statement. To do this, execute() requires two arguments: the statement handle returned by prepare() and a scalar or array with the values to assign.

When a prepared statement has multiple placeholders, you must use an array to pass the values to execute(). The first entry of the array represents the first placeholder, the second the second placeholder, etc. The order is independent of the type of placeholder used.

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement. Similarly, identifiers (i.e. table names and column names) can not be used because the names get validated during the prepare phase.

ExecuteMultiple

DB contains a process for executing several queries at once. So, rather than having to execute them manually, like this:
which would issue four queries:
INSERT INTO numbers VALUES ('1', 'one', 'en')
INSERT INTO numbers VALUES ('2', 'two', 'to')
INSERT INTO numbers VALUES ('3', 'three', 'tre')
INSERT INTO numbers VALUES ('4', 'four', 'fire')
you can use executeMultiple() to avoid the explicit foreach in the eample above:

The result is the same. If one of the records failed, the unfinished records will not be executed.

execute*() has three possible returns: a new DB_result object for queries that return results (such as SELECT queries), DB_OK for queries that manipulate data (such as INSERT queries) or a DB_Error object on failure

Introduction - autoPrepare & autoExecute

Introduction - autoPrepare & autoExecute -- Automatically prepare and execute SQL statements

Description

Purpose

autoPrepare() and autoExecute() reduce the need to write boring INSERT or UPDATE SQL queries which are difficult to maintain when you add a field for instance.

Imagine you have a 'user' table with 3 fields (id, name and country). You have to write sql queries like:
INSERT INTO table (id, name, country) VALUES (?, ?, ?)
UPDATE table SET id=?, name=?, country=? WHERE ...
If you add a field ('birthYear' for example), you have to rewrite your queries which is boring and can lead to bugs (if you forget one query for instance).

autoPrepare

With autoPrepare(), you don't have to write your insert or update queries. For example:
<?php
// Once you have a valid DB object named $db...
$table_name   = 'user';
$table_fields = array('id', 'name', 'country');

$sth = $db->autoPrepare($table_name, $table_fields,
                        DB_AUTOQUERY_INSERT);

if (PEAR::isError($sth)) {
    die($sth->getMessage());
}
?>
In this example, autoPrepare() will build the following SQL query:
INSERT INTO user (id, name, country) VALUES (?, ?, ?)
And then, it will call prepare() with it.

To add records, you have to use execute() or executeMultiple() like:
<?php
// ... contining from the example above...
$table_values = array(1, 'Fabien', 'France');

$res =& $db->execute($sth, $table_values);

if (PEAR::isError($res)) {
    die($res->getMessage());
}
?>
So, you don't have to write any SQL INSERT queries! And it works with UPDATE queries too. For flexibility reasons, you have only to write the WHERE clause of the query. For instance:
<?php
// Once you have a valid DB object named $db...
$table_name   = 'user';
$table_fields = array('name', 'country');
$table_values = array('Bob', 'USA');

$sth = $db->autoPrepare($table_name, $table_fields,
                        DB_AUTOQUERY_UPDATE, 'id = 1');

if (PEAR::isError($sth)) {
    die($sth->getMessage());
}

$res =& $db->execute($sth, $table_values);

if (PEAR::isError($res)) {
    die($res->getMessage());
}
?>
autoPrepare() will build the following query:
UPDATE user SET name=?, country=? WHERE id=1
Then, it will call prepare() with it.

Be careful, if you don't specify any WHERE clause, all the records of the table will be updated.

autoExecute

Using autoExecute() is the easiest way to do insert or update queries. It is a mix of autoPrepare() and execute().

You only need an associative array (key => value) where keys are fields names and values are corresponding values of these fields. For instance:
<?php
// Once you have a valid DB object named $db...
$table_name = 'user';

$fields_values = array(
    'id'      => 1,
    'name'    => 'Fabien',
    'country' => 'France'
);

$res = $db->autoExecute($table_name, $fields_values,
                        DB_AUTOQUERY_INSERT);

if (PEAR::isError($res)) {
    die($res->getMessage());
}
?>
And that's all! The following query is built and executed:
INSERT INTO user (id, name, country)
  VALUES (1, 'Fabien', 'France')

And it's the same thing for UPDATE queries:
<?php
// Once you have a valid DB object named $db...
$table_name = 'user';

$fields_values = array(
    'name'    => 'Fabien',
    'country' => 'France'
);

$res = $db->autoExecute($table_name, $fields_values,
                        DB_AUTOQUERY_UPDATE, 'id = 1');

if (PEAR::isError($res)) {
    die($res->getMessage());
}
?>
which prepares and executes the following query:
UPDATE user SET name='Fabien', country='France'
  WHERE id = 1

Be careful, if you don't specify any WHERE statement, all the records of the table will be updated.

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement.

Introduction - Portability

Introduction - Portability -- Database portability features

Description

Each database management system (DBMS) has its own behaviors. For example, some databases capitalize field names in their output, some lowercase them, while others leave them alone. These quirks make it difficult to port your scripts over to another server type. PEAR DB strives to overcome these differences so your program can switch between DBMS's without any changes.

You control which portability modes are enabled by using the portability configuration option. Configuration options are set via connect() and setOption().

The portability modes are bitwised, so they can be combined using | and removed using ^. See the examples section below on how to do this.

Backwards Compatibility

Some of this functionality used to be handled by the now deprecated optimize option. For backwards compatibility, when this option is set to portability, the following databases get these portability modes turned on:

  • oci8: DB_PORTABILITY_LOWERCASE and DB_PORTABILITY_DELETE_COUNT

  • fbsql, mysql, mysqli, sqlite: DB_PORTABILITY_DELETE_COUNT

When the optimize option gets set to performance the portability mode is switched to DB_PORTABILITY_NONE.

Introduction - Sequences

Introduction - Sequences -- Sequences and auto-incrementing

Description

Sequences are a way of offering unique IDs for data rows. If you do most of your work with e.g. MySQL, think of sequences as another way of doing AUTO_INCREMENT.

It's quite simple, first you request an ID, and then you insert that value in the ID field of the new row you're creating. You can have more than one sequence for all your tables, just be sure that you always use the same sequence for any particular table. To get the value of this unique ID use nextId(), if a sequence doesn't exists, it will be created automatically.

The sequence is automatically incremented each time nextId() is called.

Note

Warning

When using PEAR DB's sequence methods, we strongly advise using these methods for all procedures, including the creation of the sequences. Do not use PEAR DB's methods to access sequences that were created directly in the DBMS.

If you have a compelling reason to ignore this advice, be aware that the $seq_name argument given to all of PEAR DB's sequence methods are modified before DB calls the underlying DBMS.

$seq_name is passed through PHP's sprintf() function using the value from the seqname_format option as sprintf()'s format argument. The default seqname_format is %s_seq. So, for example, if you use person_id_sequence as the $seq_name, PEAR DB will change that name to person_id_sequence_seq when querying the DBMS about creating/accessing/updating the sequence.

The seqname_format can be modified when connect()'ing or via setOption().

Please note that you may need to change the seqname_format option to represent a quoted form of the sequence name if the sequence names contain characters that cannot be used unquoted within queries. For example, PostgreSQL users with uppercase table names will probably need to use "%s_seq" (note the quotes) for queries to work as expected.

DB

DB -- Main class

Description

The main DB class is simply a container class with some static methods for creating DB objects.

DB::connect()

DB::connect() -- Connects to a database

Description

Creates a new DB connection object and connect to the specified database

Parameter

string or array $dsn

Data Source Name. String formats are described in the DSN section while array formats are covered in the "Intro - Connect" section.

array $options

An optional argument can contain runtime configuration settings for this package. See setOption() for more information on the available settings.

Return value

object - a new DB object or a DB_Error object on failure

Note

This function should be called statically.

DB::isError()

DB::isError() -- Determines if a variable is a DB_Error object

Description

Checks whether a result code from a DB method is a DB_Error object or not.

You're generally better off using PEAR::isError() instead of the DB specific isError().

Parameter

mixed $value

Variable to check

Return value

boolean - TRUE if $value is a DB_Error object

Note

This function should be called statically.

DB_common

DB_common -- Interface for database access

Description

DB_common is an interface class; that provides all methods to query a specific database. An instance of a database specific class will be returned by the connect() method.

DB_common::affectedRows()

DB_common::affectedRows() -- Finds number of rows affected by a data changing query

Description

Number of rows affected by a data manipulation query (for example INSERT, UPDATE or DELETE). Returns 0 for SELECT queries.

Return value

integer - number of rows or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::autoCommit()

DB_common::autoCommit() -- Turns auto-commit on or off

Description

Turns auto-commit on or off.

Parameter

boolean $onoff

TRUE to turn auto-commit on. FALSE to turn auto-commit off.

Return value

integer - DB_OK on success or a DB_Error object on failure

Note

This function can not be called statically.

When using MySQL as your DBMS, transactions can only be used when the tables in question use the InnoDB format.

DB_common::autoExecute()

DB_common::autoExecute() --  Prepares and runs an INSERT or UPDATE query based on variables you supply

Description

Automatically prepares and executes INSERT or UPDATE queries.

This method builds a SQL statement using autoPrepare() and then executes the statement using execute() with it.

Parameter

string $table

name of the table

array $fields_values

assoc (key => value), keys are fields names, values are values of these fields

Values are automatically escaped and quoted according to the current DBMS's requirements.

integer $mode

type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE)

string $where

a string to be used in the WHERE clause. This is only used when $mode is DB_AUTOQUERY_UPDATE. The string is put directly into the query, so you must escape and quote literals according to the DBMS's standards.

Return value

integer - DB_OK on success or a DB_Error object on failure

Note

This function can not be called statically.

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement.

DB_common::autoPrepare()

DB_common::autoPrepare() --  Prepares an INSERT or UPDATE statement based on variables you supply

Description

Automatically builds an INSERT or UPDATE SQL statement so it can later be used by execute() or executeMultiple().

Parameter

string $table

name of the table

array $table_fields

ordered array containing the fields names

Be aware that these fields are assigned ? placeholders, therefore the data you pass to them in the execute() will be automatically escaped and quoted according to the current DBMS's requirements.

integer $mode

type of query to make (DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE)

string $where

a string to be used in the WHERE clause. This is only used when $mode is DB_AUTOQUERY_UPDATE. The string is put directly into the query, so you must escape and quote literals according to the DBMS's standards.

Return value

resource - resource handle for the query or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::commit()

DB_common::commit() -- Commits the current transaction

Description

Commits the current transaction.

Return value

integer - DB_OK on success or a DB_Error object on failure

Note

This function can not be called statically.

When using MySQL as your DBMS, transactions can only be used when the tables in question use the InnoDB format.

DB_common::createSequence()

DB_common::createSequence() -- Creates a new sequence

Description

See "Intro - Sequences"

Parameter

string $seq_name

name of the new sequence to create

To avoid problems with various database systems, sequence names should start with a letter and only contain letters, numbers and the underscore character.

Return value

integer - DB_OK or a DB_Error object on failure

Note

This function can not be called statically.

Warning

When using PEAR DB's sequence methods, we strongly advise using these methods for all procedures, including the creation of the sequences. Do not use PEAR DB's methods to access sequences that were created directly in the DBMS. See the warning on the "Intro - Sequences" page complete information.

DB_common::disconnect()

DB_common::disconnect() -- Disconnects from a database

Description

Disconnects from a database

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

DB_common::dropSequence()

DB_common::dropSequence() -- Deletes a sequence

Description

See "Intro - Sequences"

Parameter

string $seqName

name of the sequence to delete

Return value

integer - DB_OK or a DB_Error object on failure

Note

This function can not be called statically.

Warning

When using PEAR DB's sequence methods, we strongly advise using these methods for all procedures, including the creation of the sequences. Do not use PEAR DB's methods to access sequences that were created directly in the DBMS. See the warning on the "Intro - Sequences" page complete information.

DB_common::escapeSimple()

DB_common::escapeSimple() -- Escapes a string according to the current DBMS's standards

Description

Escape a string according to the current DBMS's standards.

Parameter

string $str

the input to be escaped

Return value

string - the escaped string

Note

This function can not be called statically.

Function available since: Release 1.6.0

DB_common::execute()

DB_common::execute() -- Executes a prepared SQL statement

Description

Merges the SQL statement you submitted to prepare() with the information in $data and then sends the query to the database.

Parameter

resource $stmt

query handle from prepare()

mixed $data

array, string or numeric data to be added to the prepared statement. Quantity of items passed must match quantity of placeholders in the prepared statement: meaning 1 placeholder for non-array parameters or 1 placeholder per array element.

Return value

mixed - a new DB_result object for queries that return results (such as SELECT queries), DB_OK for queries that manipulate data (such as INSERT queries) or a DB_Error object on failure

Note

This function can not be called statically.

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement.

DB_common::executeMultiple()

DB_common::executeMultiple() -- Runs a prepared SQL statement for each element of an array

Description

Automatically passes the information in $data (a multi-dimensional array) to execute(), which then runs the SQL statement you submitted to prepare().

Parameter

resource $stmt

query handle from prepare()

array $data

a numeric array containing the data to insert into the query

Return value

integer - DB_OK on success or a DB_Error object on failure

Note

This function can not be called statically.

Warning

If an error occurs during execution, the function will be stopped. Possible remaining data will be unprocessed.

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement.

DB_common::freePrepared()

DB_common::freePrepared() -- Releases resources associated with a prepared SQL statement

Description

Removes the memory occupied by the internal notations that keep track of prepared SQL statements. Does not delete the DB_result object itself.

Parameter

resource $stmt

statement resource identifier returned from prepare()

boolean $free_resource

should the PHP resource be freed too? Use false if you need to get data from the result set later.

Parameter available since Release 1.7.0.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

DB_common::getAll()

DB_common::getAll() -- Runs a query and returns all the data as an array

Description

Runs the query provided and puts the entire result set into a nested array then frees the result set.

Parameter

string $query

the SQL query or the statement to prepare

array $params

array to be used in execution of the statement. Quantity of array elements must match quantity of placeholders in query.

If supplied, prepare()/ execute() is used.

Warning

This method does not allow scalars to be used for this argument.

integer $fetchmode

the fetch mode to use. The default is DB_FETCHMODE_DEFAULT, which tells this method to use DB's current fetch mode. The current fetch mode can be changed using setFetchMode(). Potential values include:

  • DB_FETCHMODE_ORDERED

  • DB_FETCHMODE_ASSOC

  • DB_FETCHMODE_OBJECT

  • DB_FETCHMODE_ORDERED | DB_FETCHMODE_FLIPPED

  • DB_FETCHMODE_ASSOC | DB_FETCHMODE_FLIPPED

Return value

array - a nested array or a DB_Error on failure

Note

This function can not be called statically.

Example

DB_common::getAssoc()

DB_common::getAssoc() -- Runs a query and returns the data as an array

Description

Runs the query provided and puts the entire result set into an associative array then frees the result set.

If the result set contains more than two columns, the value will be an array of the values from column 2 to n. If the result set contains only two columns, the returned value will be a scalar with the value of the second column (unless forced to an array with the $force_array parameter).

Parameter

string $query

the SQL query or the statement to prepare

boolean $force_array

used only if the query returns exactly two columns. If TRUE, the values of the returned array will be one-element arrays instead of scalars.

mixed $params

array, string or numeric data to be added to the prepared statement. Quantity of items passed must match quantity of placeholders in the prepared statement: meaning 1 placeholder for non-array parameters or 1 placeholder per array element.

If supplied, prepare()/ execute() is used.

integer $fetchmode

the fetch mode to use. The default is DB_FETCHMODE_DEFAULT, which tells this method to use DB's current fetch mode. DB's current default fetch mode can be changed using setFetchMode(). Potential values include:

  • DB_FETCHMODE_ORDERED

  • DB_FETCHMODE_ASSOC

  • DB_FETCHMODE_OBJECT

boolean $group

if TRUE, the values of the returned array is wrapped in another array. If the same key value (in the first column) repeats itself, the values will be appended to this array instead of overwriting the existing values.

Return value

array - associative array with the query results or a DB_Error object on failure

Note

This function can not be called statically.

Example

All of the examples use the following data set:
INSERT INTO foo VALUES ('Juan', 5, '1991-01-11 21:31:41');
INSERT INTO foo VALUES ('Kyu', 10, '1992-02-12 22:32:42');
INSERT INTO foo VALUES ('Kyu', 15, '1993-03-13 23:33:43');

Result sets having two columns

When using getAssoc() for results which have two columns and $force_array = FALSE (the default) changing $fetchmode has no impact on the format of the resulting array.

Result sets having more than two columns

DB_common::getCol()

DB_common::getCol() -- Runs a query and returns the data from a single column

Description

Runs the query provided and puts the first column of data into an array then frees the result set.

Parameter

string $query

the SQL query or the statement to prepare

mixed $col

which column to return (integer [column number, starting at 0] or string [column name])

mixed $params

array, string or numeric data to be added to the prepared statement. Quantity of items passed must match quantity of placeholders in the prepared statement: meaning 1 placeholder for non-array parameters or 1 placeholder per array element.

If supplied, prepare()/ execute() is used.

Return value

array - an ordered array containing data from a result set column or a DB_Error object on failure. The array's index starts at 0.

Note

This function can not be called statically.

Example

DB_common::getListOf()

DB_common::getListOf() -- Views database system information

Description

Retrieves information about database users, avaible databases, views and functions.

Parameter

string $type

type of requested info, valid values for $type are database dependent, ie: tables, databases, users, view, functions

Return value

array - an ordered array containing the requested data or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::getOne()

DB_common::getOne() -- Runs a query and returns the first column of the first row

Description

Runs the query provided and returns the data from the first column of the first row then frees the result set.

Parameter

string $query

the SQL query or the statement to prepare

mixed $params

array, string or numeric data to be added to the prepared statement. Quantity of items passed must match quantity of placeholders in the prepared statement: meaning 1 placeholder for non-array parameters or 1 placeholder per array element.

If supplied, prepare()/ execute() is used.

Return value

mixed - the first column's data, NULL if there is no data, or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::getOption()

DB_common::getOption() --  Determines current state of a PEAR DB configuration option

Description

Determines current state of a PEAR DB configuration option

Parameter

string $option

name of the option to examine

Return value

mixed the option's value

Note

This function can not be called statically.

DB_common::getRow()

DB_common::getRow() -- Runs a query and returns the first row

Description

Runs the query provided and puts the first row of data into an array then frees the result set.

Parameter

string $query

the SQL query or the statement to prepare

array $params

array to be used in execution of the statement. Quantity of array elements must match quantity of placeholders in query.

If supplied, prepare()/ execute() is used.

Warning

This method does not allow scalars to be used for this argument.

integer $fetchmode

the fetch mode to use. The default is DB_FETCHMODE_DEFAULT, which tells this method to use DB's current fetch mode. DB's current default fetch mode can be changed using setFetchMode(). Potential values include:

  • DB_FETCHMODE_ORDERED

  • DB_FETCHMODE_ASSOC

  • DB_FETCHMODE_OBJECT

Return value

array - the first row's data in an array or a DB_Error object on failure. The array may be ordered or associative depending on $fetchmode. The column index starts at 0 for ordered arrays.

Note

This function can not be called statically.

DB_common::limitQuery()

DB_common::limitQuery() -- Sends a LIMIT query to the database

Description

Executes a SQL query, but fetches only the specificed count of rows. It is an emulation of the MySQL LIMIT option.

Parameter

string $query

the SQL query

integer $from

the row to start to fetch. Note that 0 returns the first row, 1 returns the second row, etc.

integer $count

the numbers of rows to fetch

mixed $params

array, string or numeric data to be added to the prepared statement. Quantity of items passed must match quantity of placeholders in the prepared statement: meaning 1 placeholder for non-array parameters or 1 placeholder per array element.

Return value

mixed - a new DB_result object for queries that return results (such as SELECT queries), DB_OK for queries that manipulate data (such as INSERT queries) or a DB_Error object on failure

Note

This function can not be called statically.

Depending on the database you will not really get more speed compared to query(). The advantage of limitQuery() is the deleting of unneeded rows in the resultset, as early as possible. So this can decrease memory usage.

Also note that $from and $count are not being escaped. You should take care of sanitizing input yourself, or you are open to an SQL injection attack.

DB_common::nextId()

DB_common::nextId() -- Returns the next number from a sequence

Description

Returns the next available number from a sequence. The sequence is automatically incremented each time this method is called.

See "Intro - Sequences" for a more complete discussion.

Parameter

string $seq_name

name of the sequence

To avoid problems with various database systems, sequence names should start with a letter and only contain letters, numbers and the underscore character.

boolean $onDemand

When TRUE, the sequence is automatically created if it does not exist yet.

The on demand creation process necessitates the database user specified in the script having the database permissions needed to create a table or sequence. The exact privileges required depends on the DBMS being used.

Return value

integer - a free id number or a DB_Error object on failure

Note

This function can not be called statically.

Warning

When using PEAR DB's sequence methods, we strongly advise using these methods for all procedures, including the creation of the sequences. Do not use PEAR DB's methods to access sequences that were created directly in the DBMS. See the warning on the "Intro - Sequences" page complete information.

DB_common::nextQueryIsManip()

DB_common::nextQueryIsManip() -- Informs the DB driver that the next query is a manipulation query

Description

Informs the DB driver that the next query that is called will manipulate data within the database and will not return a result set, irrespective of the usual detection performed within DB.

Parameter

boolean $manip

When TRUE, the next query will always be treated as not returning a result set. When FALSE, the normal behaviour will be used, which will result in DB attempting to automatically detect whether the query will return a result set or not.

Return value

void - nothing is returned

Note

This function can not be called statically.

DB_common::prepare()

DB_common::prepare() -- Prepares a SQL statement for later execution

Description

Gets a SQL statement ready so it can be run by execute().

Parameter

string $query

the query to prepare

Return value

resource - the query handle or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::provides()

DB_common::provides() -- Checks if the DBMS supports a particular feature

Description

Checks if a feature is available for the chosen database type.

Return value

boolean - TRUE if the feature is supported

Note

This function can not be called statically.

Warning

The provided information are only hints. Check the documentation of your database system for the real supported features. I.e. MySQL supports transactions, but not for every table type.

DB_common::query()

DB_common::query() -- Sends a query to the database

Description

Runs a query

Can be used instead of prepare() and execute(), if you set the $params parameter and your query uses placeholders. See "Intro - Prepare & Execute" for more information on this mode.

Parameter

string $query

the SQL query or the statement to prepare

mixed $params

array, string or numeric data to be added to the prepared statement. Quantity of items passed must match quantity of placeholders in the prepared statement: meaning 1 placeholder for non-array parameters or 1 placeholder per array element.

Return value

mixed - a new DB_result object for queries that return results (such as SELECT queries), DB_OK for queries that manipulate data (such as INSERT queries) or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::quote()

DB_common::quote() -- DEPRECATED: Quotes a string

Description

Quotes a string database-dependent, so it can be safely used in a query

This method has been deprecated. Use quoteSmart() or escapeSimple() instead.

Parameter

string $string

the input string to quote

Return value

string - the quoted string.

Note

This function can not be called statically.

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Deprecated in release 1.6.0.

DB_common::quoteIdentifier()

DB_common::quoteIdentifier() -- Formats a string so it can be safely used as an identifier

Description

Format input so it can be safely used as a delimited identifier in a query. Identifiers are objects such as table or column names.

The format returned depends on the database type being used.

Delimited identifiers are known to generally work correctly under the following drivers:

mssql
mysql
mysqli
oci8
odbc(access)
odbc(db2)
pgsql
sqlite
sybase

InterBase doesn't seem to be able to use delimited identifiers via PHP 4. They work fine under PHP 5.

Parameter

string $str

the input to be quoted

Return value

string - the formatted string

Note

This function can not be called statically.

Function available since: Release 1.6.0

Warning

Just because you CAN use delimited identifiers doesn't mean you SHOULD use them. In general, they end up causing way more problems than they solve.

Portability is broken by using the following characters inside delimited identifiers:

backtick (`) -- due to MySQL
double quote (") -- due to Oracle
brackets ([ or ]) -- due to Access

DB_common::quoteSmart()

DB_common::quoteSmart() -- Formats input so it can be safely used as a literal

Description

Format input so it can be safely used as a literal in a query. Literals are values such as strings or numbers which get utilized in places like WHERE, SET and VALUES clauses of SQL statements.

The format returned depends on the PHP data type of input and the database type being used.

Parameter

mixed $in

the input to be quoted

Return value

mixed - the formatted data

The format of the results depends on the input's PHP type:

  • input -> returns

  • NULL -> the string NULL

  • integer or float -> the unquoted number

  • boolean -> output depends on the driver in use

    Most drivers return integers: 1 if true or 0 if false. Some return strings: TRUE if true or FALSE if false. Finally one returns strings: T if true or F if false. Here is a list of each DBMS, the values returned and the suggested column type:

    • dbase -> T/F (Logical)

    • fbase -> TRUE/FALSE (BOOLEAN)

    • ibase -> 1/0 (SMALLINT) [1]

    • ifx -> 1/0 (SMALLINT) [1]

    • msql -> 1/0 (INTEGER)

    • mssql -> 1/0 (TINYINT)

    • mysql -> 1/0 (TINYINT(1))

    • mysqli -> 1/0 (TINYINT(1))

    • oci8 -> 1/0 (NUMBER(1))

    • odbc -> 1/0 (SMALLINT) [1]

    • pgsql -> TRUE/FALSE (BOOLEAN)

    • sqlite -> 1/0 (INTEGER)

    • sybase -> 1/0 (TINYINT)

    [1] Accommodate the lowest common denominator because not all versions of have BOOLEAN.

  • other (including strings and numeric strings) -> a string which has been escaped in a DBMS specific way (using escapeSimple()) and then surrounded by single quotes

Note

This function can not be called statically.

Function available since: Release 1.6.0

DB_common::rollback()

DB_common::rollback() -- Rolls back the current transaction

Description

Rolls back the current transaction.

Return value

integer - DB_OK on success or a DB_Error object on failure

Note

This function can not be called statically.

When using MySQL as your DBMS, transactions can only be used when the tables in question use the InnoDB format.

DB_common::setFetchMode()

DB_common::setFetchMode() -- Sets the default fetch mode

Description

Sets the default fetch mode used by fetch*() and get*() methods.

Parameter

integer $fetchmode

DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC or DB_FETCHMODE_OBJECT.

See the Examples section, below, for more information.

string $object_class

This parameter is for use when $fetchmode is set to DB_FETCHMODE_OBJECT.

You can set this parameter to DB_row, which then causes the resulting data to populate a new instance of a DB_row object.

Return value

void - nothing is returned on success or a DB_Error object on failure

Note

This function can not be called statically.

Example

DB_common::setOption()

DB_common::setOption() -- Sets run-time configuration options for PEAR DB

Description

Sets run-time configuration options for PEAR DB.

Return value

integer - DB_OK on success or a DB_Error object on failure

Note

This function can not be called statically.

DB_common::tableInfo()

DB_common::tableInfo() -- Gets info about columns in a table or a query result

Description

Get information about columns in a table or a query result.

Parameter

mixed $result

DB_result object from a query or a string containing the name of a table

If the name of the table needs to be delimited (ie: the name is a reserved word or has spaces in it), use the quoteIdentifier() method on the table name when passing it.

This can also be a query result resource identifier, but doing so is deprecated.

integer $mode

one of the tableInfo mode constants

Return value

array - an associative array of the table's information or a DB_Error object on failure

The array's contents depends on the $mode parameter.

The names of tables and columns will be lowercased if the DB_PORTABILITY_LOWERCASE portability mode is enabled.

The flags element contains a space separated list of extra information about the column. If the DBMS is able to report a column's default value, the value is passed through rawurlencode() to avoid problems caused by potential spaces in the value.

Most DBMS's only provide the table and flags elements if $result is a table name. Only fbsql and mysql provide full information from queries.

The type element contains the type returned by the DBMS. It varies from DBMS to DBMS.

tableInfo Modes

This section describes the format of the returned array and how it varies depending on which $mode was used when the function was called.

The sample output below is based on this query:
SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId
  FROM tblFoo
  JOIN tblBar ON tblFoo.fldId = tblBar.fldId;

NULL or 0

[0] => Array (
  [table] => tblFoo
  [name] => fldId
  [type] => int
  [len] => 11
  [flags] => primary_key not_null
)
[1] => Array (
  [table] => tblFoo
  [name] => fldPhone
  [type] => string
  [len] => 20
  [flags] =>
)
[2] => Array (
  [table] => tblBar
  [name] => fldId
  [type] => int
  [len] => 11
  [flags] => primary_key not_null
)

DB_TABLEINFO_ORDER

In addition to the information found in the default output, a notation of the number of columns is provided by the num_fields element while the order element provides an array with the column names as the keys and their location index number (corresponding to the keys in the default output) as the values.

If a result set has identical field names, the last one is used.

[num_fields] => 3
[order] => Array (
  [fldId] => 2
  [fldTrans] => 1
)

DB_TABLEINFO_ORDERTABLE

Similar to DB_TABLEINFO_ORDER but adds more dimensions to the array in which the table names are keys and the field names are sub-keys. This is helpful for queries that join tables which have identical field names.

[num_fields] => 3
[ordertable] => Array (
  [tblFoo] => Array (
      [fldId] => 0
      [fldPhone] => 1
  )
  [tblBar] => Array (
      [fldId] => 2
  )
)

DB_TABLEINFO_FULL

Contains the information from both DB_TABLEINFO_ORDER and DB_TABLEINFO_ORDERTABLE

The tableInfo mode constants are bitwised, so they can be combined using |.

Note

This function can not be called statically.

tableInfo() is not portable because not all drivers have this method, many DBMS's are unable to determine table names from query results and the metadata returned by each database system varies dramatically.

DB_result

DB_result -- DB result set

Description

DB_result contains the result set of a SQL query. An instance of this class will be returned by a number of DB_common methods.

DB_result::fetchInto()

DB_result::fetchInto() -- Fetches a row of a result set into a variable

Description

Places a row of data from a result set into a variable you provide then moves the result pointer to the next row. The data can be formatted as an array or an object.

Parameter

mixed $arr

reference to a variable to contain the row

integer $fetchMode

the fetch mode to use. The default is DB_FETCHMODE_DEFAULT, which tells this method to use DB's current fetch mode. DB's current default fetch mode can be changed using setFetchMode(). Potential values include:

  • DB_FETCHMODE_ORDERED

  • DB_FETCHMODE_ASSOC

  • DB_FETCHMODE_OBJECT

integer $rowNum

the row number to fetch. Note that 0 returns the first row, 1 returns the second row, etc.

Return value

integer - DB_OK if a row is processed, NULL when the end of the result set is reached or a DB_Error object on failure

Note

This function can not be called statically.

DB_result::fetchRow()

DB_result::fetchRow() -- Fetches a row from a result set

Description

Returns a row of data from a result set then moves the result pointer to the next row. The data can be formatted as an array or an object.

Parameter

integer $fetchmode

the fetch mode to use. The default is DB_FETCHMODE_DEFAULT, which tells this method to use DB's current fetch mode. DB's current default fetch mode can be changed using setFetchMode(). Potential values include:

  • DB_FETCHMODE_ORDERED

  • DB_FETCHMODE_ASSOC

  • DB_FETCHMODE_OBJECT

integer $rownum

the row number to fetch

Return value

mixed - an array or object containing the row's data, NULL when the end of the result set is reached or a DB_Error object on failure

Note

This function can not be called statically.

DB_result::free()

DB_result::free() -- Releases a result set

Description

Deletes the result set and frees the memory occupied by the result set. Does not delete the DB_result object itself.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

DB_result::nextResult()

DB_result::nextResult() -- Gets result sets from multiple queries

Description

Some database backends supports executing more then one query at the same time. With nextResult() you can go through the result sets.

Warning

This function has nothing to do with with executeMultiple().

Return value

boolean - TRUE if DB_result contains the next result set, FALSE if there is no further result set to fetch

Note

This function can not be called statically.

DB_result::numCols()

DB_result::numCols() -- Gets number of columns in a result set

Description

Get the number of columns of the rows in a result set.

Return value

integer - number of columns or a DB_Error object on failure

Note

This function can not be called statically.

DB_result::numRows()

DB_result::numRows() -- Gets number of rows in a result set

Description

Get the number of rows in a result set.

Warning

For ibase, ifx and oci8, this method only works if the DB_PORTABILITY_NUMROWS portability option is enabled. In addition, for ibase and ifx, PEAR DB must be at version 1.7.0 or greater.

Does not work for Microsoft Access.

Return value

integer - number of rows or a DB_Error object on failure

Note

This function can not be called statically.

DB_Error

DB_Error -- DB Error object

Description

In case of failure, most of the DB functions return a DB_Error object which contains information about the error. DB_Error offers the same functions as PEAR_Error.

The text messages returned by DB_Error::getMessage() are consistent between each DBMS.

The error code integers returned by DB_Error::getCode() are also consistent between each DBMS. The integers returned are based on the DB_ERROR_* constants defined in DB.php.

DB_Error::getDebugInfo() and DB_Error::getUserInfo() return complete native DBMS error reports.


DB_DataObject

Table of Contents
Introduction --  What DB_DataObject can do
Configuration Options --  Setting the defaults for database access
Auto Building and Database Schema --  creating the base Classes and Database schema
DB_DataObject::factory() -- Autoload and instantate class based on table name.
->get() --  Simple Get (Select) request
DB_DataObject::staticGet() -- Simple Get (Select) request, abbreviated and Autoload.
{Child Class}::staticGet() -- Simple Get (Select) request, abbreviated (autogenerated)
->find() -- find results
->fetch() -- fetch next row
->count() -- Perform a select count() request
->insert() -- Insert current objects variables into database
->update() -- Update objects variables into database
->delete() -- Delete items from table
Selecting Specific data (SELECT) --  Advanced Filters - ::query(), ::SelectAdd(), ::whereAdd(), ::Limit(), ::OrderBy(), ::GroupBy(),
->query() -- send a raw query
->free() -- Free resources
->selectAdd() -- Add selected columns
->whereAdd() -- Add WHERE statement
->escape() -- Escape a string for use with Like queries
->limit() -- Set limit
->orderBy() -- Add an order by condition
->groupBy() -- Add group by condition
Automatic Table Linking and Joins --  Automatic Table Linking - ::getLink(), ::getLinks(), ::joinAdd(), ::selectAs()
->getLink() -- fetch and return a related object
->getLinks() -- load related objects
->selectAs() -- Build the select component of a query (usually for joins)
->joinAdd() -- add another dataobject to build a create join query
->set*() and ->get*() -- Automatic Setters and Getters using overload
->setFrom() -- Copy items from Array or Object (for form posting)
->toArray() -- Get an array of the current result
->validate() -- check object data, and call objects validation methods.
->tableName() -- Get or set the table name of an object
->database() -- Get or set the database the object uses
->table() -- Get or set the table schema
->keys() -- Get or set the table keys
->getDatabaseConnection() -- Get the PEAR Database Object
->getDatabaseResult() -- Get the PEAR Database Result Object
DB_DataObject::debugLevel -- set the amount of debugging output
->debug() -- output debug information.
DB_DataObject::raiseError -- throw an error
Casting - Dates, Blobs and Null --  DB_DataObject_Cast ::date(), ::blob(), ::sql()

SQL Builder and Data Modeling Layer

This chapter describes how to use the DB_DataObject SQL Builder and Data Modeling layer

Introduction

Introduction --  What DB_DataObject can do

Introduction

Warning

Zend Optimizer: due to a bug in the optimizer, you will have to either reduce the optimization level, or define the constant DB_DATAOBJECT_NO_OVERLOAD = 0 otherwise PHP may segfault

Pass by Reference, due to a unfixable bug in PHP4, you can not use overload with pass-by-reference arguments (It works OK in PHP5), If you need pass-by-reference, define the constant DB_DATAOBJECT_NO_OVERLOAD = 0

DB_DataObject is a SQL Builder and Data Modeling Layer built on top of PEAR::DB. Its main purpose is to

  • Build SQL and execute statements based on the objects variables.

  • Group source code around the data that they relate to.

  • Provide a simple consistent API to access and manipulate that data.

So what does that mean in english? Well, if you look around at some of the better written PHP applications and frameworks out there, you will notice a common approach to using classes to wrap access to database tables or groups. The prime example of this is the person object, which would frequently look something like this.

The key benefit of this approach is that you are grouping similar actions on a single table in one place, and are more likely to spot duplicated code (eg. two methods that do similar things). You will also notice the global $db variable used here - the fact is that most of the time you will use a common database connection for all your classes, so how should this be dealt with?

The next step on this road is to use the objects variables as a storage mechanism.

As you can see, the current row of data is now stored in the Data Container, and additional methods can be added to manipulate the data in the object or even call other related objects (eg. tables relationships in databases)

As a next step, why not utilize the member variables to perform searches or gets on the database.

As you can see, by assigning values to the object before the find method is called, you can set conditions for the query. DB_DataObjects behaves in a similar way to this, however, you can also add more conditions with the whereAdd() method, or restrict the selection using the selectAdd() method.

Obviously you can carry on down this road and create lots of little containers for each table in your database, and all the code will nicely relate to each table. However, you can see from the examples above that all classes are likely to end up with a common set of methods.

  • to fetch data, like get, find, fetch

  • to update, insert and delete from the data store

  • to automate fetching related objects

So to improve on this, DB_DataObject was born, it started life as a common answer to the issues above, however as most problems grow in complexity as the problem is examined in finer detail, so has DataObjects. It has grown to include

  • A common simple configuration method (for setting database connections)

  • A fast and simple store for database descriptions, so primary keys can be used to locate data quickly

  • a debugger that enables you to see what exactly it is doing.

  • basic data validation - so the strings and integers can be checked.

  • Posibility to build complex joins or get related data by secondary calls (links) .

  • Ability to create and update your Table specific classes with the current database table variables (see autobuilding)

  • Simple to integrate with other packages, with setFrom() and toArray() methods

So what do my classes look like?

Example 37-4. At last some real DataObject Code..

// this is the common configuration code - place in a general site wide include file.
  
    // this  the code used to load and store DataObjects Configuration. 
    $options = &PEAR::getStaticProperty('DB_DataObject','options');
    
    // the simple examples use parse_ini_file, which is fast and efficient.
    // however you could as easily use wddx, xml or your own configuration array.
    $config = parse_ini_file('example.ini',TRUE);
    
    // because PEAR::getstaticProperty was called with and & (get by reference)
    // this will actually set the variable inside that method (a quasi static variable)
    $options = $config['DB_DataObject'];




     // this is normally contained in your DataObjects file (autogenerated by the generator)

    require_once 'DB/DataObject.php';
    
    
    // by extending the base class DB_DataObject - you inherit all the common methods defined in it.
    
    class DataObjects_Person extends  DB_DataObject {
        
        var $id; // this is a primary id (it's specified in a config file - explained later)
        var $name;
        var $friend;
        
        // this is a simple function to get the persons friends..?
        
        function getFriends()
        {
            
            $personObject = $this->factory('person');
            
            // look for all people with their friend number matching this persons id.
            $personObject->friend = $this->id;
            
            // do the select query.
            $personObject->find();
            $array = array();
            
            // fetch the results into the object.
            while ($personObject->fetch()) {
                // use the clone to copy - not really needed but get used to it for PHP5

                $array[] = clone($personObject);
            }
            // return the results.
            return $array;
            
        }
    }
    
    
    
    // and this goes on your display code 
    
    // create a new person class..
    $person = DB_DataObject::Factory('person');
    
    // get the person using the primary key.
    $person->get(12);
    // get the friends.
    $friends = $person->getFriends();
    
    //  DB_DataObjects is designed to make print_r useable to debug your applications.
    print_r($friends);

The above example illustrates the components of the DB_DataObject, by setting the options, all the core objects will be able to auto load the data definitions from a generated ini file, and know how to access the database. (multiple databases are supported - see section on configuration)

The class definition illustrates how you only need to define the data specific code in your class, ignoring all the common methods, along with showing one of the methods for retrieveing multiple rows of data.

The later half illustrates how to query and get the result for a single row. The $person->get() would connect to the database, perform the query, fetch the result and assign the objects variables to the data returned from the query.

As a general rule of thumb method names are usually the same as the SQL statement they relate to.

Configuration Options

Configuration Options --  Setting the defaults for database access

Configuration Options - Required

database DSN

This is the default DSN to connect to your database

schema_location directory

The directory where the DB_DataObject database schema file is store.

DB_DataObject stores the description of the database (Tables and Columns) in an .ini file, in this directory. This information is used to determine if the column is a string and needs quotes, or should be a number (and is checked) at SQL building time. It is quite common to store the schema in the same directory as your DataObject Classes.

require_prefix directory

The Path absolute, or relative to your default include path(s), where your extended classes can be found.

This is used by the staticGet() method and the getLinks() method to auto load classes,

class_prefix string

All the generated Classes are named {class_prefix}ucfirst($table_name). Use this to alter the prefixed name, this is used by the staticGet() and getLinks() methods

Configuration Options - Optional

sequence_{table} string

To Hard code the key (autoincrement/nextval() for a table to a specific key ,overriding anything in the keys definition of the file. Normally used on databases that are not able to be queried correctly for their structure

ignore_sequence_keys string

If you do not want to use pear's nextval(), for automatically filling in sequences, this can disable it for "ALL", or a list of tables "person,cart,group"

debug integer

The default debugging level (default 0=off), 1= basic sql logging,2=result logging, 3=everything

debug_ignore_updates boolean

default FALSE, if set, then updates on the database are disabled.

dont_die boolean

default FALSE, The standard behaviour of dataobjects is to issue a PEAR_ERROR_DIE (eg. exiting PHP), when a fatal error occurs, like database connection failure or sending an invalid object type to a method. However if you need to run it on a live server you will probably want to set this to TRUE and define a PEAR error handler to catch these errors and show a nice friendly 'sorry we are down for maintenence' message page.

quote_identifiers boolean

To force the quotation of identifiers in the SQL statements, set this to 1

proxy string

This enables the building of classes and ini classes on the fly, rather than forcing you to generate the code forhand. (currently the only value supported is "full", which will generate both schema data and default classes when using factory)

Configuration Options - Multiple Databases (optional)

database_* string

When you have multiple databases you can use the database_* to specify the DSN for each database

table_* string

When you have multiple databases you can use the table_* configuration variables to map individual tables to different databases, for example

Configuration Options - Builder

class_location directory

The Directory where your DataObject extended Classes are.

Used by the Class Auto Builder when updating/writing to your class definitions.

extends string

The Name of your Base Class (usually DB_DataObject) is located.

If you wish to add a common layer of useful methods for all classes, you can set the extends_location and extends settings to a different class. the default is 'DB_DataObject'

extends_location directory

The Directory where your Base Class (usually DB_DataObject) is located.

If you wish to add a common layer of useful methods for all classes, you can set the extends_location and extends settings to a different class. the default is 'DB/DataObject.php'

generator_class_rewrite boolean

Normally when you recreate a class from the database, it will only alter the variables, and staticGet, - with this set, it will also update the extends field

build_views boolean

Postgres (and maybe some others), allow you to treat views just like normal tables (eg. insert/update/delete etc. work on them), you can use this option to generate files for all the views in the database.

Note: You will have to specify keys manually in the generated classes (eg. define the methods keys() and sequenceKey(), as the generator can not guess which ones are likely to be the key.

generator_include_regex string

If you only want to generate classes and ini entries for specific tables, you can use this to build a regex, only tables with names matching the regex will be generated, for example /mytables_.*/

generator_exclude_regex string

If you only want to explicitly prevent the generation of classes and ini entries for specific tables, you can use this to build a regex, any tables that match the regex, will not be generated, for example /private_tables_.*/

generator_strip_schema boolean

postgresql has a wierd concept of schemas which end up prefixed to the list of tables. - this makes a mess of class/schema generation setting this to 1, makes the generator strip the schema from the table name

generator_novars boolean

If True, the generator does not write a private or var's definition for the columns so you can overload get/set.

generator_add_validate_stubs boolean

If True, the generator will insert / (or add to existing files) stubs for validate methods.

Auto Building and Database Schema

Auto Building and Database Schema --  creating the base Classes and Database schema

What the Auto Builder (createTables.php) does

One of the essential features of an SQL building tool is to to have some understanding of the database structure, So that Integers can be checked, and strings can be escaped. There a few ways that Querying the database for the table structure could be accomplished

  • on every SQL query

  • At the initialization of every web page.

  • Once, while setting up the application, and store it in a file

DB_DataObject uses the last of these normally (see the section below on Alternatives), it utilizes the parse_ini_file function to read the file, so it should be reasonably fast. However this does involve a stage of setting up DB_DataObject prior to use.

The other key concept of DB_DataObject is that you work with extended classes of DB_DataObject, which do all the 'table' related work. Setting up these classes for a large database can be time consuming, so the createTables.php file will automatically build the skeletons for all these class files.

To start the auto builder simply go to the pear/DB/DataObject/ directory, and type c:\php4\php.exe createTables.php myconfig.ini this will read your configuration file and generate all the base classes, along with the data definition file.

As of Version 1.5, you can use the option "proxy = full", which will cause DataObjects to create classes and schema on the fly, rather than using an ini file or prebuilt classes.

Default Class Definition

The default generated class looks like this.

The class defines the table name, and comments some of table columns for your reference, It also adds the staticGet() method, which can be used to quickly get single rows as Objects. You should add your table related code after the ###END_AUTOCODE.

Prior to version 1.6 a method __clone was created, since PHP5 changed to use $x = clone($y);, this method has been removed. DataObjects now creates a dummy function clone (if necessary), to enable forward compatibility

Database Schema File

The default generated database definition file looks like this, it is located in the directory set by the "schema_location" configuration option, and is named the same as the database.

If you rename the database, you will either have to regenerate the file or copy it to match the same name.

If you change the database schema (eg. add a column or change the type), you will have to regenerate the schema file, using createTables.php, At present, this is not done automatically (although this may be added in the future..)

You should not edit this file by hand (as any changes will be lost when regenerating it). You can override the keys of a table by using a configuration option "sequence_{table} = key", or by defining the sequenceKey() method in your extended class.

The blocks indicate either tables and the type of field with binary addition (1=integer,2=string,128=not null, so 129=integer and not null), or a list of keys for each table. You should not need to edit file.

Alternatives to using a Schema File

It is possible to use DataObjects without a schema file, this can be achieved in 2 ways

  • by defining the table() and keys() methods in an extended class

  • by passing an array to table() and keys() when you have an instance of dataobjects

The second of this is demonstrated on the keys() and tables() page.

Below is a hand coded class which does not use a schema.ini file.

It was designed to be a return value from a method, rather than an object variable, so that the output of print_r(), would not include extra information (and would be smaller when dumping a large result set.

DB_DataObject::factory()

DB_DataObject::factory() -- Autoload and instantate class based on table name.

Description

This is the recommended way to autoload a class, and instantate it. The class is loaded based on the configuration settings (class_location and class_prefix) for table to class naming.

Parameter

  • string $table - the table you want to load ([From Version 1.7.2] if blank, and called on an an instance of a dataobject, it will create a new instance of that object)

Return value

object mixed - DB_DataObject_Error or the object

Note

This method can be called statically or dynamically.

->get()

->get() --  Simple Get (Select) request

Description

Get a result using key, value. Returns Number of rows located (usually 1) for success, and puts all the table columns into this classes variables. If only one parameter is used, it is assumed that first parameter is a value and get() will use the primary key.

Parameter

  • mixed $key or $value - column (or value if only one parameter)

  • mixed $value - value

Return value

int - Number of rows

Note

This function can not be called statically.

You should avoid calling get on the same object instance twice, as this will result in unexpected results.

DB_DataObject::staticGet()

DB_DataObject::staticGet() -- Simple Get (Select) request, abbreviated and Autoload.

Description

Warning

This method is depreciated, it is recommended to use ::factory() and ->get()

The static method is a combination of factory and get(). staticGet() will cache the returned data in a global variable for quick access within the same request (any data modification query will clear the cache).

Parameter

  • string $class - class name

  • string $key - column (or value if only 2 parameters are given)

  • mixed $value - value

Return value

object mixed - FALSE or the object

Note

This method must be called statically.

{Child Class}::staticGet()

{Child Class}::staticGet() -- Simple Get (Select) request, abbreviated (autogenerated)

Description

The static method is similar to the get request, however it does not require the initial instantiation of the class. staticGet() can optionally cache the results. (see the configuration section)

Parameter

  • string $key - column or value if only one parameter is given

  • mixed $value - value

Return value

object mixed - FALSE or the object

Note

This method must be called statically.

->find()

->find() -- find results

Description

The find method builds and executes the current Query, based on the object variables and any WhereAdd() conditions , If the AutoFetch is TRUE, then it will also call the fetch method automatically.

Parameter

  • boolean $autoFetch - fetch first result

Return value

int - number of rows found, only if the database backend supports the numRows() method. Otherwise 1 (or in versions after 1.7.13, true will returned)

Note

This function can not be called statically.

->fetch()

->fetch() -- fetch next row

Description

The fetch method gets the next row and sets the objects variables to the rows data. It returns TRUE if data has been collected, and FALSE when there is no more data.

Return value

boolean - TRUE on success and FALSE on failure.

Note

This function can not be called statically.

Fetch is called by staticGet and get calls, so you can override this method in your classes, to add extra data to your object (like formated dates etc)

->count()

->count() -- Perform a select count() request

Description

It performs a select count() request on the tables key column and returns the number of resulting rows. The default condition applied to the count() is a combination of the object variables and whereAdd settings. If the constant DB_DATAOBJECT_WHEREADD_ONLY is passed in as the first parameter then only the whereAdd settings will be used.

Parameter

  • string $countWhat - by default count will count on the primary key, if you need to count something else, if you just say DISTINCT, it will count the primiary key prefixed with distinct, or put your own value in (don't forget to escape it if necessary)

  • boolean $useWhereAddOnly - use only the whereAdd conditions (by default, count will only use both the object settings and the whereAdd conditions)

Return value

int|false - number of results or false on an error

Note

This function can not be called statically.

->insert()

->insert() -- Insert current objects variables into database

Description

Insert the data into the database, based on the variable values of the current object and returns the ID of the inserted element if sequences or primary keys are being used. The values are correctly quoted, and some limited type checking is done.

With mysql, the mysql_next_id() method is used, on other databases, PEAR DB sequence method is used.

Note, insert() may not return the ID correctly in quite a few situations:

  • If the database backend does not support it.

  • The generator did not correctly flag the correct column as autoincrement/nextval

  • An error occured (turn on debugging to see it)

  • The insert failed or '0' rows where affected.

Return value

mixed - Id or key

Note

This function can not be called statically.

->update()

->update() -- Update objects variables into database

Description

Updates current objects variables into the database. if you supply it with a dataObject, as an argument, it will only update the differences between the new and old.

if called with DB_DATAOBJECT_WHEREADD_ONLY as the argument, the update request is built based on the whereAdd values, rather than the primary key. This enables global updates to be performed, rather than single row ones.

Parameter

  • DataObject $original - if provided the update query will be built from the difference between the current and original dataobject.

Return value

int number of rows affected or FALSE on failure

Note

This function can not be called statically.

->delete()

->delete() -- Delete items from table

Description

Deletes data from the database, either using primary key or based on a whereAdd() method call. By default the delete will base its query on the set variables, however if you wish to use the whereAdd() method you should set the $useWhere parameter to DB_DATAOBJECT_WHEREADD_ONLY.

Parameter

  • boolean $use_where - use the whereAdd() conditions (by default, delete will only use primary keys)

Return value

int number of rows affected or FALSE on failure

Note

This function can not be called statically.

Selecting Specific data (SELECT)

Selecting Specific data (SELECT) --  Advanced Filters - ::query(), ::SelectAdd(), ::whereAdd(), ::Limit(), ::OrderBy(), ::GroupBy(),

More advanced Querying

The basic features allow most simple queries to be done very quickly, however building more complex queries can be done using the methods listed below, which append or set conditions that build the query. You will find that there is a fine balance between using these builder methods and just using raw SQL.

The DB_DataObject can now handle JOIN queries, however please read the introduction to linking and Joining before jumping in and using the Join feature, as you may be trading the use of a cool feature, against the readibility of your code.

->query()

->query() -- send a raw query

Description

Sends a raw query to database. Often you may consider that using a large number of whereAdd's and orderBy method calls are not neccessary, and it would be simpler to just write the query, to make the code clearer and shorter.

Parameter

  • string $string - SQL Query

Note

This function can not be called statically.

->free()

->free() -- Free resources

Description

DataObjects stores result set's as a private global variable, normally this is free'ed after you have run through the results, or at the end of the request. However in some situations, like running queries directly, inserting data, some data is unnecessarly cached.

Using this method will Free All results sets! (so be carefull) it may break running fetch() loops..

You normally only need to use this if you are doing a large number of inserts or queries.

Note

This function can not be called statically.

->selectAdd()

->selectAdd() -- Add selected columns

Description

Adds a selected columns. By default a select query will request all items (eg. SELECT * FROM table), to change this behavior you can first call selectAdd() without any arguments to clear the current request and then add the specific items you require.

You can also set up a default selection query by adding SelectAdd() method calls in the object constructor method (the one with the same name as the class)

Parameter

  • resource $key - table column name

Note

This function can not be called statically.

->whereAdd()

->whereAdd() -- Add WHERE statement

Description

Adds items to the where part of a SQL query. Calling this without any arguments clears the where condition. The default behavior is to add 'AND' to the existing conditions, use the $logic parameter to append OR conditions.

Parameter

  • string $cond - condition to add, or blank to reset the conditions

  • string $logic - optional logic "OR" (defaults to "AND")

Note

This function can not be called statically.

See

->escape()

->escape() -- Escape a string for use with Like queries

Description

Similar to Pear DB's quote it will escape a value, without the quotes, so it can be used with a LIKE query.

Parameter

  • string $value - the string you want to escape

Note

This function can not be called statically.

->limit()

->limit() -- Set limit

Description

Sets the limit for a query. (this only works on databases that support the LIMIT clause), without parameters, it will clear the current limit.

Parameter

  • int $from - limit start (or number), or blank to reset

  • int $number - limit results to number

Note

This function can not be called statically.

Since postgres and mysql only really support limit directly - calling this on an unsupported database will emit a PEAR::Error and die.

->orderBy()

->orderBy() -- Add an order by condition

Description

Adds a order by condition. Calling this without any arguments clears the current order condition.

Parameter

  • string $order - Order

Note

This function can not be called statically.

->groupBy()

->groupBy() -- Add group by condition

Description

Adds a group by condition. Calling this without any arguments clears the Group Condition

Parameter

  • string $group - Grouping condition

Note

This function can not be called statically.

Automatic Table Linking and Joins

Automatic Table Linking and Joins --  Automatic Table Linking - ::getLink(), ::getLinks(), ::joinAdd(), ::selectAs()

Automating the collection of related data

When designing a database, often some tables are related to others - a membership table would contain a reference to a person's id and the group id that they are a member of. Using the Link methods, you can automatically fetch objects into the parents variables.

Automated links are supported by a databasename.links.ini file. which stores the relations ship between tables, maping one tables column to anothers. This databasename.links.ini file is used by the getLinks() and joinAdd() Method, to either retrieve related information of a primary object, or quickly build complex multitable queries.

The other way of using linking is via the getLink() method, which you can manually use without a database.links.ini file to specify a column, and how it relates to another table and column.

The goal of getlinks and joinAdd is to make connecting two tables as simple and fast as possible, while still ensuring that the code is reasonably comprehensable. In the example below, It is demostrated how getlinks() can be used to fetch more data about an object after the initial fetch, and it can also be used to test the links file prior to building a full blown join Query.

Example 37-1. A simple introduction to links and joins

// just loop and fetch more information

$person = new DataObjects_Person;
$person->eyeColour = 'red';
$person->find();
while ($person->fetch()) {
    // this will look up in the cars table for the id matching the person->car value.

    $car = $person->getLink('car','cars','id');

    echo "{$person->name} has red eyes and owns a {$car->type}\n";
}





// now if you create a database.links.ini file with the car example
// the example would look like this.

$person = new DataObjects_Person;
$person->eyeColour = 'red';
$person->find();
while ($person->fetch()) {

    // use the links.ini file to automatically load
    // the car object into $person->_car
    $person->getLinks();

    echo "{$person->name} has red eyes and owns a {$person->_car->type}\n";
}






// and finally the most complex, using SQL joins and select as.
// the example would look like this.

$person = new DataObjects_Person;
$person->eyeColour = 'red';

// first, use selectAs as to make the select clauses match the column names.
$person->selectAs();

// now lets create the related element
$car = new DataObjects_Car;

// and for fun.. lets look for red eys and red cars..
$car->colour = 'red';

// add them together.
$person->joinAdd($car);

// since both tables have the column id in them, we need to reformat the query so
// that the car columns have a different name.

$person->selectAs($car,'car_%s');




$person->find();
while ($person->fetch()) {

    echo "{$person->name} has red eyes and owns a {$person->car_type}\n";
}

Using link ini files for table links

DB_DataObject Version 0.3 introduced the ability to create link ini files so you can map column to other database columns using an ini file this ini file should have the name 'databasename.links.ini', and be placed in the same folder as the database schema ini file 'databasename.ini' file that is created automatically by createTables.php

The databasename.links.ini file contains a section for each table, then the column that is linked equal to the table and column that it should locate the column from. It assumes the relationships are non-primary id to primary id, as the example below shows, the person.owner is linked to grp.id. This indicates that running getLinks() on the person object, will fetch a single bit of data from 3 tables - colurs,grp,attachments.

If you use a 'full stop' in the key (link from column), getLinks() will look up in the table with the column name matching the string to the left of the 'full stop', and replace the 'full stop' with and underscore and assign the object variable to that name. Or you may wish to use the selectAs() method to decide how you want columns from different objects to be returned (when using joinAdd())

It is also possible to create joins on keys consisting of more than one column. Use the following syntax:

This will lead to the following select statement (here using the INNER JOIN syntax):

->getLink()

->getLink() -- fetch and return a related object

Description

Fetch a related object. This should be used in conjunction with a <dbname>.links.ini file configuration (see the introduction on linking for details on this).

You may also use this with all parameters to specify, the column, and related table and column.

Parameter

  • string $column - either column or column.xxxxx

  • string $table - name of table to look up value in

  • string $link - name of column in other table to match

Return value

mixed - object on success or FALSE on failure.

Note

This function can not be called statically.

->getLinks()

->getLinks() -- load related objects

Description

Loads the all the related objects into the main object, by using the links.ini relationships, and sets the calling objects variables with the row name prefixed with an underscode (_) to the resulting objects.

Using this with the earlier column naming convention is depreciated, and links.ini files should be used.

Parameter

Return value

boolean - TRUE on success and FALSE on failure

Note

This function can not be called statically.

Example

Example 37-2. Two Example Tables

Person
+---------------+---------------+------+-----+---------+----------------+
| Field         | Type          | Null | Key | Default | Extra          |
+---------------+---------------+------+-----+---------+----------------+
| id            | mediumint(9)  |      | PRI | 0       | auto_increment |
| first_name    | varchar(80)   | YES  |     | NULL    |                |
| last_name     | varchar(80)   |      | MUL |         |                |
| middle_name   | varchar(80)   | YES  |     | NULL    |                |
| badge_number  | smallint(6)   | YES  |     | NULL    |                |
| street        | varchar(80)   | YES  |     | NULL    |                |
| city          | varchar(80)   | YES  |     | NULL    |                |
| state         | varchar(80)   | YES  |     | NULL    |                |
| zip           | varchar(15)   | YES  |     | NULL    |                |
| phone         | varchar(15)   | YES  |     | NULL    |                |
| reg_type      | varchar(80)   | YES  |     | NULL    |                |
| judge         | varchar(10)   | YES  |     | NULL    |                |
| staff         | varchar(10)   | YES  |     | NULL    |                |
| volunteer     | varchar(10)   | YES  |     | NULL    |                |
| rpga_number   | mediumint(9)  | YES  |     | NULL    |                |
| total_fee     | float(10,2)   | YES  |     | NULL    |                |
| email_address | varchar(80)   | YES  |     | NULL    |                |
| country       | varchar(30)   | YES  |     | NULL    |                |
| convention_id | int(11)       |      |     | 0       |                |
| last_modified | timestamp(14) | YES  |     | NULL    |                |
+---------------+---------------+------+-----+---------+----------------+

Convention
+----------------------+---------------+------+-----+---------+----------------+
| Field                | Type          | Null | Key | Default | Extra          |
+----------------------+---------------+------+-----+---------+----------------+
| id                   | int(11)       |      | PRI | 0       | auto_increment |
| name                 | varchar(50)   |      |     |         |                |
| sponsor_organization | varchar(50)   |      |     |         |                |
| rpga_convention_code | varchar(20)   |      |     |         |                |
| web_site_url         | varchar(200)  |      |     |         |                |
| last_modified        | timestamp(14) | YES  |     | NULL    |                |
| room_id              | int(11)       |      |     |         |                |
+----------------------+---------------+------+-----+---------+----------------+

Room
+----------------------+---------------+------+-----+---------+----------------+
| Field                | Type          | Null | Key | Default | Extra          |
+----------------------+---------------+------+-----+---------+----------------+
| room_id              | int(11)       |      | PRI | 0       | auto_increment |
| name                 | varchar(50)   |      |     |         |                |
+----------------------+---------------+------+-----+---------+----------------+

Example 37-5. Resulting Output

Object:dataobjects_person Object
(
    [_DB_DataObject_version] => 1.0
    [__table] => person
    [_database_dsn] =>
    [_database_dsn_md5] => 3974043abbccdd6412fb156a1d10b98377
    [_database] => testing
    [_condition] =>
    [_group_by] =>
    [_order_by] =>
    [_limit] =>
    [_data_select] => *
    [_link_loaded] => 1
    [_lastError] => pear_error Object
        (
            [error_message_prefix] =>
            [mode] => 1
            [level] => 1024
            [code] => -3
            [message] => getLink:Could not find class for row last_modified, table last
            [userinfo] =>
            [callback] =>
        )

    [id] => 1079
    [N] => 1
    [_DB_resultid] => 2
    [first_name] => Tim
    [last_name] => White
    [middle_name] =>
    [badge_number] => 123
    [street] => 334411 N Washington
    [city] => Texas
    [state] => CO
    [zip] => 12345
    [phone] => 343412323232
    [reg_type] => Staff
    [judge] =>
    [staff] => CHECKED
    [volunteer] =>
    [rpga_number] => 1232323
    [total_fee] => 0.00
    [email_address] => tim@example.com
    [country] => USA
    [convention_id] => 1
    [last_modified] => 20020711084539
    [_first_name] =>
    [_last_name] =>
    [_middle_name] =>
    [_badge_number] =>
    [_reg_type] =>
    [_rpga_number] =>
    [_total_fee] =>
    [_email_address] =>
    [_convention_id] => dataobjects_convention Object
        (
            [_DB_DataObject_version] => 1.0
            [__table] => convention
            [_database_dsn] =>
            [_database_dsn_md5] => 3974043abbcc86412fb156a1d10b98377
            [_database] => testing
            [_condition] =>
            [_group_by] =>
            [_order_by] =>
            [_limit] =>
            [_data_select] => *
            [_link_loaded] =>
            [_lastError] =>
            [id] => 1
            [N] => 1
            [_DB_resultid] => 3
            [name] => ABCD XYZ
            [sponsor_organization] => some sponser
            [rpga_convention_code] => ABCD_XYZ
            [web_site_url] => http://example.com
            [last_modified] => 20020703143828
            [room_id] => 1
        )

    [_last_modified] =>
)

** Note,  This error: [message] => getLink:Could not find class for row last_modified, table last

is caused by the original link code using {tablename}_{colname} for guessing links, this automated
linking should be ignored, and not used, as it is depreciated.

->selectAs()

->selectAs() -- Build the select component of a query (usually for joins)

Description

Auto creates select items based on either the current objects column names, the supplied object, or an array.

This is primarily used in conjunciton with joinAdd, to enable the renaming of columns into a fixed format when they are likely to have naming conflicts (like both tables have an 'id' column).

Sending no arguments to selectAs, will reset the current select (usually removing the default *), and build a select list based on the current objects column names.

Parameter

  • object | array $column_or_object - a dataobject or array of column names

  • string $format - the format the columns will appear, using sprintf format, the %s is replaced with the column name so car_%s would result in the SQL 'car.name as car_name' being generated.

  • string $tableName - this is used either when use send an array as the first argument, or when you are joining a table 'as' another name,

Note

This function can not be called statically.

Example

Example 37-1. Using selectAs()

<?php       
// ok lets see what is going on..
DB_DataObject::debugLevel(1);       
       
$person = new DataObjects_Person;


// to generate "person.id as id , person.name as name ......."
$person->selectAs();

// to generate a restricted list.. "person.age as age , person.name as name"
$person->selectAs(array('age','name'));

// using another object. 
$car = new DataObjects_Car;

// this is the first car (
$car->use = 'first';


// using the joinadd add the car..
$person->joinAdd($car); 

// now add all the select columns for the car eg. "car.id as car_id, car.name as car_name ...."
$person->selectAs($car, 'car_%s');


// select only a few columns from the car table.
// note you have to use the table name at the end..
$person->selectAs(array('color','topspeed'), 'car_%s','car');




// now the user can have a second car....
$secondcar = new DataObjects_Car;
$secondcar->use = 'second';

// now since we alreay have one car, the sql statement would get messy 
// so we are joining this as the second car "FROM person INNER JOIN car ..... , car as secondcar WHERE .....
$person->joinAdd($secondcar,'','secondcar'); 

// and we can now add all the columns
// "secondcar.id as secondcar_id, secondcar.name as secondcar_name ........
// note that you must use the last field as the SECONDCAR.ID format uses the 'AS' name, rather than the 
// objects real table name 'car'
$person->selectAs($secondcar, 'secondcar_%s','secondcar');

 

// ok fire of a query...
$person->find();
while ($person->fetch()) {
  ......
}


?>

->joinAdd()

->joinAdd() -- add another dataobject to build a create join query

Description

Builds a Join Query, by adding another dataobject to this one. Be careful when using this, raw queries may be clearer than using joinAdd.

Thanks to Stijn de Reede for the implementation of this.

Parameter

  • object $obj - joining object (no value resets the join)

  • string $joinType - "LEFT" | "INNER " | "RIGHT" | ""

    INNER is default, "" indicates just select ... from a,b,c with no join and links are added as where items.

    Note: 'LEFT' is the same as LEFT OUTER.

  • string $joinAs - if you want to select the table as anther name useful when you want to select multiple columns from a secondary table.

  • string $joinCol - The column on This objects table to match,needed if this table links to the child object in multiple places eg.

Note

This function can not be called statically.

The Examples below are not tested, use DB_DataObject::debugLevel(1), to see what exactly is going on when you use this, and send the author some better examples..

->set*() and ->get*()

->set*() and ->get*() -- Automatic Setters and Getters using overload

Description

From version PHP 4.3.2RC2 onwards, DB_DataObject is automatically overloaded, providing access to all variables using $object->set{ColumnName}() and $object->set{ColumnName}($value) even if you have not defined the method.

It is assumed that set methods return strings as errors or TRUE, so that it can interact with setFrom and return array's of error strings.

The get Methods are used by toArray(), if defined they can be used to alter the appearance of columns ,like making dates human readable

The logic is very simple, if you call $object->setXXX() and it is not defined, it will just set the value, if you define a method setXXXX, that will be called instead of the default handler, same applies to getXXX().

Due to the naming conflict possiblity of a column named from, the associated method for column 'from' is set_from, rather than setFrom()

Parameter

  • mixed $value - on setters only (the value to assign to the column), on getters you may like to implement date formating or sprintf formating as the argument.

Return value

mixed - setters will return TRUE from the default method, in your implementations of setters. It is expected that setXXX($value) will return a string (the error) if it is invalid or TRUE on success. getXXX may return the value or a formated value, remember though it affects $object->toArray().

Note

This function can not be called statically.

Warning: This is experimental, its behavour may change slightly in the future.

->setFrom()

->setFrom() -- Copy items from Array or Object (for form posting)

Description

Copies items that are in the table definitions from an array or object into the current object (It will not override key values). This can be used to process form posts (if the field names match the database), or cloning similar objects.

you can not set the value of a key column using setFrom, It is silently ignored for security reasons. (you can still assign it manually)

setFrom will attempt to call the setters set{columnname} methods if they exist, It will also call fromValue(), which formats dates correctly.

You may realize that this method overlaps the overloaded method for the column name from, due to this, the associated methods for the column name 'from' are set_from and getFrom.

Parameter

  • array or Object $from - what to copy from

  • string $format - the format of the array or object variables and how they relate to this object. for example if your input array is in the format prefix_COLNAME, then you can use 'prefix_%s'.

  • bool $skipEmpty - If set to true, DB_DataObject will not assign empty values if a column is empty (eg. '' / 0 etc...)

Return value

array or boolean - TRUE on success or an array of set*() return values in PHP4.3.2 upwards

Note

This function can not be called statically.

->toArray()

->toArray() -- Get an array of the current result

Description

Allows the fetching of an associate array (with optional key formating) for use with other packages, like HTML_QuickForm.

From PHP4.2.3RC2 onwards, The values of each column are retrieved using getXXXX() methods so you can change the formating of a row by defining a getter method.

Parameter

  • string $format - a sprintf string eg. 'form[%s]'

  • bool $hideEmpty - If set to true, empty elements (no value/null) will not be returned

Note

This function can not be called statically.

->validate()

->validate() -- check object data, and call objects validation methods.

Description

Check all the objects variables to see if they are valid, by default this means is a column an integer or string, if you define methods like validateEmail(), in your extended class then it will be called to validate the row called 'email'. This may be useful if called prior to an update or insert.., to generate error messages.

override this to set up your validation rules.

Return value

array - of validation results or TRUE

Note

This function can not be called statically.

the examples below utilize the PEAR validation package

->tableName()

->tableName() -- Get or set the table name of an object

Description

Without any argument, it returns the table name that the object deals with. With a string, it will set the table name for the instance of the object.

Note

This function can not be called statically.

->database()

->database() -- Get or set the database the object uses

Description

Without any argument, it returns the database that the object deals with. With a string, it will set the database for the instance of the object.

Note

This function can not be called statically.

->table()

->table() -- Get or set the table schema

Description

Without any argument, it returns the table schema that the object deals with. With an array, it will set the table schema for the instance of the object.

The default schema is normally stored in the database.ini file described in the Autobuilding section.

Note

This function can not be called statically.

->keys()

->keys() -- Get or set the table keys

Description

Without any argument, it returns the keys used by the object (the generator builds these and guess'es them based on finding things like primary key, unique, or nextval() in the description. Calling it with a value , or mulitple values, sets it for the current instance of the object.

The default keys are is normally stored in the database.ini file described in the Autobuilding section.

Note

This function can not be called statically.

->getDatabaseConnection()

->getDatabaseConnection() -- Get the PEAR Database Object

Description

Fetch the pear database connection that the object uses - so you can find information or send queries directly to it.

Note

This function can not be called statically.

->getDatabaseResult()

->getDatabaseResult() -- Get the PEAR Database Result Object

Description

Fetch the pear database result object - so you can use it with things like the Pager or HTML_Select classes

Note

This function can not be called statically.

DB_DataObject::debugLevel

DB_DataObject::debugLevel -- set the amount of debugging output

Description

Sets and returns debug level. So you can see the queries and connections being built and executed.

Parameter

  • integer $level - level, without any parameters it will disable the debugging output. 1 give a general output, 5 includes things like passwords for connections.

Note

This function can not be called statically.

->debug()

->debug() -- output debug information.

Description

Debugger - you can use this in your extended classes to output debugging information. Uses DB_DataObject::DebugLevel(x) to turn it on, and can be completly turned off by using the production setting in the configuration file

Parameter

  • string $message - message to output

  • string $logPrefix - A bold prefix string

  • integer $level - output level, 1 is general, 5 tends to reveal things like database connection passwords..

Note

This function can not be called statically.

Warning

In production mode, the debugger is disabled

DB_DataObject::raiseError

DB_DataObject::raiseError -- throw an error

Description

Default error handling is to create a PEAR::Error, but never return it. If you need to handle errors you should look at setting the PEAR_Error callback this is due to the fact it would wreck havoc on the internal methods!

Parameter

  • int $message - message

  • resource $type - type

  • resource $behaviour - behaviour (die or continue!);

Return value

object [unknown] -

Note

This function can not be called statically.

Casting - Dates, Blobs and Null

Casting - Dates, Blobs and Null --  DB_DataObject_Cast ::date(), ::blob(), ::sql()

Dealing with Casting, (everything except strings and numbers)

Warning

This is experimental!, although it is documented, it currently only supports a limited amount of databases (send me fixes if you want it to support your favorite database), and the internal operations/API may change in the future..

DataObjects is a very easy way to work with databases that are focused on numbers and strings. You can also use it on date fields (although you must format your strings correctly), and you can use it with other types by using raw SQL query(), and the string value "null" is automatically converted to NULL in the database.

In an effort to provide a cleaner way to code to the richer database types, the DB_DataObject_Cast object was created. It's purpose is to simply create an object to represent some of the more unusual types. Below is an example of using it to create a few simple types.

Cast Objects can be used in both building queries, and assigning values

As you can see, This component is in it"s infancy, so if you have any feature requests, ideas, please do not hesitate to contact me at alan_k at php dot net.


DB_DataObject_FormBuilder

Table of Contents
Introduction --  A package for building HTML forms from DataObject classes

A package for building HTML forms from DataObject classes.

For now, detailed documentation is available here.

You can view a presentation about FormBuilder here.

Introduction

Introduction --  A package for building HTML forms from DataObject classes

DB_DataObject_FormBuilder Description

DB_DataObject_FormBuilder will aid you in rapid application development using the packages DB_DataObject and HTML_QuickForm. For having a quick but working prototype of your application, simply model the database, run DataObject createTable script over it and write a script that passes one of the resulting objects to the FormBuilder class. The FormBuilder will automatically generate a simple but working HTML_QuickForm object that you can use to test your application. It also provides a processing method that will automatically detect if an insert() or update( )command has to be executed after the form has been submitted. If you have set up DataObject links.ini file correctly, it will also automatically detect if a table field is a foreign key and will populate a selectbox with the linked tables entries. There are many optional parameters that you can place in your DataObjects.ini or in the properties of your derived classes, that you can use to fine-tune the form-generation, gradually turning the prototypes into fully-featured forms, and you can take control at any stage of the process. Basic usage:
$do =& new MyDataObject();
// Insert "$do->get($some_id);" here to edit an 
// existing object instead of making a new one
$fg =& DB_DataObject_FormBuilder::create($do);
$form =& $fg->getForm();
if ($form->validate()) {
    $form->process(array(&$fg,'processForm'), false);
$form->freeze();
}
$form->display();


DB_NestedSet

Table of Contents
Introduction --  Introduction to DB_NestedSet
DB_NestedSet::addListener() -- Add an event listener
DB_NestedSet::apiVersion() -- apiVersion
DB_NestedSet::convertTreeModel() -- Convert a <1.3 tree into a 1.3 tree format
DB_NestedSet::createLeftNode() -- Creates a node before a given node
DB_NestedSet::createRightNode() -- Creates a node after a given node
DB_NestedSet::createRootNode() --  Creates a new root node. If no id is specified then it is either added to the beginning/end of the tree based on the $pos.
DB_NestedSet::createSubNode() -- Creates a subnode
DB_NestedSet::deleteNode() -- Deletes a node
DB_NestedSet::factory() --  Handles the returning of a concrete instance of DB_NestedSet based on the driver.
DB_NestedSet::getAllNodes() -- Fetch the whole NestedSet
DB_NestedSet::getBranch() -- Fetch the whole branch where a given node id is in
DB_NestedSet::getChildren() -- Fetch the children _one level_ after of a node given by id
DB_NestedSet::getParent() -- Fetch the immediate parent of a node given by id
DB_NestedSet::getParents() -- Fetch the parents of a node given by id
DB_NestedSet::getRootNodes() -- Fetches the first level (the rootnodes) of the NestedSet
DB_NestedSet::getSiblings() --  Fetch all siblings of the node given by id Important: The node given by ID will also be returned Do a unset($array[$id]) on the result if you don't want that
DB_NestedSet::getSubBranch() -- Fetch all the children of a node given by id
DB_NestedSet::isParent() -- See if a given node is a parent of another given node
DB_NestedSet::moveTree() -- Wrapper for node moving and copying
DB_NestedSet::pickNode() -- Fetch the data of a node with the given id
DB_NestedSet::removeListener() -- Removes an event listener
DB_NestedSet::setAttr() -- Sets an object attribute
DB_NestedSet::setDbOption() -- Sets a db option. Example, setting the sequence table format
DB_NestedSet::setsortMode() -- This enables you to set specific options for each output method
DB_NestedSet::testLock() -- Tests if a database lock is set
DB_NestedSet::triggerEvent() -- Triggers and event an calls the event listeners
DB_NestedSet::updateNode() -- Changes the payload of a node

With this package, one can easily create trees with infinite depth inside a relational database.

Introduction

Introduction --  Introduction to DB_NestedSet

Overview

With this package, one can easily create trees with infinite depth inside a relational database. The package provides a way to

  • create/update/delete nodes

  • query nodes, trees and subtrees

  • copy (clone) nodes, trees and subtrees

  • move nodes, trees and subtrees

  • etc.

DB_NestedSet::addListener()

DB_NestedSet::addListener()  -- Add an event listener

Description

Adds an event listener and returns an ID for it Known events are nodeCreate nodeDelete nodeUpdate nodeCopy nodeLoad

Parameter

string $event

The event name

string $listener

The listener object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::apiVersion()

DB_NestedSet::apiVersion()  -- apiVersion

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::convertTreeModel()

DB_NestedSet::convertTreeModel()  -- Convert a <1.3 tree into a 1.3 tree format

Description

This will convert the tree into a format needed for some new features in 1.3. Your <1.3 tree will still work without converting but some new features like preorder sorting won't work as expected.

Usage: - Create a new node table (tb_nodes2) from the current node table (tb_nodes1) (only copy the structure). - Create a nested set instance of the 'old' set (NeSe1) and one of the new set (NeSe2) - Now you have 2 identical objects where only node_table differs - Call DB_NestedSet::convertTreeModel(&$orig, &$copy); - After that you have a cleaned up copy of tb_nodes1 inside tb_nodes2

Parameter

&$orig

&$copy

integer $_parent

ID of the parent node (private)

object $copy

Object where the new tree is copied to

Return value

returns True uns success

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::createLeftNode()

DB_NestedSet::createLeftNode()  -- Creates a node before a given node

Description


 +-- root1
 |
 +-\ root2
 | |
 | |-- subnode2 [new]
 | |-- subnode1 [target]
 | |-- subnode3
 |
 +-- root3

Parameter

integer $id

Target node ID

array $values

Hash with param => value pairs of the node (see $this->params)

boolean $returnID

Tell the method to return a node id instead of an object. ATTENTION: That the method defaults to return an object instead of the node id has been overseen and is basically a bug. We have to keep this to maintain BC. You will have to set $returnID to TRUE to make it behave like the other creation methods. This flaw will get fixed with the next major version.

Return value

returns The node id or false on error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::createRightNode()

DB_NestedSet::createRightNode()  -- Creates a node after a given node

Description


 +-- root1
 |
 +-\ root2
 | |
 | |-- subnode1 [target]
 | |-- subnode2 [new]
 | |-- subnode3
 |
 +-- root3

Parameter

integer $id

Target node ID

array $values

Hash with param => value pairs of the node (see $this->params)

boolean $returnID

Tell the method to return a node id instead of an object. ATTENTION: That the method defaults to return an object instead of the node id has been overseen and is basically a bug. We have to keep this to maintain BC. You will have to set $returnID to TRUE to make it behave like the other creation methods. This flaw will get fixed with the next major version.

Return value

returns The node id or false on error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::createRootNode()

DB_NestedSet::createRootNode()  --  Creates a new root node. If no id is specified then it is either added to the beginning/end of the tree based on the $pos.

Description

Optionally it deletes the whole tree and creates one initial rootnode


 +-- root1 [target]
 |
 +-- root2 [new]
 |
 +-- root3
  

Parameter

array $values

Hash with param => value pairs of the node (see $this->params)

integer $id

ID of target node (the rootnode after which the node should be inserted)

boolean $first

Danger: Deletes and (re)inits the whole tree - sequences are reset

string $pos

The position in which to insert the new node.

Return value

returns The node id or false on error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::createSubNode()

DB_NestedSet::createSubNode()  -- Creates a subnode

Description


 +-- root1
 |
 +-\ root2 [target]
 | |
 | |-- subnode1 [new]
 |
 +-- root3

Parameter

integer $id

Parent node ID

array $values

Hash with param => value pairs of the node (see $this->params)

Return value

returns The node id or false on error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::deleteNode()

DB_NestedSet::deleteNode()  -- Deletes a node

Description

This package is not documented yet.

Parameter

integer $id

ID of the node to be deleted

Return value

returns True if the delete succeeds

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::factory()

DB_NestedSet::factory()  --  Handles the returning of a concrete instance of DB_NestedSet based on the driver.

Description

If the class given by $driver allready exists it will be used. If not the driver will be searched inside the default path ./NestedSet/

Parameter

string $driver

The driver, such as DB or MDB

string $dsn

The dsn for connecting to the database

array $params

The field name params for the node table

Return value

returns DB_NestedSet object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getAllNodes()

DB_NestedSet::getAllNodes()  -- Fetch the whole NestedSet

Description

This package is not documented yet.

Parameter

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getBranch()

DB_NestedSet::getBranch()  -- Fetch the whole branch where a given node id is in

Description

This package is not documented yet.

Parameter

integer $id

The node ID

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getChildren()

DB_NestedSet::getChildren()  -- Fetch the children _one level_ after of a node given by id

Description

This package is not documented yet.

Parameter

integer $id

The node ID

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

boolean $forceNorder

(optional) Force the result to be ordered by the norder param (as opposed to the value of secondary sort). Used by the move and add methods.

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getParent()

DB_NestedSet::getParent()  -- Fetch the immediate parent of a node given by id

Description

This package is not documented yet.

Parameter

integer $id

The node ID

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

$useDB

Return value

returns False on error, or the parent node

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getParents()

DB_NestedSet::getParents()  -- Fetch the parents of a node given by id

Description

This package is not documented yet.

Parameter

integer $id

The node ID

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getRootNodes()

DB_NestedSet::getRootNodes()  -- Fetches the first level (the rootnodes) of the NestedSet

Description

This package is not documented yet.

Parameter

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getSiblings()

DB_NestedSet::getSiblings()  --  Fetch all siblings of the node given by id Important: The node given by ID will also be returned Do a unset($array[$id]) on the result if you don't want that

Description

This package is not documented yet.

Parameter

integer $id

The node ID

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or the parent node

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::getSubBranch()

DB_NestedSet::getSubBranch()  -- Fetch all the children of a node given by id

Description

getChildren only queries the immediate children getSubBranch returns all nodes below the given node

Parameter

string $id

The node ID

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::isParent()

DB_NestedSet::isParent()  -- See if a given node is a parent of another given node

Description

A node is considered to be a parent if it resides above the child So it doesn't mean that the node has to be an immediate parent. To get this information simply compare the levels of the two nodes after you know that you have a parent relation.

Parameter

mixed $parent

The parent node as array or object

mixed $child

The child node as array or object

Return value

returns True if it's a parent

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::moveTree()

DB_NestedSet::moveTree()  -- Wrapper for node moving and copying

Description

This package is not documented yet.

Parameter

integer $id

Source ID

$targetid

Target ID

constant $pos

Position (use one of the NESE_MOVE_* constants)

boolean $copy

Shall we create a copy

integer $target

Target ID

Return value

returns ID of the moved node or false on error

See

see _moveInsideLevel

see _moveRoot2Root

see _moveAcross

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::pickNode()

DB_NestedSet::pickNode()  -- Fetch the data of a node with the given id

Description

This package is not documented yet.

Parameter

integer $id

The node id of the node to fetch

boolean $keepAsArray

(optional) Keep the result as an array or transform it into a set of DB_NestedSet_Node objects?

boolean $aliasFields

(optional) Should we alias the fields so they are the names of the parameter keys, or leave them as is?

string $idfield

(optional) Which field has to be compared with $id? This is can be used to pick a node by other values (e.g. its name).

array $addSQL

(optional) Array of additional params to pass to the query.

Return value

returns False on error, or an array of nodes

See

see _addSQL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::removeListener()

DB_NestedSet::removeListener()  -- Removes an event listener

Description

Removes the event listener with the given ID

Parameter

string $event

The ivent name

string $listenerID

The listener's ID

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::setAttr()

DB_NestedSet::setAttr()  -- Sets an object attribute

Description

This package is not documented yet.

Parameter

array $attr

An associative array with attributes

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::setDbOption()

DB_NestedSet::setDbOption()  -- Sets a db option. Example, setting the sequence table format

Description

This package is not documented yet.

Parameter

$option

$val

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::setsortMode()

DB_NestedSet::setsortMode()  -- This enables you to set specific options for each output method

Description

This package is not documented yet.

Parameter

constant $sortMode

Return value

returns sortMode

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::testLock()

DB_NestedSet::testLock()  -- Tests if a database lock is set

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::triggerEvent()

DB_NestedSet::triggerEvent()  -- Triggers and event an calls the event listeners

Description

This package is not documented yet.

Parameter

string $event

The Event that occured

&$node

Node

array $eparams

A associative array of params which may be needed by the handler

object $node

A Reference to the node object which was subject to changes

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DB_NestedSet::updateNode()

DB_NestedSet::updateNode()  -- Changes the payload of a node

Description

This package is not documented yet.

Parameter

integer $id

Node ID

array $values

Hash with param => value pairs of the node (see $this->params)

$_internal

Internal use only.

boolean $_intermal

Internal use only. Used to skip value validation. Leave this as it is.

Return value

returns True if the update is successful

Throws

throws no exceptions thrown

Note

This function can not be called statically.


DB_QueryTool

Table of Contents
Introduction --  An OO-interface for easily retrieving and modifying data in a database

Warning

This package has been superseded. Please use MDB_QueryTool for new projects.

This package is an OO-abstraction to the SQL-Query language, it provides methods such as setWhere, setOrder, setGroup, setJoin, etc. to easily build queries.

Introduction

Introduction --  An OO-interface for easily retrieving and modifying data in a database

DB_QueryTool Description

This package is an OO-abstraction to the SQL-Query language, it provides methods such as setWhere, setOrder, setGroup, setJoin, etc. to easily build queries. It also provides an easy to learn interface that interacts nicely with HTML-forms using arrays that contain the column data, that shall be updated/added in a database. This package bases on an SQL-Builder which lets you easily build SQL-Statements and execute them.

You can find some useful usage examples and docs in the MDB_QueryTool documentation. Everything there holds true for DB_QueryTool too, except for the class name, of course.


DB_Table

Table of Contents
Introduction --  Overview of the DB_Table package.
DB_Table Class Tutorial --  Interface to a single table
DB_Table Forms Tutorial --  Creating HTML_QuickForm forms
DB_Table_Database Class Tutorial --  Interface to a relational database
DB_Table_Generator Class Tutorial --  Code generation for an existing database
DB_Table Data Types --  Abstract data types used in DB_Table column definitions

An object-oriented interface to a database

Introduction

Introduction --  Overview of the DB_Table package.

Description

The DB_Table package provides an object oriented interface to a database. It contains three main classes:

  • DB_Table - interface to and model of a single database table.

  • DB_Table_Database - interface to and model of a relational database.

  • DB_Table_Generator - code generation for an existing database.

The package grew around the DB_Table class, which was written by Paul M. Jones. The Database and Generator class were added in releases 1.5.0RC1 and 1.5.0RC2, respectively. These manual pages document release 1.5.0.

The properties of the core DB_Table class contain the schema for a table, defined using portable data types. The class methods provides a convenient API for constructing and submitting INSERT, UPDATE, DELETE, and SELECT SQL commands, and for creation of a RDBMS database table from the defined schema. Simple data type validation is provided for data to be inserted or updated. The class provides methods to automatically generate HTML_QuickForm input forms that match the column definitions.

Each instance of DB_Table_Database contains a model of relationships between tables in a database, in which each table is represented by an instance of DB_Table. The autoJoin() method can automatically construct join conditions for queries that join any number of tables. The class also provides optional PHP validation of foreign key validity, and optional PHP emulation of actions triggered on delete or update of referenced rows, such as cascading deletes.

The DB_Table_Generator class may be used to automatically generate the PHP code necessary to use the DB_Table package as an interface to an existing database. It is used (if at all) only during set-up of the interface for a database.

Each of these three classes is discussed in a separate tutorial in the following manual pages.

DB_Table Class Tutorial

DB_Table Class Tutorial --  Interface to a single table

Description

This tutorial uses an extended example to introduce the use of the DB_Table class as an interface to a single database table. This class provides:

  • Column and index definitions embedded in the object properties, using portable data types.

  • Creation or verification of the table from the declared schema.

  • Simplified API for SELECT, INSERT, UPDATE, and DELETE commands.

  • Array syntax for SELECT commands, and stored baseline queries.

  • Data type validation for inserted/updated column values

  • Auto-increment emulation

  • Automated creation of HTML_QuickForm elements from the column definitions.

This class tutorial contains two manual pages: This page documents all of the features of DB_Table except those involving HTML_Quick form generation, which are discussed in the next page. The tutorial is based closely upon the original external documentation for DB_Table, by Paul M. Jones, which is still available here. The original documentation includes some examples of how to customize a DB_Table subclass definition that are not included here.

The DB_Table and DB_Table_Database classes both extend an abstract base class named DB_Table_Base. Methods and properties that are inherited from DB_Table_Base are thus available via either a DB_Table or a DB_Table_Database object, with the same interface. These shared methods and properties will be identified as such in these manual pages.

Contents

Extending DB_Table

You generally do not usually create instances of DB_Table directly. Instead, for each table in a database, you define a a subclass of DB_Table, and instantiate one object of that subclass. The table schema is embedded in the properties of that object: column definitions are declared in the $col property array and indices in the $idx property array. Normally, the values of these property arrays are defined as part of the subclass definition, which thus serves as a record of the table schema.

One advantage of any database gateway that associates a class with each RDBMS table is that the subclass definition provides a natural place to specify properties and behaviors that are specific to that table. Custom behaviors and validations may be implemented by overriding the class methods, or by defining new methods. DB_Table also allows commonly used or baseline SELECT queries to be stored in the $sql property array.

The package provides two ways to create both a RDBMS table and a corresponding DB_Table subclass, without writing redundant specifications:

  • Programmatic table creation: Write a DB_Table subclass definition for each table, and use an instance of that subclass to create the actual database table.

  • Reflection and code generation: Use the DB_Table_Generator class to automatically generate skeleton DB_Table subclass definitions, and related glue code, for an existing database.

In this tutorial, we demonstrate the former method, which requires us to write subclass definitions manually. A discussion of the latter method is given in the DB_Table_Generator class tutorial.

Defining Columns

The $col property is an associative array in which each key is a column name, and each value is an associative array containing a column definition. The value of the required 'type' element of a column definition must be the name of one of the DB_Table data types, e.g., 'integer', 'decimal', 'boolean', etc. The 'char' and 'varchar' string types, and the 'decimal' numerical type, all require a 'size' element, for which the value is an integer number of characters or digits. The 'decimal' type also requires a 'scope' element, which is the number of digits after the decimal point. A 'require' element with a boolean true value is equivalent to NOT NULL in SQL, and indicates that NULL values are not allowed in that column.

As an example, let's say we're going to create a GuestBook table. This table will store the first and last name of visitors, their email address, and the date and time they signed the guestbook. In addition, we're going to want a unique ID for each row. The columns in our table will be:

  • id -- a sequential integer that is unique for every row (required; i.e., no nulls allowed)

  • fname -- a string of up to 32 characters, the first name of the visitor

  • lname -- a string of up to 64 characters, the last name of the visitor

  • email -- a string of up to 255 characters, the visitor's email address (required; i.e., no nulls allowed)

  • signdate -- a date for when the visitor signed the guestbook (required; i.e., no nulls allowed)

These column definitions must be declared in the $col property array. Shown below is the required declaration of $col for a subclass of DB_Table, named GuestBook_Table, that is associated with a database table named GuestBook:

Defining Indices

The $idx property array is used to declare indices. Each index can be declared to be of type 'primary', 'unique', or 'normal'. Primary and unique indices both define constraints that require that each key value be unique within the table. Normal indices are introduced purely for efficiency. Both single- and multi-column indices may be defined.

In our GuestBook example, we want two single column indices: First, we will define a primary index for the "id" identifier column. Second, for purposes of the example, we'll define a normal index on the "signdate" column, because we expect to search for visitors by date and time. The required $idx property declaration is given below:

The key of each element in the $idx array is an index name, and the value is generally an array containing a definition for the index. An index definition array must contain a 'type' element, for which the value must be 'primary', 'unique' or 'normal', and 'cols' element. The value of 'cols' element must be either the name of a single column, for a single-column array, or a sequential array of column names, for a multi-column index. There is also an alternative shorthand syntax for single-column indices, which is discussed below.

As an example of a multi-column index, here is the definition for a multi-column index named "namefl" on the fname and lname columns.

There is also a shorthand way to declare a single-column index: If you want single-column index for which the index name is the same as the column name, use the column name as the key of $idx, and the index type string (rather than an index definition array) as the value.

Declaring an Auto-Increment Column

One integer column of each table may be declared to be an auto-increment column. This column is normally a primary key identifier. The only effect of this declaration is to change the behavior of the insert() method: If the insert() method is used to insert a row in which the value of an auto-increment column is not set or NULL, then an auto-incremented integer will be inserted automatically.

A column is declared to be auto-increment by setting the value of the $auto_inc_col property to the column name. In the following example, we declare the "id" primary key column of the GuestBook table to be auto-increment:

DB_Table Constructor

Each DB_Table object wraps a DB or MDB2 database connection object. This object is passed to the DB_Table constructor as its first parameter. A single DB/MDB2 object may be shared by any number of DB_Table objects. The second parameter of the constructor is the name of the associated RDBMS table. The optional third parameter is a string $create that can be used to specify whether the table should be created by the constructor if it does not already exist, or whether its structure should be verified if it does (as discussed in more detail below).

In the example shown below, an instance of the GuestBook subclass is created, which binds to the GuestBook table. The use of a value $auto_create = 'safe' specifies that the GuestBook table should be created if a table of that name does not already exist, but not otherwise.
The $conn connection object may be either a DB or MDB2 object, and is passed by reference.

The allowed values of the $create argument are:

  • boolean false to not attempt creation (default)

  • 'drop' to drop any existing table with the same name and re-create it

  • 'safe' to create the table if no such table exist, and do nothing if it does.

  • 'verify' to check whether the table exists, verify the schema. It checks whether all the columns exist, whether the columns have the right type, and whether the indexes exist and have the right type

  • 'alter' does the same as 'safe' if the table does not exist; if it does exist, the schema is verified, and the table is altered if needed.

Modifying Data: Insert, Update, and Delete

The DB_Table insert(), update(), and delete() methods provide a convenient interface for inserting, updating, and deleting rows of data. A row of data to be inserted or updated is passed to the insert or update method as an associative array in which the keys are column names.

Inserting Rows

To insert a row into the GuestBook table, you use the insert() method. The only parameter is an associative array in which the keys are column names, and the values are column values to be inserted.

By default, the insert method will automatically validate that the data you are inserting is of the expected type, and that values have been provided for all required columns other than auto-increment columns. If either of these validations fails, the method returns a PEAR Error, and does not attempt to insert a row. In the above example, no value has been provided for the required 'id' column because this is an auto-increment column, as discussed below.

Auto-Increment Columns and Sequences

DB_Table can use sequences created by the underlying DB or MDB2 layer to generate auto-increment integer identifiers. If the value of a column that has been declared to be auto-increment is not set or set to PHP NULL in the array of values that is passed to the insert method, then an auto-incremented sequence value will be generated and inserted for that column. In the above example, a sequence value is generated and inserted for the 'id' column. If an integer value is set for such a column, however, the provided value will instead be inserted.

The sequence generation features of DB or MDB2 may also be accessed explictly via the DB_Table::nextID() method. This method is simply a wrapper that calls the corresponding DB or MDB2 method internally. The following example shows how to use nextID() to explicitly generate and insert an auto-incremented value for an identifier.
Because the 'id' column has been declared to be auto-increment, this code snippet is functionally equivalent to that given in the preceding example.

Updating Rows

The update() method is used to update the data in a row or a set of rows. The method takes two parameters. Its first parameter is an associative array in which keys are names of columns to be updated, and values are new data values. The second is the text of the WHERE clause of the corresponding SQL UPDATE statement, excluding the WHERE keyword.

For example to change all the rows with the last name "Smith" to "Jones":

As for insertion, if you attempt to update with values that do not validate against the declared column types, then the update will fail, and the method will return a PEAR Error.

Deleting Rows

The delete() method is used to delete a row or set of rows specified by a logical condition. Its only parameter is a string containing the logical condition of the WHERE clause needed to identify which rows to delete, excluding the WHERE keyword.

For example, to delete all rows that were entered before today:

Selecting Data

DB_Table uses an array syntax for constructing SQL SELECT statements, in which each clause of an SQL SELECT statement (e.g., SELECT, FROM, WHERE clauses) is stored in a different element. This representation makes it relatively easy to modify a query by, e.g., adding additional conditions to the WHERE clause to further limit the returned set of rows. Query arrays may be stored in the $sql property array.

Queries may be submitted to the database using either the select() method, which generally returns the result set as an array, or the selectResult() method, which returns a DB_Result or MDB2_Result_Common result set object. These three methods are all inherited from the DB_Table_Base base class, and thus are also available as methods of a DB_Table_Database object.

Query Arrays

Each SQL select statement is defined by a "query array". For most of the allowed elements of a query array, the key is a lower case version of the keyword that begins a clause in the SELECT statement (e.g., 'select', 'from', 'where', etc.), and the value is the text of the remainder of that clause, excluding the keyword. The allowed keys of a query array that define clauses of the SELECT command are:

  • 'select' - the SELECT clause (defaults to '*')

  • 'from' - the table(s) to select from. (Defaults to the name of this table, $this->table)

  • 'join' - any join clauses that should be added to the FROM clause.

  • 'where' - the WHERE clause

  • 'group' - the GROUP BY clause

  • 'having' - the HAVING clause

  • 'order' - the ORDER BY clause

The values of the 'select', 'from', 'where', 'group', 'having', and 'order' elements are strings that contain the text of corresponding clause of the desired SQL statement, excluding the keywords SELECT, FROM, WHERE, GROUP BY, HAVING, or ORDER, respectively. The value of the 'join' element, if present, is simply concatenated onto the end of the 'FROM' element, and should include the keywords, e.g., 'JOIN', 'INNER JOIN', or 'LEFT JOIN'.

The other allowed keys of a query array may be used to specify how the results of query should be returned by the select() method. These are:

  • 'get' - determines how the select() method will return results. See below for a list of allowed values. (Defaults to 'all').

  • 'fetchmode' - determines how rows of a result set will be returned by select() if 'get' is 'all' or not set.

  • 'fetchmode_object_class' - The name of the class of the objects that should be used to encapsulate rows if rows are returned as objects.

These three elements effect only the behavior of the select() method, and have no effect upon the behavior of the selectResult() method. The allowed values of the 'get' element are:

  • 'all' - return all rows of a return set as a sequential array of rows (this is the default). Each row can be returned as either an associative array in which keys are column names (the default) or a sequential array.

  • 'assoc' - returns an associative array in which the key is the first column of the return set and the value is the second column.

  • 'col' - return only the first column as a sequential array

  • 'row' - return only the first row as an associative array in which the keys are column names and the values are the column values.

  • 'one' - return only the value of the first column in the first row.

Each allowed value of the 'get' element corresponds to the name of the get* method of DB and MDB2 that is actually called internally by DB_Table::select(): If the value of the 'get' element is 'all', the query is submitted by calling the DB/MDB2::getAll() method, using an SQL query constructed from the query array, and DB_Table::select() simply returns the return value of getAll(). Similarly, a 'get' element value of 'assoc' causes a call to getAssoc(), 'col' calls getCol(), 'one' calls getOne(), and 'row' calls getRow().

When the 'get' element is set to 'all', explicitly or by default, each row in the array returned by the DB_Table::select() method returned as an associative array in which keys are column names, as a sequential array, or as an object in which column names map to property names. The choice of data structure for each row may be controlled by the 'fetchmode' element of the query or, if this is not is set, by the $fetchmode property of the DB_Table object. Similarly, when rows are returned as objects, the name of the object class may be specified by the 'fetchmode_object_class' element of the query or, if this is not set, by the $fetchmode_object_class property of the DB_Table object.

The values of the 'fetchmode' and 'fetchmode_object_class' elements of the query or the $fetchmode and $fetchmode_object_class properties of DB_Table are used to temporarily reset the values of the 'fetchmode' and 'fetchmode_object_class' properties (for DB) or options (for MDB2) of the underlying DB or MDB2 object. These values should be set equal to the desired DB_FETCHMODE_* or MDB2_FETCHMODE_* constant appropriate for the underlying backend. The original values of the DB/MDB2 object properties or options are restored before the select() method returns.

Storing Queries: $sql property array

Commonly used queries, and "baseline" queries that are useful as a starting point for construction of more complicated ones, may be stored in the $sql public property array. The $sql property is an associative array in which keys are query names, and values are query arrays. Stored queries can be submitted by passing the name key for the query as an argument to any of the select*() methods.

The $sql property is inherited from the DB_Table_Base class. Queries may thus be stored either the $sql property of a DB_Table that provides an interface to a specific table, or in the $sql property of a DB_Table_Database object that provides an interface to the entire database. For applications that involve only one table, or queries that involve only one table, it may be convenient to use the $sql property of the DB_Table object, as in the above example, and to then use the select*() methods of that object to access these queries by name. For more complicated queries and applications, however, it may be more convenient to store all queries in the $sql property of a DB_Table_Database object, and submit them by name via the select*() methods of that object.

Submitting Queries: select*() Methods

The select() method submits a query and returns the result set as an array. The selectResult() method returns the result as a DB_Result/MDB2_Result_Common object. The selectCount() method returns an integer equal to the number of rows that would be returned by a query, without returning the actual result set.

The interface is the same for all three of these methods. In each, the first parameter, which is required, can be either a query array or a key of the $sql property array, for which the corresponding value is a stored query array. The remaining parameters, which are all optional, may be used to modify the query before submission to the database. The second parameter, $filter, is a string that contains an SQL logical expression that will be ANDed with the WHERE clause of the query before the SELECT command is submitted. The third parameter, $order, if present, is used to construct the 'ORDER BY' clause, and may be used to override the 'order' element of the query. The fourth and fifth parameters, $start and $count, are integers that may be used to specify the first row of the result set that should be returned, and the maximum number of rows to be returned.

The next example shows how to modify a stored query with the filter, order, start and count parameters:

To have select() return rows as associative arrays, we must set either the 'fetchmode' element of a specific query array or the $fetchmode property of the DB_Table object to the DB_FETCHMODE_ASSOC or MDB2_FETCHMODE_ASSOC constant values, as appropriate:

To have select() return rows as objects, with properties that correspond to column names, we must set either the 'fetchmode' element of the query array or the $fetchmode property of the DB_Table object to the DB_FETCHMODE_OBJECT or MDB2_FETCHMODE_OBJECT constant. If no user-defined class is specified, all rows are returned as instances of stdClass, as in the following example:

To specify a class to be used to encapsulate rows of a return set, set the value of the 'fetchmode_object_class' element of the query array or the $fetchmode_object_class property to the name of the desired class.

Data Type Validation

DB_Table can automatically validate that the format of data to be inserted or updated is consistent with the declared types for the corresponding columns. Validation of the data type of both inserted and updated data is on by default. Validation upon insertion and updating can be turned on or off with the autoValidInsert() and autoValidUpdate() methods, respectively. Each of these methods takes a single boolean parameter, and turns validation on if its parameter is true and off if it is false.

Data type validation for a row of data to be inserted or updated is actually carried out by the validInsert() or validUpdate() method, respectively. Each of these methods takes one parameter, which is an associative array of data in which keys are column names. Each returns boolean true on success or a PEAR_Error object on failure. These methods are called internally by the insert() and update() methods, respectively, when auto-validation is enabled. Customized automatic validations may thus be implemented by overriding one or both of these methods.

Validation of the type of a single column value is carried out by the isValid() method. This method takes the value to be validated as its first parameter, and the name of the required DB_Table data type as its second parameter. This method is called internally by the two row validation methods.

DB_Table Forms Tutorial

DB_Table Forms Tutorial --  Creating HTML_QuickForm forms

Description

This page documents the use of the DB_Table class to create HTML_QuickForm form elements appropriate for the columns of a table, and to create entire data entry forms. DB_Table can use the column definitions to automatically create default form elements for you. Although your plain column definitions will do fine at first, you will want to customize the labels and options for your form elements. You can do so by adding 'qf_*' keys to your column definitions

Note: The underlying HTML_QuickForm package is a very powerful library with many options. While DB_Table automates away much of the complexity for simple forms, the full power of HTML_QuickForm can only be realized by combining the automatic element creation from DB_Table with custom-created HTML_QuickForm objects. DB_Table makes it easy to get started with HTML_QuickForm, but does not replace it.

Simple Form with Default Elements

Once you have defined your columns and instantiated an object, you can generate a complete HTML_QuickForm object using the getForm() method. If getForm() is called with no parameters, it will return a form with all of the $GuestBook object columns as input fields.

Simple Form with Custom Elements

The basic form is nice, but it's very generic. It doesn't have descriptive labels for the input fields, all the fields are text boxes, and so on. This section shows you how to include form element properties along with your column definitions so that your forms are customized in a somewhat consistent fashion.

In every case you will modify the $col property by adding 'qf_*' keys and values.

  • 'qf_label' (string) Adds a text label to the field

  • 'qf_type' (string) Sets the input type (text, hidden, select, checkbox, etc.)

  • 'qf_vals' (array) Sets list of values for select, radio, and checkbox elements

  • 'qf_attrs' (array) Sets additional HTML attributes for the input element

  • 'qf_opts' (array) Sets options for date elements (date, time, timestamp, jscalendar)

Element Label

When a column appears in a form, you can make sure the same label is always applied to it. Let's say we have a column called "other" defined as a 32-character string. We always want it to be labelled as "Other Information" in our forms; use 'qf_label' key like this:

Element Type

By default, DB_Table will try to figure out what kind of form field input type to use for your column. Most column types translate into text fields, but there are some exceptions.

  • Boolean columns become HTML_QuickForm 'advcheckbox' fields with values of 0 for not-checked and 1 for checked.

  • CLOB columns become HTML_QuickForm 'textarea' fields

  • Date columns become HTML_QuickForm 'date' select fields in 'Y-m-d' format.

  • Time columns become HTML_QuickForm 'date' select fields in 'H:i:s' format.

  • Timestamp columns become HTML_QuickForm 'date' select fields in 'Y-m-d H:i:s' format

To explicitly set the HTML_QuickForm element type for a column, rather than relying on the above defaults, you add a 'qf_type' element to your column definition. You can tell DB_Table to create any of several supported HTML_QuickForm element types by setting the 'qf_type' element to one of these string values:

  • 'checkbox' for a single checkbox; maps to the 'advcheckbox' HTML_QuickForm type

  • 'hidden' for a hidden element

  • 'password' for a password text box

  • 'radio' for a set of radio buttons

  • 'select' for a select menu

  • 'text' for a text box

  • 'textarea' for a text area

  • 'date' for a date selector; formats as 'Y-m-d'

  • 'time' for a time selector; maps to 'date', formats as 'H:i:s'

  • 'timestamp' for a timestamp selector; maps to 'date', formats as 'Y-m-d H:i:s'

If you use any other element name, DB_Table will attempt to map to the proper HTML_QuickForm element (thanks to Moritz Heidkamp for the patch), but it's not guaranteed to work.

In this example, we'll make the 'example' column a text field:

Element Values

If your column form element is 'checkbox', 'radio', or 'select', you can set the values of the available choices for the form element. You do so via an 'sq_vals' element in the corresponding column definition.

Element HTML Attributes

If you like, you can add HTML attributes to the form element using the 'qf_attrs' keys. Attributes are assigned as key-value pairs in an associative array; the keys is the attribute name, and the value is the attribute value. For example, to set the number of rows and columns for a textarea element:

DB_Table automatically adds a "maxlength" attribute to text and password elements based on the column size, so that users cannot type in values longer than the column allows.

Element Rules

HTML_QuickForm allows you to add validation rules to the input form. These rules are not the same as the DB_Table automated validations; the HTML_QuickForm rules apply only to the values as they relate to the form itself, not the values related to the table proper. This is an important distinction that will become apparent as you use HTML_QuickForm.

The available rules are:

  • email - the form input must be an email address

  • lettersonly -- the form nput must consist only of letters

  • maxlength -- the form input cannot have more than this many characters

  • maxlength -- the form input cannot have fewer than this many characters

  • nonzero -- the form input must be greater than or less than zero

  • nopunctuation -- the form input may not contain punctuation

  • numeric -- the form input must be a number of some sort (no letters)

  • regex -- the form input must match a regular expression

  • required -- the form input is required to be filled (even with a single space)

DB_Table will automatically add HTML_QuickForm rules for you in most cases.

  • If the column is required ('require' => true), then DB_Table will add a 'required' HTML_QuickForm rule.

  • If the column is numeric ('smallint', 'integer', 'bigint', 'single', 'double', or 'timestep') then DB_Table will a 'numeric' HTML_QuickForm rule.

  • If the column has a specific size ('size'), then DB_Table will add a 'maxlength' rule.

If you want to use a specific HTML_QuickForm rule for a column when that column appears in a form, set 'qf_rules' key to the name of the rule and set the value for that rule; in most cases, the value is an error message, but in some cases the value is a sequential array. You can add as many different rules as you like, but you can add only one of each type.

Setting Default Values

Sometimes you will want to populate your input form with default values, such as the current values from the database. Doing so is easy.

When you call getForm(), instead of passing a sequential array of column names, pass an associative array in which the key is the column name and the value is the column value.

Element Names as Array Keys

By default, when you call getForm(), the form elements are named for their columns. For example, the column 'fname' is called 'fname' in the form.
<!-- [snip] the beginning of the form -->

<input type="text" name="fname" ... />

<!-- [snip] the end of the form -->
However, often you will want the form elements to be keys in any array instead of their own separate variables. This is particularly useful when you are going to use the values in a DB_Table insert() or update() call.

To do so, pass the name of an array as the second argument to getForm() (after the list of columns to use in the form). For example, if you want the column names to be keys in an array called 'new_row', do this:

Custom HTML_QuickForm Objects

Although the getForm() method supports all HTML_QuickForm parameters (such as the name of the form, the method, the action, and so on), you don't need to use DB_Table to create the entire form. If you like, you can create your own HTML_QuickForm object, and add DB_Table columns to it one-by-one or in groups.

DB_Table provides these methods to add automatically-defined elements to pre-existing HTML_QuickForm objects:

  • addFormElements() to add one or more automatically-defined form element objects to a pre-existing HTML_QuickForm object, along with their associated DB_Table defined rules.

  • getFormGroup() to get an HTML_QuickForm group array of automatically-defined element objects

  • getFormElement() to get a single automatically defined element object.

Here are example uses of each:

DB_Table_Database Class Tutorial

DB_Table_Database Class Tutorial --  Interface to a relational database

Description

DB_Table_Database is an database abstraction class for a relational database. It is a layer built on top of the DB_Table class: Each table in a DB_Table_Database object is represented by a DB_Table object. The most important difference between a DB_Table_Database object and a collection of DB_Table objects is that the properties of a parent DB_Table_Database object contain a model of the entire database, including relationships between tables.

DB_Table_Database provides:

  • An object-oriented representation of a relations between tables in a relational database, including linking/association tables that create many-to-many relationships.

  • A simplified API for INSERT, UPDATE, DELETE, and SELECT commands, with an interface very similar to that of the DB_Table class.

  • Automated construction of join conditions for inner joins of any number of tables, based on a list of table names and/or a list of desired column names.

  • Optional checking of the validity of foreign key values by the PHP layer upon insertion or updating.

  • Optional PHP emulation of SQL ON DELETE and ON UPDATE referentially triggered actions.

  • PHP serialization to (and unserialization from) a string that contains the entire database schema.

  • Serialization to (and unserialization) from XML, using an extension of the MDB2 XML schema. (Unserialization from XML requires PHP 5).

  • Methods to set various properties of all the child DB_Table objects to a common value.

  • Various utility methods that aid the construction of SQL queries.

Like DB_Table, DB_Table_Database wraps a DB or MDB2 database connection object. The class is compatible with both PHP 4 and PHP 5, with the exception of one non-essential method: The fromXML() method, which creates a DB_Table_Database object from an XML database schema, requires PHP 5.

Class DB_Table_Database extends abstract base class DB_Table_Base. Methods or properties that are inherited from DB_Table_Base are noted as such, and are indicated in the table of contents of this page with the notation "(from DB_Table_Base)".

This tutorial uses an extended example to introduce the use of the DB_Table_Database class to create a model of an interface to a relational database.

Contents

Example Database

Throughout this tutorial, our examples will refer to a DB_Table_Database object for an example database named TestDB, which is described below. The child DB_Table objects that are associated with RDBMS tables must all be instantiated first, and then added to (i.e., linked with) a parent DB_Table_Database object.

The example database TestDB stores names, numbers, and addresses for a set of people, and contains 4 tables. Peoples names, phone numbers, and addresses are stored in three tables named Person, Phone, and Address, respectively. To allow for the fact that several people may share a phone number, and that a person may have more than one phone number, the database allows the creation of a many-to-many relationship between Person and Phone. This relationships are established by an additional linking table, named PersonPhone, which contains foreign key references to Person and Phone.

DB_Table objects must be instantiated before they can be added to a parent DB_Table_Database instance. The usual way of creating a DB_Table object (as discussed in the tutorial for that class) is to create one subclass of DB_Table for each table, and create one instance of each such subclass. In this tutorial, we use a convention in which the subclass of DB_Table associated with a database table named "Entity" is Entity_Table, and in which the single object of this class is $Entity. This is also the convention used in code generated by the DB_Table_Generator class.

The following code defines a subclass Person_Table that represents a database table Person:
<?php
require_once 'DB/Table.php'

class Person_Table extends DB_Table
{
    // Define columns
    $col = array (
        'PersonID' => array('type' => 'integer', 'require' => true),
        'FirstName' => array('type' => 'char', 'size' => 32, 'require' => true),
        'MiddleName' => array('type' => 'char', 'size' => 32),
        'LastName' => array('type' => 'char', 'size' => 64, 'require' => true),
        'NameSuffix' => array('type' => 'char', 'size' => 16),
        'AddressID' => array('type' => 'integer')
    );

    // Define indices. PersonID is declared to be the primary index
    $idx = array(
        'PersonID' => array('cols' => 'PersonID',  'type' => 'primary'),
        'AddressID' => array('cols' => 'AddressID', 'type' => 'normal')
    );

    // Declare 'PersonID' to be an auto-increment column
    $auto_inc_col = 'PersonID';

}
?>
Here, 'PersonID' is the primary index of the Person table. Column AddressID is a foreign key that references the primary key of the Address table (defined below).

Note the assignment of a value for the $auto_inc_col property, which is a recent addition to DB_Table: The value of $auto_inc_col is the name of a column that is declared to be 'auto increment'. Auto incrementing of this column is now implemented in the insert method of DB_Table using DB or MDB2 sequences.

The following code uses the same method to create subclasses of DB_Table associated with the remaining Phone, Address, and PersonPhone tables of database TestDB:
<?php
class Address_Table extends DB_Table
{
    $col = array(
        'AddressID' => array('type' => 'integer', 'require' => true),
        'Building' => array('type' => 'char', 'size' =>16),
        'Street' => array('type' => 'char', 'size' => 64),
        'UnitType' => array('type' => 'char', 'size' => 16),
        'Unit' => array('type' => 'char', 'size' => 16),
        'City' => array('type' => 'char', 'size' => 64),
        'StateAbb' => array('type' => 'char', 'size' => 2),
        'ZipCode' => array('type' => 'char', 'size' => 16)
    );
    $idx = array(
        'AddressID' => array('cols' => 'AddressID', 'type' => 'primary'),
    );
    $auto_inc_col = 'AddressID';
}
?>
<?php
class Phone_Table extends DB_Table
{
    $col = array(
        'PhoneID' => array('type' => 'integer', 'require' => true),
        'PhoneNumber' => array('type' => 'char', 'size' => 16, 'require' => true),
        'PhoneType'   => array('type' => 'char', 'size' => 4)
    );
    $idx = array(
        'PhoneID' => array('cols' => 'PhoneID', 'type' => 'primary')
    );
    $auto_inc_col = 'PhoneID';
}
?>
<?php
class PersonPhone_Table extends DB_Table
{
    $col = array(
        'PersonID' => array('type' => 'integer', 'require' => true),
        'PhoneID'  => array('type' => 'integer', 'require' => true)
    );

    $idx = array(
        'PersonID' => array('cols' => 'PersonID', 'type' => 'normal'),
        'PhoneID' => array('cols' => 'PhoneID', 'type' => 'normal')
    );
}
?>
In ths example, the PhoneType column of table Phone is used to distinguish home, work, and cell phones, and so must have one of the 4 character values 'HOME', 'WORK' or 'CELL'.

The following code instantiates one object of each DB_Table subclass, which is associated with the corresponding table:
<?php
$Person = new Person_Table($conn, 'Person', 'safe');
$Address = new Address_Table($conn, 'Address', 'safe');
$Phone = new Phone_Table($conn, 'Phone', 'safe');
$PersonPhone = new PersonPhone_Table($conn, 'PersonPhone', 'safe');
?>
Here, because we have used the value 'safe' for the optional third parameter of the DB_Table constructor in each statement, each table will be created in the RDBMS only if and only if a table of that name does not already exist in the database.

It is recommended that constructor statements be placed in a separate file from any of the DB_Table subclass definitions. Doing so makes it easier to serialize and unserialize the DB_Table and DB_Table_Database objects, because a php file in which an instance of a DB_Table subclass is unserialized must have access to the subclass definition, but should not include the constructor statements. Putting each DB_Table subclass definition in a separate file, with a name that is the subclass name with a .php extension, also allows the subclass definitions to be autoloaded when an object is serialized, as discussed below.

An alternative way to create a DB_Table object is to create an instance of DB_Table itself, rather than of a subclass of DB_Table. In this method, one first instantiates a generic DB_Table object, which initially contains no information about the table schema, and then sets the values of the public $col and $idx properties needed to define a table schema. As an example, the following code constructs an instance of DB_Table that represents the Person table:
<?php
$Person = new DB_Table($conn, 'Person');

$Person->col['PersonID'] = array('type' => 'integer', 'require' => true);
$Person->col['FirstName'] = array('type' => 'char', 'size' => 32, 'require' => true);
$Person->col['MiddleName'] = array('type' => 'char', 'size' => 32);
$Person->col['LastName'] = array('type' => 'char', 'size' => 64, 'require' => true);
$Person->col['NameSuffix'] = array('type' => 'char', 'size' => 16);
$Person->col['AddressID'] = array('type' => 'integer');

$Person->idx['PersonID'] = array('cols' => 'PersonID', 'type' => 'primary');
$Person->idx['PersonID'] = array('cols' => 'PersonID', 'type' => 'normal');

$Person->auto_inc_col = 'PersonID';
?>
This method is valid only in recent versions of the DB_Table package (1.5.0RC1 and greater) that contain the DB_Table_Database class. Earlier versions of DB_Table required that DB_Table always be extended. The only real disadvantage of using such generic DB_Table objects is that it makes it impossible to override the methods of DB_Table to, for example, customize the insert or update method so as to implement business rules for a table. Generic DB_Table objects are used by the fromXML() method, which takes an XML description of a database schema as a parameter, and returns a DB_Table_Database object in which each of the child tables is represented by an instance of DB_Table.

Constructor

A DB_Table_Database object is instantiated as an empty shell, to which tables, foreign key references, and links are then added. The constructor interface is
void DB_Table_Database(DB/MDB2 object $conn, string $name)
The parameter $conn must be either a DB or MDB2 object, which establishes a connection to a RDBMS. The $name parameter is the name of the database. To instantiate an object that represents a database named TestDB with a DB connection to a MySQL database, we might thus use (with no error checking):
<?php
require_once 'DB/Table/Database.php'

$conn = DB::connect("mysqli://$user:$password@$host");
$db = new DB_Table_Database($conn, 'TestDB');
?>
where the values of $user, $password, and $host are the user name, database password, and host machine, respectively.

Building a Model

To construct a model of a relational database, after instantiating a set of DB_Table objects and a DB_Table_Database object, we must add the table objects to the database object, add declarations of foreign key references, and declare many-to-many relationships that involve linking tables, in that order.

Adding Tables

After a DB_Table object is instantiated, it can be added to the parent database with the DB_Table_Database::addTable() method. The interface for this method is
true|PEAR_Error addTable(object &$Table)
where $Table is a DB_Table object that is passed by reference. The method returns boolean true on normal completion, and a PEAR_Error object on failure.

The following code adds the four tables of our example database to the $db DB_Table_Database object:
<?php
$db->addTable($Person);
$db->addTable($Address);
$db->addTable($Phone);
$db->addTable($PersonPhone);
?>
In this and all subseqent examples, we omit the error handling code that should be added to production code.

Adding Foreign Key References

After tables have been added to a database, we can use the addRef() method to add references between pairs of tables.

Synopsis (simplified):
true|PEAR_Error addRef(string $ftable, string|array $fkey, 
                       string $rtable, [string|array $rkey] )
Here $ftable is the name of a referencing (or foreign key) table, $fkey is the foreign key, $rtable is the name of the referenced table, and $rkey is the (optional) referenced key. If the optional $rkey parameter is absent or null, the referenced key is taken by default to be the primary key of the referenced table. The foreign and referenced key values are specified using the same syntax as that used to define indices in DB_Table: Each key may be either a column name string, for a single-column key, or a sequential array of column names, for a multi-column key. The method returns true on normal completion, and a PEAR_Error on failure. The simplified synopsis shown here does not include two more optional parameters (parameters 5 and 6) that can be used to specify 'on delete' and 'on update' actions. The full interface is presented below. For example, the command:
<?php
$db->addRef('Person', 'AddressID', 'Address', 'AddressID');
?>
adds a reference from foreign key Person.AddressID of referencing table Person to the primary key Address.AddressID of referenced table Address. Because the referenced key 'AddressID' is also the primary key of table 'Address' this could also be written as:
<?php
$db->addRef('Person', 'AddressID', 'Address');
?>
When the referenced key is explicitly specified, as in the first example, it should always be either a primary key or a key for which a unique index is defined, as required by standard SQL.

A reference between two tables can only be added after both the referencing and referenced DB_Table objects have been instantiated and added to the parent DB_Table_Datbase instance.

Adding Links

A table may be declared to be a "linking" table that establishes a many-to-may relationship between two others. The only effect of such a declaration is to change the action of the autoJoin method: If a table named $link is declared to be a linking table that creates a many-to-many relationship between tables named $table1 and $table2, then the autoJoin method may use the linking table to join $table1 and $table2, if necessary.

Method addLink() declares a table to be a linking or association table for two others.

Synopsis:
true|PEAR_Error addLink(string $table1, string $table2, string $link)
Here, $link is the name of a linking table that links tables named $table1 and $table2. All three parameters are required, and all must be valid table name strings. It does not matter which of the two linked tables, $table1 and $table2, is listed first and which second in the function call. A table that links $table1 and $table2 must have foreign keys that references to both of the linked tables. A link can only be added to the model after the references from the linking table to both of the linked tables have been added. The method returns true on normal completion and a PEAR_Error() if an error is detected.

For example, the command:
<?php
$db->addLink('Person', 'Phone, 'PersonPhone')
?>
declares PersonPhone to be a linking table that links tables Person and Phone.

The addLink() method will not prevent one from declarating more than one linking table for the same two linked tables. Doing so would make the link declaration useless, however, because the autoJoin() method will fail if it needs to use a linking table to join a pair of tables, but finds that more than one of linking table is declared for those two tables.

The command
<?php
$db->addAllLinks()
?>
adds all possible linking tables to the database. In this method, any table that has foreign keys that reference tables $table1 and $table2 is declared to be a link between $table1 and $table2. In some databases, the easiest way to declare links may be by using the addAllLinks method to create all possible links and then using the deleteLink() method to delete those that are not desired.

The database model is complete when all of the tables have been added, all of the references have been added, and all the links have been added.

Example - Putting it Together

For our example, let us create a directory in which to put all of the code required as an interface to a database. We will put each DB_Table subclass definition in a separate file in this directory, in which each file name is simply the class name with a '.php' extension. In addition, it is convenient to create a single file, which we will call 'Database.php', in which we create a DB or MDB2 connection, create one object per table, and construct a parent DB_Table_Database object. This file structure is used by the DB_Table_Generator class for code that is auto-generated for an existing database. Below is a listing of the minimal 'Database.php' file required for our example database:

This example file is very similar to the skeleton file that would be created by DB_Table_Generator for an existing database with this structure. The main differences are that some lines in the auto-generated file would have to be uncommented or edited to produce the above (e.g., the lines that define the database DSN). In this example, the call to addAllLinks() method would correctly identify 'PersonPhoneAssoc' as a table that links 'Person' and 'Phone'. This example does not include any referentially triggered 'ON DELETE' or 'ON UPDATE' actions, discussed below, which could be added to the end of the same file.

Deleting Tables, References, and Links

The deleteTable(), deleteRef(), and deleteLinks() methods can be used to delete tables, and foreign key references, and linking table declarations, respectively, from the DB_Table_Database model.

deleteTable() - deletes a table from the database model

Synopsis:
void deleteTable(string $table)
Parameter $table is the name of the table to be deleted. Deletion of a table causes deletion of the table and all other entities of the model that depend on the existence of that table, including foreign key references to or from that table, and linking relationships that depend upon the existence of those foreign key references.

deleteRef() - deletes a reference from the database model

Synopsis:
void deleteRef(string $ftable, string $rtable)
where $ftable and $rtable are the names of the referencing and referenced tables, respectively. Deletion of a foreign key reference causes deletion of any links that rely on the existence of that reference, i.e., links in which $ftable is the linking table and $rtable is one of the linked tables.

deleteLink() - deletes a linking table declaration

Synopsis:
void deleteLink(string $table1, string $table2, [string $link])
Here $table1 and $table2 are names of the linked tables, and the optional parameter $link is the name of the linking table. If $link is null or absent, all declarations of linking tables between $table1 and $table2 are deleted. If $link is present, only the declaration of $link as a linking table between $table1 and $table2 is deleted (if one exists). The deleteLinks() method may be used after the addAllLinks() to prune the resulting set of linking table declarations.

On Delete and On Update Actions

DB_Table_Database optionally provides actions designed to enforce referential integrity that are provided by ANSI SQL, but that are not provided by some popular databases (e.g., SQLite and the default MySQL engine). DB_Table_Database offers optional PHP emulation of referentially triggered ON DELETE and ON UPDATE actions, such as cascading deletes (discussed here), and also optionally checks the validity of foreign key values before insertion or updating (discussed below)

The ON DELETE and ON UPDATE actions associated with a reference (if any) may be declared either as additional parameters to addRef(), or by using setOnDelete() and setOnUpdate().

Declaring actions in addRef()

Actions to be taken on deletion or updating of a referenced row may may be declared when a reference is added to the model using two optional parameters of the addRef() method. The following example shows the extended form of addRef() needed to add a reference from PersonPhone to Person (as above), while also declaring a cascade action on delete of a referenced row of Person, and a restrict action on update of such a row:
<?php
$db->addRef('PersonPhone', 'PersonID', 'Person', null, 'cascade', 'restrict');
?>
Here, a null value of the fourth parameter is used to indicate that the referenced key should be taken, by default, to be primary key of referenced table Person. The values of the fifth and sixth parameters represent actions to be taken upon delete ('cascade') and upon update ('restrict'), respectively. A null or absent value for either of these parameters indicates that no referentially triggered action should be taken on delete or on update.

The effect of the 'cascade' values of the fifth parameter in the above example is to declare that that all referencing rows of PersonPhone should be deleted upon deletion of a corresponding referenced row of Person (a cascading delete). The 'restrict' value of the sixth parameter declares that updating of the primary key PersonID of Person should be prevented (the 'restrict' on update action), and an error should be thrown by the update method, in rows of Person that are referenced by rows of PersonPhone.

The full interface of the addRef() method is:
true|PEAR_Error addRef(string $ftable, mixed $fkey, string $rtable, [mixed $rkey], 
                       [string|null $on_delete], [string|null $on_update])
Here, $ftable is the referencing table, $fkey is the foreign key, $rtable is referenced table, and $rkey is the referenced key. The $fkey and $rkey parameters may be column name strings or arrays of column names, or $rkey may be null. An absent or null value of $rkey indicates a reference to the primary key of the referenced table. The $on_delete and $on_update parameters indicate actions to be taken on deletion or updating of a referenced row. The only allowed values of $on_delete and $on_update are the string literals
'cascade' | 'restrict' | 'set null' | 'set default'
or PHP null, which is the default value for both parameters. Each of the allowed action strings is the lower case form of a standard SQL action, and turns on PHP emulation of the corresponding action. An absent or null value for either action indicates that no action should be taken at the PHP layer upon delete or update of a referenced row. (Note that a PHP null value is different from the 'set null' action string.)

The following example declares all of the foreign key references needed in our example database, with appropriate referentially triggered actions:
<?php
$db->addRef('Person', 'AddressID', 'Address', null, 'set null', 'cascade');
$db->addRef('PersonPhone', 'PersonID', 'Person', null, 'cascade', 'cascade');
$db->addRef('PersonPhone', 'PhoneID', 'Phone', null, 'cascade', 'cascade');
?>
As a result of these declarations, rows in the linking table PersonPhone will be deleted when corresponding rows of either Person or Phone are deleted, and updated if the primary keys of reference rows Person or Phone are modified. The foreign key AddressID of a row in table Person will be set to null if the corresponding referenced row of Address is deleted (to indicate that no address is known), and updated if the primary key of that row in Address is modified.

setOnDelete() and setOnUpdate()

The referentially triggered actions associated with a foreign key reference may also be changed, or turned off, with the setOnDelete() and setOnUpdate() methods.

Synopses:
void setOnDelete(string $ftable, string $rtable, string|null $action)
void setOnUpdate(string $ftable, string $rtable, string|null $action)
Here, $ftable and $rtable are the names of referencing (foreign key) and referenced table, respectively, for an existing reference. The $action parameter is the value for the on_delete or on_update action for that reference, i.e., either an action strings or null. A null parameter is used to indicate that no action on delete or update of rows of table $rtable.

For example, the following code would change the 'on_update' action associated with the reference from 'PersonPhone' to 'Person' to a 'restrict' action:
<?php
$db->setOnUpdate('PersonPhone', 'Person', 'restrict');
?>
The effect this is to prohibit updates of the primary key value in rows of Person that are referenced by rows of PersonPhone.

setActOnDelete() and setActOnUpdate()

PHP emulation of referentially triggered actions may be turned on or off for the entire database by the setActOnDelete() and setActOnUpdate() methods.

Synopses:
void setActOnDelete(bool $flag)
void setActOnUpdate(bool $flag)
Passing a true value to either method activates PHP emulation of all of the declared ON DELETE or ON UPDATE actions, respectively, while a false value turns off PHP emulation of the corresponding action. By default, PHP emulation of both ON DELETE and ON UPDATE actions is on. Calling either of these methods with a false value does not modify the values of the instance property (the $_ref property) that records the on delete or on update actions associated with each reference: It merely prevents PHP emulation of these actions by the DB_Table_Database::delete() and DB_Table_Database::update() methods.

Foreign Key Validation

By default, DB_Table_Database checks the validity of foreign key values before inserting or updating data in a table with foreign keys. That is, before inserting a row, or updating any foreign key column values, the insert() and update() methods of DB_Table_Database actually submit a query to confirm that the inserted or updated foreign key column values correspond to values of the referenced columns of an existing row in the referenced table. By default, both methods throw an error, and do not modify the data, if this check fails.

This checking of foreign key validity by the PHP layer may be turned on or off, for insertion or updating of any table in database, with the setCheckFKey() method. The interface of this method is:
void setCheckFKey(bool $flag)
Passing a true value of $flag turns on checking of foreign keys (the default), while a false value turns checking off.

Data Selection

DB_Table_Database provides an object-oriented interface for SQL select statements that is almost identical to that of DB_Table.

Query Arrays

As in DB_Table, queries are represented in DB_Table_Database as arrays, in which array elements represents clauses of a corresponding SQL select statement. For example, a query for names of all people that live on Oak Street in Anytown in our example database might be
<?php
$oak = array(
   'select'  => 'Person.FirstName, Person.LastName, Address.Building',
   'from'    => 'Person, Address',
   'where'   => "Person.AddressID = Address.AddressID\n" 
              . "  AND Address.Street = 'Oak Street'\n"
              . "  AND Address.City = 'AnyTown'",
   'order'   => 'Address.Building' );
?>
The buildSQL() method accepts such a query array as a parameter and returns the corresponding SQL command string. For example
<?php
echo $db->buildSQL($oak);
?>
yields the output
SELECT Person.FirstName, Person.LastName, Address.Building
FROM Person, Address
WHERE Person.AddressID = Address.AddressID
  AND Address.Street = 'Oak Street'
  AND Address.City = 'AnyTown'
ORDER BY Address.Building
The string values of most values in this array are passed to the RDBMS unmodified, prefixed by the keywords 'SELECT', 'FROM', etc. Column names that appear in only one table often do not need to be qualified by table names, as they are in the above example.

As in DB_Table, such query arrays can be stored in the public $sql property array:
<?php
$db->sql['oak'] = $oak
?>
Representing queries as arrays, rather than strings, makes it easier for baseline queries to be modified by, for example, adding additional limitations to the end of the 'where' clause string.

Select* Methods: select(), selectResult(), and selectCount()

The select*() methods are inherited by both the DB_Table_Database and DB_Table classes from the DB_Table_Base class, and thus share the same interface and behavior. The interface is also the same for all three methods. The required first parameter can be either the key for a previously stored query array, as in
<?php
$result = $db->select('oak')
?>
or the corresponding array value as a parameter, as in
<?php
$result = $db->select($oak)
?>
The select method returns a result set as a numerically indexed array of rows. Each row can represented as be either an associative or numerical array, or an object, depending on the value of the $fetch_mode property of the DB_Table_Database object or (if this is null) the fetchmode of the underlying DB or MDB2 object.

The common interface of three select* methods select(), selectCount(), and selectResult() is:
mixed select*( array|string $sql_key, [string $filter], [string $order], 
               [int $start], [int $count], [array $params])
As discussed above, $sql_key is either a query array, or the key of a baseline query array that has been stored in the $sql property. The $filter parameter is an SQL logical expression string that limits the result set. This condition is added (i.e., ANDed) to the end of the 'where' element of the $sql_key query array. The $order parameter is an ORDER BY clause (without the ORDER BY prefix) that can be used to override any 'order' element of the $sql_key array. Integer parameters $start is which the position within the full result set of the first row that should be included in the return value, while $count is the maximum number of rows desired within the return value. If present, $params is an array in which the values are parameters for placeholder substitution in a prepared query.

autoJoin()

autoJoin() - accepts an array parameter containing the names of desired columns and/or an array of tables names, and returns a query array containing a WHERE clause with automatically generated join conditions.

Synopsis:
array|PEAR_Error autoJoin([array $cols], [array $tables], [string $filter])
Here, $cols is a sequential array of the names of the desired columns, $tables is a sequential array of names of tables to be joined, and $filter is an SQL logical statement that may be used to limit the results. The $filter clause is added (i.e., ANDed) to the end of the the 'where' element, after the automatically generated join conditions. Both the $col and $tables parameter are optional, but at least one of them must be supplied. The query returned by autoJoin is an inner join of a set of tables containing all of those listed in the $tables parameter, all of the tables containing the columns listed in the $cols parameter, and any linking tables required to join these tables.

The following example generates and submits query that selects a result set in which each row contains a person's name, home phone number and address, based on knowledge of the names of the desired columns. In our example database, this requires that all four tables be joined.
<?php
$cols = array('FirstName', 'LastName', 'PhoneNumber', 'Building', 'Street', 'City')
$report = $db->autoJoin($cols, "Phone.PhoneType = 'HOME'");
$result = $db->select($report);
?>
Note that the column names in the $cols parameter do not need to be qualified by table names if they are unambiguous -- the autoJoin method internally uses the validCol() method to validate and disambiguate all qualified and unqualified column names.

The SQL command corresponding to such a query array may be obtained using buildSQL(). In this example,the command
<?php
echo $db->buildSQL($report);
?>
yields
SELECT Person.FirstName, Person.LastName, Phone.PhoneNumber, Address.Building, Address.Street, Address.City
FROM Person, Phone, Address, PersonPhone
WHERE PersonPhone.PhoneID = Phone.PhoneID
  AND PersonPhone.PersonID = Person.PersonID
  AND Person.AddressID = Address.AddressID
If autoJoin() is passed only a set of column names, as in the above example, it identifies the set of tables that contain those columns, and joins those tables, plus any linking tables needed to create many-to-many relationships.

In the following example, the $cols parameter is null, but the names of the tables to be joined are specified in the $tables parameter:
<?php
$tables = array('Person', 'Address', 'Phone');
$report = $db->autoJoin(null,$tables);
$result = $db->select($report);
?>
The corresponding SQL command is
SELECT *
FROM Person, Phone, Address, PersonPhone
WHERE PersonPhone.PhoneID = Phone.PhoneID
  AND PersonPhone.PersonID = Person.PersonID
  AND Person.AddressID = Address.AddressID
When the first argument of autoJoin is null, as in this example, the SELECT clause is taken to be 'SELECT * by default. Note that the FROM and WHERE clauses join a linking table PersonPhone that was not explicitly specified, because this table was necessary to join two of the tables containing the desired data.

Algorithm: The algorithm used by autoJoin() is designed to find appropriate join conditions if these exist and are unambiguous, and to return a PEAR Error if the structure of references and linking tables either yields a multiply connected network of joins, or if it cannot construct an appropriate set of join conditions. The method first examines the $col and $table property to identify the list of tables that must be joined. It then creates a network of joined tables (the joined set) by starting with one table and sequentially adding tables to the joined set from the set of tables have not yet been joined (the unjoined set). The process starts by taking the first required table as a nucleus of the joined set, and then iterating through the unjoined set in search of a table that can be joined to the first. During this and each subsequent stage of addition, the method iterates through the unjoined set in search of a table that can be joined to any table in the joined set (i.e., that either references or is referenced by one of the tables in the joined set.) If it finds an unjoined table that can be joined to exactly one table in the joined set, that table is added to the joined set, and the search for another table to join begins. If the search encounters a table in the unjoined set that can be joined to two or more tables in the joined set, the method returns an error indicating that the join conditions are ambiguous -- the method will only return a set of joins that correspond to a tree graph (where tables are nodes and joins are bonds) and will reject any multiply connected set of joins. If it is found that none of the tables in the unjoined set can be directly joined to any table in the joined set, the method then cycles through the unjoined set again in search of a table that can be joined to exactly one table in the joined set through a linking tables. If it finds a table that is connected via linking tables to two or more tables in the joined set, it will also return an error. If the search does not identify any unjoined table that can be joined to a table in the joined set either through a direct reference or a linking table, the method returns an error indicating that the required set of tables can not be joined.

SQL Utilities

quote()

The quote method returns an SQL literal string representation of the parameter $value.

Synposis:
string quote(mixed $value)
The DB_Table_Database::quote() method calls either the DB::quoteSmart() or MDB2::quote() method internally. The return value is always a string, with a return value whose format depends upon the PHP type of $value: If $value is a string, the method returns a string that is properly quoted and escaped for the underlying RDBMS. If $value is an integer or float, it returns an unquoted string representation of the number. If $value is boolean, it returns '1' for true, or '0' for false (consistent with the representation of booleans as integers used by the DB_Table abstract data type). If $value is null, it returns the unquoted string NULL.

buildFilter()

buildFilter() returns a SQL logical expression that is true if the values of a specified set of database columns are equal to a corresponding set of SQL literal values. It must be passed an array parameter in which the array keys are column names and the array values are the required values.

The following example uses the buildFilter method to construct a filter for addresses on Pine St. in Peoria:
<?php
$data = array('Street' => 'Pine St', 'City' => 'Peoria');
$filter = $db->buildFilter($data);
?>
Printing $filter then yields the SQL snippet:
Street = 'Pine St' AND City = 'Peoria'
In this example, the resulting SQL string is admittedly longer than the code required to create it. The function becomes more useful when the column names and/or values are variables representing data of various types, rather than string literals, or strings that may require escaping. The buildFilter method uses the quote method internally to construct SQL literal string representations of values.

buildSQL()

buildSQL() - takes a query array of the form used by the select* methods, and returns a corresponding SQL command string. It is called internally by the select*() methods. Both buildSQL() and the select*() methods are inherited from DB_Table_Base.

Synopsis: The interface is similar to that of the select*() methods:
string|PEAR_Error buildSQL(array|string $query, [string $filter], [string $order], 
                           [int $start], [int $count])
As in the select*() methods, $query is a query array or a key for a query array stored in the $sql property, $filter is an SQL logical condition that is added to the 'where' element of the query array, $order is an ORDER BY clause that overrides the 'order' element of the query array when it is present, and $start and $count are the first row in the result set that should be returned, and the maximum number of rows that should be returned. Only the $query argument is required.

validCol()

validCol() - validates and (if necessary) disambiguates column names.

Synopsis:
array|PEAR_Error validCol(string $col, [array $from])
The required parameter $col is a column name. The optional $from parameter is a sequential array of table names.

The $col parameter may either be a column name qualified by a table name, using the SQL syntax table.column, or a column name that is not qualified by a table name, if the identification of the column with a table is unambiguous. The return value of validCol, upon success, is a sequential array in which the second element is the unqualified column name string, and the first element is either a table name (if $col is qualified by a table name or a unique table can be identified) or a sequential array of possible column names (if $col is an unqualified column name that could refer to columns in two or more different tables). If no column with the specified name exists in the database, a PEAR error is returned.

The optional $from parameter is used only when $col is not explicitly qualified by a table name. When it is present, $from is a sequential list of tables that should be searched for a column of the specified name (as in the from clause of an SQL select statement). In this case, validCol first searches the tables in $from, and returns a table name if this yields a unique result. If a set of or more tables in $from are found to contain a column with the specified name, the return value is that set, or a subset thereof. If none of the table in $from contain a columns with the specified name, the search is instead broadened to all tables in the database. If two or more choices still remain at this point (either more than one tables in from, or more than one tables in the rest of the database) the method tries excluding tables in which the specified column is a foreign key column, if this still leaves one or more tables in which the column is not a foreign key column.

Data Modification: insert(), update(), and delete()

The insert(), delete(), and update() methods of DB_Table_Database have interfaces and behaviors similiar to those of the corresponding methods of DB_Table. The only differences in the interfaces are that each of these DB_Table_Database method requires an additional first parameter whose value is the name of the table to which the SQL insert, update, or delete command should be applied.

Synopses:
true|PEAR_Error insert(string $table, array $data)
true|PEAR_Error delete(string $table, [string $where])
true|PEAR_Error update(string $table, array $data, [string $where])
In all three functions $table_name is the name of the table to which the operation should be applied. In the insert and update methods, $data is an associative array of data to be inserted or updated, in which the keys are column name strings and the values are the value to be inserted or updated in the database. In the delete and update methods, the optional $where parameter is a string containing an SQL logical condition that is used to select the rows that should be deleted or updated, respectively. That is, the $where parameter should contain the contents of the WHERE clause of the corresponding SQL command, without the 'WHERE ' prefix. Each method returns true on normal completion, and a PEAR Error if an error is encountered.

These DB_Table_Database methods are simple wrappers that call the corresponding methods DB_Table methods internally. As one result, overriding any of these methods in a subclass of DB_Table in order to customize the behavior of a specific table will automatically modify the behavior of the DB_Table_Database method.

The DB_Table_Database data insert() and update() methods can validate foreign key values before actually modifying data in the database, and can emulate referentially triggered actions such cascading deletes, if foreign key validation and these referentially triggered actions are enabled. The corresponding methods of DB_Table will take identical actions if the DB_Table has been added to a parent DB_Table_Database object (i.e., if it contains a reference to a parent object), and if these actions are enabled in the parent DB_Table_Database object. Foreign key validation is disabled by default. Referentially triggered actions are enabled by default, for any such action that is declared in the database model.

The insert() and update() methods return a PEAR_Error object if foreign key validation fails, or if an error occurs during any database command. A PEAR_Error is also returned if a 'restrict' ON DELETE or ON UPDATE action is declared, when such actions are enabled, if an attempt is made to delete or update any row that is referenced by a foreign key of one or more rows of another table.

PHP Serialization

One way to maintain the state of DB_Table_Database between web pages is to serialize the entire database as one string, and save it in a session variable, a file, or a database. A serialized DB_Table_Database object contains serialized versions of all of its tables, and thus contains the information necessary to reconstruct the database. Serialization is accomplished by the PHP serialize function:
<?php
$db_serial = serialize($db);
?>
The following two commands are necessary to unserialize and restore the state of a DB_Table_Database object:
<?php
$db = unserialize($db_serial);
$db->setDBconnection($DB_object);
?>
where $DB_object is a DB or MDB2 connection object. The setDBconnection method sets the same database connection for the parent DB_Table_Database object and all of the child DB_Table objects.

When a DB_Table_Database object is unserialized, each child DB_Table object is unserialized in turn by the DB_Table_Database::__wakeup() method. If the DB_Table objects are instances of subclasses of DB_Table, this requires that the definitions of these subclasses exist in memory prior to unserialization of the table. This can be accomplished by explicitly including the file or files containing the required class definitions in the file containing the unserialize command, or by taking advantage of an auto-load mechanism that is built into the wake-up method.

In order for autoloading of subclass definitions to work, each of the subclasses must be defined in a separate file in a default directory, with a filename that is given by the class name with an added '.php' extension. If the definition of a required subclass of DB_Table named "classname" is found to not exist in memory when needed during unserialization, the __wakeup() method tries to include a file named "classname.php" in this directory.

For autoloading to work, the base of each such filename must be the class name obtained by applying the built-in get_class function to the object. This yields a lower case class name PHP 4 and preserves the capitalization used in the class definition in PHP 5.

setTableSubclassPath()

setTableSubclassPath() - sets the path to the default directory for DB_Table subclass definitions.

Synopsis:
void setTableSubclassPath(string $path)
Parameter $path is the path to the desired directory, without a trailing directory separator. The path must be specified in the form required by a 'require_once" statement, with the current PHP settings.

XML Serialization

The toXML() and fromXML() methods may be used to serialize a database schema to, and unserialize it from, an XML string, respectively. The fromXML() method uses simpleXML to parse the XML string, and so requires PHP 5. (This is the only method in the class that is not compatible with PHP 4).

The XML schema used by these methods is an extension of the current MDB2_Schema DTD, extended so as to allow specification of foreign key references. This extension for foreign keys has been agreed upon for adoption in a future release of MDB2_Schema.

The toXML() method returns an XML string for the entire database, including all of its tables and foreign key references, like so:
<?php
$xml_string = $db->toXML();
?>
The DB_Table_Database::fromXML() method is a static method that takes an MDB2 XML database schema string as its only parameter and returns a DB_Table_Database object containing all the tables and references in the database. The following pair of commands is necessary to create a DB_Table_Database object and connect it to a RDBMS
<?php
$db = DB_Table_Database::fromXML($xml_string);
$db->setDBconnection($DB_object);
?>
Here, as for unserialization, the setDBconnection() method is used to establish a connection be the new object and a database server, where $DB_object is a DB or MDB2 connection object. The tables of the DB_Table_Database object that is returned by fromXML() are all instances of DB_Table itself, rather than of custom subclasses of DB_Table. fromXML() returns a PEAR_Error if the XML string cannot be parsed, if an error is thrown during instantiation of either the DB_Table_Database object or any of the child DB_Table objects, or if called with a PHP 4 interpreter (it requires PHP 5).

Setting DB_Table properties

Several methods of DB_Table_Database are used to set a common value of a DB_Table property for every child table in the database. These methods, which have the same names and interfaces as the corresponding DB_Table methods, are:
void autoValidInsert(bool $flag);
void autoValidUpdate(bool $flag);
void autoRecast(bool $flag);
void autoInc(bool $flag);
Each has a boolean argument that turns on (true) or off (false) one of the features of DB_Table. All of the relevant features affect data insertion and updating, and are implemented within the DB_Table insert() and update() methods. The DB_Table_Database insert() and update() methods simply call the corresponding DB_Table methods, so changes in these properties also change the behavior of the DB_Table_Database methods.

The autoValidInsert and autoValidUpdate methods turn on or off the automatic validation that data is of the expected type prior to insertion or updating of the data. The autoRecast method turns on or off the attempted recasting of data to the expected data type, if necessary, prior to insertion or updating. autoInc turns on or off the PHP implementation of auto-incrementation of the value of the $auto_inc_col column (if any) upon insertion. Note that, when the feature is on, this column is still auto-incremented only if its value is left null in the data to be inserted.

Get* Methods

Most of the properties of DB_Table_Database are private. A get* method is defined for each private property. Please see the API documentation for a discussion of all of properties and associated get* methods.

DB_Table_Generator Class Tutorial

DB_Table_Generator Class Tutorial  --  Code generation for an existing database

Description

The DB_Table_Generator class can generate the PHP code necessary to use the DB_Table package to interact with an existing database. It generates skeleton DB_Table subclass definitions for every table in the database, using table schemas that are obtained by querying the database. It can also generate a file containing the code required to connect to the database, and to create a parent DB_Table_Database object.

Name Conventions and File Structure

All code generated by a DB_Table_Generator object is written to a directory whose path is given by the $class_write_path property of that object. By default, this is the current directory. By default, the name of the class constructed for a table named 'thing' is Thing_Table. That is, the class name is the table name, with the first letter upper case, with an added suffix '_Table'. This suffix can be changed by setting the $class_suffix property. The name of the file containing a subclass definition is the subclass name with a PHP extension, e.g., 'Thing_Table.php'. The name of the object instantiated from that subclass is the same as the table name, with no suffix, e.g., 'thing'.

Code Generation Instructions

To generate the code for all of the tables in a database named $database, instantiate a DB or MDB2 object named $conn that connects to the database of interest, and execute the following code:

In the above example, '/var/www/html/app1/db_table' is the path (without a trailing directory separator) to a directory in which all of the code should be written. If this directory does not exist, it will be created (if possible). If the directory does already exist, existing files will not be overwritten. If $class_write_path is not set (i.e., if this line from the example is ommitted) all the code will be written to the current directory.

The generateTableClassFiles() method generates skeleton subclass definitions for a set of tables, with different subclass definitions in different files. If it is called with no argument, as above, it generates subclass definitions for all of the tables in the current database.

The generateDatabaseFile() method generates a file, named 'Database.php' by default, that contains all of the additional code necessary to connect to a database and to create a parent DB_Table_Database object. If the generateDatabaseFile() method is called, as in the above example, it must be called after the generateTableClassFiles(). The code in the 'Database.php' file includes (using the "require_once" command) each of the table subclass definition files, instantiates one object of each DB_Table subclass (creating one object per table), instantiates a parent DB_Table_Database object, adds all the tables to that parent, and attempts to guess foreign key relationships between tables based on the column names. This file will generally need to be edited so as to include information about the data source name (DSN), and any foreign key relationships that could not be guessed by the generator.

By default, generateTableClassFiles() and generateDatabaseFiles() generate code for all of the tables in the current database. To generate code for a specified list of tables, set the value of the public $tables property to a sequential list of table names before calling either of these methods. For example, code can be generated for three tables named 'table1', 'table2', and 'table3' as follows:

If the $tables property of the DB_Table_Generator object is not set to an array value before generateTableClassFiles() is called, then, by default, the generateTableClassFiles() method queries the database for an array of all table names (by calling the getTableNames() method internally), and the $table property is set equal to the resulting array of table names.

DB_Table Data Types

DB_Table Data Types --  Abstract data types used in DB_Table column definitions

Description

These are the supported data types in DB_Table:

DB_Table abstracts data types for you, so your data is always stored the same way, regardless of the database backend. In some cases, particularly with date, time, and timestamp, the native database format is ignored completely and data is stored as a fixed-length character string.

DB_Table does no support binary large objects (BLOBs), but character large objects (CLOBS) are available.

Integers

There are three sizes of integer columns:

  • 'smallint' can store values from (-2^15) to +(2^15); that is, from -32778 to 32767

  • 'integer' can store values from (-2^31) to +(2^31); that is, from -2,147,483,648 to +2,147,483,647

  • 'bigint' can store values from (-2^63) to +(2^63); that is, from -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807

The $col definition, you need only specify the column type; no size or scope is needed.

Fixed-Point Decimal Numbers

To define a fixed-point column in DB_Table, use the 'decimal' datatype, and indicate both the 'size' (width) and 'scope' (number of decimal places). For example, to define a 5-digit number that has 2 decimal places:

For the above example, standard SQL requires that the column be able to store any value with 5 digits and 2 decimals. In this case, therefore, the range of values that can be stored in the column is from -999.99 to 999.99. DB_Table attempts to enforce this behavior regardless of the RDBMS backend behavior.

Floating-Point Numbers

To define a floating-point column in DB_Table, use the 'single' or 'double' datatype.

  • 'single' is a single-precision floating point number

  • 'double' is a double-precision floating point number

You need only specify the column type; no size or scope is needed.

Boolean

A boolean value is a true/false (1 or 0) value. You need only specify the column type; no size or scope is needed.

Boolean values are stored as fixed-point decimals of size 1, scope 0.

If the column is not required, a NULL value stored therein may be treated as a third value, which allows the boolean column to be treated as a ternary value instead of a binary value (i.e., NULL|0|1 instead of 0|1).

Strings

To define a fixed-length character string column, use the 'char' datatype, and indicate the exact size of the string.

To define a variable-length character string column, use the 'varchar' datatype, and indicate the maximum size of the string.

For example, to define a 64-character variable-length string:

You must specify a 'size' element, but no scope is needed. The maximum size is 255 characters.

Date

To define an ISO-standard date column, use the 'date' datatype.

You need only specify the column type; no size or scope is needed.

Values for 'date' are always stored as 10-character strings, in the format "yyyy-mm-dd".

Time

To define an ISO standard time with hour, minutes, and seconds, use the 'time' data type.

You need only specify the column type; no size or scope is needed.

A 'time' value is always stored as an 8-character string, in the format "hh:ii:ss".

Timestamp

To define an ISO standard date-and-time column, use the 'timestamp' data type.

You need only specify the column type; no size or scope is needed.

Values for 'timestamp' are always stored as an 19-character strings, in the format "yyyy-mm-dd hh:ii:ss" (24-hour clock).

Note: If you want to store a Unix timestamp, use the 'integer' datatype; Unix timestampes are 4-byte integers, which maps perfectly to the DB_Table 'integer' datatype.

Character Large Object (CLOB)

You need only specify the column type; no size or scope is needed.

Values for 'clob' are always stored as the large possible native text type (e.g., LONGTEXT) or native CLOB type.


MDB

Table of Contents
Introduction - DSN -- The Data Source Name
Introduction - Connect -- Connecting and disconnecting a database
Introduction - Query -- Performing a query against a database.
Introduction - Fetch -- Fetching rows from the query
Introduction - Sequences -- Database sequences
Introduction - Execute -- Prepare & Execute/ExecuteMultiple
MDB -- Main class
MDB::connect() -- connects to database
MDB::isError() -- checks for an error
MDB_Common -- Interface for database access
MDB_Common::affectedRows() -- Number of affected rows
MDB_Common::createSequence() -- create a new sequence
MDB_Common::currId() -- returns the current free id of a sequence
MDB_Common::disconnect() -- disconnect from a database
MDB_Common::dropSequence() -- deletes a sequence
MDB_Common::execute() -- executes a prepared SQL statement
MDB_Common::executeQuery() -- executes a prepared SQL statement
MDB_Common::executeMultiple() -- repeated execution of a prepared SQL statement
MDB_Common::fetchAll() -- fetch result set as a nested array
MDB_Common::fetchCol() -- Fetch a single column
MDB_Common::fetchOne() -- fetch the first column of the first row
MDB_Common::fetchRow() -- fetch the first row
MDB_Common::fetchInto() -- fetch a row into a variable
MDB_Common::freeResult() -- delete the result set
MDB_Common::getAll() -- Fetch all rows
MDB_Common::getAssoc() -- fetch result set as associative array
MDB_Common::getCol() -- Fetch a single column
MDB_Common::getOne() -- fetch the first column of the first row
MDB_Common::getRow() -- fetch the first row
MDB_Common::getTextValue() -- quotes a string
MDB_Common::limitQuery() -- send a limited query to the database
MDB_Common::nextId() -- returns the next free id of a sequence
MDB_Common::numCols() -- get number of columns
MDB_Common::numRows() -- get number of rows
MDB_Common::prepareQuery() -- prepares a SQL statement
MDB_Common::query() -- send a query to the database
MDB_Common::queryAll() -- fetch result set as a nested array
MDB_Common::queryCol() -- Fetch a single column
MDB_Common::queryOne() -- fetch the first column of the first row
MDB_Common::queryRow() -- fetch the first row
MDB_Common::setFetchMode() -- sets the default fetch mode
MDB_Common::tableInfo() -- get table info from a query
MDB_Error -- MDB Error object

A unified API for accessing databases, based on user provided meta data.

Introduction - DSN

Introduction - DSN -- The Data Source Name

Description

To connect to a database through PEAR::MDB, you have to create a valid DSN - data source name. This DSN consists in the following parts:

phptype: Database backend used in PHP (i.e. mysql , odbc etc.)
dbsyntax: Database used with regards to SQL syntax etc.
protocol: Communication protocol to use ( i.e. tcp, unix etc.)
hostspec: Host specification (hostname[:port])
database: Database to use on the DBMS server
username: User name for login
password: Password for login
proto_opts: Maybe used with protocol

The format of the supplied DSN is in its fullest form:
phptype(dbsyntax)://username:password@protocol+hostspec/database
Most variations are allowed:
phptype://username:password@protocol+hostspec:110//usr/db_file.mdb
phptype://username:password@hostspec/database_name
phptype://username:password@hostspec
phptype://username@hostspec
phptype://hostspec/database
phptype://hostspec
phptype(dbsyntax)
phptype
The currently supported database backends are:
mysql  -> MySQL
pgsql  -> PostgreSQL
ibase  -> InterBase
mssql  -> Microsoft SQL Server
oci8   -> Oracle 7/8/8i
fbsql  -> FrontBase

With an up-to-date version of MDB, you can use a second DSN format
phptype(syntax)://user:pass@protocol(proto_opts)/database

Warning

Please note, that some features may be not supported by all database backends. Please refer to the PEAR MDB extensions status document located at: <pear base dir>/MDB/STATUS to get a detailed list about what features are supported by which backend.

Introduction - Connect

Introduction - Connect -- Connecting and disconnecting a database

Introduction - Query

Introduction - Query -- Performing a query against a database.

Description

To perform a query against a database, you have to use the function query(), that takes the query string as an argument. On failure you get a MDB_Error object. Be sure to check it with MDB::isError(). On success, you get MDB_OK or when you set a SELECT-statement a result resource handle

Introduction - Fetch

Introduction - Fetch -- Fetching rows from the query

Description

Fetch rows by number

The PEAR MDB fetch system also supports an extra parameter to the fetch statement. So you can fetch rows from a result by number. This is especially helpful if you only want to show sets of an entire result (for example in building paginated HTML lists), fetch rows in an special order, etc.

Freeing the result set

It is recommended to finish the result set after processing in order to to save memory. Use freeResult() to do this.

Quick data retrieving

MDB provides some special ways to retrieve information from a query without the need of using fetch*() and loop throw results.

queryOne() retrieves the first result of the first column from a query
$numrows = $db->queryOne('select count(id) from clients');

queryRow() returns the first row and returns it as an array.
$sql = 'select name, address, phone from clients where id=1';
if (is_array($row = $db->queryRow($sql))) {
    list($name, $address, $phone) = $row;
}

queryCol() returns an array with the data of the selected column. It accepts the column number to retrieve as the second parameter.
$all_client_names = $db->queryCol('SELECT name FROM clients');
The above sentence could return for example:
$all_client_names = array('Stig', 'Jon', 'Colin');

getAll() fetches all the rows returned from a query. This method also has some advanced parameters still will also enable you to return the data as an associative array using the first column as the key.
$data = getAll('SELECT id, text, date FROM mytable');
/*
Will return:
array(
   1 => array('4', 'four', '2004'),
   2 => array('5', 'five', '2005'),
   3 => array('6', 'six', '2006')
)
*/

The query*() family methods will do all the dirty job for you, this is: launch the query, fetch the data and free the result. Please note that as all PEAR MDB functions they will return a MDB_Error object on errors.

Getting more information from query results

With MDB you have many ways to retrieve useful information from query results. These are:

  • numRows() : Returns the total number of rows returned from a "SELECT" query.
    // Number of rows
    echo $db->numRows($res);

  • numCols() : Returns the total number of columns returned from a "SELECT" query.
    // Number of cols
    echo $db->numCols($res);

  • affectedRows() : Returns the number of rows affected by a data manipulation query ("INSERT", "UPDATE" or "DELETE").
    // remember that this statement won't return a result object
    $db->query('DELETE * FROM clients');
    echo 'I have deleted ' . $db->affectedRows() . ' clients';

  • tableInfo() : Returns an associative array with information about the returned fields from a "SELECT" query.
    // Table Info
    print_r($db->tableInfo($res));

Don't forget to check if the returned result from your action is a MDB_Error object. If you get a error message like "MDB_Error: database not capable", means that your database backend doesn't support this action.

Introduction - Sequences

Introduction - Sequences -- Database sequences

Description

Sequences are a way of offering unique IDs for data rows. If you do most of your work with e.g. MySQL, think of sequences as another way of doing AUTO_INCREMENT. It's quite simple, first you request an ID, and then you insert that value in the ID field of the new row you're creating. You can have more than one sequence for all your tables, just be sure that you always use the same sequence for any particular table. To get the value of this unique ID use nextId() , if a sequence doesn't exists, it will be created automaticlly.

Introduction - Execute

Introduction - Execute -- Prepare & Execute/ExecuteMultiple

Description

Purpose

prepareQuery() and executeQuery*() give you more power and flexibilty for query execution. You can use them, if you have to do more than one equal query (i.e. adding a list of adresses to a database) or if you want to support different databases, which have different implementations of the SQL standard.

Imagine you want to support two databases with different INSERT syntax:
db1 : INSERT INTO tbl_name ( col1, col2 ... ) VALUES ( expr1, expr2 ... )
db2 : INSERT INTO tbl_name SET col1=expr1, col2=expr2 ...
Corresponding to create multi-lingual scripts you can create a array with queries like this:
$statement['db1']['INSERT_PERSON'] = "INSERT INTO person ( surname, name, age ) VALUES ( ?, ?, ? )" ;
$statement['db2']['INSERT_PERSON'] = "INSERT INTO person SET surname=?, name=?, age=?" ;

Prepare

To use the features above, you have to do two steps. Step one is to prepareQuery the statement and the second is to executeQuery it.

Prepare() has to be called with the generic statement at least once. It returns a handle for the statement.

To create a generic statement is simple. Write the SQL query as usual, i.e.
SELECT surname, name, age FROM person
   WHERE name = 'name_to_find' AND age < 'age_limit'
Now check which parameters should be replaced while script runtime. Substitute this parameters with a placeholder.
SELECT surname, name, age FROM person WHERE name = ? AND age < ?
So, thats all! Now you have a generic statement, required by prepareQuery() .

prepareQuery() can handle different types of placeholders or wildcards.

? - (recommended) stands for a scalar value like strings or numbers, the value will be quoted depending of the database
! - stands for a scalar value and will inserted into the statement "as is".
& - requires an existing filename, the content of this file will be included into the statement (i.e. for saving binary data of a graphic file in a database)

Execute/ ExecuteMultiple

After preparing the statement, you can execute the query. This means to assign the variables to the prepared statement. To do this, executeQuery() requires two arguments, the statement handle of prepareQuery() and an array with the values to assign. The array has to be numerically ordered. The first entry of the array represents the first wildcard, the second the second wildcard etc. The order is independent from the used wildcard char.
In the example the query is done four times:
INSERT INTO numbers VALUES( '1', 'one', 'en')
INSERT INTO numbers VALUES( '2', 'two', 'to')
INSERT INTO numbers VALUES( '3', 'three', 'tre')
INSERT INTO numbers VALUES( '4', 'four', 'fire')
executeMultiple() works in the same way, but requires a two dimensional array. So you can avoid the explicit foreach in the eample above.
The result is the same. If one of the records failed, the unfinished records will not be executed.

If executeQuery*() fails a MDB_Error, else MDB_OK will returned.

MDB

MDB  -- Main class

Description

The main MDB class is simply a container class with some static methods for creating MDB objects.

MDB::connect()

MDB::connect() -- connects to database

Description

Creates a new MDB connection object and connect to the specified database

Parameter

string $dsn

Data Source Name. See the "DSN" section for further information.

boolean $options

If $options is TRUE the connection will be persistent (requires support by database driver). Default is FALSE. In future releases, this parameter will be an array and take different options depending on the database.

Return value

object - the created MDB connection object, or a MDB_Error object on error.

Note

This function should be called statically.

MDB::isError()

MDB::isError() -- checks for an error

Description

Checks whether a result code from a MDB method is a MDB_Error object or not.

Parameter

mixed $value

Variable to check

Return value

boolean - TRUE, if $value is a MDB_Error object

Note

This function should be called statically.

MDB_Common

MDB_Common  -- Interface for database access

Description

MDB_Common is an interface class; that provides all methods to query a specific database. An instance of a database specific class will be returned by the MDB::connect() method.

MDB_Common::affectedRows()

MDB_Common::affectedRows() -- Number of affected rows

Description

Number of affected rows by a query

Return value

integer - number of rows or MDB_Error when fail

Note

This function can not be called statically.

MDB_Common::createSequence()

MDB_Common::createSequence() -- create a new sequence

Parameter

string $seq_name

name of the new sequence to create

integer $start

starting value of the sequence

Return value

integer - MDB_OK or MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::currId()

MDB_Common::currId() -- returns the current free id of a sequence

Parameter

string $seq_name

name of the sequence

Return value

resource - a free id or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::disconnect()

MDB_Common::disconnect() -- disconnect from a database

Description

Disconnects from a database

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

MDB_Common::dropSequence()

MDB_Common::dropSequence() -- deletes a sequence

Parameter

string $seqName

name of the sequence to delete

Return value

Note

This function can not be called statically.

MDB_Common::execute()

MDB_Common::execute() -- executes a prepared SQL statement

Description

execute() joins the prepared SQL statement from prepareQuery() with the given data and executes the SQL query.

Parameter

resource $stmt

query handle from prepareQuery()

array $types

if supplied, the types of the columns in the result set will be set for fetching

array $params

a numeric array containing the data to insert into the query

array $param_types

if supplied, the values in $param will automatically be set to the passed datatypes

Return value

mixed - a resource id/MDB_OK or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::executeQuery()

MDB_Common::executeQuery() -- executes a prepared SQL statement

Description

executeQuery() joins the prepared SQL statement from prepareQuery() with the data that was set using one of the setParam() methods and executes the SQL query.

Parameter

resource $stmt

query handle from prepareQuery()

array $types

if supplied, the types of the columns in the result set will be set for fetching

Return value

mixed - a resource id/MDB_OK or a MDB_Error, if fail

Note

This function can not be called statically.

See Introduction - Execute for general using and an example.

MDB_Common::executeMultiple()

MDB_Common::executeMultiple() -- repeated execution of a prepared SQL statement

Description

executeMultiple() joins the prepared SQL statement from prepareQuery() with the given data and does the SQL query for every "row" in the $data array.

Parameter

resource $stmt

query handle from prepareQuery()

array $types

if supplied, the types of the columns in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

array array $data

a numeric array containing the data to insert into the query

Return value

mixed - a resource id/MDB_OK or a MDB_Error, if fail

Note

This function can not be called statically.

Warning

If an error occurs during execution, the function will be stopped. Possible remaining data will be unprocessed.

See Introduction - Execute for general using and an example.

MDB_Common::fetchAll()

MDB_Common::fetchAll() -- fetch result set as a nested array

Description

Fetch the entire result set of a result set and return it into a nested array and free the result set.

Parameter

resource $result

a valid resource returned by query() or executeQuery()

integer $fetchmode

the fetch mode to use

boolean $rekey

if set to TRUE the array result be modified as follows: If the result set contains more than two columns, the value will be an array of the values from column 2 to n. If the result set contains only two columns, the returned value will be a scalar with the value of the second column (unless forced to an array with the $force_array parameter).

boolean $force_array

used only if the query returns exactly two columns. If TRUE, the values of the returned array will be one-element arrays instead of scalars.

boolean boolean $group

if TRUE, the values of the returned array is wrapped in another array. If the same key value (in the first column) repeats itself, the values will be appended to this array instead of overwriting the existing values.

Return value

array - an nested array or a MDB_Error, if fail.

Note

This function can not be called statically.

MDB_Common::fetchCol()

MDB_Common::fetchCol() -- Fetch a single column

Description

Fetch a single column from a result set of a result set and free the result set.

Parameter

resource $result

a valid resource returned by query() or executeQuery()

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

mixed $colnum

which column to return (integer [column number, starting at 0] or string [column name])

Return value

array - the first row of results as an array indexed from 0 or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::fetchOne()

MDB_Common::fetchOne() -- fetch the first column of the first row

Description

Fetch the first column of the first row of data returned from a result set and free the result set.

Parameter

resource $result

a valid resource returned by query() or executeQuery()

Return value

mixed - the returned value or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::fetchRow()

MDB_Common::fetchRow() -- fetch the first row

Description

Fetch the first row of data returned from a result set and free the result set.

Parameter

resource $result

a valid resource returned by query() or executeQuery()

integer $fetchmode

the fetch mode to use, default is MDB_FETCHMODE_DEFAULT

integer $rownum

the row number to fetch

Return value

array - the first row of results as an array indexed from 0 or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::fetchInto()

MDB_Common::fetchInto() -- fetch a row into a variable

Description

Fetch a row and return data in an array.

Parameter

resource $result

result identifier

integer $fetchMode

format of fetched row

integer $rownum

the row number to fetch

Return value

mixed - an array or NULL, if no more rows

MDB_Common::freeResult()

MDB_Common::freeResult() -- delete the result set

Description

Deletes the result set and frees the memory occupied by the result set.

Parameter

resource $result

A valid resource returned by query() or executeQuery()

Return value

  • boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

MDB_Common::getAll()

MDB_Common::getAll() -- Fetch all rows

Description

Fetch the entire result set of a query and return it into a nested array. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

integer $fetchmode

the fetch mode to use, default is MDB_FETCHMODE_DEFAULT

Return value

  • array - an nested array or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::getAssoc()

MDB_Common::getAssoc() -- fetch result set as associative array

Description

Fetch the entire result set of a query and return it as an associative array using the first column as the key. The function takes care of doing the query and freeing the results when finished. If the result set contains more than two columns, the value will be an array of the values from column 2 to n. If the result set contains only two columns, the returned value will be a scalar with the value of the second column (unless forced to an array with the $force_array parameter).

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

integer $fetchmode

the fetch mode to use

boolean $force_array

used only if the query returns exactly two columns. If TRUE, the values of the returned array will be one-element arrays instead of scalars.

boolean boolean $group

if TRUE, the values of the returned array is wrapped in another array. If the same key value (in the first column) repeats itself, the values will be appended to this array instead of overwriting the existing values.

Return value

array - associative array with results from the query.

Note

This function can not be called statically.

MDB_Common::getCol()

MDB_Common::getCol() -- Fetch a single column

Description

Fetch a single column from a result set of a query. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query

string $type

if supplied, the type of the column in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

mixed $colnum

which column to return (integer [column number, starting at 0] or string [column name])

Return value

array - the first row of results as an array indexed from 0 or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::getOne()

MDB_Common::getOne() -- fetch the first column of the first row

Description

Fetch the first column of the first row of data returned from a query. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query or the statement to prepare

string $type

if supplied, the type of the column in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

Return value

mixed - the returned value or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::getRow()

MDB_Common::getRow() -- fetch the first row

Description

Fetch the first row of data returned from a query. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

integer $fetchmode

the fetch mode to use, default is MDB_FETCHMODE_DEFAULT

Return value

array - the first row of results as an array indexed from 0 or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::getTextValue()

MDB_Common::getTextValue() -- quotes a string

Description

Quotes a string database-dependent, so it can be safely used in a query

Parameter

string $string

the input string to quote

Return value

string - the quoted string.

Note

This function can not be called statically.

MDB_Common::limitQuery()

MDB_Common::limitQuery() -- send a limited query to the database

Description

Executes a SQL query, but fetches only the specificed count of rows. It is an emulation of the MySQL LIMIT option.

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

integer $from

the row to start to fetch

integer $count

the numbers of rows to fetch

Return value

mixed - a new a resource id/MDB_OK or a MDB_Error, if fail

Note

This function can not be called statically.

Warning

This module is EXPERIMENTAL. That means that the behaviour of these functions, these function names, in concreto ANYTHING documented here can change in a future release of this package WITHOUT NOTICE. Be warned, and use this module at your own risk.

Depending on the database you will not really get more speed compared to query() . The advantage of limitQuery() is the deleting of unneeded rows in the resultset, as early as possible. So this can decrease memory usage.

MDB_Common::nextId()

MDB_Common::nextId() -- returns the next free id of a sequence

Parameter

string $seq_name

name of the sequence

boolean $onDemand

when TRUE the sequence is automatic created, if it not exists.

Return value

resource - a free id or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::numCols()

MDB_Common::numCols() -- get number of columns

Description

Get the number of columns of the rows in a result set.

Parameter

resource $result

a valid resource returned by query() or executeQuery()

Return value

integer - number of columns

Note

This function can not be called statically.

MDB_Common::numRows()

MDB_Common::numRows() -- get number of rows

Description

Get the number of rows in a result set.

Parameter

resource $result

a valid resource returned by query() or executeQuery()

Return value

integer - number of rows

Note

This function can not be called statically.

MDB_Common::prepareQuery()

MDB_Common::prepareQuery() -- prepares a SQL statement

Description

Prepares a query for execution with executeQuery() .

Parameter

string $query

the query to prepareQuery

Return value

resource - the query handle

Note

This function can not be called statically.

See Introduction - Execute for general using and an example.

MDB_Common::query()

MDB_Common::query() -- send a query to the database

Description

Executes a SQL query

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

Return value

mixed - a new a resource id/MDB_OK or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::queryAll()

MDB_Common::queryAll() -- fetch result set as a nested array

Description

Fetch the entire result set of a query and return it into a nested array. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

integer $fetchmode

the fetch mode to use

boolean $rekey

if set to TRUE the array result be modified as follows: If the result set contains more than two columns, the value will be an array of the values from column 2 to n. If the result set contains only two columns, the returned value will be a scalar with the value of the second column (unless forced to an array with the $force_array parameter).

boolean $force_array

used only if the query returns exactly two columns. If TRUE, the values of the returned array will be one-element arrays instead of scalars.

boolean boolean $group

if TRUE, the values of the returned array is wrapped in another array. If the same key value (in the first column) repeats itself, the values will be appended to this array instead of overwriting the existing values.

Return value

array - an nested array or a MDB_Error, if fail.

Note

This function can not be called statically.

MDB_Common::queryCol()

MDB_Common::queryCol() -- Fetch a single column

Description

Fetch a single column from a result set of a query. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query

string $type

if supplied, the type of the column in the result set will be set for fetching

array $params

if supplied, prepareQuery()/ executeQuery() will be used with this array as execute parameters

array $param_types

if supplied, the values in $param will automatically set to the passed datatypes

mixed $colnum

which column to return (integer [column number, starting at 0] or string [column name])

Return value

array - the first row of results as an array indexed from 0 or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::queryOne()

MDB_Common::queryOne() -- fetch the first column of the first row

Description

Fetch the first column of the first row of data returned from a query. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query or the statement to prepare

string $type

if supplied, the type of the cell in the result set will be set for fetching

Return value

mixed - the returned value or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::queryRow()

MDB_Common::queryRow() -- fetch the first row

Description

Fetch the first row of data returned from a query. The function takes care of doing the query and freeing the results when finished.

Parameter

string $query

the SQL query

array $types

if supplied, the types of the columns in the result set will be set for fetching

integer $fetchmode

the fetch mode to use, default is MDB_FETCHMODE_DEFAULT

integer $rownum

the row number to fetch

Return value

array - the first row of results as an array indexed from 0 or a MDB_Error, if fail

Note

This function can not be called statically.

MDB_Common::setFetchMode()

MDB_Common::setFetchMode() -- sets the default fetch mode

Description

Sets the fetch mode used by default on queries for the connection.

Parameter

integer $fetchmode

MDB_FETCHMODE_ORDEREDor MDB_FETCHMODE_ASSOC, all possibly bit-wise OR'ed with MDB_FETCHMODE_FLIPPED. See "Introduction - Fetch" for further information.

Return value

void - NULL, if ok(!)

Note

This function can not be called statically.

MDB_Common::tableInfo()

MDB_Common::tableInfo() -- get table info from a query

Description

Fetch table information from result query.

Return value

Returns an associative array of table and field information.

Warning

This function is currently not documented.

Note

This function can not be called statically.

MDB_Error

MDB_Error  -- MDB Error object

Description

In case of failure, most of the MDB functions return a MDB_Error object which contains information about the error. MDB_Error offers the same functions as PEAR_Error.


MDB2

Table of Contents
Introduction -- A feature overview
DSN -- The Data Source Name
Connecting -- Connecting and disconnecting a database
Querying -- Performing queries
Quoting and escaping -- Quote values in a suitable format to compose a query.
Datatypes -- An overview of datatype handling
Results -- Obtaining data from query results
Prepare & Execute -- Prepare and execute SQL statements
Transactions -- Performing transactions
Modules -- Loading and calling modules
Manager Module -- Module for managing database structure
Reverse Module -- Module for managing database structure
autoPrepare & autoExecute -- Automatically prepare and execute SQL statements
Portability -- Database portability features
Sequences -- Sequences and auto-incrementing
FAQ -- Frequently asked questions

A unified API for accessing databases and constructing SQL in a portable way.

Introduction

Introduction -- A feature overview

MDB2 Description

PEAR MDB2 is a merge of the PEAR DB and Metabase php database abstraction layers.

It provides a common API for all support RDBMS. The main difference to most other database abstraction packages is that MDB2 goes much further to ensure portability. Among other things MDB2 features:

  • An OO-style query API

  • A DSN (data source name) or array format for specifying database servers

  • Datatype abstraction and on demand datatype conversion

  • Portable error codes

  • Sequential and non sequential row fetching as well as bulk fetching

  • Ability to make buffered and unbuffered queries

  • Ordered array and associative array for the fetched rows

  • Prepare/execute (bind) emulation

  • Sequence emulation

  • Replace emulation

  • Limited Subselect emulation

  • Row limit support

  • Transactions support

  • Large Object support

  • Index/Unique support

  • Module Framework to load advanced functionality on demand

  • Table information interface

  • RDBMS management methods (creating, dropping, altering)

  • Full integration into the PEAR Framework

  • PHPDoc API documentation

Currently supported RDBMS:

  • MySQL

  • MySQLi (PHP5 only)

  • PostgreSQL

  • Oracle

  • Frontbase (unmaintained)

  • Querysim

  • Interbase/Firebird (PHP5 only)

  • MSSQL

  • SQLite

Installation

When you install PEAR MDB2, you only get the base classes, but you also need to install the driver of the appropriate DBMS to have a working installation. For instance, to install the MySQL and the PostgreSQL drivers, you have to run these commands:
$ pear install MDB2

$ pear install MDB2#mysql

$ pear install MDB2#pgsql
Still having problems? Check the F.A.Q.

DSN

DSN -- The Data Source Name

Description

To connect to a database through PEAR::MDB2, you have to create a valid DSN - data source name. This DSN consists in the following parts:

phptype: Database backend used in PHP (i.e. mysql , pgsql etc.)
dbsyntax: Database used with regards to SQL syntax etc.
protocol: Communication protocol to use ( i.e. tcp, unix etc.)
hostspec: Host specification (hostname[:port])
database: Database to use on the DBMS server
username: User name for login
password: Password for login
proto_opts: Maybe used with protocol
option: Additional connection options in URI query string format. options get separated by &. The Following table shows a non complete list of options:

The DSN can either be provided as an associative array or as a string. The string format of the supplied DSN is in its fullest form:
phptype(dbsyntax)://username:password@protocol+hostspec/database?option=value

Most variations are allowed:
phptype://username:password@protocol+hostspec:110//usr/db_file.db
phptype://username:password@hostspec/database
phptype://username:password@hostspec
phptype://username@hostspec
phptype://hostspec/database
phptype://hostspec
phptype:///database
phptype:///database?option=value&anotheroption=anothervalue
phptype(dbsyntax)
phptype

The currently supported database backends are:
fbsql  -> FrontBase
ibase  -> InterBase / Firebird (requires PHP 5)
mssql  -> Microsoft SQL Server (NOT for Sybase. Compile PHP --with-mssql)
mysql  -> MySQL
mysqli -> MySQL (supports new authentication protocol) (requires PHP 5)
oci8   -> Oracle 7/8/9/10
pgsql  -> PostgreSQL
querysim -> QuerySim
sqlite -> SQLite 2

A second DSN format is supported
phptype(syntax)://user:pass@protocol(proto_opts)/database

If your database, option values, username or password contain characters used to delineate DSN parts, you can escape them via URI hex encodings:
: = %3a   / = %2f   @ = %40
+ = %2b   ( = %28   ) = %29
? = %3f   = = %3d   & = %26

Warning

Please note, that some features may be not supported by all database backends.

Connecting

Connecting -- Connecting and disconnecting a database

Description

To instantiate a database object you have several methods available using MDB2.

To connect to a database you have to use the function factory(), connect() or singleton(), which require a valid DSN as the first parameter. This parameter can either be a string or an array. If using an array, the array used gets merged with the default information:
$dsn = array(
    'phptype'  => false,
    'dbsyntax' => false,
    'username' => false,
    'password' => false,
    'protocol' => false,
    'hostspec' => false,
    'port'     => false,
    'socket'   => false,
    'database' => false,
    'new_link' => false,
    'service'  => false, // only in oci8
);
Any elements you set override the defaults and the remainder stay at their defaults.

The second parameter is the optional $options array that can contain runtime configuration settings for this package.

Table 37-2. List of options

NameTypeDescription
sslboolean determines if ssl should be used for connections
field_caseinteger CASE_LOWER|CASE_UPPER: determines what case to force on field/table names
disable_queryboolean determines if queries should be executed
result_classstring class used for result sets
buffered_result_classstring class used for buffered result sets, default is MDB2_Result_Common
result_wrap_classstring class used to wrap result sets into, default is MDB2_Result_Common
result_bufferingboolean should results be buffered or not?
fetch_classstring class to use when fetch mode object is used
persistentboolean persistent connection?
debuginteger numeric debug level
debug_handlerstring function/method that captures debug messages
debug_expanded_outputboolean BC option to determine if more context information should be send to the debug handler
default_text_field_lengthinteger default text field length to use
lob_buffer_lengthinteger LOB buffer length
log_line_breakstring line-break format
idxname_formatstring pattern with '%s' for index name
seqname_formatstring pattern with '%s' for sequence name
savepoint_formatstring pattern with '%s' for auto generated savepoint names
seqcol_namestring sequence column name
quote_identifierboolean if identifier quoting should be done when check_option is used
use_transactionsboolean if transaction use should be enabled
decimal_placesinteger number of decimal places to handle
portabilityinteger portability constant
modulesarray short to long module name mapping for __call()
emulate_preparedboolean force prepared statements to be emulated
datatype_maparray map user defined datatypes to other primitive datatypes
datatype_map_callbackarray callback function/method that should be called

In case of success you get a new instance of the database class. It is strongly recommended to check this return value with PEAR::isError() (will detect PEAR_Error or any subclass) or the MDB2_Driver_Common specific isError().

To disconnect use the method disconnect() from your database class instance.

Querying

Querying -- Performing queries

Description

PEAR MDB2 provides several methods for querying databases. The most direct method is query(). It takes a SQL query string as an argument. There are two possible returns: A new MDB2_Result object for queries that return results (such as SELECT queries), or a MDB2_Error object on failure. It should not be used with statements that manipulate data (such as INSERT queries)

exec() should be used for manipulation queries. There are two possible returns: An integer denoting the number of affected rows for statements that manipulate data (such as INSERT queries), or a MDB2_Error object on failure. It should not be used with statements that return results (such as SELECT queries)

Data types

MDB2 supports a number of data types across all drivers. These can be set for result sets in all relevant methods. You can find an overview of the supported data types and their format here.

Limiting rows and reading from an offset

In order to read/write to only a limited number of rows from a result set and/or to start reading from a specific offset the setLimit() can be called prior to issueing the query. The limit and offset will only affected the next method call that will issue a query or prepare a statement and will automatically be reset after issueing the query. This also applies to any internal queries issues inside MDB2. Note that limit may not work with DML statements on RDBMS that emulate limit support and no error will be raised.

Quoting and escaping

Quoting and escaping -- Quote values in a suitable format to compose a query.

Description

MDB2 provides a quote() method to quote a value into a DBMS specific format that is suitable to compose query statements. It has four parameters (only the first one is required): the value to be quoted, its datatype, whether or not to quote the value, and whether or not to escape the wildcards in the value. If you don't provide the datatype, it will be guessed from the value.

With the third parameter of the quote() you can specify whether or not the above fields should be individually quoted:

The above example will quote the fields and the resulting SQL will look as such:
INSERT INTO sometable FIELDS (textfield1, boolfield2, datefield3) VALUES ('blah', 1, '2006-02-21')
where the values defined were the values inserted accordingly. You will notice that the "boolfield2" is unquoted as we specified FALSE in the quote() method.

NB: If you use prepared statements, then quoting will be done automatically, you don't need to do it yourself.

Identifiers

You can quote the db identifiers (table and field names) with quoteIdentifier(). The delimiting style depends on which database driver is being used. NOTE: just because you CAN use delimited identifiers, it doesn't mean you SHOULD use them. In general, they end up causing way more problems than they solve. Anyway, it may be necessary when you have a reserved word as a field name (in this case, we suggest you to change it, if you can). Also, don't use quoteIdentifier() if you have a period in the table name itself (which, BTW, is a really bad idea), since it will consider it as a schema.table pair.

Some of the internal MDB2 methods generate queries. Enabling the quote_identifier option of MDB2 you can tell MDB2 to quote the identifiers in these generated queries. For all user supplied queries this option is irrelevant.

Portability is broken by using the following characters inside delimited identifiers:

  • backtick (`) -- due to MySQL

  • double quote (") -- due to Oracle

  • brackets ([ or ]) -- due to Access

Delimited identifiers are known to generally work correctly under the following drivers:

  • mssql

  • mysql

  • mysqli

  • oci8

  • pgsql

  • sqlite

Firebird/InterBase doesn't seem to be able to use delimited identifiers via PHP 4. They work fine under PHP 5.

Quoting options

Within the MDB2 API there are a number of options to set the quoting options, one of which simply quotes the identifiers within the abstraction, the other quotes the field values on insert/update etc. when using the prepared statements methods.

When using the quote_identifier option, all of the field identifiers will be automatically quoted in the resulting SQL statements:
$mdb2->setOption('quote_identifier', true);
will result in a SQL statement that all the field names are quoted with the backtick '`' operator (in MySQL).
SELECT * FROM `sometable` WHERE `id` = '123';
as opposed to:
SELECT * FROM sometable WHERE id='123';

Escape

If you want to escape a value, without surrounding it with quotes, you can use the escape() method. If you also want to escape the wildcards (_ and %), set the second parameter to TRUE

If you just want to escape the wildcards in a value, you can use the escapePattern() method.

Datatypes

Datatypes -- An overview of datatype handling

Introduction

All DBMS provide multiple choice of data types for the information that can be stored in their database table fields. However, the set of data types made available varies from DBMS to DBMS.

To simplify the interface with the DBMS supported by MDB2, it was defined a base set of data types that applications may access independently of the underlying DBMS.

The MDB2 applications programming interface takes care of mapping data types when managing database options. It is also able to convert that is sent to and received from the underlying DBMS using the respective driver.

The following data type examples should be used with MDB2's createTable() method. The example array at the end of the data types section may be used with createTable() to create a portable table on the DBMS of choice (please refer to the main MDB2 documentation to find out what DBMS back ends are properly supported). It should also be noted that the following examples do not cover the creation and maintenance of indices, this chapter is only concerned with data types and the proper usage thereof.

"Global" table type modifiers

Within the MDB2 API there are a few modifiers that have been designed to aid in optimal table design. These are:

  • The notnull modifiers

  • The length modifiers

  • The default modifiers

  • unsigned modifiers for some field definitions, although not all DBMS's support this modifier for integer field types.

  • fixed length modifiers for some field definitions.

Building upon the above, we can say that the modifiers alter the field definition to create more specific field types for specific usage scenarios. The notnull modifier will be used in the following way to set the default DBMS NOT NULL Flag on the field to true or false, depending on the DBMS's definition of the field value: In PostgreSQL the "NOT NULL" definition will be set to "NOT NULL", whilst in MySQL (for example) the "NULL" option will be set to "NO". In order to define a "NOT NULL" field type, we simply add an extra parameter to our definition array (See the examples in the following section)
'sometime' = array(
    'type'    = 'time',
    'default' = '12:34:05',
    'notnull' = true,
),
Using the above example, we can also explore the default field operator. Default is set in the same way as the notnull operator to set a default value for the field. This value may be set in any character set that the DBMS supports for text fields, and any other valid data for the field's data type. In the above example, we have specified a valid time for the "Time" data type, '12:34:05'. Remember that when setting default dates and times, as well as datetimes, you should research and stay within the epoch of your chosen DBMS, otherwise you will encounter difficult to diagnose errors!

The above example will create a character varying field of length 12 characters in the database table. If the length definition is left out, MDB2 will create a length of the maximum allowable length for the data type specified, which may create a problem with some field types and indexing. Best practice is to define lengths for all or most of your fields.

Text data type

The text data type is available with two options for the length: one that is explicitly length limited and another of undefined length that should be as large as the database allows.

The length limited option is the most recommended for efficiency reasons. The undefined length option allows very large fields but may prevent the use of indexes, nullability and may not allow sorting on fields of its type.

The fields of this type should be able to handle 8 bit characters. Drivers take care of DBMS specific escaping of characters of special meaning with the values of the strings to be converted to this type.

By default MDB2 will use variable length character types. If fixed length types should be used can be controlled via the fixed modifier.

Boolean data type

The boolean data type represents only two values that can be either 1 or 0. Do not assume that these data types are stored as integers because some DBMS drivers may implement this type with single character text fields for a matter of efficiency. Ternary logic is possible by using null as the third possible value that may be assigned to fields of this type.

Integer data type

The integer data type may store integer values as large as each DBMS may handle. Fields of this type may be created optionally as unsigned integers but not all DBMS support it. Therefore, such option may be ignored. Truly portable applications should not rely on the availability of this option.

Decimal data type

The decimal data type may store decimal numbers accurately with a fixed number of decimal places. This data type is suitable for representing accurate values like currency amounts.

Some DBMS drivers may emulate the decimal data type using integers. Such drivers need to know in advance how many decimal places that should be used to perform eventual scale conversion when storing and retrieving values from a database. Despite this, applications may use arithmetic expressions and functions with the values stored on decimal type fields as long as any constant values that are used in the expressions are also converted with the respective MDB2 conversion functions.

The number of places that are used to the left and the right of the decimal point is pre-determined and fixed for all decimal values stored in the same database. By default, MDB2 uses 2 places to the right of the decimal point, but this may be changed when setting the database connection. The number of places available to the right of the decimal point depend on the DBMS.

It is not recommended to change the number places used to represent decimal values in database after it is installed. MDB2 does not keep track of changes in the number of decimal places. The number of decimal places can be set using the setOption() method.

Float data type

The float data type may store floating point decimal numbers. This data type is suitable for representing numbers within a large scale range that do not require high accuracy. The scale and the precision limits of the values that may be stored in a database depends on the DBMS that it is used.

Date data type

The date data type may represent dates with year, month and day. DBMS independent representation of dates is accomplished by using text strings formatted according to the IS0-8601 standard.

The format defined by the ISO-8601 standard for dates is YYYY-MM-DD where YYYY is the number of the year (Gregorian calendar), MM is the number of the month from 01 to 12 and DD is the number of the day from 01 to 31. Months or days numbered below 10 should be padded on the left with 0.

Some DBMS have native support for date formats, but for others the DBMS driver may have to represent them as integers or text values. In any case, it is always possible to make comparisons between date values as well sort query results by fields of this type.

Time data type

The time data type may represent the time of a given moment of the day. DBMS independent representation of the time of the day is also accomplished by using text strings formatted according to the ISO-8601 standard.

The format defined by the ISO-8601 standard for the time of the day is HH:MI:SS where HH is the number of hour the day from 00 to 23 and MI and SS are respectively the number of the minute and of the second from 00 to 59. Hours, minutes and seconds numbered below 10 should be padded on the left with 0.

Some DBMS have native support for time of the day formats, but for others the DBMS driver may have to represent them as integers or text values. In any case, it is always possible to make comparisons between time values as well sort query results by fields of this type.

Timestamp data type

The timestamp data type is a mere combination of the date and the time of the day data types. The representation of values of the time stamp type is accomplished by joining the date and time string values in a single string joined by a space. Therefore, the format template is YYYY-MM-DD HH:MI:SS. The represented values obey the same rules and ranges described for the date and time data types

Large object (file) data types

The large object data types are meant to store data of undefined length that may be too large to store in text fields, like data that is usually stored in files.

MDB2 supports two types of large object fields: Character Large OBjects (CLOBs) and Binary Large OBjects (BLOBs). CLOB fields are meant to store only data made of printable ASCII characters. BLOB fields are meant to store all types of data.

Large object fields are usually not meant to be used as parameters of query search clause (WHERE) unless the underlying DBMS supports a feature usually known as "full text search"

Putting it all together

The above example will create a database table as such:

Custom Data Types and Further reading

Custom data types can be defined. This will be explored soon. For now you can refer to these blog posts:

Further reading should be done at the following URL's: getTypeDeclaration, getDeclaration.

Results

Results -- Obtaining data from query results

Description

Fetching Individual Rows From Query Results

The MDB2_Result_Common object provides two methods for fetching data from rows of a result set: fetchOne(), fetchRow(), fetchCol() and fetchAll().

fetchRow() and fetchOne() read an entire row or a single field from a column respectively. The result pointer gets moved to the next row each time these methods are called. NULL is returned when the end of the result set is reached.

fetchAll() and fetchCol() read all rows in the result set and therefore move the result pointer to the end. While fetchAll() reads the entire row data, fetchCol() only reads a single column.

MDB2_Error is returned if an error is encountered.

Formats of Fetched Rows

The data from the row of a query result can be placed into one of three constructs: an ordered array (with column numbers as keys), an associative array (with column names as keys) or an object (with column names as properties).

MDB2_FETCHMODE_ORDERED (default)
Array
(
    [0] => 28
    [1] => hi
)

MDB2_FETCHMODE_ASSOC
Array
(
    [a] => 28
    [b] => hi
)

MDB2_FETCHMODE_OBJECT
stdClass Object
(
    [a] => 28
    [b] => hi
)

NOTE: When a query contains the same column name more than once (such as when joining tables which have duplicate column names) and the fetch mode is MDB2_FETCHMODE_ASSOC or MDB2_FETCHMODE_OBJECT, the data from the last column with a given name will be the one returned. There are two immediate options to work around this issue:

Use aliases in your query, for example People.Name AS PersonName
Change the fetch mode to MDB2_FETCHMODE_ORDERED

TIP: If you are running into this issue, it likely indicates poor planning of the database schema. Either data is needlessly being duplicated or the same names are being used for different kinds of data.

Fetch Rows by Number

The PEAR MDB2 fetch system also supports an extra parameter to the fetch statement. So you can fetch rows from a result by number. This is especially helpful if you only want to show sets of an entire result (for example in building paginated HTML lists), fetch rows in an special order, etc.

Getting Entire Result Sets

The MDB2_Result_Common object provides several methods to read entire results sets: fetchCol() and fetchAll().

Getting the native result resource

If whatever data you need to read from a result set is not yet implemented in MDB2 you can get the native result resource using the getResource() method and then call the underlying PHP extension directly (though this would of course require that it is now up to you to make this sufficiently portable).

Getting More Information From Query Results

With MDB2 there are four ways to retrieve useful information about the query result sets themselves:

Example 37-7. numRows() tells how many rows are in a SELECT query result

<?php
// Once you have a valid MDB2 object named $mdb2...
$res =& $mdb2->query('SELECT * FROM phptest');
if ($mdb2->getOption('result_buffering')) {
    echo $res->numRows();
} else {
    echo 'cannot get number of rows in the result set when "result_buffering" is disabled';
}
?>

Example 37-8. numCols() tells how many columns are in a SELECT query result

<?php
// Once you have a valid MDB2 object named $mdb2...
$res =& $mdb2->query('SELECT * FROM phptest');
echo $res->numCols();
?>

Example 37-9. rowCount() tells which row number the internal result row pointer currently points to

<?php
// Once you have a valid MDB2 object named $mdb2...
$res =& $mdb2->query('SELECT * FROM phptest');
$res->fetchRow();
// returns 2 if the result set contains at least 2 rows
echo $res->rowCount();

?>

Example 37-10. getColumnNames() returns an associative array with the names of the column of the result set as keys and the position inside the result set as the values

<?php
// Once you have a valid MDB2 object named $mdb2...
$res =& $mdb2->query('SELECT * FROM phptest');
print_r($res->getColumnNames());

?>

Example 37-11. seek() allows to seek to a specific row inside a result set. Note that seeking to previously read rows is only possible if the 'result_buffering' option is left enabled, otherwise only forward seeking is supported.

<?php
// Once you have a valid MDB2 object named $mdb2...
$res =& $mdb2->query('SELECT * FROM phptest');
// Seek to the 10th row in the result set
$res->seek(10));

?>

Example 37-12. nextResult() allows iterate over multiple results returned by a multi query.

<?php
// Once you have a valid MDB2 object named $mdb2...
$multi_query = $this->db->setOption('multi_query', true);
// check if multi_query can be enabled
if (!PEAR::isError($multi_query)) {
    $res =& $mdb2->query('SELECT * FROM phptest; SELECT * FROM phptest2;');
    $data1 = $res->fetchAll();
    // move result pointer to the next result
    $res->nextResult();
    $data2 = $res->fetchAll();
} else {
    echo 'multi_query option is not supported';
}

?>

Example 37-13. bindColumn() allows to bind a reference to a user variable to a specific field inside the result set. This means that when fetching the next row, this variable is automatically updated.

<?php
// Once you have a valid MDB2 object named $mdb2...
$name = $address = null;
$res =& $mdb2->query('SELECT id, name, address FROM clients', array('id' => 'integer'));
$res->bindColumn('id', $id);
// provide a type for the column not included in the query() call
$res->bindColumn('name', $name, 'text');
// but specifying a type is as always optional in MDB2
$res->bindColumn('address', $address);
while ($res->fetchRow()) {
    echo "The address of '$name' (user id '$id') is '$address'\n";
}
?>

Data types

MDB2 supports a number of data types across all drivers. These can be set for result sets at query or prepare time or using the setResultTypes() method. You can find an overview of the supported data types and their format here.

Checking for Errors

Don't forget to use isError() to check if your actions return a MDB2_Error object.

Prepare & Execute

Prepare & Execute -- Prepare and execute SQL statements

Description

Purpose

prepare() and execute() give you more power and flexibilty for query execution. Prepare/execute mode is helpful when you have to run the same query several times but with different values in it, such as adding a list of addresses into a database.

Another place prepare/execute is useful is supporting databases which have different SQL syntaxes. Imagine you want to support two databases with different INSERT syntax:
db1: INSERT INTO tbl_name (col1, col2) VALUES (expr1, expr2)
db2: INSERT INTO tbl_name SET col1=expr1, col2=expr2
Corresponding to create multi-lingual scripts you can create a array with queries like this:
$statement['db1']['INSERT_PERSON'] = 'INSERT INTO person
    (surname, name, age) VALUES (?, ?, ?)';

$statement['db2']['INSERT_PERSON'] = 'INSERT INTO person
    SET surname=?, name=?, age=?';
Furthermore it is also possible to use named placeholders as inspired by Oracle. Using named placeholders also allows using the same placeholder name multiple times inside a single statement:
$statement['db1']['INSERT_PERSON'] = 'INSERT INTO person
    (surname, name, age) VALUES (:surname, :lastname, :age)';

$statement['db2']['INSERT_PERSON'] = 'INSERT INTO person
    SET surname=:surname, name=:lastname, age=:age';
NB: we don't recommend using non-standard SQL syntax. The example above is just meant to show what you can do with prepared statements, but if you use MDB2 because you heart portability, then be sure you're using a standard SQL syntax (hint: the db1 INSERT is correct).

Prepare

To use the features above, you have to do two steps. Step one is to prepare the statement which returns an instance of the MDB2_Statement_Common class. The second step is to execute it.

To start out, you need to prepare() a generic SQL statement. Create a generic statement by writing the SQL query as usual:
SELECT surname, name, age
    FROM person
    WHERE name = 'name_to_find' AND age < age_limit
Then substitute "placeholders" for the literal values which will be provided at run time:
SELECT surname, name, age
    FROM person
    WHERE name = ? AND age < ?
Then pass this SQL statement to prepare(), which returns a statement class instance to be used when calling execute().

prepare() can handle different types of placeholders (a.k.a. wildcards). By default all placeholders are handled as strings. However passing an array of data types as the second parameter makes it possible to set a specific type for each placeholder.

Since DML (data manipulation language - INSERT, UPDATE, DELETE) statements have different return values than data fetches the prepare() accepts a third parameter. This parameter should be set to MDB2_PREPARE_MANIP for DML statements. For data reads it should either be set to MDB2_PREPARE_RESULT, an array of data types for each of the columns in the result set or TRUE in order to automatically detect the data types in the result set.

Execute

After preparing the statement, you can execute the query. This means to assign the variables to the prepared statement. To do this, execute() requires one argument a scalar or array with the values to assign.

When a prepared statement has multiple placeholders, you must use an array to pass the values to execute(). The first entry of the array represents the first placeholder, the second the second placeholder, etc. The order is independent of the type of placeholder used.

When using named placeholders the data array needs to be an associative array with the keys matching the placeholder names.

When using named placeholders the data array needs to be an associative array with the keys matching the placeholder names.

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement. Similarly, identifiers (i.e. table names and column names) can not be used because the names get validated during the prepare phase.

ExecuteMultiple

MDB2 contains a process for executing several queries at once. So, rather than having to execute them manually, like this:
which would issue four queries:
INSERT INTO numbers VALUES ('1', 'one', 'en')
INSERT INTO numbers VALUES ('2', 'two', 'to')
INSERT INTO numbers VALUES ('3', 'three', 'tre')
INSERT INTO numbers VALUES ('4', 'four', 'fire')
you can use executeMultiple() to avoid the explicit foreach in the example above:

The result is the same. If one of the records failed, the unfinished records will not be executed.

execute() has three possible returns: a new MDB2_Result_Common object for queries that return results (such as SELECT queries), integer for queries that manipulate data (such as INSERT queries) or a MDB2_Error object on failure

Data types

MDB2 supports a number of data types across all drivers. These can be set for prepared placeholders as well as result sets in all relevant methods. You can find an overview of the supported data types and their format here.

Freeing Prepared Statements

Once you finish using prepared statements, if your script continues for a while, it's a good idea to save memory by freeing the prepared statement set via Use free().

Limiting rows and reading from an offset

In order to read/write to only a limited number of rows from a result set and/or to start reading from a specific offset, the setLimit() can be called prior to calling prepare(). The limit and offset will only affect the next method call that will issue a query or prepare a statement and will automatically be reset after issuing the query. This also applies to any internal queries issued inside MDB2. Note that limit may not work with DML statements on RDBMS that emulate limit support and no error will be raised.

Transactions

Transactions -- Performing transactions

Description

PEAR MDB2 defaults to auto-committing all queries. However using the beginTransaction() method one can open a new transaction and with the commit() and rollback() methods, a transaction is finished. These three methods optionally accept a string name of a savepoint to set, release or rollback to respectively. The method inTransaction() may be used to check if a transaction is currently open.

Warning

PEAR MDB2 does not emulate transactions or savepoints. This means that it depends on the underlying RDBMS (and in the case of MySQL the storage engines used) if transactions will be available in MDB2. Also note that some RDBMS implicitly commit transactions when executing DDL statements - notable exceptions are Oracle and PostgreSQL.

MDB2 also supports "nested" transactions using the beginNestedTransaction() method. Actually these are not true nested transactions as they are natively supported in Interbase for example. MDB2 maintains a counter of opened nested transactions. The transaction is finished once that counter is decremented back to 1 with completeNestedTransaction() calls. If the RDBMS supports savepoints then MDB2 will automatically set a savepoint on every call of the beginNestedTransaction() method after the initial call and will return the name. These savepoints are automatically released by the completeNestedTransaction() method. The name of these automatic savepoints are determined by the "savepoint_format" option and the nested transaction counter. The "savepoint_format" defaults to 'MDB2_SAVEPOINT_%s'.

If, after initially opening a nested transaction, an unexpected PEAR error is raised on the MDB2 instance the transaction is rolled back, otherwise it is commited at this point. Using the getNestedTransactionError() method it is possible to check if there has been an error inside the transaction. Alternatively a rollback can be forced using the failNestedTransaction(). This method optionally accepts a mixed parameter which will set the error to return if the getNestedTransactionError() method is called, as well as a second boolean parameter that optionally forces an immidiate rollback.

Finally MDB2 supports setting the transaction isolation level as per the SQL 92 standard using the setTransactionIsolation() method. If a given RDBMS does not support a given isolation level but supports a higher more strict isolation level, then MDB2 silently uses that higher transaction level. Some RDBMS systems support additional options which are silently ignored if they are not supported.

Modules

Modules -- Loading and calling modules

Description

MDB2 follows a modular concept to provide functionality beyond the basic ability to send queries to the database and fetch result sets. Currently the following modules are available:

  • Datatype module (API) - handles datatype abstraction via the MDB2_Datatype_Common class

  • Extended module (API) - provides numerous high-level methods via the MDB2_Extended class

  • Function module (API) - handles SQL function abstraction via the MDB2_Function_Common class

  • Manager module (API) - handles data definition language (DDL) abstraction and schema listing via the MDB2_Manager_Common class

  • Native module (API) - handles RDBMS specific functions via the MDB2_Native_Common class

  • Reverse module (API) - handles schema reverse engineering abstraction via the MDB2_Reverse_Common class

A module is loaded using the loadModule() method. This method returns the module instance, but also stores the instance in a property. The name of the property is either the lowercased name of the module passed in as the first parameter, or optionally the non null value of the second parameter. The optional third parameter is used to differentiate modules that depend on a specific RDBMS (like the Datatype module) and those that do not (like the Extended module). The method can also be used to load custom modules that are installed.

Warning

The third parameter is automatically detected if it is not set. On hosts that have 'safe_mode' enabled automatic detection does however require silenced falls to fopen(). Error handling and error handlers should be configured accordingly.

On PHP5 users can also rely on overloading to load and call modules.

Manager Module

Manager Module -- Module for managing database structure

Description

The Manager module provides methods for managing database structure. The methods can be grouped based on their responsibility: create, edit (alter or update), list or delete (drop) database elements. The following document lists the available methods, providing examples of their use. The following tables will be created, altered and finally dropped, in a database named "events_db":
events(id, name, datetime);
people(id, name);
event_participants(event_id, person_id);
To include the Manager module functionality, you need to load it first.
After including the module, you can access its methods like this:
Further in the document the PHP5-compatible way will be used.

Creating database elements

These are methods to create new databases, tables, indices, constraints and sequences.

Creating tables

Now that the database is created, we can proceed with adding some tables. The method createTable() takes three parameters: the table name, an array of field definition and some extra options (optional and RDBMS-specific).
The keys of the definition array are the names of the fields in the table. The values are arrays containing the required key 'type' as well as other keys, depending on the value of 'type'. The values for the 'type' key are the same as the possible MDB2 datatypes. Depending on the datatype, the other options may vary.

The third parameter to createTable() contains extra options for the table, based on the underlying RDBMS. Here's an example for MySQL.
To round up the example database, here's the event_participants table creation code.

Creating constraints

In the example events table, the id should be a primary key. Creating a primary key is a task done by the createConstraint() method. It takes three parameters: the table name, the constraint name and the definition array.

The full structure of the definition array looks like this (in this case, it's representing a FOREIGN KEY constraint):
<?php
$definition = array (
    'primary' => false,
    'unique'  => false,
    'foreign' => true,
    'check'   => false,
    'fields' => array (
        'field1name' => array(), // one entry per each field covered
        'field2name' => array(), // by the index
        'field3name' => array(
            'sorting'  => ascending|descending,
            'position' => 3,
        ),
    )
    'references' => array(
        'table' => name,
        'fields' => array(
            'field1name' => array( //one entry per each referenced field
                'position' => 1,
        ),
    )
    'deferrable' => false,
    'initiallydeferred' => false,
    'onupdate' => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION,
    'ondelete' => CASCADE|RESTRICT|SET NULL|SET DEFAULT|NO ACTION,
    'match' => SIMPLE|PARTIAL|FULL,
);
?>
Note: Some RDBMS may choose to ignore the name of the constraint, for example MySQL will not use the value keyname provided in the method call, but will use PRIMARY when a primary key is created, or [tablename]_ibfk_[n] when a foreign key is created.

In the definition array, you specify which fields will be included in the constraint, using the fields key. The other possible keys in the definition array are primary and unique, which have boolean values.

Let's create another key in the event_participants, where each row has to be unique, meaning that one person can appear only once for a specific event. The definitions array will have both fields in the fields key and the unique key will be set to true.

Creating indices

To create an index, the method createIndex() is used, which has similar signature as createConstraint(), so it takes table name, index name and a definition array. The definition array has one key fields with a value which is another associative array containing fields that will be a part of the index. The fields are defined as arrays with possible keys:

  • sorting, with values ascending and descending

  • length, integer value

Not all RDBMS will support index sorting or length, in these cases the drivers will ignore them. In the test events database, we can assume that our application will show events occuring in a specific timeframe, so the selects will use the datetime field in WHERE conditions. It will help if there is an index on this field.

Creating sequences

The way MDB2 handles sequences is described here. For the events table in our example database, we'll need to have the 'id' auto-incrementing. For this purpose the method nextId() is used to give the next value. nextId() will create the sequence table if it doesn't exist, but we can create if beforehand with createSequence(). It takes a sequence name and an optional start value for the sequence.
In the default MDB2 setup the example above will create two tables: events_seq and people_seq, each with one field called 'sequence', but the field name and the '_seq' postfix are configurable via the MDB2 options seqname_format and seqcol_name.

Altering database tables

Once a database table is created you can rename it or add, remove, rename and alter fields, using the alterTable() method. alterTable() takes three parameters: the table name, the definition of changes and a boolean "check-only" flag. If true, no changes will be made, but only a check if the proposed changes are feasible for the specific table and RDBMS. The second parameter (definition of changes) is an array with these keys:

  • name: new name for the table. This is the only key related to the table itself, the other keys contain field definitions

  • add: fields to be added

  • remove: fields to be removed

  • change: fields to be changed

  • rename: fields to be renamed

The values for add/remove/change/rename keys have slightly different structures, but they all contain field definitions. You can check the API docs for more information and an examples.

Listing database elements

To see what's in the database, you can use the list*() family of functions, namely:

  • listDatabases()

  • listFunctions()

  • listSequences(): takes optional database name as a parameter. If not supplied, the currently selected database is assumed.

  • listTableConstraints(): takes a table name

  • listTableFields(): takes a table name

  • listTableIndexes(): takes a table name

  • listTables(): takes an optional database name

  • listTableTriggers(): takes a table name

  • listTableViews(): takes a table name

  • listUsers()

  • listViews(): takes an optional database name

Reverse Module

Reverse Module -- Module for managing database structure

Description

The Reverse module is an extension of the Common Module driver, and is made up in the following structure:

  • Common driver file that encapsulates an API that can be used to execute the reverse driver queries.

  • A set of DBMS specific drivers that are specifically written against the supported database back end (e.g. mysql.php for MySQL, and pgsql.php for PostgreSQL)

Usage

In order to use the MDB2 Reverse drivers, it is necessary to first load the Reverse driver into your MDB2 instance. Let's start a MDB2 instance and set up our connection:
In the above example, we have created a valid connection to a database that does exist, using a valid user and password for our database server. We now have access to all of the MDB2 Reverse functionality within our example application. For the purposes of this document, we will set up an example table as such:

getTableFieldDefinition() Method

The getTableFieldDefinition() Method exists primarily to get an array that defines a table field. This array can then be used to re-create the table elsewhere, or for any other purpose that may be necessary. Using the MDB2 instance defined above, we will connect to a database, define a table that we want to work with, and reverse engineer a specific field that we are interested in. First, we need to define the table and field that we want to work with; then, it is as easy as a single line of code to get the table definition back as an array of mixed values, then using var_dump to view the results:
The return will look something like the following, depending on your field definition:
array(1) {
  [0] => array(5) {
    ['notnull'] => bool(false)
    ['nativetype'] => string(4) "date"
    ['default'] => NULL
    ['type'] => string(4) "date"
    ['mdb2type'] => string(4) "date"
  }
}

Additional table information

A number of other methods exist to gain information about a selected table. You may use any of the following methods according to the information needed:

  • getTableIndexDefinition(): - requires a table name and an index name to return information about the table index as an array

  • getTableConstraintDefinition(): requires a table name and a constraint to query against. This will return any constraint definitions that exist on the table. A constraint as is defined here is usually a Primary Key, an Unique Key or a Foreign Key. The returned array has the same structure as the one used in the Manager module with createConstraint().

  • getSequenceDefinition(): requires a sequence name. It will return information about the existing table sequence. The method will return an array on success or an MDB2 error on failure.

  • getTriggerDefinition(): takes a trigger name as an argument, and will return information as an array on the trigger queried.

tableInfo() Method

This method will return a lot of information regarding a table, and can be used in a number of different ways. The information that it returns will differ slightly across different RDBM's and may give some variance in results. This method can be used to query either a table definition, or a resultset, which makes it great for creating optimized tables. The tableInfo() method allows you to pass a parameter for the mode that you would like to see the results presented as. In order to demonstrate the results more effectively, we will use a series of examples to do some queries and return the results in different modes. NOTE: Either a table OR a resultset can be passed as the first parameter to get information on the table. In these examples, we will be using the table that we defined above.
In the subsequent examples, we will only include the first table field definition, as it effectively illustrates the differences in modes. Now, let's change the mode to MDB2_TABLEINFO_ORDER. In addition to the information found in the default output, a notation of the number of columns is provided by the num_fields element while the order element provides an array with the column names as the keys and their location index number (corresponding to the keys in the default output) as the values.
Changing the mode to MDB2_TABLEINFO_ORDERTABLE will give us some additional information by adding additional dimensions to the array in which the table names are keys, and the field names are sub keys. This type of query can be useful when querying complex joins, where some field names may be the same.

NOTE: The flags element will contain a space-separated list of additional information about the field. This data is inconsistent between RDBMS's due to the way each RDBMS works:

  • primary_key

  • unique_key

  • multiple_key

  • not_null

  • unsigned

Most RDBMS's only provide the table and flags elements if the result is a table name. If the portability option is set to MDB2_PORTABILITY_FIX_CASE, the names of tables and fields will be lower- or upper-cased. If the case is set to CASE_UPPER all tables and fields will be uppercased, as is seen in Oracle and Firebird/Interbase, while CASE_LOWER will lower case all field and table names; this is the default setting.

autoPrepare & autoExecute

autoPrepare & autoExecute -- Automatically prepare and execute SQL statements

Description

Purpose

autoPrepare() and autoExecute() reduce the need to write boring INSERT, UPDATE, DELETE or SELECT SQL queries which are difficult to maintain when you add a field for instance. It requires the use of the Extended module

Imagine you have a 'user' table with 3 fields (id, name and country). You have to write sql queries like:
INSERT INTO table (id, name, country) VALUES (?, ?, ?)
UPDATE table SET id=?, name=?, country=? WHERE ...
If you add a field ('birthYear' for example), you have to rewrite your queries which is boring and can lead to bugs (if you forget one query for instance).

autoPrepare

With autoPrepare(), you don't have to write your insert, update, delete or select queries. For example:
<?php
// Once you have a valid MDB2 object named $mdb2...
$table_name   = 'user';
$table_fields = array('id', 'name', 'country');
$types = array('integer', 'text', 'text');

$mdb2->loadModule('Extended');
$sth = $mdb2->extended->autoPrepare($table_name, $table_fields,
                        MDB2_AUTOQUERY_INSERT, null, $types);

if (PEAR::isError($sth)) {
    die($sth->getMessage());
}
?>
In this example, autoPrepare() will build the following SQL query:
INSERT INTO user (id, name, country) VALUES (?, ?, ?)
And then, it will call prepare() with it.

To add records, you have to use execute() or executeMultiple() like:
<?php
// ... continuing from the example above...
$table_values = array(1, 'Fabien', 'France');

$res =& $sth->execute($table_values);

if (PEAR::isError($res)) {
    die($res->getMessage());
}
?>
So, you don't have to write any SQL INSERT queries! And it works with UPDATE and DELETE queries too. For flexibility reasons, you have only to write the WHERE clause of the query. For instance:
<?php
// Once you have a valid MDB2 object named $mdb2...
$table_name   = 'user';

$mdb2->loadModule('Extended');
$sth = $mdb2->extended->autoPrepare($table_name, null,
                        MDB2_AUTOQUERY_DELETE, 'id = '.$mdb2->quote(1, 'integer'));

if (PEAR::isError($sth)) {
    die($sth->getMessage());
}

$res =& $sth->execute($table_values);

if (PEAR::isError($res)) {
    die($res->getMessage());
}
?>
autoPrepare() will build the following query:
UPDATE user SET name=?, country=? WHERE id=1
Then, it will call prepare() with it.

Be careful, if you don't specify any WHERE clause, all the records of the table will be updated.

autoExecute

Using autoExecute() is the easiest way to do insert, update, delete or select queries. It is a mix of autoPrepare() and execute().

You only need an associative array (key => value) where keys are fields names and values are corresponding values of these fields. This is only relevant for insert and update queries. For instance:
<?php
// Once you have a valid MDB2 object named $mdb2...
$table_name = 'user';

$fields_values = array(
    'id'      => 1,
    'name'    => 'Fabien',
    'country' => 'France'
);
$types = array('integer', 'text', 'text');

$mdb2->loadModule('Extended');
$affectedRows = $mdb2->extended->autoExecute($table_name, $fields_values,
                        MDB2_AUTOQUERY_INSERT, null, $types);

if (PEAR::isError($affectedRows)) {
    die($affectedRows->getMessage());
}
?>
And that's all! The following query is built and executed:
INSERT INTO user (id, name, country)
  VALUES (1, 'Fabien', 'France')

And it's the same thing for UPDATE queries:
<?php
// Once you have a valid MDB2 object named $mdb2...
$table_name = 'user';

$fields_values = array(
    'name'    => 'Fabien',
    'country' => 'France'
);
$types = array('text', 'text');

$mdb2->loadModule('Extended');
$affectedRows = $mdb2->extended->autoExecute($table_name, $fields_values,
                        MDB2_AUTOQUERY_UPDATE, 'id = '.$mdb2->quote(1, 'integer'), $types);

if (PEAR::isError($affectedRows)) {
    die($affectedRows->getMessage());
}
?>
which prepares and executes the following query:
UPDATE user SET name='Fabien', country='France'
  WHERE id = 1

Be careful, if you don't specify any WHERE statement, all the records of the table will be updated.

Here is an example for a DELETE queries:
<?php
// Once you have a valid MDB2 object named $mdb2...
$table_name = 'user';

$mdb2->loadModule('Extended');
$affectedRows = $mdb2->extended->autoExecute($table_name, null,
                        MDB2_AUTOQUERY_DELETE, 'id = '.$mdb2->quote(1, 'integer'));

if (PEAR::isError($affectedRows)) {
    die($affectedRows->getMessage());
}

?>
which prepares and executes the following query:
DELETE FROM user WHERE id = 1

Finally an example for a SELECT queries:
<?php
// Once you have a valid MDB2 object named $mdb2...
$table_name = 'user';

// if left as a non array all fields of the table will be fetched using '*'
// in that case this variable can be set to true, to autodiscover the types
$result_types = array(
    'name'    => 'text',
    'country' => 'text'
);

$mdb2->loadModule('Extended');
$res = $mdb2->extended->autoExecute($table_name, null,
                        MDB2_AUTOQUERY_SELECT, 'id = '.$mdb2->quote(1, 'integer'),
                        null, true, $result_types);

if (PEAR::isError($res)) {
    die($res->getMessage());
}

$row = $res->fetchRow();

?>
which prepares and executes the following query:
SELECT name, country FROM user WHERE id = 1

Warning

The values passed in $data must be literals. Do not submit SQL functions (for example CURDATE()). SQL functions that should be performed at execution time need to be put in the prepared statement.

Portability

Portability -- Database portability features

Description

Each database management system (DBMS) has its own behaviour. For example, some databases capitalize field names in their output, some lowercase them, while others leave them alone. These quirks make it difficult to port your scripts over to another server type. PEAR MDB2 strives to overcome these differences so your program can switch between DBMSs without any changes.

You control which portability modes are enabled by using the portability configuration option. Configuration options are set via factory() and setOption().

The portability modes are bitwised, so they can be combined using | and removed using ^. See the examples section below on how to do this.

NB: MDB2 portability modes are meant to change the behaviour of the returned values only, not that of the query itself. For instance, if you created your tables quoting the identifiers, remember to use the quoteIdentifier() method in all your queries or you'll get "not found" or "not exists" errors. Also check for the quote_identifier option, if it's false then quoting won't be applied if the check_option is used.

Portability Mode Constants

Sequences

Sequences -- Sequences and auto-incrementing

Description

Sequences are a way of offering unique IDs for data rows. If you do most of your work with e.g. MySQL, think of sequences as another way of doing AUTO_INCREMENT.

It's quite simple, first you request an ID, and then you insert that value in the ID field of the new row you're creating. You can have more than one sequence for all your tables, just be sure that you always use the same sequence for any particular table. To get the value of this unique ID use nextID(), if a sequence doesn't exists, it will be created automatically.

The sequence is automatically incremented each time nextID() is called.

Note

Warning

When using PEAR MDB2's sequence methods, we strongly advise using these methods for all procedures, including the creation of the sequences. Do not use PEAR MDB2's methods to access sequences that were created directly in the DBMS.

If you have a compelling reason to ignore this advice, be aware that the $seq_name argument given to all of PEAR MDB2's sequence methods are modified before MDB2 calls the underlying DBMS.

$seq_name is passed through PHP's sprintf() function using the value from the seqname_format option as sprintf()'s format argument. The default seqname_format is %s_seq. So, for example, if you use person_id_sequence as the $seq_name, PEAR MDB2 will change that name to person_id_sequence_seq when querying the DBMS about creating/accessing/updating the sequence.

Also note that the default table layout for sequences emulated in PEAR DB is slightly different in PEAR MDB2. Where PEAR DB calls the column "id" PEAR MDB2 instead calls it "sequence" to make its purpose more clear. For backward compatibility this can be controlled via the seqcol_name option.

The seqname_format and seqcol_name can be modified when connecting or via setOption().

Getting the last inserted ID

If you prefer using AUTO_INCREMENT you can alternatively use the lastInsertID() method to retrieve the last generated value. This method alternatively also supports getting the current ID from a sequence using the format defined in PostgreSQL's SERIAL data type. MDB2 can emulate this behaviour for RDBMS that do not support autoincrement at table creation time when using the createTable() method.

FAQ

FAQ -- Frequently asked questions

I get an error!

If you get a PEAR_Error (or a MDB2_Error object), try using getMessage() and getUserInfo(). They do often give you more information about the cause of the error.

"MDB2 Error: not found"

If you get this error after creating the MDB2 instance it means that you don't have any MDB2 database driver installed. Since most people use only one database system, it is unnecessary to install 15 driver files.

If SQLite is the database of your choice, do a pear install MDB2_Driver_sqlite or simply pear install MDB2#sqlite and it should work.

Also search for MDB2 drivers in the PEAR package list.

"pear/MDB2_Driver_XXX requires php extension XXX"

If you get this error when trying to install a driver it means that the php.ini loaded in the given installer does not see the "XXX" extension. Either you forgot to install the extension all together or you need to make sure that the extension is actived in all relevant php.ini files. Note that there are usually separate php.ini files for the CLI and your other SAPIs.

If all else failes do pear install -nodeps MDB2_Driver_XXX and it should work.

Two instances fail to keep different databases selected

If you work with more than one database at the same time, you may notice that as soon you connect to the second db the connection to the first one is lost, since the DBMS reuses the last open connection link. To solve the problem, just set the new_link DSN option to TRUE.


MDB_QueryTool

Table of Contents
Introduction --  An OO-interface for easily retrieving and modifying data in a database
Object --  An introduction to the usage of Objects with MDB_QueryTool
Quick API reference --  A quick overview of the available methods. Please refer to the full API docs for a detailed documentation.

This package is an OO-abstraction to the SQL-Query language, it provides methods such as setWhere, setOrder, setGroup, setJoin, etc. to easily build queries.

Introduction

Introduction --  An OO-interface for easily retrieving and modifying data in a database

MDB_QueryTool Description

This package is an OO-abstraction to the SQL-Query language, it provides methods such as setWhere(), setOrder(), setGroup(), setJoin(), etc. to easily build queries. It also provides an easy to learn interface that interacts nicely with HTML-forms using arrays that contain the column data, that shall be updated/added in a database. This package bases on an SQL-Builder which lets you easily build SQL-Statements and execute them. It supports all the db engines supported by MDB and MDB2.

Since it's a 1:1 port of DB_QueryTool, it has the same API, the only difference being the class name (and the constructor name, of course). Unfortunately, complete documentation is not available at the moment.

Example 1 - Arrays

The best way to use MDB_QueryTool is creating a class that extends it. Here's a sample usage:
require_once 'MDB/QueryTool.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';

/**
 * Let's suppose the "car" table has the following fields:
 * (id, model, hp, color, clima, price)
 */
class Car extends MDB_QueryTool
{
    var $table        = TABLE_CARS;
    var $sequenceName = TABLE_CARS;

    // this is default, but to demonstrate it here ...
    var $primaryCol =   'id';

    /**
     * This table spec assigns a short name to a table name
     * this short name is needed in case the table name changes
     * i.e. when u put the application on a provider's db, where you have to
     * prefix each table, and you dont need to change the entire application to
     * where you refer to joined table columns, for that joined results the
     * short name is used instead of the table name
     */
    var $tableSpec = array(
        array('name'  => TABLE_CARS, 'shortName' =>  'cars'),
        //array('name'  => TABLE_TIME, 'shortName' =>  'time'),
    );
}


//instanciate an object of the Car class
$car = new Car($dsn);

//get the car #3
$car->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $car->get(3);
var_dump($res);

//get all the cars
$car->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $car->getAll();
var_dump($res);

// get the first 10 cars
$car->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $car->getAll(0, 10);
var_dump($res);

//get all the red cars with clima, sorted by price
$car->reset();
$car->setWhere('color="red"');
$car->addWhere('clima=1');
$car->setOrder('price');
$res = $car->getAll();
var_dump($res);

//add a new car to the database
$data = array(
    'model' => 'Super Trooper',
    'hp'    => 140,
    'color' => 'black',
    'clima' => 0,
    'price' => 19000
);
$newCarId = $car->save($data);
var_dump($newCarId);

//update an existing car
$data = array(
    'id'    => $newCarId,
    'clima' => 1,
    'price' => 20000,
);
$res = $car->save($data);   //equivalent to $car->update($data);
var_dump($res);


//remove the car from the database
$res = $car->remove($newCarId);
var_dump($res);

Example 2 - Classes

MDB_QueryTool also offers working with classes. Here's a sample usage:
require_once 'MDB/QueryTool.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';

/**
 * Let's suppose the "car" table has the following fields:
 * (id, model, hp, color, clima, price)
 */
class Car extends MDB_QueryTool
{
    var $table        = TABLE_CARS;
    var $sequenceName = TABLE_CARS;

    // this is default, but to demonstrate it here ...
    var $primaryCol =   'id';

    /**
     * This table spec assigns a short name to a table name
     * this short name is needed in case the table name changes
     * i.e. when u put the application on a provider's db, where you have to
     * prefix each table, and you dont need to change the entire application to
     * where you refer to joined table columns, for that joined results the
     * short name is used instead of the table name
     */
    var $tableSpec = array(
        array('name'  => TABLE_CARS, 'shortName' =>  'cars'),
        //array('name'  => TABLE_TIME, 'shortName' =>  'time'),
    );
}


//instanciate an object of the Car class
$car = new Car($dsn);
$car->useResult('object');

//get the car #3
$car->reset();     // reset the query-builder, so no where, order, etc. are set
$res = $car->get(3)->fetchRow();
var_dump($res);

//get all the cars
$car->reset();     // reset the query-builder, so no where, order, etc. are set
$cars = $car->getAll();
while ($res = $cars->getNext()) {
    var_dump($res);
}

// get the first 10 cars
$car->reset();     // reset the query-builder, so no where, order, etc. are set
$cars = $car->getAll(0, 10);
while ($res = $cars->getNext()) {
    var_dump($res);
}

//get all the red cars with clima, sorted by price
$car->reset();
$car->setWhere('color="red"');
$car->addWhere('clima=1');
$car->setOrder('price');
$cars = $car->getAll();
while ($res = $cars->getNext()) {
    var_dump($res);
}

//add a new car to the database
$newCar = $car->newEntity();
$newCar->model = 'Super Trooper';
$newCar->hp    = 140;
$newCar->color = 'black';
$newCar->clima = 0;
$newCar->price = 19000;

$newCarId = $newCar->save();
var_dump($newCarId);

//update an existing car
$car->reset();
$res        = $car->get($newCarId)->fetchRow();
$res->clima = 1;
$res->price = 20000;
$res->save();
var_dump($res);

//remove the car from the database
$car->reset();
$res = $car->get($newCarId)->fetchRow();
var_dump($res->remove());
unset($res);

Object

Object --  An introduction to the usage of Objects with MDB_QueryTool

MDB_QueryTool Object Description

It is possible to use objects as result. A comprehensive example may be seen in the intro.

But using objects is not a simple alternative to using arrays as result. It is also possible to register a custom Class to be returned instead of the default MDB_QueryTool_Result_Row. The new resulting class has to be child of the MDB_QueryTool_Result_Row class.

Example 1 - Change the default result class

To change the resulting class the method setReturnClass is used.
require_once 'MDB/QueryTool.php';
require_once 'MDB/QueryTool/Result/Object.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';

/**
 * Let's suppose the "cars" table has the following fields:
 * (id, model, hp, color, clima, price)
 */
class Car extends MDB_QueryTool
{
    public $table = TABLE_CARS;
}

class CarEntity extends MDB_QueryTool_Result_Row
{
}

//instanciate an object of the Car class
$car = new Car($dsn);
$car->useResult('object');
$car->setReturnClass('CarEntity');

Controlling class variable access

This can now be used to implement getter and setter and thus regulate the accessability to the values. In order to block the access to the class variables from outside they have to be declared as protected. Declaring them as private would result in also blocking the parent class, which gets the data, of accessing them. Of course when doing so corresponding methods have to be implemented to access the variables again.

Example 2 - Restricting class variable access

To keep the example short only methods for dealing with model, hp and clima have been implemented.
require_once 'MDB/QueryTool.php';
require_once 'MDB/QueryTool/Result/Object.php';
define('TABLE_CARS', 'cars');
$dsn = 'mysql://user:pass@host/dbname';

/**
 * Let's suppose the "cars" table has the following fields:
 * (id, model, hp, color, clima, price)
 */
class Car extends MDB_QueryTool
{
    public $table = TABLE_CARS;
}

class CarEntity extends MDB_QueryTool_Result_Row
{
    protected $id;
    protected $model;
    protected $hp;
    protected $color;
    protected $clima;
    protected $price;
    public function getModel() {
        return $this->model;
    }
    public function setModel($model) {
        $this->model = $model;
    }
    public function getHp() {
        return $this->hp;
    }
    public function setHp($hp) {
        $this->hp = $hp;
    }
        public function getClima() {
        if ($this->clima) {
            return true;
        } else {
            return false;
        }
    }
    public function setClima($clima) {
        if ($clima) {
            $this->clima = 1;
        } else {
            $this->clima = 0;
        }
    }
}

//instantiate an object of the Car class
$car = new Car($dsn);
$car->useResult('object');
$car->setReturnClass('CarEntity');

Outlook

This example only demonstrates a very basic feature. But it enables for example the implementation of Decorators. Every feature of modern OOP is now possible to implement.

Quick API reference

Quick API reference --  A quick overview of the available methods. Please refer to the full API docs for a detailed documentation.

MDB_QueryTool available methods

MDB_QueryTool provides the following methods:

  • autoJoin()

    Join the given tables, using the column names, to find out how to join the tables; i.e., if table1 has a column named "table2_id", this method will join "WHERE table1.table2_id=table2.id". All joins made here are only concatenated via AND.

  • getDbInstance()

    Return a PEAR::DB object

  • setDbInstance()

    Pass an existing PEAR::DB object to MDB_QueryTool

  • get($id, $column)

    Get the data of a single entry. If the second parameter is only one column, the result will be returned directly, not as an array!

  • getMultiple($ids, $column)

    Same as get(), but for all the elements in the $ids array.

  • getAll()

    Get all the entries from the db.

  • getCol($column)

    This method only returns one column, so the result will be a one dimensional array. This does also mean that using setSelect() should be set to *one* column, the one you want to have returned. A common use case for this could be:
    $table->setSelect('id');
    $ids = $table->getCol();
    //OR
    $ids = $table->getCol('id');
    so ids will be an array with all the id's.

  • getCount()

    Get the number of entries.

  • getDefaultValues()

    return an empty element where all the array elements do already exist corresponding to the columns in the DB

  • getQueryString()

    Render the current query and return it as a string.

  • save($data)

    Save data, calls either update() or add(). If the primaryCol is given in the data this method knows that the data passed to it are meant to be updated (call update()), otherwise it will call the method add(). If you don't like this behaviour simply stick with the methods add() and update() and ignore this one here. This method is very useful when you have validation checks that have to be done for both adding and updating, then you can simply overwrite this method and do the checks in here, and both cases will be validated first.

  • update($data)

    Update the member data of a data set.

  • add($data)

    Add a new member in the db.

  • addMultiple($data)

    Adds multiple new members in the db.

  • remove($data, $whereCol)

    Removes a member from the db. data is the value of the column that shall be removed (integer/string); if an array is used, it must contain multiple columns that shall be matched (in this case, the second parameter will be ignored); $whereCol: the column to match the data against, only if data is not an array

  • removeAll()

    Empty a table.

  • removeMultiple($ids, $colName)

    Remove the datasets with the given ids. If colName is set, it is used as the primary key column name.

  • removePrimary($ids, $colName, $atLeastOneObject)

    Removes a member from the db and calls the remove() methods of the given objects so all rows in another table that refer to this table are erased too.

  • setLimit($from=0, $count=0)

    Set the limits for the following query.

  • getLimit()

    Get the limits for the following query.

  • setWhere($whereCondition)

    Sets the where condition which is used for the current instance.

  • getWhere()

    Gets the where condition which is used for the current instance.

  • addWhere($whereCondition, $condition)

    Adds a string to the where clause. The default condition is AND.

  • addWhereSearch($column, $stringToSearch, $condition)

    Add a where-like clause which works like a search for the given string; i.e. calling it like this:
    $this->addWhereSearch('name', 'otto hans')
    produces a where clause like this one
    UPPER(name) LIKE "%OTTO%HANS%"
    so the search finds the given string.

  • setOrder($orderCondition, $desc=FALSE)

    Sets the order condition which is used for the current instance.

  • getOrder()

    Gets the order condition which is used for the current instance.

  • addOrder($orderCondition, $desc=FALSE)

    Adds an order parameter to the query.

  • setHaving($havingCondition)

    Sets the having condition which is used for the current instance.

  • getHaving()

    Gets the having condition which is used for the current instance.

  • addHaving($what, $connectString)

    Adds an having parameter to the query.

  • setJoin($table, $where, $joinType)

    Sets the join condition which is used for the current instance.

  • setLeftJoin($table, $where)

    Sets a left join on $this->table.

  • addLeftJoin($table, $where, $type)

    Adds a left join to the query.

  • setRightJoin($table, $where)

    Sets a right join on $this->table.

  • getJoin($what)

    Gets the join-condition.

  • addJoin($table, $where, $type)

    adds a table and a where clause that shall be used for the join instead of calling
    setJoin(array(table1, table2), '<where clause1> AND <where clause2>');
    you can also call
    setJoin(table1,'<where clause1>');
    addJoin(table2,'<where clause2>');

  • setTable($table)

    Sets the table this class is currently working on.

  • getTable()

    Gets the table this class is currently working on.

  • setGroup($group)

    Sets the group-by condition.

  • getGroup()

    Gets the group-by condition.

  • setSelect($what)

    Limit the result to return only the columns given in what.

  • addSelect($what, $connectString)

    Add a string to the select-part of the query and connects it to an existing string using the connectString, which by default is a comma. ("SELECT xxx FROM..." xxx is the select-part of a query)

  • getSelect()

    Gets the select-part of the query.

  • setDontSelect($what)

    Exclude some columns from the resultset.

  • getDontSelect()

    Gets the columns excluded from the resultset.

  • reset($what)

    Reset all the set* settings, with no parameter given it resets them all.

  • setOption($option, $value)

    Set mode the class shall work in. The 'raw' mode does not quote the data before building the query

  • getOption($option)

    Get the given option.

  • debug($string)

    override this method and i.e. print the queryString to see the final query.

  • getTableShortName($table)

    Gets the short name for a table.

  • execute($query, $method)

    Execute a query (the current query is executed when query is null.

  • writeLog($text)

    Write events to the logfile. It does some additional work, like time measuring etc. to see some additional info.

  • returnResult($result)

    Return the chosen result type

  • setIndex($key)

    Format the result to be indexed by key. NOTE: be careful, when using this you should be aware, that if you use an index which's value appears multiple times you may loose data since a key can't exist multiple times! The result for a result to be indexed by a key(=columnName) (i.e. 'relationtoMe') which's values are 'brother' and 'sister' or alike normally returns this:
    $res['brother'] = array('name' => 'xxx');
    $res['sister']  = array('name' => 'xxx');
    but if the column 'relationtoMe' contains multiple entries for 'brother' then the returned dataset will only contain one brother, since the value from the column 'relationtoMe' is used and which 'brother' you get depends on a lot of things, like the sort order, how the db saves the data, and whatever else. You can also set indexes which depend on 2 columns, simply pass the parameters like 'table1.id,table2.id' it will be used as a string for indexing the result and the index will be built using the 2 values given, so a possible index might be '1,2' or '2108,29389' this way you can access data which have 2 primary keys. Be sure to remember that the index is a string!

  • getIndex()

    Gets the index.

  • useResult($type)

    Choose the type of the returned result ('array', 'object', 'none')

  • setErrorCallback($param)

    Set both callbacks.

  • setErrorLogCallback($param)

    Set the error log callback.

  • setErrorSetCallback($param)

    Set the error set callback.


MDB2_Schema

Table of Contents
Introduction -- Introduction to MDB2_Schema
Installation and Usage Example -- Installation and example for the usage of MDB2_Schema
Get Database Definition -- Generating the definition array of a physical database or MDB2 XML
Dump Database -- Dumping a database to MDB2 XML
Create Database -- Restoring a database from MDB2 XML
Update Database -- Updating a database against a new schema

PEAR::MDB2_Schema enables users to maintain RDBMS independent schema files in XML that can be used to create, alter and drop database entities and insert data into a database. Reverse engineering database schemas from existing databases is also supported. The format is compatible with both PEAR::MDB and Metabase.

Introduction

Introduction -- Introduction to MDB2_Schema

Introduction to MDB2_Schema

MDB2_Schema builds upon MDB2 to provide tools to manage your database schema using XML which is both platform- and database-independent.

The XML format is inherited from the Metabase package and was improved to be able to represent new entities such as Data Manipulation Instructions and Foreign Keys.

It enables users to maintain RDBMS independent schema files in XML that can be used to create, alter and drop database entities (also called as DDL: Data Definition Language) and insert data (also called as DML: Data Manipulation Language) into a database. Reverse engineering database schemas from existing databases is also supported. It also features the hability to parse database schemas and database data in separated files. However, in this document the term "schema file" will be used to designate any XML supported by MDB2_Schema, no matter its nature.

Reading of schema files is handled by MDB2_Schema_Parser and writing to them by MDB2_Schema_Writer. There is also the MDB2_Schema_Validate class which is called after something is parsed. It is supposed to check the logical integrity of the schema file, for instance whether you are trying to declare a index field that does not exist or even when you are trying to insert a float in a date field.

Currently two parsers are available, one based on the package XML_Parser (default) and another based on XML_Unserializer. As MDB2_Schema is still beta, both parsers have its own limitation. The default one can't parse more than 2 nested expressions. The later doesn't respect DML instructions in the order they are specified in the schema file.

Although MDB2_Schema API supports input from physical databases and schema files, internally it always operates using a database schema array that will be described later in the documentation.

Installation and Usage Example

Installation and Usage Example -- Installation and example for the usage of MDB2_Schema

Installation

First you need MDB2 installed:

$ pear install --alldeps MDB2

You should install a driver for each database you are working with. For MySQL it would be:

$ pear install MDB2_Driver_Mysql

For some hints refers to MDB2 documentation or try in a UNIX-like system:

$ pear remote-list | grep MDB2

MDB2_Schema is a separate package, and can also be installed using the PEAR installer:

$ pear install --alldeps MDB2_Schema-beta

now you should be ready :)

Usage Example

To create an instance of the MDB2_Schema class you can use the factory(), which accepts a $dsn or an array. The factory method also accepts an existing MDB2 object. In the example below, we will just use a $dsn.

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
}

if (isset($error)) {
    var_dump($error);
}

$schema->disconnect();
?>

Get Database Definition

Get Database Definition -- Generating the definition array of a physical database or MDB2 XML

Introduction

All the internal work of MDB2_Schema is done over array structures, which we will call "definition array". Many methods, such as createDatabase, requires a definition array as input parameter, instead of a filename. Others take care of the conversion automatically, accepting both inputs.

For the cases when you need a definition array, there are two avaliable methods to manually generate the definition array, one for each schema source - either a database or a schema file. Obviously you can also write it by hand, it is not intended to be done this way though.

Get Database Definition

You can use getDefinitionFromDatabase() to get the definition array from an existing database.

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    // this method _attempts_ to get the defintition from the database
    // make sure you have tested it with your database to see if it
    // returns what you expect
    $definition = $schema->getDefinitionFromDatabase();

    if (PEAR::isError($definition)) {
      $error = $definition->getMessage();
    }
}

if (isset($error)) {
  var_dump($error);
}

$schema->disconnect();
?>

Though you have to use the method with caution, if you use the method on a database created by hand. Some of the fields might be slightly different, but once you create your database using MDB2_Schema it is reliable and will return the same $definition every time.

Parse Database Definition

You can use parseDatabaseDefinitionFile() to get the definition array from a schema file.

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    $definition = $schema->parseDatabaseDefinitionFile('schema.xml');

    if (PEAR::isError($definition)) {
      $error = $definition->getMessage();
    }
}

if (isset($error)) {
  var_dump($error);
}

$schema->disconnect();
?>

Although the method accepts more parameters, only the first one is required.

Dump Database

Dump Database -- Dumping a database to MDB2 XML

Dump Database

You can use dumpDatabase() to copy your database to a schema file. dumpDatabase() accepts a database definition array, for instance:

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    $dump_options = array(
      'output_mode' => 'file',
      'output' => 'schema.xml',
      'end_of_line' => "\n"
    );

    $definition = $schema->getDefinitionFromDatabase();
    if (PEAR::isError($definition)) {
      $error = $definition->getMessage();
    } else {
      $op = $schema->dumpDatabase($definition, $dump_options, MDB2_SCHEMA_DUMP_ALL);

      if (PEAR::isError($op)) {
          $error = $op->getMessage();
      }
  }
}

if (isset($error)) {
    var_dump($error);
}

$schema->disconnect();
?>

The first parameter is just the database definition array. The second parameter is the options where we choose to output to a file. The third option tells dumpDatabase() what to be dumped - either the structure, the data in the tables, or both. This is defined using the constants MDB2_SCHEMA_DUMP_STRUCTURE, MDB2_SCHEMA_DUMP_CONTENT and MDB2_SCHEMA_DUMP_ALL.

Some databases don't accept a text field with a default value. Given that, notice that $options['force_defaults'] has to be set to false when you want to create a field with the type text, as it is true by default.

Create Database

Create Database -- Restoring a database from MDB2 XML

Create Database

When having a schema file, it is a breeze to create a database. Simply do the following:

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    // first run with queries disabled to make sure everything is allright
    $disable_query = true;

    $definition = $schema->parseDatabaseDefinitionFile('example.xml');
    if (PEAR::isError($definition)) {
      $error = $definition->getMessage();
    } else {
      $op = $schema->createDatabase($definition, array(), $disable_query);

      if (PEAR::isError($op)) {
        $error = $op->getMessage();
      }
    }
}

if (isset($error)) {
    var_dump($error);
}

$schema->disconnect();
?>

Update Database

Update Database -- Updating a database against a new schema

Update Database

Having MDB2_Schema to update your database, when its schema changes is also really easy. You can use the getDefinitionFromDatabase() method to determine the current database schema, and then just use updateDatabase() to do the actual update. However, you have to make sure, that getDefinitionFromDatabase() returns what you expect before you rely on it. See the respective chapter for more info.

<?php
require_once 'MDB2/Schema.php';

$options = array(
    'log_line_break' => '<br>',
    'idxname_format' => '%s',
    'debug' => true,
    'quote_identifier' => true,
    'force_defaults' => false,
    'portability' => false
);
$dsn = 'mysql://root:@localhost/MDB2Example';

$schema =& MDB2_Schema::factory($dsn, $options);

if (PEAR::isError($schema)) {
    $error = $schema->getMessage();
} else {
    // first run with queries disabled to make sure everything is allright
    $disable_query = true;

    $previous_schema = $schema->getDefinitionFromDatabase();
    $op = $schema->updateDatabase('schema.xml', $previous_schema, array(), $disable_query);

    if (PEAR::isError($op)) {
        $error = $op->getMessage();
    }
}

if (isset($error)) {
    var_dump($error);
}

$schema->disconnect();
?>

The method accepts both, a filename or a definition array, as the first two parameters. Note how we mixed them in the example above. You may want to backup the current schema using dumpDatabase() for the case something goes wrong.

When updating database schemas we can run into data persistence issues. This can be addressed with data manipulation ability, that will be documented later in this manual.


Chapter 38. Date and Time

Provides Packages for working with date and time data



Calendar

Table of Contents
Introduction --  What Calendar can do
Installing -- How to install PEAR::Calendar
In A Hurry --  Just add hot water...
Package Overview --  Summary of Calendar Classes
Method Overview --  Summary of Calendar API
Calendar Decorators --  What Calendar_Decorator is for
FAQ --  Frequently Asked Questions
Calendar -- Calendar base class
constructor Calendar::Calendar() -- Constructs the Calendar
Calendar::adjust() -- Adjusts the date (helper method)
Calendar::build() -- Abstract method for building the children of a calendar object.
Calendar::fetch() -- Iterator method for fetching child Calendar subclass objects (e.g. a minute from an hour object). On reaching the end of the collection, returns false and resets the collection for further iteratations.
Calendar::fetchAll() -- Fetches all child from the current collection of children
Calendar::getTimestamp() -- Returns a timestamp from the current date / time values
Calendar::getValidator() -- Returns an instance of Calendar_Validator
Calendar::isSelected() -- True if the calendar subclass object is selected (e.g. today)
Calendar::isValid() -- Determine whether this date is valid
Calendar::nextDay() -- Returns the value for the next day
Calendar::nextHour() -- Returns the value for the next hour
Calendar::nextMinute() -- Returns the value for the next minute
Calendar::nextMonth() -- Returns the value for next month
Calendar::nextSecond() -- Returns the value for the next second
Calendar::nextYear() -- Returns the value for next year
Calendar::prevDay() -- Returns the value for the previous day
Calendar::prevHour() -- Returns the value for the previous hour
Calendar::prevMinute() -- Returns the value for the previous minute
Calendar::prevMonth() -- Returns the value for the previous month
Calendar::prevSecond() -- Returns the value for the previous second
Calendar::prevYear() -- Returns the value for the previous year
Calendar::setSelected() -- Defines calendar object as selected (e.g. for today)
Calendar::setSelection() -- Abstract method for selected data objects called from build
Calendar::setTimestamp() -- Defines the calendar by a Unix timestamp
Calendar::size() -- Get the number Calendar subclass objects stored in the internal collection.
Calendar::thisDay() -- Returns the value for this day
Calendar::thisHour() -- Returns the value for this hour
Calendar::thisMinute() -- Returns the value for this minute
Calendar::thisMonth() -- Returns the value for this month
Calendar::thisSecond() -- Returns the value for this second
Calendar::thisYear() -- Returns the value for this year
Calendar_Year -- Calendar_Year API
constructor Calendar_Year::Calendar_Year() -- Constructs Calendar_Year
Calendar_Year::build() -- Builds the Months of the Year.
Calendar_Month -- Calendar_Month API
constructor Calendar_Month::Calendar_Month() -- Constructs Calendar_Month
Calendar_Month::build() -- Builds Day objects for this Month. Creates as many Calendar_Day objects
Calendar_Month_Weekdays -- Calendar_Month_Weekdays API
constructor Calendar_Month_Weekdays::Calendar_Month_Weekdays() -- Constructs Calendar_Month_Weekdays
Calendar_Month_Weekdays::build() -- Builds Day objects in tabular form, to allow display of calendar month with empty cells if the first day of the week does not fall on the first day of the month.
Calendar_Month_Weeks -- Calendar_Month_Weeks API
constructor Calendar_Month_Weeks::Calendar_Month_Weeks() -- Constructs Calendar_Month_Weeks
Calendar_Month_Weeks::build() -- Builds Calendar_Week objects for the Month. Note that Calendar_Week
Calendar_Week -- Calendar_Week API
constructor Calendar_Week::Calendar_Week() -- Constructs Week
Calendar_Week::build() -- Builds Calendar_Day objects for this Week
Calendar_Week::nextWeek() -- Gets the value of the following week, according to the requested format
Calendar_Week::prevWeek() -- Gets the value of the previous week, according to the requested format
Calendar_Week::thisWeek() -- Gets the value of the current week, according to the requested format
Calendar_Day -- Calendar_Day API
constructor Calendar_Day::Calendar_Day() -- Constructs Calendar_Day
Calendar_Day::build() -- Builds the Hours of the Day
Calendar_Day::isEmpty() -- 
Calendar_Day::isFirst() -- Returns true if Day object is first in a Week
Calendar_Day::isLast() -- Returns true if Day object is last in a Week
Calendar_Hour -- Calendar_Hour API
constructor Calendar_Hour::Calendar_Hour() -- Constructs Calendar_Hour
Calendar_Hour::build() -- Builds the Minutes in the Hour
Calendar_Minute -- Calendar_Minute API
constructor Calendar_Minute::Calendar_Minute() -- Constructs Minute
Calendar_Minute::build() -- Builds the Calendar_Second objects
Calendar_Second -- Calendar_Second API
constructor Calendar_Second::Calendar_Second() -- Constructs Second
Calendar_Second::build() -- Overwrite build
Calendar_Second::fetch() -- Overwrite fetch
Calendar_Second::fetchAll() -- Overwrite fetchAll
Calendar_Second::size() -- Overwrite size
Calendar_Validation_Error -- Calendar_Validation_Error API
constructor Calendar_Validation_Error::Calendar_Validation_Error() -- Constructs Calendar_Validation_Error
Calendar_Validation_Error::getMessage() -- Returns the validation error message
Calendar_Validation_Error::getUnit() -- Returns the Date unit
Calendar_Validation_Error::getValue() -- Returns the value of the unit
Calendar_Validation_Error::toString() -- Returns a string containing the unit, value and error message
Calendar_Validator -- Calendar_Validator API
constructor Calendar_Validator::Calendar_Validator() -- Constructs Calendar_Validator
Calendar_Validator::fetch() -- Iterates over any validation errors
Calendar_Validator::isValid() -- Calls all the other isValidXXX() methods in the validator
Calendar_Validator::isValidDay() -- Check whether this is a valid day
Calendar_Validator::isValidHour() -- Check whether this is a valid hour
Calendar_Validator::isValidMinute() -- Check whether this is a valid minute
Calendar_Validator::isValidMonth() -- Check whether this is a valid month
Calendar_Validator::isValidSecond() -- Check whether this is a valid second
Calendar_Validator::isValidYear() -- Check whether this is a valid year
Package Calendar Constants -- Constants defined in and used by Calendar

Calendar Data Structures

This chapter describes how to use PEAR::Calendar

Introduction

Introduction --  What Calendar can do

Introduction

Warning

Some classes in PEAR::Calendar require PEAR::Date be installed. The PEAR::Date 1.3.1beta is missing a file and will not work. Make sure you have PEAR::Date version 1.4 or newer installed.

PEAR::Calendar is a package for generating Calendars as data structures. It does not render content or rely on any underlying data store, allowing it to be applied to many problem domains. At the same time it provides an easy to use API that makes rendering, for example, an HTML calendar very easy, while making it possible to "connect" the calendar with your data store.

PEAR::Calendar was developed as a result of finding no alternatives out there in PHP. There are numerous public domain calendar utilities / classes out there but all are tied to a specific output format (typically HTML with limited ability to customize without re-writing code) and often dependent on pre-built data structures stored in a database (read MySQL). This poses significant restrictions on the problem domains they can be applied to. By contrast PEAR::Calendar focuses on eliminating the math from the task of generating a calendar, allowing the end user to simply iterate over a prepared data structure.

Some of the benefits / features of PEAR::Calendar include:

  • You can render whatever output you like (e.g. (X)HTML, WML, SOAP, XML-RPC, command line ASCII or whatever).

  • Generating a calendar is much like looping through the results of a database query.

  • Representations of all "date objects" from a Year down to a Second (e.g. you can equally render a complete yearly calendar with months and days or a "Weekly / Daily Diary")

  • Allows "tabular" calendars to be generated easily.

  • Any date can be easily validated (is 29th Feb 2003 valid?).

  • Performs well despite number crunching and object oriented API.

  • Calendars can be easily navigated (e.g. providing a link from 1st Jan 2004 to 31st Dec 2003 is no problem).

  • It returns numeric values for all operations, meaning you are not tied to using, say, English names for months. Typically you would generate these yourself with PHP functions like strftime() and setlocale().

  • Representations of a date can be obtained as a human readable number or in the form of a timestamp (e.g. Unix Timestamp), depending on the calendar engine you are using.

  • You can attach your own functionality to the calendar by creating Decorators.

  • Allows you to write layered, N-Tier applications.

  • The calendar "calculation engine" is abstracted meaning you are not tied to a Gregorian calendar - you could write a Tolkien calendar should you wish. Currently "engines" based on Unixtimestamps (the default) and PEAR::Date have been implemented.

Note: there are numerous and extensive examples provided with the PEAR::Calendar package file.

Installing

Installing -- How to install PEAR::Calendar

Installing

  • If not already installed, setup the PEAR package manager.

  • Type pear install Calendar-beta (using the command line manager)

  • PEAR::Calendar is now installed.

In A Hurry

In A Hurry --  Just add hot water...

In A Hurry

require_once 'Calendar/Month/Weekdays.php';

$Month = new Calendar_Month_Weekdays(date('Y'), date('n'));

$Month->build();

echo "<table>\n";

while ($Day = $Month->fetch()) {
    if ($Day->isFirst()) {
        echo "<tr>\n";
    }

    if ($Day->isEmpty()) {
        echo "<td>&nbsp;</td>\n";
    } else {
        echo '<td>'.$Day->thisDay()."</td>\n";
    }

    if ($Day->isLast()) {
        echo "</tr>\n";
    }
}

echo "</table>\n";

Package Overview

Package Overview --  Summary of Calendar Classes

Package Overview

When working with PEAR::Calendar, there are a total of 12 (public) classes available for you to use, depending on the particular problem you are trying to solve. They can be grouped in date classes, tabular date classes, validation classes and decorators.

Date Classes

Providing representations of all basic human date units. All are subclasses of Calendar so provide the methods defined there.

  • Calendar_Year - represents a year and can build Calendar_Month, Calendar_Month_Weekdays and Calendar_Month_Weeks objects.

    Include with
    require_once 'Calendar/Year.php';
    .

  • Calendar_Month - represents a month and can build Calendar_Day objects.

    Include with
    require_once 'Calendar/Month.php';
    .

  • Calendar_Day - represents a day and can build Calendar_Hour objects.

    Include with
    require_once 'Calendar/Day.php';
    .

  • Calendar_Hour - represents a hour and can build Calendar_Minute objects.

    Include with
    require_once 'Calendar/Hour.php';
    .

  • Calendar_Minute - represents a minute and can build Calendar_Second objects.

    Include with
    require_once 'Calendar/Minute.php';
    .

  • Calendar_Second - represents a second but cannot build anything.

    Include with
    require_once 'Calendar/Second.php';
    .

Tabular Date Classes

Designed for building calendars in tabular format. All are subclasses of Calendar so provide the methods defined there.

  • Calendar_Month_Weekdays - builds Calendar_Day objects setting the isFirst(), isLast() and isEmpty() states, to display a month in tabular form.

    Include with
    require_once 'Calendar/Month/Weekdays.php';
    .

  • Calendar_Month_Weeks - builds Calendar_Week objects, representing a month in terms of the tabular weeks it contains (see FAQ for what a week represents).

    Include with
    require_once 'Calendar/Month/Weeks.php';
    .

  • Calendar_Week - builds a collection of seven Calendar_Day objects. If extended by a Calendar_Month_Weeks object, it represents a tabular week in a month and it sets the isEmpty() state for the appropriate days, if necessary.

    Include with
    require_once 'Calendar/Week.php';
    .

Validation Classes

Used to validate dates. Calendar provides the methods isValid() to perform a simple check on any date and getValidator() to return an instance of Calendar_Validator for fine grained validation.

  • Calendar_Validator - is not instantiated by your code directly (you need need specifically include / create it) but instead returned from the Calendar::getValidator() method you can call on any subclass of Calendar. It is used to provide fine grained validation of a date to find out exactly what's wrong with it (for simple validation just call isValid() on any Date object or Tabular Date object, to know if it was created with valid values.

  • Calendar_Validation_Error - represents a validation error, providing methods to determine what went wrong. Available methods are getUnit() (e.g. returns Year or Month), getValue() (the value it failed with), getMessage() (the validation error message) and toString() which returns a combination of all the three preceding methods. The default validation error messages are in English but stored in the constants CALENDAR_VALUE_TOOSMALL and CALENDAR_VALUE_TOOLARGE which you can redefine in your code.

Decorators

Provide a mechanism to add functionality to the main calendar objects (the subclasses of Calendar) without needing to directly extend them (and risk overwriting fields accidentally). When you create a decorator, you pass its constructor an instance of an existing calendar object. You can then make calls to the decorator in exactly the same way as you make calls to the original calendar object. This allows you to "overwrite" calendar methods, add new methods or even apply multiple decorators to the same calendar object. Decorators a typically either "injected" (via selection or the Calendar_Decorator_Wrapper decorator) into the loop where the calendar is rendered and / or to alter the output content (e.g. convert a numeric month into a textual month: 1 => January).

PEAR::Calendar provides some decorator implementations for you, to help with common tasks. These are not designed to suit everyone and hence are provided as optional code for you to use as needed (avoiding the performance cost associated with parsing code you're not using).

  • Calendar_Decorator - this is the base decorator class which you should extend with your own. It provides the same API as the calendar object it is decorating, and simply routes calls through to it. Example;
    require_once 'Calendar/Decorator.php';
    
    class ChristmasDecorator extends Calendar_Decorator
    {
        function ChristmasDecorator(&$Calendar)
        {
            parent::Calendar_Decorator($Calendar);
        }
        // Some method I've added
        function getDaysToChristmas()
        {
            $today = parent::thisDay(true);
            $Christmas = new Calendar_Day(date('Y'), 12, 25);
            $xmasday = $Christmas->thisDay(TRUE);
            $diff = $xmasday - $today;
            if ($diff < 0) {
                $NextChristmas = new Calendar_Day($Christmas->nextYear(), 12, 25);
                $nextxmasday = $NextChristmas->thisDay(true);
                $diff = $today - $nextxmasday;
            }
            return ($diff / 86400);
        }
    }

  • Calendar_Decorator_Uri - provides a decorator to help with generating URLs (for example next / prev URLs).

    Include with
    require_once 'Calendar/Decorator/Uri.php';
    .

  • Calendar_Decorator_Textual - helps with obtaining textual month names and weekday names from a calendar object.

    Include with
    require_once 'Calendar/Decorator/Textual.php';
    .

  • Calendar_Decorator_Wrapper - is intended to help you add decorators to the children of the calendar object you are working with. It will wrap the children in the decorator you specify at the point fetch() or fetchAll() is called, after a build build() call.

    Include with
    require_once 'Calendar/Decorator/Wrapper.php';
    .

Method Overview

Method Overview --  Summary of Calendar API

Method Overview

For the main Calendar classes (the subclasses of Calendar) all share a common API (a common set of class methods). Although there are some minor variations in specific cases, you should find it intuitive and easy to remember, once you are familiar with what's available. This section summarizes the common methods and highlights the variations. For further information, consult the API documentation.

Constructors

The constructors of the Date classes accept integer date values as their arguments, beginning with the year (on the left) across to the second (on the right), depending on what class you're using, for example;
// Natural Calendar Classes
$Year = new Calendar_Year(2003);                         // 2003
$Month = new Calendar_Month(2003, 10);                   // October 2003
$Day = new Calendar_Day(2003, 10, 25);                   // 25th October 2003
$Hour = new Calendar_Hour(2003, 10, 25, 13);             // 25th October 2003 13:00:00
$Minute = new Calendar_Minute(2003, 10, 25, 13, 31);     // 25th October 2003 13:31:00
$Second = new Calendar_Second(2003, 10, 25, 13, 31, 45); // 25th October 2003 13:31:45

// Tabular Calendar Classes
$Month = new Calendar_Month_Weekdays(2003, 10);          // October 2003
$Month = new Calendar_Month_Weeks(2003, 10);             // October 2003
$Week = new Calendar_Week(2003, 10, 25);                 // week containing 25th October 2003
Note that the tabular classes, Calendar_Month_Weekdays and Calendar_Month_Weeks both take an optional third argument (integer) which specifies the first day of the week and adjust tabular display (normally it defaults to Monday (1) - pass the integer value 0 to switch to Sunday as the first day, for example). Calendar_Week accepts the first day argument as the fourth to its constructor.

Location Methods

All date and tabular date classes share the methods defined in the abstract base class Calendar. Among these are methods for an object of any of these classes to identify itself (what's its date is) and the previous and next dates. For example;
// Create a day
$Day = new Calendar_Day(2003, 10, 1); // 1st October 2003

echo $Day->thisDay(); // Displays 1
echo $Day->prevDay(); // Displays 30 (the 30th of September)
echo $Day->nextDay(); // Displays 2

echo $Day->thisMonth(); // Displays 10
echo $Day->prevMonth(); // Displays 9
echo $Day->nextMonth(); // Displays 11
Notice that from the $Day I can find out not just about the day itself but also the month (or year/hour/minute/second). Notice also how prevDay() returned 30, taking care of working out that the previous day is in September for you. There are this***(), prev***() and next***() methods for years, months, days, hours, minutes and seconds.

Calling any of these methods and passing the value TRUE will result in a timestamp being returned (the type of timestamp depends on the Calendar Engine you are using - see the FAQ), for example;
// Create a second
$Second = new Calendar_Second(2003, 10, 25, 13, 32, 44);

echo $Second->thisYear(TRUE);     // Displays 1041375600
echo $Second->thisMonth(TRUE);    // Displays 1064959200
echo $Second->thisDay(TRUE);      // Displays 1067032800
echo $Second->thisHour(TRUE);     // Displays 1067079600
echo $Second->thisMinute(TRUE);   // Displays 1067081520
echo $Second->thisSecond(TRUE);   // Displays 1067081564
Notice how the timestamp return increases, depending on the method that was called to obtain it. The first, obtained from thisYear(TRUE)() is a timestamp for the beginning of the year 2003 (1st January 2003 in fact) while the third from thisDay(TRUE)() is a timestamp for 25th October 2003.

Warning

The prev***() and next***() methods return values calculated relative to the current Calendar object you are working with. In the above example, if you wanted the day and month of the next day (which should be 2nd October 2003), calling nextDay() then nextMonth() would give you the 2nd of November not October. Instead you should call nextDay() passing it the argument TRUE, to get back a timestamp from which the next day can be obtained. Be aware of the Calendar_Decorator_Uri which is designed to help build URLs for next / prev links.

There are also the methods thisWeek(), prevWeek() and nextWeek() which only become available if you're using an instance of Calendar_Week. The returned value format can be chosen among 'timestamp', 'n_in_month', 'n_in_year' or 'array'. Be careful - if you select 'n_in_month', it will return NULL if it reaches the beginning or end of a month.

Finally all Calendar objects provide the methods getTimeStamp() and setTimeStamp(). The former returns a timestamp in the format used by the calendar engine you are working with (i.e. Unix Timestamp if it's the default UnixTs engine or of format YYYY-MM-DD HH:MM:SS). The later excepts a timestamp which is used to replace the values the Calendar object was constructed with.

Building and Fetching

Every date and tabular date class has a build() method which is used to generate the children of that date object. For example Calendar_Month builds Calendar_Day objects, the days being "children" of the month.

Once build() is called, the children can be fetched from the date object using the simple fetch() iterator, for example;
$Month = new Calendar_Month(2003, 10);

$Month->build();

while ($Day = $Month->fetch()) {
    echo $Day->thisDay()."<br />\n";
}
The fetch() method returns one child at a time, in ascending date order, and returns FALSE when there are no more children. It also automatically resets the internal collection of children, meaning you can loop over them as many times as you like.

If you don't like the iterator, and wish to use your own, you can simply extract the children with the fetchAll() method (returns an indexed array of child date objects) and check the number you got back with size(). Be careful the index of the array you get back from fetchAll(). For Calendar_Year, Calendar_Month, Calendar_Month_Weekdays, Calendar_Month_Weeks and Calendar_Week, the first index of the array is 1 while for Calendar_Day, Calendar_Hour, Calendar_Minute and Calendar_Second the index begins with 0. Why? Consider 2003-1-1 00:00:00 ...

Note: Calendar_Second::build() doesn't do anything - it has no children.

Selecting Children

To help with rendering the calendar, the build() methods accept an index array of date objects which is compares with the children it is building. If it finds that an object that was passed to it matches a child, it set's the childs state to selected, meaning the isSelected() method (available on any date or tabular date objects) returns TRUE. For example;
$Month = new Calendar_Month(2003, 10);

$DayX = new Calendar_Day(2003, 10, 15);
$DayY = new Calendar_Day(2003, 10, 23);
$selection = array($DayX, $DayY);

$Month->build($selection);

while ($Day = $Month->fetch()) {
    if ($Day->isSelected()) {
        echo $Day->thisDay()."<br />\n"; // Displays 15 or 23
    }
}
In the above example, only 15th October 2003 and 23rd October 2003 are displayed.

The objects you pass to build() which match children that are being built replace the child (i.e. if there was a match, you get your object back). This allows you to "inject" your own objects into the loop, best accomplished by extending Calendar_Decorator.

Note: the Calendar_Year::build() method takes a second argument to specify the first day of the week (see above discussion on Constructors).

Tabular Days

The Calendar_Day class has three unique methods, which don't appear elsewhere, and are used purely for building tabular calendars. The isEmpty() is used to determine whether the day is an empty day or not (see FAQ for explaination of empty days). The methods isFirst() and isLast() are used to mark the beginning and and of a week.

Whether you need to use these methods depends on which class was used to build the day objects. If the day was built with Calendar_Month_Weekdays, all three of these methods are applicable (you may have empty days and Calendar_Month_Weekdays builts a complete month but delimits the beginning and end of each week so you can find it with isFirst() and isLast()). If the day was built with Calendar_Week, only the isEmpty() method is applicable (the first or last week in a month may contain empty days). For day objects built in any other manner, isEmpty(), isFirst() and isLast() are meaningless.

Validation

All date objects and tabular objects (except weeks) are capable of validating themselves. By default they accept whatever arguments they are given on construction but you can validate the date with the isValid() method, for example;
$Day = new Calendar_Day(2003, 10, 32);

if (!$Day->isValid()) {
    die ('Invalid date');
}
For more fine grained validation, you can first call the getValidator() method, to return an instance of Calendar_Validator then list the validation errors;
$Day = new Calendar_Day(2003, 10, 32);

if (!$Day->isValid()) {
    $Validator = & $Day->getValidator();
    while ($Error = $Validator->fetch()) {
        echo $Error->getUnit().' is invalid<br>';
    }
}
or...
$Day = new Calendar_Day(2003, 10, 32);

$Validator = & $Day->getValidator();
if (!$Validator->isValid()) {
    while ($Error = $Validator->fetch()) {
        echo $Error->toString().'<br>';
    }
}

Note that rather than validating dates, you may prefer to automatically adjust them with the adjust() method, for example;
$Day = new Calendar_Day(2003, 10, 32);

$Day->adjust();

echo $Day->thisYear();      // 2003
echo $Day->thisMonth();     // 11 (moved forward a month)
echo $Day->thisDay();       // 1 (the first of the month)

That summarizes all the methods available within PEAR::Calendar, apart from the those provided in the Decorator classes.

Calendar Decorators

Calendar Decorators --  What Calendar_Decorator is for

Calendar Decorators

The Calendar_Decorator is provided to allow you to attach functionality to existing Calendar objects without needing to subclass them. This helps in a number of situations, such as allowing results from, say, a database query to be rendered in the calendar or to modify the values returned from Calendar methods (perhaps converting a numeric month into its textual name).

Some concrete decorators are provided with PEAR::Calendar, to address what may be common problems you encounter in using the library. These are not designed to suit everyone but instead focus on solving a more narrow problem domain. They will only be parsed by the PHP engine should you explicitly include them in your code. An example of why decorators can be useful:
require_once 'Calendar/Day.php';
require_once 'Calendar/Decorator.php';

class WorkingDay extends Calendar_Decorator {
    function WorkingDay(& $Calendar) {
        parent::Calendar_Decorator($Calendar);
    }

    // Overides the default fetch method of the calendar object
    function fetch() {
        if ($Hour = parent::fetch()) {

            // Recursive fetch, return only hours between 8am and 6pm
            if ($Hour->thisHour() < 8 || $Hour->thisHour() > 18) {
                return $this->fetch();
            } else {
                return $Hour;
            }
        } else {
            // Make sure to return FALSE when the real fetch returned nothing
            // or you will get an infinite loop
            return FALSE;
        }
    }
}

// Create a normal day and build the hours
$Day = new Calendar_Day(date('Y'), date('n'), date('d'));
$Day->build();

// Create the decorator, passing it the normal day
$WorkingDay = new WorkingDay($Day);

// Only hours in a working day are displayed...
while ($Hour = $WorkingDay->fetch()) {
    echo $Hour->thisHour().'<br />';
}

The base Calendar_Decorator

The base class Calendar_Decorator "mirrors" the combined API of all the subclasses of Calendar. It accepts a Calendar object to its constructor then "takes over" the API allowing you to make calls through it rather than directly to the original calendar object. The Calendar_Decorator simply routes calls through to the calendar object it is decorating and returns values where appropriate.

Decorators and Date Selection

One important use of decorators is to help "inject" data into the loop which renders the calendar. This helps with fetching data from some sort of "event" table in a database. When passing a selection array to any build() method, the selected date objects will replace the default built objects, allowing you to get them back as inside the fetch() loop, using the isSelected() method. You'll find an example of this in the PEAR::Calendar download. It should always be possible to fetch the event data you need with a single database query...

The bundled Decorators

PEAR::Calendar already provides a few decorators:

  • Calendar_Decorator_Textual

    Decorator to help with fetching textual representations of months and days of the week. It has

  • Calendar_Decorator_Uri

    Decorator to help with building HTML links for navigating the calendar.

  • Calendar_Decorator_Weekday

    Decorator for fetching the day of the week.

  • Calendar_Decorator_Wrapper

    Decorator to help with wrapping built children in another decorator.

Calendar_Decorator_Textual example

This decorator defines a few methods that can be useful to handle month and day names:

  • monthNames($format='long')

    Returns an array with month names; the format of returned months depends on the format parameter (one, two, short or long)

  • weekdayNames($format='long')

    Returns an array with day names; the format of returned days depends on the format parameter (one, two, short or long)

  • prevMonthName($format='long')

    Returns textual representation of the previous month of the decorated calendar object

  • thisMonthName($format='long')

    Returns textual representation of the month of the decorated calendar object

  • nextMonthName($format='long')

    Returns textual representation of the next month of the decorated calendar object

  • prevDayName($format='long')

    Returns textual representation of the previous day of the decorated calendar object

  • thisDayName($format='long')

    Returns textual representation of the day of the decorated calendar object

  • nextDayName($format='long')

    Returns textual representation of the next day of the decorated calendar object

  • orderedWeekdays($format='long')

    Returns the days of the week using the order defined in the decorated calendar object. Only useful for Calendar_Month_Weekdays, Calendar_Month_Weeks and Calendar_Week. Otherwise the returned array will begin on Sunday.

Calendar_Decorator_Uri example

Methods defined by this decorator:

  • setFragments($y, $m=null, $d=null, $h=null, $i=null, $s=null)

    Set the names of the URI vars for each date element

  • setSeparator($separator)

    Set the fragments separator, for instance '/' (default: &).

  • setScalar(boolean $state=TRUE)

    Puts Uri decorator into "scalar mode" - URI variable names are not returned

  • prev($method)

    Gets the URI string for the previous calendar unit (year, month, week or day etc)

  • this($method)

    Gets the URI string for the current calendar unit (year, month, week or day etc)

  • next($method)

    Gets the URI string for the next calendar unit (year, month, week or day etc)

A simple usage example:
$Day = new Calendar_Day(2003, 10, 23);
$Uri = & new Calendar_Decorator_Uri($Day);
$Uri->setFragments('year', 'month', 'day');
echo $Uri->prev('day');
// Displays year=2003&month=10&day=22

Calendar_Decorator_Weekday example

Methods defined by this decorator:

  • setFirstDay($firstDay)

    Sets the first day of the week (0 = Sunday, 1 = Monday [default] etc)

  • prevWeekDay($format='int')

    Returns the previous weekday, formatted according the $format parameter (int, array, object, timestamp)

  • thisWeekDay($format='int')

    Returns the current weekday, formatted according the $format parameter (int, array, object, timestamp)

  • nextWeekDay($format='int')

    Returns the next weekday, formatted according the $format parameter (int, array, object, timestamp)

Example:
$Day = new Calendar_Day(2003, 10, 23);
$Weekday = & new Calendar_Decorator_Weekday($Day);
$Weekday->setFirstDay(0); // Set first day of week to Sunday (default Mon)
echo $Weekday->thisWeekDay(); // Displays 5 - fifth day of week relative to Sun

Calendar_Decorator_Wrapper example

require_once 'Calendar/Month.php';
require_once 'Calendar/Decorator.php'; // Not really needed but added to help this make sense
require_once 'Calendar/Decorator/Wrapper.php';

class MyBoldDecorator extends Calendar_Decorator
{
    function MyBoldDecorator(&$Calendar)
    {
        parent::Calendar_Decorator($Calendar);
    }

    function thisDay()
    {
        return '<b>'.parent::thisDay().'</b>';
    }
}

$Month = new Calendar_Month(date('Y'), date('n'));

$Wrapper = & new Calendar_Decorator_Wrapper($Month);
$Wrapper->build();

echo '<h2>The Wrapper decorator</h2>';
echo '<i>Day numbers are rendered in bold</i><br /> <br />';
while ($DecoratedDay = $Wrapper->fetch('MyBoldDecorator')) {
    echo $DecoratedDay->thisDay().'<br />';
}

FAQ

FAQ --  Frequently Asked Questions

Why doesn't it generate HTML?

What if you want WML, SOAP, PDF, GIF, command line, etc. etc.? PEAR::Calendar can be used to generate any output format you like (see the examples for SOAP and WML). Tying it to a particular output content type will limit its use (a problem that every public domain PHP Calendar library I've looked at suffers from). A PEAR::HTML_Calendar is likely to be developed using PEAR::Calendar.

There are too many objects, classes and files. It's bloated!

Running the examples on Sourceforge's servers (which are always overloaded), example 3.php renders in under 0.1 seconds (usually half that). The code is highly optimized and every "trick in the book" has been applied to make sure PHP only parses / executes the subset of logic you need for your specific problem. If in doubt, use Cache_Lite to cache the output HTML.

You use Unix timestamps to calculate the Calendar, which limits the range of years it can generate. Can this be changed?

All calculations are handled by a class implementing the Calendar_Engine interface. The default implemention is based on PHP's date() and mktime() functions (so Unix timestamps are required for that engine). A second engine exists which uses PEAR::Date. It's a bit slower but overcomes the limit on the range of Unixstamps. To switch between engines use the constant CALENDAR_ENGINE e.g.
// The default Unix timestamp engine (this definition is not required)
// define('CALENDAR_ENGINE', 'UnixTs');

// Switch to PEAR::Date engine
define('CALENDAR_ENGINE', 'PearDate');
Note that the PearDate engine is based on PEAR::Date version 1.4 or newer.

This examples use the English language for days and months. Can this be changed?

PEAR::Calendar only uses base 10 numbers for calculations - the names of months and days of the week and generated as the calendar is being rendered (by you). You should only need to change PHP's locale with setlocale() and use the strftime() function e.g.:
$Day = & new Calendar_Day(2003, 10, 23);

setlocale (LC_TIME, 'de_DE'); // German

echo strftime('%A %d %B %Y', $Day->getTimeStamp());
Note that Calendar_Decorator_Textual provides help in generating month and day of week names in a manner which is independent of the Calendar Engine you are using and can be modified with setlocale().

What are empty days?

PEAR::Calendar makes it easy to render calendars in tabular format (like humans are used to) such as:



October 2003
M       T       W       T       F       S       S
                1       2       3       4       5
6       7       8       9       10      11      12
13      14      15      16      17      18      19
20      21      22      23      24      25      26
27      28      29      30      31

        

Notice the top left and botton right of this example - these are "empty days". Empty days are generated only by two calendar classes: Calendar_Month_Weekdays and Calendar_Week. For example using Calendar_Month_Weekdays;
require_once 'Calendar/Month/Weekdays.php';

$Month = & new Calendar_Month_Weekdays(2003, 10);
$Month->build();

while ($Day = & $Month->fetch()) {
    if ($Day->isFirst()) // Check for the start of a week
        echo "\n";

    if ($Day->isEmpty()) // Check to see if day is empty
        echo "\t";
    else
        echo $Day->thisDay()."\t";

    if ($Day->isLast()) // Check for the end of a week
        echo "\n";
}
An empty day can still return values, the date it represents being from the previous or next month in the calendar. You may get empty days for Calendar_Month_Weekdays and Calendar_Week. Using Calendar_Week, you will only build 7 days (use Calendar_Month_Weeks to build Calendar_Week objects), so the isFirst() and isLast() methods are not applicable.

How do I select some dates?

All calendar objects (except Calendar_Second, which has no "children") have the method build() to build the "children" of that object. For example Calendar_Year::build() builds Calendar_Month objects while Calendar_Hour::build() builds Calendar_Minute objects. You have the option of passing this method an indexed array of Calendar objects which will be used to "select" the matching built children. For example:
$Month = & new Calendar_Month(2003, 10); // Oct 2003

$SelectedDay1 = & new Calendar_Day(2003, 10, 5);  // Oct  5th 2003
$SelectedDay2 = & new Calendar_Day(2003, 10, 21); // Oct 21st 2003

// Place in an array...
$selection = array($SelectedDay1, $SelectedDay2);

$Month->build($selection);

while ($Day = & $Month->fetch()) {
    if ($Day->isSelected())
        echo  $Day->thisYear().' '.$Day->thisMonth().' '.$Day->thisDay().' is selected'."\n";
}
Note: the date objects you pass to a build() method replace the corresponding built date objects, allowing you to do things like attach your own subclass of Calendar_Decorator to them, then access the decorating functionality inside the loop which renders the calendar. You might display the contents from an "events database table" using this approach.

Why do I have to call build() explicitly. Why can't children be built automatically?

First and foremost, for performance. Building the children has a performance cost and you won't always need to have the children, so it should be called explicitly, otherwise you might have $Year->build(), expecting to get just months but behind the scenes, months built days, which built hours, which build minutes etc. Also calling build() yourself give you a chance to "select" some of the children.

How do I validate a date?

Validity is determined by the Calendar_Engine being used as well as the time the date object you're working with represents (e.g. $Month = & new Month(2003, 2, 29); is invalid, because Feb 2003 was not a leap year). For quick validation, you can call the method isValid() on any date object, which will return FALSE if there's a problem. For more information of more detailed validation, you can call the method getValidator() on any date object, which returns an instance of the class Calendar_Validator. For example;
$Month = & new Month(2003, 2, 29); // 29th Feb 2003 (?!?)
if (!$Month->isValid()) {
    $Validator = & $Month->getValidator();
    while ($Error = $Validator->fetch()) {
        echo $Error->toString();
    }
}
You can also begin validation by calling getValidator() then either isValidYear(), isValidMonth(), isValidDay(), isValidHour(), isValidMinute() and isValidSecond() (or just isValid() which calls all of the isValidxxx methods).

Can I adjust invalid dates?

If you're allowing end users to navigate your calendar via the URL, were they to modify the URL to something like calendar.php?year=2003&month=13, instead of throwing a validation error at them, you could call the Calendar::adjust() method on the calendar object you create with that URL. You should then end up with January 2004 (in this example). This behaviour is possible thanks to mktime() for the Unix Timestamp engine, while being built into the PearDate engine for you.

After calling build(), I just want to get a single child date object with looping through the lot. How?

The method fetchAll() can be called on any date object to get an indexed array of all the children which have been built, allowing you to reference them directly. Be careful with the first index of this array - in some cases it will be [1] not [0], depending on the type of date object built. For example;
$Month = & new Calendar_Month(2003, 10);
$Month->build();

$days = & $Month->fetchAll(); // Now all in array
echo $days[1]->thisDay(); // The first day has index 1

$Hour = & new Calendar_Hour(2003, 10, 25, 15); // Oct 25th 2003, 3pm
$Hour->build();

$hours = & $Hour->fetchAll(); // Now all in array
echo $hours[0]->thisHour(); // The first hour has index 0
The following classes are always built to have the first index as 1: Calendar_Month, Calendar_Month_Weekdays, Calendar_Month_Weeks, Calendar_Week and Calendar_Day The following classes are always built to have the first index as 0: Calendar_Hour, Calendar_Minute and Calendar_Second Note also the method size() can be called on any date object, after build() has been called, to get the number of children.

What does a week actually represent in PEAR::Calendar?

Weeks are "pseudo" dates. They're useful for formatting the user interface for end users. Weeks are instantiated with a year, a month and a day of the month. You can then have the week tell you its timestamp (which will be the same as the timestamp for the first day in the week), its numeric position within the tabular month (see empty days above), its numeric position within the year (this is an ISO-8601 week number of year, weeks starting on Monday) or an array containing the numeric year, month and the first day of the week (as a number within the month). For example:
$Week = & new Calendar_Week(2003, 10, 15);

$Week = new Calendar_Week(2003, 10, 15);

echo $Week->thisWeek(); // Displays 2 (week num in month)
echo $Week->thisWeek('n_in_month'); // Display 2 - same as above

echo $Week->thisWeek('n_in_year');  // Displays 41 (week in year)

echo $Week->thisWeek('timestamp');  // Displays unix timestamp or an ISO-8601 datetime
                                    // (YYYY-MM-DD HH:MM:SS), depending on the engine.

print_r $Week->thisWeek('array');   // [year] => 2003 [month] => 10 [day] => 12

How do I get a Calendar_Year to build Calendar_Month_Weekdays or Calendar_Month_Weeks, instead of the default Calendar_Month objects?

When working with a Calendar_Year, the constants CALENDAR_MONTH_STATE controls what type of month object is built. You can define CALENDAR_MONTH_STATE to CALENDAR_USE_MONTH_WEEKDAYS or CALENDAR_USE_MONTH_WEEKS for the Calendar_Month_Weekdays and Calendar_Month_Week classes, respectively.

You use Monday as the start of the week. Can I change that?

Yes. For the classes which are concerned with the notion of a "week", you can can pass a value which defines the first day of the week. For the default timestamp based Calendar engine, this is a number from 0 to 6, 0 being Sunday through to 6 being Saturday. This value can be passed to the following:
$Year = new Calendar_Year(2003);
$selection = array();
$Year->build($selection, 0); // the second argument is the first day of the week (Sunday)

$MonthWeekdays = new Calendar_Month_Weekdays(2003, 10, 6); // Third argument - Saturday

$MonthWeeks = new Calendar_Month_Weekdays(2003, 10, 2); // Third argument - Tuesday

$Week = new Calendar_Week(2003, 10, 15, 5) // Fourth argument - Friday

Calendar

Calendar -- Calendar base class

Description

Calendar API.

constructor Calendar::Calendar()

constructor Calendar::Calendar() -- Constructs the Calendar

Description

This package is not documented yet.

Parameter

integer $y

year

integer $m

month

integer $d

day

integer $h

hour

integer $i

minute

integer $s

second

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::adjust()

Calendar::adjust() -- Adjusts the date (helper method)

Description

Helper method. You can adjust calling object's date just like mktime does. For instance, (2003, 11, -1) will be translated to (2003, 10, 31). This method allows math operations on dates.

Note

This function can not be called statically.

Calendar::build()

Calendar::build() -- Abstract method for building the children of a calendar object.

Description

Implemented by Calendar subclasses

Parameter

array $sDates

containing Calendar objects to select (optional)

abstract

Note

This function can not be called statically.

Calendar::fetch()

Calendar::fetch() -- Iterator method for fetching child Calendar subclass objects (e.g. a minute from an hour object). On reaching the end of the collection, returns false and resets the collection for further iteratations.

Description

This package is not documented yet.

Return value

returns either an object subclass of Calendar or false

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::fetchAll()

Calendar::fetchAll() -- Fetches all child from the current collection of children

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::getTimestamp()

Calendar::getTimestamp() -- Returns a timestamp from the current date / time values

Description

Format of timestamp depends on Calendar_Engine implementation being used

Return value

returns timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::getValidator()

Calendar::getValidator() -- Returns an instance of Calendar_Validator

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::isSelected()

Calendar::isSelected() -- True if the calendar subclass object is selected (e.g. today)

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::isValid()

Calendar::isValid() -- Determine whether this date is valid

Description

Determine whether this date is valid with the bounds determined by the Calendar_Engine. The call is passed on to Calendar_Validator::isValid

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::nextDay()

Calendar::nextDay() -- Returns the value for the next day

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 12 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::nextHour()

Calendar::nextHour() -- Returns the value for the next hour

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 14 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::nextMinute()

Calendar::nextMinute() -- Returns the value for the next minute

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 25 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::nextMonth()

Calendar::nextMonth() -- Returns the value for next month

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 6 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::nextSecond()

Calendar::nextSecond() -- Returns the value for the next second

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 45 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::nextYear()

Calendar::nextYear() -- Returns the value for next year

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 2004 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::prevDay()

Calendar::prevDay() -- Returns the value for the previous day

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 10 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::prevHour()

Calendar::prevHour() -- Returns the value for the previous hour

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 13 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::prevMinute()

Calendar::prevMinute() -- Returns the value for the previous minute

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 23 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::prevMonth()

Calendar::prevMonth() -- Returns the value for the previous month

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 4 or Unix timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::prevSecond()

Calendar::prevSecond() -- Returns the value for the previous second

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 43 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::prevYear()

Calendar::prevYear() -- Returns the value for the previous year

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 2002 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::setSelected()

Calendar::setSelected() -- Defines calendar object as selected (e.g. for today)

Description

This package is not documented yet.

Parameter

boolean $state

state whether Calendar subclass

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::setSelection()

Calendar::setSelection() -- Abstract method for selected data objects called from build

Description

This package is not documented yet.

Parameter

array $sDates

abstract

Note

This function can not be called statically.

Calendar::setTimestamp()

Calendar::setTimestamp() -- Defines the calendar by a Unix timestamp

Description

Defines the calendar by a Unix timestamp, replacing values passed to the constructor

Parameter

integer $ts

Unix timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::size()

Calendar::size() -- Get the number Calendar subclass objects stored in the internal collection.

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::thisDay()

Calendar::thisDay() -- Returns the value for this day

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 11 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::thisHour()

Calendar::thisHour() -- Returns the value for this hour

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 14 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::thisMinute()

Calendar::thisMinute() -- Returns the value for this minute

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 24 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::thisMonth()

Calendar::thisMonth() -- Returns the value for this month

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 5 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::thisSecond()

Calendar::thisSecond() -- Returns the value for this second

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 44 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar::thisYear()

Calendar::thisYear() -- Returns the value for this year

Description

This package is not documented yet.

Parameter

string $format

'int', 'timestamp' , 'array' or 'object'

Return value

returns e.g. 2003 or timestamp

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Year

Calendar_Year -- Calendar_Year API

Description

Calendar_Year API.

constructor Calendar_Year::Calendar_Year()

constructor Calendar_Year::Calendar_Year() -- Constructs Calendar_Year

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Year::build()

Calendar_Year::build() -- Builds the Months of the Year.

Description

Note: by defining the constant CALENDAR_MONTH_STATE you can control what class of Calendar_Month is built e.g.;
1  require_once 'Calendar/Calendar_Year.php';
    2  define ('CALENDAR_MONTH_STATE',CALENDAR_USE_MONTH_WEEKDAYS); // Use Calendar_Month_Weekdays
    3  // define ('CALENDAR_MONTH_STATE',CALENDAR_USE_MONTH_WEEKS); // Use Calendar_Month_Weeks
    4
It defaults to building Calendar_Month objects.

Parameter

array $sDates

(optional) array of Calendar_Month objects representing selected months

integer $firstDay

(optional) first day of week (e.g. 0 for Sunday, 2 for Tuesday etc.)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Month

Calendar_Month -- Calendar_Month API

Description

Calendar_Month API.

constructor Calendar_Month::Calendar_Month()

constructor Calendar_Month::Calendar_Month() -- Constructs Calendar_Month

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $firstDay

(optional) unused in this class

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Month::build()

Calendar_Month::build() -- Builds Day objects for this Month. Creates as many Calendar_Day objects

Description

as there are days in the month

Parameter

array $sDates

(optional) Calendar_Day objects representing selected dates

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Month_Weekdays

Calendar_Month_Weekdays -- Calendar_Month_Weekdays API

Description

Calendar_Month_Weekdays API.

constructor Calendar_Month_Weekdays::Calendar_Month_Weekdays()

constructor Calendar_Month_Weekdays::Calendar_Month_Weekdays() -- Constructs Calendar_Month_Weekdays

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $firstDay

(optional) first day of week (e.g. 0 for Sunday, 2 for Tuesday etc.)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Month_Weekdays::build()

Calendar_Month_Weekdays::build() -- Builds Day objects in tabular form, to allow display of calendar month with empty cells if the first day of the week does not fall on the first day of the month.

Description

This package is not documented yet.

Parameter

array $sDates

(optional) Calendar_Day objects representing selected dates

Throws

throws no exceptions thrown

See

see Calendar_Day_Base::isLast()

see Calendar_Day_Base::isFirst()

see Calendar_Day::isEmpty()

Note

This function can not be called statically.

Calendar_Month_Weeks

Calendar_Month_Weeks -- Calendar_Month_Weeks API

Description

Calendar API.

constructor Calendar_Month_Weeks::Calendar_Month_Weeks()

constructor Calendar_Month_Weeks::Calendar_Month_Weeks() -- Constructs Calendar_Month_Weeks

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $firstDay

(optional) first day of week (e.g. 0 for Sunday, 2 for Tuesday etc.)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Month_Weeks::build()

Calendar_Month_Weeks::build() -- Builds Calendar_Week objects for the Month. Note that Calendar_Week

Description

builds Calendar_Day object in tabular form (with Calendar_Day->empty)

Parameter

array $sDates

(optional) Calendar_Week objects representing selected dates

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Week

Calendar_Week -- Calendar_Week API

Description

Calendar_Week API.

constructor Calendar_Week::Calendar_Week()

constructor Calendar_Week::Calendar_Week() -- Constructs Week

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $d

a day of the desired week

integer $firstDay

(optional) first day of week (e.g. 0 for Sunday, 2 for Tuesday etc.)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Week::build()

Calendar_Week::build() -- Builds Calendar_Day objects for this Week

Description

This package is not documented yet.

Parameter

array $sDates

(optional) Calendar_Day objects representing selected dates

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Week::nextWeek()

Calendar_Week::nextWeek() -- Gets the value of the following week, according to the requested format

Description

This package is not documented yet.

Parameter

string $format

['timestamp' | 'n_in_month' | 'n_in_year' | 'array']

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Week::prevWeek()

Calendar_Week::prevWeek() -- Gets the value of the previous week, according to the requested format

Description

This package is not documented yet.

Parameter

string $format

['timestamp' | 'n_in_month' | 'n_in_year' | 'array']

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Week::thisWeek()

Calendar_Week::thisWeek() -- Gets the value of the current week, according to the requested format

Description

This package is not documented yet.

Parameter

string $format

['timestamp' | 'n_in_month' | 'n_in_year' | 'array']

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Day

Calendar_Day -- Calendar_Day API

Description

Calendar_Day API.

constructor Calendar_Day::Calendar_Day()

constructor Calendar_Day::Calendar_Day() -- Constructs Calendar_Day

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 8

integer $d

day e.g. 15

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Day::build()

Calendar_Day::build() -- Builds the Hours of the Day

Description

This package is not documented yet.

Parameter

array $sDates

(optional) Calendar_Hour objects representing selected dates

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Day::isEmpty()

Calendar_Day::isEmpty() -- 

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Day::isFirst()

Calendar_Day::isFirst() -- Returns true if Day object is first in a Week

Description

Only relevant when Day is created by Calendar_Month_Weekdays::build()

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Day::isLast()

Calendar_Day::isLast() -- Returns true if Day object is last in a Week

Description

Only relevant when Day is created by Calendar_Month_Weekdays::build()

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Hour

Calendar_Hour -- Calendar_Hour API

Description

Calendar_Hour API.

constructor Calendar_Hour::Calendar_Hour()

constructor Calendar_Hour::Calendar_Hour() -- Constructs Calendar_Hour

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $d

day e.g. 11

integer $h

hour e.g. 13

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Hour::build()

Calendar_Hour::build() -- Builds the Minutes in the Hour

Description

This package is not documented yet.

Parameter

array $sDates

(optional) Calendar_Minute objects representing selected minutes

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Minute

Calendar_Minute -- Calendar_Minute API

Description

Calendar_Minute API.

constructor Calendar_Minute::Calendar_Minute()

constructor Calendar_Minute::Calendar_Minute() -- Constructs Minute

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $d

day e.g. 11

integer $h

hour e.g. 13

integer $i

minute e.g. 31

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Minute::build()

Calendar_Minute::build() -- Builds the Calendar_Second objects

Description

This package is not documented yet.

Parameter

array $sDates

(optional) Calendar_Second objects representing selected seconds

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Second

Calendar_Second -- Calendar_Second API

Description

Calendar_Second API.

constructor Calendar_Second::Calendar_Second()

constructor Calendar_Second::Calendar_Second() -- Constructs Second

Description

This package is not documented yet.

Parameter

integer $y

year e.g. 2003

integer $m

month e.g. 5

integer $d

day e.g. 11

integer $h

hour e.g. 13

integer $i

minute e.g. 31

integer $s

second e.g. 45

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Second::build()

Calendar_Second::build() -- Overwrite build

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Second::fetch()

Calendar_Second::fetch() -- Overwrite fetch

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Second::fetchAll()

Calendar_Second::fetchAll() -- Overwrite fetchAll

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Second::size()

Calendar_Second::size() -- Overwrite size

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validation_Error

Calendar_Validation_Error -- Calendar_Validation_Error API

Description

Calendar_Validation_Error API.

constructor Calendar_Validation_Error::Calendar_Validation_Error()

constructor Calendar_Validation_Error::Calendar_Validation_Error() -- Constructs Calendar_Validation_Error

Description

This package is not documented yet.

Parameter

string $unit

Date unit (e.g. month,hour,second)

integer $value

Value of unit which failed test

string $message

Validation error message

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validation_Error::getMessage()

Calendar_Validation_Error::getMessage() -- Returns the validation error message

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validation_Error::getUnit()

Calendar_Validation_Error::getUnit() -- Returns the Date unit

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validation_Error::getValue()

Calendar_Validation_Error::getValue() -- Returns the value of the unit

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validation_Error::toString()

Calendar_Validation_Error::toString() -- Returns a string containing the unit, value and error message

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator

Calendar_Validator -- Calendar_Validator API

Description

Calendar_Validator API.

constructor Calendar_Validator::Calendar_Validator()

constructor Calendar_Validator::Calendar_Validator() -- Constructs Calendar_Validator

Description

This package is not documented yet.

Parameter

object subclass; &$calendar

of Calendar

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::fetch()

Calendar_Validator::fetch() -- Iterates over any validation errors

Description

This package is not documented yet.

Return value

returns either Calendar_Validation_Error or false

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValid()

Calendar_Validator::isValid() -- Calls all the other isValidXXX() methods in the validator

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValidDay()

Calendar_Validator::isValidDay() -- Check whether this is a valid day

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValidHour()

Calendar_Validator::isValidHour() -- Check whether this is a valid hour

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValidMinute()

Calendar_Validator::isValidMinute() -- Check whether this is a valid minute

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValidMonth()

Calendar_Validator::isValidMonth() -- Check whether this is a valid month

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValidSecond()

Calendar_Validator::isValidSecond() -- Check whether this is a valid second

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Calendar_Validator::isValidYear()

Calendar_Validator::isValidYear() -- Check whether this is a valid year

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package Calendar Constants

Package Calendar Constants -- Constants defined in and used by Calendar

Date

Table of Contents
Examples -- Learning by doing
Basics -- How to get information

PEAR Date is a generic class to represent and work with dates. It does not use timestamps which means it can be used for dates before 1970 and after 2038. The class provides methods to convert a date in different formats, calculate differences, weekdays and more.

Examples

Examples -- Learning by doing

Introduction

Following the saying "learning by doing", we start with some examples.

The first step to work with the class is to instantiate a Date object.

After finishing your work with the date object, you probably want to have it back. This can be done in different ways, for example by using getTime or getDate.

Date has a lot more methods to output your date, but that is subject of a later chapter.

Now that we know how to create a Date instance, we'll do some easy tasks.

Calculating a time difference

You often have the task to know which time span lies between two dates. With Date, this is easy to accomplish. First we use setFromDateDiff on a fresh Date_Span object and then toDays to get the exact number of days between the two dates.

Note: Date_Span works, unlike Date, internally with integers, which means that you have a precision of 32 bit or 68 years.

Converting timezones

Date can help you working with time zones. An array with all supported timezones can be retrieved by using getAvailableIDs statically as in $list = Date_TimeZone::getAvailableIDs();.

convertTZ converts the Date object's internal settings to the given time zone. Using format you can display the timezone setting. With Date_TimeZone's getDefault method the default time zone for this computer can be obtained.

Basics

Basics -- How to get information

Introduction

The auto-generated API documentation is very valuable to get information about this packages' methods and which parameters they require. But of course you first need to have an overview about the abilities of the class.

Getting data

There are a number of simple getter methods that let you retrieve single pieces of a date currently set.

Date does also have some advanced methods to obtain data from it.

Navigating between dates

The following method all return a new date object.

You can also do excact calculations by adding and subtracting intervals. The *Span methods require a Date_Span object to be passed as only parameter while the others take a number representing seconds.


Date_Holidays

Table of Contents
Introduction --  What Date_Holidays can do
Example -- Example for the usage of Date_Holidays

Holiday calculation package.

This chapter describes how to use PEAR::Date_Holidays

Introduction

Introduction --  What Date_Holidays can do

Introduction

Date_Holidays is a driver-based holiday calculation package. It helps you check whether a specific date is a holiday in a specific country or religion. Furthermore you can calculate the date of any holiday supported in the driver for the country, region or religion.

Currently the following drivers are supported:

  • Austria

  • Christian, calculates Christian holidays (used as base driver for other drivers)

  • Denmark

  • England & Wales

  • Germany, calculates German holidays

  • Ireland, calculates Irish holidays

  • Jewish, calculates Jewish holidays

  • The Netherlands

  • Norway

  • Slovenia

  • Sweden, calculates Swedish holidays

  • USA, calculates holidays in the United States of America

  • UNO, calculates UNO (United Nations Organization) holidays

  • Composite, a driver that is used to combine any number of the other drivers so they can be queried at once.

If you have written a custom driver for Date_Holidays that could be included in the distribution, please contact the package maintainers or open a feature request and attach a patch in the bug tracking tool.

Date_Holidays supports I18N by storing the names of the different holidays in INI files for each language. These files will be stored in the data directory of your PEAR installation.

Example

Example -- Example for the usage of Date_Holidays

Basic example

This example shows you, how to calculate the Easter date of 2005.

require_once "Date/Holidays.php";
$germany = &Date_Holidays::factory('Germany', 2004, 'en_EN');
if (Date_Holidays::isError($germany)) {
    die('Factory was unable to produce driver-object');
}
$easter = &$germany->getHoliday('easter', 'de_DE');
if (!Date_Holidays::isError($easter)) {
    print_r($easter->toArray());
}

This will return an array in the following format:

Array
(
    [internalName] => easter
    [title] => Easter Sunday
    [date] => date Object
        (
            [year] => 2004
            [month] => 04
            [day] => 11
            [hour] => 0
            [minute] => 0
            [second] => 0
            [tz] => date_timezone Object
                (
                    [id] => UTC
                    [longname] => Coordinated Universal Time
                    [shortname] => UTC
                    [hasdst] =>
                    [dstlongname] => Coordinated Universal Time
                    [dstshortname] => UTC
                    [offset] => 0
                    [default] =>
                )

        )

)

Chapter 39. Encryption

Provides Packages for de- and encryption



Crypt_CHAP

Table of Contents
Introduction -- encryption
Crypt_CHAP::generateChallenge() -- Generates a new random challenge.
Crypt_CHAP_MD5::Crypt_CHAP_MD5() -- constructor
Crypt_CHAP_MD5::challengeResponse() -- Generates the challenge-response paket.
Crypt_CHAP_MSCHAPv1::Crypt_CHAP_MSCHAPv1() -- constructor
Crypt_CHAP_MSCHAPv1::challengeResponse() -- Generates the Challenge-Response paket.
Crypt_CHAP_MSCHAPv1::lmChallengeResponse() -- Generates the Challenge-Response paket using the LAN-Manager Hash.
Crypt_CHAP_MSCHAPv1::ntChallengeResponse() -- Generates the Challenge-Response paket using the NT-Hash.
Crypt_CHAP_MSCHAPv1::ntPasswordHash() -- Generates the NT-Hash from the given plaintext-password.
Crypt_CHAP_MSCHAPv1::lmPasswordHash() -- Generates the LAN-Manager-Hash from the given plaintext-password.
Crypt_CHAP_MSCHAPv1::str2unicode() -- Converts a string to unicode.
Crypt_CHAP_MSCHAPv1::response() -- Generates the response-packet.
Crypt_CHAP_MSCHAPv2::Crypt_CHAP_MSCHAPv2() -- constructor
Crypt_CHAP_MSCHAPv2::challengeHash() -- Generates the Challenge-Hash.
Crypt_CHAP_MSCHAPv2::ntPasswordHashHash() -- Generates an MD4 Hash from the NT-Hash.

Classes for generating packets for various CHAP Protocols

Introduction

Introduction -- encryption

CHAP - Challenge Handshake Authentication Protocol

CHAP is a part usualy of PPP (Point-to-Point Protocol) software, implemented in the authentication subsystem. CHAP avoid's sending plaintext passwords over an insecure link. The traditional CHAP-MD5 needs the plaintext password stored on the server. MS-CHAP doesen't need this, but also needs the password either as NT-Hash and/or as LAN-Manager-Hash. LAN-Manager-Hashes are weak and shouldn't be used anymore.

This package provides 3 classes:

Crypt_CHAP::Crypt_CHAP_MD5() - for generating CHAP-MD5 (RFC 1994) compliant pakets
Crypt_CHAP::Crypt_MSCHAPv1() - for generating MS-CHAPv1 (RFC 2433) compliant pakets
Crypt_CHAP::Crypt_MSCHAPv2() - for generating MS-CHAPv2 (RFC 2759) compliant pakets

Crypt_CHAP::Crypt_CHAP is an abstract base class.

In order to get the MS-CHAP* to work you need the mhash extension.

Crypt_CHAP::generateChallenge()

Crypt_CHAP::generateChallenge() -- Generates a new random challenge.

Description

This method generates a new random challenge and stores it in the given property, the default size of the challenge is 8 bytes.

Parameter

  • string $varname - name of the property for storing the challenge

  • int $size - the size of the challenge

Return value

string - a String containing the challenge

Note

This function can not be called statically.

Crypt_CHAP_MD5::Crypt_CHAP_MD5()

Crypt_CHAP_MD5::Crypt_CHAP_MD5() -- constructor

Description

Generates a new Object for generating CHAP-MD5 compliant pakets.

Crypt_CHAP_MD5::challengeResponse()

Crypt_CHAP_MD5::challengeResponse() -- Generates the challenge-response paket.

Description

This method generates the challenge-response paket, by doing: md5(ID + Password + Challenge).

Return value

string - a String containing the challenge-response paket

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv1::Crypt_CHAP_MSCHAPv1()

Crypt_CHAP_MSCHAPv1::Crypt_CHAP_MSCHAPv1() -- constructor

Description

Generates a new Object for generating MS-CHAPv1 compliant pakets.

Note

You need the mhash extension in order to get this class to work.

Crypt_CHAP_MSCHAPv1::challengeResponse()

Crypt_CHAP_MSCHAPv1::challengeResponse() -- Generates the Challenge-Response paket.

Description

This method generates the Challenge-Response paket.

Return value

string - a String containing the challenge-response paket

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv1::lmChallengeResponse()

Crypt_CHAP_MSCHAPv1::lmChallengeResponse() -- Generates the Challenge-Response paket using the LAN-Manager Hash.

Description

This method generates the Challenge-Response using the LAN-Manager Hash.

Return value

string - a String containing the challenge-response

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv1::ntChallengeResponse()

Crypt_CHAP_MSCHAPv1::ntChallengeResponse() -- Generates the Challenge-Response paket using the NT-Hash.

Description

This method generates the Challenge-Response using the NT-Hash.

Return value

string - a String containing the challenge-response

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv1::ntPasswordHash()

Crypt_CHAP_MSCHAPv1::ntPasswordHash() -- Generates the NT-Hash from the given plaintext-password.

Description

This method generates NT-Hash from the given plaintext-password or from the password property. The NT-Hash is computed like this: md4(str2unicode(plaintext))

Parameter

  • string $password - the password to be hashed

Return value

string - a String containing the NT-Hash

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv1::lmPasswordHash()

Crypt_CHAP_MSCHAPv1::lmPasswordHash() -- Generates the LAN-Manager-Hash from the given plaintext-password.

Description

This method generates LAN-Manager-Hash from the given plaintext-password or from the password property.

Parameter

  • string $password - the password to be hashed

Return value

string - a String containing the LAN-Manager-Hash

Note

This function can not be called statically.

LAN-Manager Hash are weak and should not be used anymore.

Crypt_CHAP_MSCHAPv1::str2unicode()

Crypt_CHAP_MSCHAPv1::str2unicode() -- Converts a string to unicode.

Description

This method generates converts the given string to unicode.

Parameter

  • string $str - the string to be unicoded

Return value

string - a String containing unicode representation of the given string

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv1::response()

Crypt_CHAP_MSCHAPv1::response() -- Generates the response-packet.

Description

This method generates the response paket, containing the NT-Challenge-Response and/or the LM-Challenge-Response. By default the LM-Challenge-Response is not included.

Parameter

  • bool $lm - wether including the LM-Challenge-Response

Return value

string - a String containing the paket

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv2::Crypt_CHAP_MSCHAPv2()

Crypt_CHAP_MSCHAPv2::Crypt_CHAP_MSCHAPv2() -- constructor

Description

Generates a new Object for generating MS-CHAPv2 compliant pakets. This version of CHAP uses also a Peer-Challenge, LM-Hashes are not used anymore. The Constructor generates automatically a Peer-Challenge and the Authenticator-Challenge.

Crypt_CHAP_MSCHAPv2::challengeHash()

Crypt_CHAP_MSCHAPv2::challengeHash() -- Generates the Challenge-Hash.

Description

This method generates the (SHA1) Challenge-Hash containing the authenticator and the peer challenge and the username.

Return value

string - a String containing the Challenge-Hash

Note

This function can not be called statically.

Crypt_CHAP_MSCHAPv2::ntPasswordHashHash()

Crypt_CHAP_MSCHAPv2::ntPasswordHashHash() -- Generates an MD4 Hash from the NT-Hash.

Description

This method generates an MD4 Hash from the given NT-Hash.

Parameter

  • string $nthash - the NT-Hash to be hashed

Return value

string - a String containing the NT-Hash

Note

This function can not be called statically.


Chapter 40. Event

Provides packages for event based development.



Event_Dispatcher

Table of Contents
Introduction -- Introduction to Event_Dispatcher
Examples -- Examples for the usage of Event_Dispatcher
Event_Dispatcher::getInstance() -- Create a new Event_Dispatcher object
Event_Dispatcher::getName() -- Get the name of the dispatcher.
Event_Dispatcher::addObserver() -- Add a new observer.
Event_Dispatcher::removeObserver() -- Remove an observer.
Event_Dispatcher::setNotificationClass() -- Set the class that is used as notification.
Event_Dispatcher::post() -- Post a notification.
Event_Dispatcher::addNestedDispatcher() -- Add a nested dispatcher.
Event_Dispatcher::removeNestedDispatcher() -- Remove a nested dispatcher.
Event_Notification -- Container class for notifications.
Event_Notification::Event_Notification() -- Create a new notification object.
Event_Notification::getNotificationName() -- Get the name of the notification.
Event_Notification::getNotificationObject() -- Get the object that sent the notification.
Event_Notification::getNotificationInfo() -- Get additional information from the notification.
Event_Notification::getNotificationCount() -- Get number of observers notified.
Event_Notification::cancelNotification() -- Cancel the notification.
Event_Notification::isNotificationCancelled() -- Check, whether notification has been cancelled.

Dispatch notifications using PHP callbacks

Introduction

Introduction -- Introduction to Event_Dispatcher

Introduction to Event_Dispatcher

Event_Dispatcher acts as a notification dispatch table. It is used to notify other objects of interesting things. This information is encapsulated in Event_Notification objects.

Client objects register themselves with the Event_Dispatcher as observers of specific notifications posted by other objects. When an event occurs, an object posts an appropriate notification to the Event_Dispatcher. The Event_Dispatcher dispatches a message to each registered observer, passing the notification as the sole argument.

Event_Dispatchers allows you to use event bubbling similar to JavaScript's event management. If an event is not handled by the dispatcher that triggered the event, it may bubble up to the next dispatcher.

Examples

Examples -- Examples for the usage of Event_Dispatcher

Examples usage of Event_Dispatcher

The following examples show you how to use Event_Dispatcher to create more flexible applications.

Event_Dispatcher::getInstance()

Event_Dispatcher::getInstance() -- Create a new Event_Dispatcher object

Description

Create a new Event_Dispatcher object.

As Event_Dispatcher uses the singleton pattern, you must not use the new operator to create a new instance of Event_Dispatcher, but use getInstance() instead.

If you need more than one instance of Event_Dispatcher, pass different names to the method.

Parameter

  • string $name = '__default'

Return value

object Event_Dispatcher Event_Dispatcher instance

Note

This function should be called statically.

Event_Dispatcher::getName()

Event_Dispatcher::getName() -- Get the name of the dispatcher.

Description

Get the name of the dispatcher.

The name of the dispatcher is used as a unique identifier. This is important for the methods getInstance() and removeNestedDispatcher().

Return value

string name of the dispatcher

Note

This function can not be called statically.

Event_Dispatcher::addObserver()

Event_Dispatcher::addObserver() -- Add a new observer.

Description

Adds a new observer to the dispatcher.

Observers are PHP callbacks. That means you may either pass a function name as a string or an array containing an object or class and a method to call.

The callback is used as a signature for the observer, which allows you to remove it by passing the exact same parameters to removeObserver().

Parameter

  • mixed $callback

    Callback to notity, may either be a string containing the name of a global function or an array containing class or object and the name of the method to call.

  • string $nName = EVENT_DISPATCHER_GLOBAL

    Acts as a filter: notify the observer only if the notification name matches the name passed in this parameter. Use EVENT_DISPATCHER_GLOBAL if the observer should be notified regardles of the notification name.

  • string $class = ''

    Acts as a filter: notify the observer only if the sender of the notification matches the class passed in this parameter.

Return value

void

Note

This function can not be called statically.

Event_Dispatcher::removeObserver()

Event_Dispatcher::removeObserver() -- Remove an observer.

Description

Remove an observer from dispatcher.

To remove an observer, specify the same parameters as used in the call to addObserver().

Parameter

  • mixed $callback

    Callback to notity, may either be a string containing the name of a global function or an array containing class or object and the name of the method to call.

  • string $nName = EVENT_DISPATCHER_GLOBAL

    Acts as a filter: notify the observer only if the notification name matches the name passed in this parameter. Use EVENT_DISPATCHER_GLOBAL if the observer should be notified regardles of the notification name.

  • string $class = ''

    Acts as a filter: notify the observer only if the sender of the notification matches the class passed in this parameter.

Return value

bool TRUE if the observer could be removed, FALSE otherwise

Note

This function can not be called statically.

Event_Dispatcher::setNotificationClass()

Event_Dispatcher::setNotificationClass() -- Set the class that is used as notification.

Description

Set the name of the class that will be used as a notification object when post() is called.

You may call this method on an object to change it for a single dispatcher or statically, to set the default for all dispatchers that will be created.

Parameter

  • string $class

    Name of the class that is used as a notification container when the post() method is called. Make sure the class is loaded before using it as notification class.

Return value

This method always returns true.

Note

This function can be called statically.

Event_Dispatcher::post()

Event_Dispatcher::post() -- Post a notification.

Description

Post a new notification to all observers.

Parameter

  • object &$object

    Reference to the object that posts the notification (the sender). May be used to filter notifications in the callbacks.

  • string $nName

    Name of the notification.

  • mixed $info = array()

    Additional information about the notification.

  • bool $pending = TRUE

    Notifications are by default added to a pending notification list. This way, if an observer is not registered by the time they are posted, it will still be notified when it is added as an observer.

    This behaviour can be turned off in order to make sure that only the registered observers will be notified.

  • bool $bubble = TRUE

    Notifications are by default added broadcasted to any nested dispatchers that have been added using addNestedDispatcher().

    This behaviour can be turned off in order to make sure that only the observers added the posting dispatcher will be notified. This allows you to differentiate between global and local notifications.

Return value

object Event_Notification The notification object.

Note

This function can not be called statically.

Event_Dispatcher::addNestedDispatcher()

Event_Dispatcher::addNestedDispatcher() -- Add a nested dispatcher.

Description

Adds a nested dispatcher to the dispatcher.

Nested dispatchers allow you to create event bubbling like it is implemented in Javascript. After an event has been posted to all observers of the dispatcher, it will be broadcasted to all nested dispatchers.

If you have one dispatcher that dispatches events of a component in your framework and one dispatcher that dispatches global events that are triggered by the framework itself it could make sense that you nest these dispatchers, so that events posted by the component dispatcher will also be broadcasted to the global dispatcher.

Parameter

  • object Event_Dispatcher &$dispatcher

    Dispatcher that should be added as a nested dispatcher to the current dispatcher.

Return value

void

Note

This function can not be called statically.

Event_Dispatcher::removeNestedDispatcher()

Event_Dispatcher::removeNestedDispatcher() -- Remove a nested dispatcher.

Description

Removes a nested dispatcher from the dispatcher.

To remove a dispatcher from the list of nested dispatcher, just pass the same object to removeNestedDispatcher().

Parameter

  • object Event_Dispatcher &$dispatcher

    Dispatcher that should be removed from the list of nested dispatchers.

Return value

boolean TRUE if the dispatcher could be removed, FALSE otherwise.

Note

This function can not be called statically.

Event_Notification

Event_Notification -- Container class for notifications.

Description

The Event_Notification class acts as a container for event information. It provides some setters and getters to access the contained information.

If you need to store additional information about the events or provide additional features, you may change the class that is used by Event_Dispatcher, but it is recommended to extend Event_Notification.

Event_Notification::Event_Notification()

Event_Notification::Event_Notification() -- Create a new notification object.

Description

Constructor of the Event_Notification class.

In most cases, you will not need to create the notification objects yourself, as this is done automatically by the Event_Dispatcher::post() method..

Parameter

  • object &$object

    Reference to the object that posts the notification (the sender). May be used to filter notifications in the callbacks.

  • string $nName

    Name of the notification.

  • mixed $info = array()

    Additional information about the notification.

Return value

string name of the notification

Note

This function can not be called statically.

Event_Notification::getNotificationName()

Event_Notification::getNotificationName() -- Get the name of the notification.

Description

Get the name of the notification.

Return value

string name of the notification

Note

This function can not be called statically.

Event_Notification::getNotificationObject()

Event_Notification::getNotificationObject() -- Get the object that sent the notification.

Description

Get a reference to the object that sent the notification.

Return value

object sender of the notification

Note

This function can not be called statically.

Event_Notification::getNotificationInfo()

Event_Notification::getNotificationInfo() -- Get additional information from the notification.

Description

Get additional information that has been stored in the notification.

Return value

mixed additional information.

Note

This function can not be called statically.

Event_Notification::getNotificationCount()

Event_Notification::getNotificationCount() -- Get number of observers notified.

Description

Retrieves the amount of observers that have been notified by the notification.

Return value

int number of observers notified.

Note

This function can not be called statically.

Event_Notification::cancelNotification()

Event_Notification::cancelNotification() -- Cancel the notification.

Description

Cancels the notification.

If a notification is cancelled, no more observers will be notified by this notification.

Return value

void

Note

This function can not be called statically.

Event_Notification::isNotificationCancelled()

Event_Notification::isNotificationCancelled() -- Check, whether notification has been cancelled.

Description

Checks, whether the notification has been cancelled.

Return value

bool TRUE if the notification has been cancelled, FALSE otherwise.

Note

This function can not be called statically.


Chapter 41. File Formats

Provides Packages for working with different file formats.



Contact_Vcard

Table of Contents
Contact_VCard --  About the classes
Components --  Data stored in a vCard
Lines --  vCards internally
Projects --  Other vCard projects

Parse and create vCards.

Contact_VCard

Contact_VCard --  About the classes

Description

The Contact_Vcard classes for PHP allow you to parse and build vCards that match the IMC standards.

A vCard is a plain text file that contains an "electronic business card" of contact information suitable for including in an address book. The vCard format is a standardized way of trading personal and organizational contact information.

For a full overview of the vCard 3.0 specification, refer to Internet Engineering Task Force RFC 2426.

For a full overview of the vCard 2.1 specification (version 2.1), refer to the Internet Mail Consortium Product Developer Information web page.

Components

Components --  Data stored in a vCard

Description

These are some, but not all, of the components of a vCard file:

  • N: The name of the person or organization represented by the vCard, in a structured format: family name, given name, additional (middle) names, any honorific prefixes (Mr., Dr., Miss, etc), and any honorific suffixes (Jr., III, Ph.D., etc).

  • ADR: Physical address. There may be one or more addresses in a vCard; one for home, one for work, one for deliveries, and so on. The ADR element has structured components for p.o. box, extended information, street, city/locality, state/region, postal code, and country.

  • TEL: Telephone. There may be one or more telephone numbers in a vCard; one for home, one for work, one for fax, and so on. The TEL element has a single text value indicating the phone number.

  • EMAIL: Email address. There may be one or more email addresses in a vCard; one for home, one for work, and so on. The EMAIL element has a single text value indicating the email address.

  • URL: One URL associated with this vCard; e.g., a personal or organizational home page.

  • ORG: The organization in which this vCard is a part. There may be one or more suborgnizations as well.

  • TITLE: A single job title.

  • ROLE: A single, longer description of the job role. Whereas TITLE might be "Senior VP Of Custodial Enforcement" the ROLE might be "Sweep floors, empty trash, etc."

  • CATEGORIES: The category or categories of this vCard: Personal, Business, Family, and so on.

  • BDAY: Birthday in yyyy-mm-dd format. It might also have additional time and timezone information.

  • PHOTO, LOGO, KEY, SOUND: Respectively, a binary-encoded file for a personal photo, corporate logo, encryption key, or name-pronounciation sound associated with the vCard. The information may also be a URI link to a binary file.

  • NOTE: Any other arbitrary information you might want to keep with the vCard.

Lines

Lines --  vCards internally

Description

Each line in a vCard is a separate component of the vCard. A component line consists of three things:

  • the component type-defnition (N, ADR, TEL, etc);

  • optionally, parameters for the component, such as whether or not the data is binary-encoded, or the type of data (home/work/preferred/etc), and so on; and

  • the component value (which may be a single text value, repeated text values, or a structured text value).

For example, consider the following component lines:

ADR;TYPE=WORK,PREF:;;123 Main;Beverly Hills;CA;90210;US
EMAIL;TYPE=HOME;TYPE=INTERNET:nobody@example.com
CATEGORIES:Personal,Business,Family
PHOTO;TYPE=JPEG;VALUE=URI:http://example.com/photo.jpg

Component line 1 has an ADR type-definition (meaning a delivery address). It has a TYPE parameter of WORK and PREF, indicating that this a work address and is the preferred address for deliveries. Finally, the value of the component is a structured text value. Structured text value parts are delimited by semicolons; in the case of ADR components, the structured value parts are p.o. box, extended address, street address, city/locality, state/region, zip/postal code, and country.

Component line 2 has an EMAIL type-definition (meaning an email address). It has a TYPE parameter of HOME and INTERNET (meaning an internet email address for home). The component value is a single text value indicating the email address.

Component line 3 has a CATEGORIES type-definition (meaning the general categories of of this vCard). There are no parameters for this component. The component value is a repeating-text value. Repeated text values a delimited by commas.

Component line 4 has a PHOTO type-definition (meaning a personal photograph). The parameters indicate that the photo TYPE is JPEG (giving a hint to vCard decoders how to handle the PHOTO value) and that the component VALUE will be a URI (that is, a link to an external photo file). Finally, the component value is a single text value, revealing in this case the URI of the photo.

Projects

Projects --  Other vCard projects

Description

Frank Hellwig has a 2.1/3.0 parser and address-book page generator. See his site at vcardphp.sf.net.

Kai Blankenhorn has a 2.1 card generator (not a parser). See his work at www.bitfolge.de/?s=phpvcard.

Flaimo has a vCard generator, too, at flaimo.com/php_scripts.php (scroll down past the iCalendar stuff).

HORDE has a vCard data element in their application framework, but I don't quite see how to use it outside that framework. The doc pages for it are at http://dev.horde.org/api/horde/dev-doxygen/html/classData__vcard.html .

Of course, you can always search for more vCard stuff under PHP, too: http://www.google.com/search?q=vcard+php.


Contact_Vcard_Build

Table of Contents
Introduction --  Build (create) and fetch vCard 2.1 and 3.0 text blocks.
Usage --  How to use Contact_VCard_Build

Build (create) and fetch vCard 2.1 and 3.0 text blocks.

Please read About Contact_Vcard first.

Introduction

Introduction --  Build (create) and fetch vCard 2.1 and 3.0 text blocks.

Contact_Vcard_Build Description

Allows you to programmatically create a vCard, version 2.1 or 3.0, and fetch the vCard text.

Differences Between vCard 2.1 and vCard 3.0

The 2.1 specification uses CRLF to terminate lines (\r\n). It allows the following components and parameters:

  • Parameters:

    • TYPE of DOM, INTL, POSTAL, PARCEL, HOME, WORK, PREF, VOICE, FAX, MSG, CELL, PAGER, BBS, MODEM, CAR, ISDN, VIDEO, AOL, APPLELINK, ATTMAIL, CIS, EWORLD, INTERNET, IBMMAIL, MCIMAIL, POWERSHARE, PRODIGY, TLX, X400, GIF, CGM, WMF, BMP, MET, PMB, DIB, PICT, TIFF, PDF, PS, JPEG, QTIME, MPEG, MPEG2, AVI, WAVE, AIFF, PCM, X509, or PGP.

    • ENCODING of 7BIT, 8BIT, BASE64, QUOTED-PRINTABLE

    • VALUE of INLINE, CONTENT-ID, CID, URL, VCARD

    • CHARSET of any ISO charset specification.

    • LANGUAGE is very lenient, basically anything so long as it uses only the characters a-z, A-Z, 0-9, and dash (-).

  • Components and methods

    • VERSION (setVersion())

    • FN (setFormattedName())

    • N (setName())

    • PHOTO (setPhoto())

    • BDAY (setBirthday())

    • ADR (addAddress())

    • LABEL (addLabel())

    • TEL (addTelephone())

    • EMAIL (addEmail())

    • MAILER (setMailer())

    • TZ (setTZ())

    • GEO (setGeo())

    • TITLE (setTitle())

    • ROLE (setRole())

    • LOGO (setLogo())

    • AGENT (setAgent())

    • ORG (addOrganization())

    • NOTE (setNote())

    • REV (setRevision())

    • SOUND (setSound())

    • URL (setURL())

    • KEY (setKey())

The 3.0 specification uses LF to terminate lines (\n). It allows the following components and parameters:

  • Parameters:

    • TYPE of any of the 2.1 TYPE values, or any other value so long as it uses only the characters a-z, A-Z, 0-9, and dash (-).

    • ENCODING of 8BIT and B ("binary").

    • VALUE of BINARY, PHONE-NUMBER, TEXT, URI, UTC-OFFSET, or VCARD.

  • Components and Methods:

    • VERSION (setVersion())

    • FN (setFormattedName())

    • N (setName())

    • NAME (setSourceName())

    • SOURCE (setSource())

    • NICKNAME (addNickname())

    • PHOTO (setPhoto())

    • BDAY (setBirthday())

    • ADR (addAddress())

    • LABEL (addLabel())

    • TEL (addTelephone())

    • EMAIL (addEmail())

    • MAILER (setMailer())

    • TZ (setTZ())

    • GEO (setGeo())

    • TITLE (setTitle())

    • ROLE (setRole())

    • LOGO (setLogo())

    • AGENT (setAgent())

    • ORG (addOrganization())

    • CATEGORIES (addCategories())

    • NOTE (setNote())

    • PRODID (setProductID())

    • REV (setRevision())

    • SORT-STRING (setSortString())

    • SOUND (setSound())

    • UID (setUniqueID())

    • URL (setURL())

    • CLASS (setClass())

    • KEY (setKey())

Usage

Usage --  How to use Contact_VCard_Build

Description

The basic use of Contact_Vcard_Build is straightforward: instantiate a builder object, add values and parameters, then fetch the resulting vCard.

Instantiation

To create an instance of a Contact_Vcard_Build ("builder") object, include the class file and issue a new directive:

<?php
    require_once 'Contact_Vcard_Build.php';
    $vcard =& new Contact_Vcard_Build();
?>

By default, this creates a builder object that will allow you to fetch a version 3.0 vCard. If you want to build a version 2.1 vCard, pass '2.1' as the only constructor argument:

<?php
    $vcard =& new Contact_Vcard_Build('2.1');
?>

How To Set A Component Value

There are two ways to set the value of a component: use the method specifically for the component you want to add, or use the generic setValue() and addValue() methods. While the generic methods allow you direct control over every individual component, iteration, structured part, and value repetition, the component-specific methods are often easier to use.

Note: You must set the FN (formatted name) and N (personal name) components; these are required by both 2.1 and 3.0 version vCards.

For example, if you want to add two ADR components to the vCard, you can do it with the ADR-specific method...

<?php
    // add first address iteration
    $vcard->addAddress($pobox0, $extend0, $street0, $city0, 
        $state0, $zip0, $country0);

    // add second address iteration
    $vcard->addAddress($pobox1, $extend1, $street1, $city1, 
        $state1, $zip1, $country1);
?>

...or you can use the generic methods:

<?php
    // add first address (iteration = 0)
    $vcard->addValue('ADR', 0, VCARD_ADR_POB,      $pobox0);
    $vcard->addValue('ADR', 0, VCARD_ADR_EXTEND,   $extend0);
    $vcard->addValue('ADR', 0, VCARD_ADR_STREET,   $street0);
    $vcard->addValue('ADR', 0, VCARD_ADR_LOCALITY, $city0);
    $vcard->addValue('ADR', 0, VCARD_ADR_REGION,   $state0);
    $vcard->addValue('ADR', 0, VCARD_ADR_POSTCODE, $zip0);
    $vcard->addValue('ADR', 0, VCARD_ADR_COUNTRY,  $country0);

    // add second address (iteration = 1)
    $vcard->addValue('ADR', 1, VCARD_ADR_POB,      $pobox1);
    $vcard->addValue('ADR', 1, VCARD_ADR_EXTEND,   $extend1);
    $vcard->addValue('ADR', 1, VCARD_ADR_STREET,   $street1);
    $vcard->addValue('ADR', 1, VCARD_ADR_LOCALITY, $city1);
    $vcard->addValue('ADR', 1, VCARD_ADR_REGION,   $state1);
    $vcard->addValue('ADR', 1, VCARD_ADR_POSTCODE, $zip1);
    $vcard->addValue('ADR', 1, VCARD_ADR_COUNTRY,  $country1);
?>

Please see the Contact_Vcard_Build.php inline comments for descriptions of how to use each component-specific method.

How To Set A Parameter Value

There is only one way to add a parameter: use the addParam() method. Unlike with adding values, there are no component-specifc methods to add parameters.

In general, you should add the parameters of a component immediately after you add the complete value of a component, because the builder object keeps track of what was the last component value added. (This is why there are no component-specific add-parameter methods.)

For example, we can set the params for the ADR components as in the above code:

<?php
    // add first address iteration
    $vcard->addAddress($pobox0, $extend0, $street0, $city0, 
        $state0, $zip0, $country0);

    // add parameters to the first address
    $vcard->addParam('TYPE', 'HOME');
    $vcard->addParam('TYPE', 'PREF');

    // add second address iteration
    $vcard->addAddress($pobox1, $extend1, $street1, $city1, 
        $state1, $zip1, $country1);

    // add parameters to the second address
    $vcard->addParam('TYPE', 'WORK');
?>

Thus, the first address will have TYPE=HOME,PREF and the second will have TYPE=WORK as their parameters.

Alternatively, you can add parameters directly using the same addParam() method, with some additional arguments:

<?php
    // add parameters to the first address iteration
    // (component = ADR, iteration = 0)
    $vcard->addParam('TYPE', 'HOME', 'ADR', 0);
    $vcard->addParam('TYPE', 'PREF', 'ADR', 0);

    // add parameters to the second address iteration
    // (component = ADR, iteration = 1)
    $vcard->addParam('TYPE', 'WORK', 'ADR', 1);
?>

This does the same thing as the earlier addParam() code.

Note: Although the version 2.1 specification optionally allows parameter values to be indicated without without specified types (i.e, "HOME" instead of "TYPE=HOME") the Contact_Vcard_Build class is not so lenient. With Contact_Vcard_Builder, you must set both the parameter kind and parameter value.

How To Fetch A vCard

After you have added all the values and parameters that you want, you get back the vCard using the fetch() method. This will return the components, parameters, and values (including BEGIN:VCARD and END:VCARD) in proper format for the vCard version.

<?php
    $text = $vcard->fetch();
?>

Note: If you set values and parameters for components that are not part of the selected vCard version, they will not be included in the fetched vCard text.

Note: You must have set the FN (formatted name) and N (personal name) components, or the fetch() method will return a PEAR_Error object. The FN and N components are required by both 2.1 and 3.0 version vCards.


Contact_Vcard_Parse

Table of Contents
Introduction --  Build (create) and fetch vCard 2.1 and 3.0 text blocks.
How Data Is Returned --  Getting data from the file
Known issues --  Problems you might encounter

Parse vCard 2.1 and 3.0 files.

Please read About Contact_Vcard first.

Introduction

Introduction --  Build (create) and fetch vCard 2.1 and 3.0 text blocks.

Description

Here are some quick instructions for the impatient. :-)

  • Download and un-compress Contact_Vcard_Parse from the PEAR archive.

  • Include Contact_Vcard_Parse.php in your PHP script.

  • Instantiate a new Contact_Vcard_Parse object.

  • Use the fromFile() method to parse any file which may have one or more vCards in it; try the sample.vcf file for a start. Contact_Vcard_Parse should work with both 2.1 and 3.0 vCard files.

  • Use print_r() to view the resulting array of data from the parsed file.

  • Do what you want with the data, such as insert into a table.

How Data Is Returned

How Data Is Returned --  Getting data from the file

Description

Contact_Vcard_Parse reads a file or block of text for vCard data, then converts that data into a series of nested arrays. I used to present a detailed prose explanation of the array, but I think it's easier to just give a generic outline of the array:

$parse_result = array (
    [int_cardnumber] => array (
        [string_datatype] => array (
            ["param"] => array (
                [string_paramname] => array (
                    [int_repetitionnumber] => string_paramtext
                )
            )
            ["value"] => array (
                [int_partnumber] => array (
                    [int_repetitionnumber] => string_valuetext
                )
            )
        )
    )
)

By way of example, let's take a look at the vCard of my friend Bolivar Shagnasty.

BEGIN:VCARD
VERSION:3.0
N:Shagnasty;Bolivar;Odysseus;Mr.;III,B.S.
FN:Bolivar Shagnasty
ADR;TYPE=HOME,WORK:;;123 Main,Apartment 101;Beverly Hills;CA;90210
EMAIL;TYPE=HOME;TYPE=WORK:boshag@example.com
EMAIL;TYPE=PREF:boshag@ciaweb.net
END:VCARD

This is a pretty simple vCard: my buddy Bolivar's name, one address (looks like Bolivar works from home), two email addresses (one for work and home, and one as his "preferred" address). This simple vCard, when it gets parsed, looks like this:

(
    [0] => Array
        (
            [VERSION] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => 3.0
                                        )

                                )

                        )

                )

            [N] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                )

                            [value] => Array
                                (
                                    [0] => Array // family
                                        (
                                            [0] => Shagnasty
                                        )

                                    [1] => Array // first
                                        (
                                            [0] => Bolivar
                                        )

                                    [2] => Array // additional or middle
                                        (
                                            [0] => Odysseus
                                        )

                                    [3] => Array // honorifix prefix
                                        (
                                            [0] => Mr.
                                        )

                                    [4] => Array // honorifix suffix
                                        (
                                            [0] => III
                                            [1] => B.S.
                                        )

                                )

                        )

                )

            [FN] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => Bolivar Shagnasty
                                        )

                                )

                        )

                )

            [ADR] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                    [TYPE] => Array
                                        (
                                            [0] => HOME
                                            [1] => WORK
                                        )

                                )

                            [value] => Array
                                (
                                    [0] => Array // p.o. box
                                        (
                                            [0] => 
                                        )

                                    [1] => Array // extended
                                        (
                                            [0] => 
                                        )

                                    [2] => Array // street
                                        (
                                            [0] => 123 Main
                                            [1] => Apartment 101
                                        )

                                    [3] => Array // locality or city
                                        (
                                            [0] => Beverly Hills
                                        )

                                    [4] => Array // region, state, or province
                                        (
                                            [0] => CA
                                        )

                                    [5] => Array // postal code
                                        (
                                            [0] => 90210
                                        )

                                    [6] => Array // country
                                        (
                                            [0] => 
                                        )

                                )

                        )

                )

            [EMAIL] => Array
                (
                    [0] => Array
                        (
                            [param] => Array
                                (
                                    [TYPE] => Array
                                        (
                                            [0] => HOME
                                            [1] => WORK
                                        )

                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => boshag@example.com
                                        )

                                )

                        )

                    [1] => Array
                        (
                            [param] => Array
                                (
                                    [TYPE] => Array
                                        (
                                            [0] => PREF
                                        )

                                )

                            [value] => Array
                                (
                                    [0] => Array
                                        (
                                            [0] => boshag@ciaweb.net
                                        )

                                )

                        )

                )

        )

)

Sweet Jebus! That's an ugly mess. But it retains every bit of info about the vCard so you can do what you like with it. It keeps (separately) every element and component so you can see the underlying structure of the vCard.

Yes, I know it's a deeply-nested array set, and is ugly and probably inefficient. The problem (or genius?) of the vCard format is that just about every part of a vCard element can have multiple values. While this makes the vCard format very flexible, it makes it a little difficult to parse and interpret in a simple fashion. The easiest way I could think of was a series of nested arrays. An object-oriented approach might be better, but even then you're going to have nested objects or nested arrays within the vCard object to represent multiple values of a vCard data element.

Known issues

Known issues --  Problems you might encounter

Description

When I wrote this parser, my primary goal was to be able to read vCard files produced by the Mac OS X Address Book application. However, it looks like Address Book puts some weird character after every single text character in the output, in addition to some weird line endings. If you want to use .vcf files generated by the Mac OS X Address Book, you might need to massage the file in BBEdit or TextWrangler first; turn on "show invisibles" to see the offending characters, then do a search-and-replace to delete them all at once (or perhaps "Zap Gremlins").

UPDATE: David Weingart writes, "That's probably Unicode. In my extremely limited testing, it looks like in some cases you get plain vanilla ISO Latin 1, but if there are any high ascii characters in the entry, they export UTF 16 (double-byte) Unicode." Thanks, David. (Contact_Vcard_Parse does not do Unicode at this time.)

Contact_Vcard_Parse does not validate the information or formatting in the vCard (although it does decode quoted-printable text). In the spirit of "be lenient in what you accept and strict in what you produce", Contact_Vcard_Parse should be able to read just about anything from a vCard file, but it's up to you as the programmer to make sense of the data.

Contact_Vcard_Parse should work on file with any kind of line endings (Mac \r, Unix \n, and DOS \r\n) automatically. It also unfolds lines automatically, so data elements spread across multiple lines should come through OK.

If you discover a new bug or want to contribute code to Contact_Vcard_Parse, contact Paul M. Jones at pjones at ciaweb dot net; the subject line should start with [VCARD].


File_Archive

Table of Contents
Examples -- Some simple usage examples
Dynamic generation of archive files for a gallery -- How to use File_Archive for a photo/video gallery
Readers -- Getting files into an archive
Writers -- Saving archives
Predicates -- Filters
Archive modification -- Remove and append files
Cache -- Caching compressed files

This package will let you manipulate easily tar, gz, bz2, tgz, tbz, zip, ar and deb files.

Examples

Examples -- Some simple usage examples

Extract a tar archive to a sub directory

Here we simply take a tar archive called archive.tar and extract its contents to the folder output/.

<?php
require_once "File/Archive.php";

File_Archive::extract('archive.tar/', 'output');
?>

Send a zip archive containing the content of a tar file to the standard output

<?php
require_once "File/Archive.php";

File_Archive::extract(
    //The content of archive.tar appears in the root folder (default argument)
    'archive.tar/',

    //And is written to ...
    File_Archive::toArchive(       // ... a zip archive
        'archive.zip',             // called archive.zip
        File_Archive::toOutput()   // that will be sent to the standard output
    )
);
?>

Extracting a file from an archive

Use extract() to get files out of an archive. When specifying the file to extract, make sure to use the archive name as first folder.

<?php
require_once "File/Archive.php";

File_Archive::extract(
    'archive.tar/inner.tgz/file.txt',
    File_Archive::toOutput()
);
?>

Dynamic generation of archive files for a gallery

Dynamic generation of archive files for a gallery -- How to use File_Archive for a photo/video gallery

One possible use case of File_Archive is to dynamically generate archives that contain pictures or videos from a gallery.

The choice of the file format is important if you want an efficient generation. Let's see what are the possibilities:

1. Tar
2. Tgz, Tbz
3. Zip

1. Tar

Pros: Generation very efficient, constant memory usage, no need to cache

Cons: No compression (but anyway images or video can hardly be compressed), not as widely used as Zip

2. Tgz, Tbz

Pros: Very high compression ratio, constant memory usage

Cons: Can't be cached, needs a lot of CPU at each generation

3. Zip

Pros: Intermediate result can be cached, compressed, you can choose the compression level, widely used

Cons: Compression ratio lower than for Tgz/Tbz

We will focus on Tar and Zip generation, Tgz and Tbz are too CPU expensive for an "on the fly" archive generation.

Tar generation

<?php
require_once "File/Archive.php";

// $files is an array of path to the files that must be added to the archive
File_Archive::extract(
    $files,
    File_Archive::toArchive(
        'myGallery.tar',
        File_Archive::toOutput()
    )
);
?>

Readers

Readers -- Getting files into an archive

Introduction

A reader is an object that represents a list of files and directories. Those files can be generated dynamically or exist physically. For example, there is a reader class for a directory, or for each archive format handled by File_Archive, and they all have the same interface.

To create a reader, you will have to use the File_Archive factory. The important function is the read() function:

In this function the URL will represent what you want to read.

The symbolic attribute says how the files read will be displayed for future use. If $URL is a directory, $URL will be replaced by $symbolic (or '' if $symbolic is null). So, in our first example, the files will be displayed as if the current directory was 'Path/to/dir': Since by default $symbolic is empty, Path/to/dir will be simply removed from the file. You may want to put Path/to/dir as $symbolic to keep the full path Path/to/dir.

If $URL is a file, then only the filename will be kept, and $symbolic will be added to it. So, in our second example, the source contains a file with symbolic name file.txt. If a symbolic name foo had been specified, the source would contain foo/file.txt.

The $uncompression parameter indicate how many files will be uncompressed while parsing the tree to files. By default the files are not uncompressed. So, if you do File_Archive::read('archive.tar/inner/dir', 'inner/dir'), and if archive.tar contains a file called archive.tar/inner/dir/file.tgz, this second archive will appear as a file and not as a directory. It won't be uncompressed because $uncompression is 0. If $uncompression is set to 1, file.tgz would appear as a directory, but the files inside this archive would not be uncompressed. If $uncompression is set to -1, all the files would be uncompressed, regardless of the depth.

The $directoryDepth parameter gives a limit to the number of directory read by the reader.

Multi readers

Using a multi reader, you can make several sources appear as one. You can create a multi reader using the File_Archive::readMulti() function.

Reading the content of a data reader

Any reader provides the following interface:

  • function next()

    Go to the next file in the source. Returns false when the end of the archive is reached.

  • function getFilename()

    Returns the filename of the currently selected entry in the archive.

  • function getStat()

    Returns the stat as the stat() function does This function may not return a complete array, it may even return array().

  • function getDataFilename()

    For optimisation purposes: if the source is a physical file, this function returns the name of the file; otherwise it returns null.

  • function getData($length = -1)

    Reads some data from the source. This function will return a string which size is determined by the smallest of

    • $length if $length >= 0

    • the end of the file.

    If the end of the file is reached, the function will return null.

  • function skip($length)

    Equivalent to getData($length), but does not return any data. Depending on the data reader, this function can be far more efficient than getData().

  • function close()

    Should be called after having used the data reader (closes the file handles...). This function moves the object in the same state as it was before the first call to next(). After this call, you can iterate again on the data reader.

Functions that use readers

All File_Archive functions that take a reader as an argument also accept strings and arrays. The strings will be automatically interpreted as a reader using File_Archive::read function. The arrays will be interpreted as a multi reader.

Since the readers are passed by reference, you will have to pass a variable and not the raw string or array.

It is thus possible to rewrite the previous example like that:

Writers

Writers -- Saving archives

Introduction

A writer is an object that deals with data. Some writers transform data (this is the case of the archive writers), some save them to disk (for files writers), or to memory (for the memory writer)... They all implement the same interface.

You can transfer data from a reader to a writer using the File_Archive::extract function.

All the writers can be created thanks to the File_Archive factory, and more particularly the File_Archive::to* functions.

Send files to the user

To send files to the remote user (i.e. write data to the standard output), you need a special writer. You can build one calling function File_Archive::toOutput().

This writer will automatically send a header forcing the download of the file.

If you don't want that, call File_Archive::toOutput(false).

Multi writers

Using a multi writer, you can write the data to two or more different locations in parallel.

A typical use is to send the file to the user at the same time as you write it to a file.

It can also be used to generate archives in different formats.

You can create a multi writer using File_Archive::toMulti($dest1, $dest2).

Writing to a writer

It is also possible to write data directly to a writer, without using a reader. To do so, you can use the following interface implemented by any writer:

  • function newFile($URL, $stat)

    Create a new file in the writer.

    $URL is the name of the file, $stat is an array of statistics about the data (see the PHP stat() function for more information).

    The stat array may not contain all the information. The only index that must be present is index 7 (size of the data).

  • function writeData($data)

    Append the specified data to the writer. A call to newFile() must have been done previously.

  • function close()

    Close the writer, eventually flush the data, write the footer... This function must be called before the end of the file, otherwise some data may not be treated by the writer.

Note: If you do not specify the stat array in the newFile() function, the majority of the archives will have to buffer the data until the end of the file is reached (this is because the size of the file is usually needed to be able to write the header).

This may be a memory problem if you want to generate really large files.

Functions that use writers

All File_Archive functions that take a writer as an argument also accept strings and arrays. The strings will be automatically interpreted as a writer using File_Archive::appender() function. The arrays will be interpreted as a multi writer.

Since the writers are passed by reference, you will have to pass a variable and not the raw string or array.

It is thus possible to rewrite the previous example like that:

Predicates

Predicates -- Filters

Introduction

File_Archive introduces the concept of filters to be able to select the files from a source. A filter is a particular reader that you can create with the File_Archive::filter() function. This function requires you to give a predicate. You can build this predicate using the File_Archive::pred* functions.

The standard logic predicates are:

  • predTrue(): always evaluates to true

  • predFalse(): always evaluates to false

  • predAnd($p1, $p2, ...): evaluates to $p1 && $p2 && ...

  • predOr($p1, $p2, ...): evaluates to $p1 || $p2 || ...

  • predNot($p): evaluates to !$p

Some other predicats will help you filtering the files:

  • predMinSize($size): keep only the files which size is >= $size (in bytes).

  • predMinTime($time): keep only the files that have been modified after $time (unix timestamp).

  • predMaxDepth($depth): keep only the files that have a public name with less than $depth directories.

  • predExtension($list): keep only the files with a given extension. $list is an array or a comma separated string of allowed extensions.

  • predEreg($ereg): keep only the files that have a public name that matches the given regular expression.

  • predEregi($ereg): same as predEreg(), but the test is case insensitive.

  • predMIME($mimes): Select files with a certain MIME type. You can pass an array of types or a string, and use wildcards.

Archive modification

Archive modification -- Remove and append files

Introduction

File_Archive version 1.3 introduces some new functions to edit existing archives. These functions will allow you to remove or append files to an existing archive.

Since for File_Archive, the file system is just another reader / writer, those modifications can be done on "real" archives (real files), or on nested archives (an archive inside another archive).

Remove files from an existing archive

To remove files from an archive, you'll use one of the following functions from File_Archive class:

Note that those functions will not recursively uncompress archives.

Cache

Cache -- Caching compressed files

Introduction

File_Archive 1.4 introduce the possibility to use a cache to store intermediate result of a zip compression. It uses the Cache_Lite PEAR package to do so.

A zip file is made of compressed files, one after the others. So if you generate an archive that contains files A, B and C and then another archive that contains A and C, you will compress twice the files A and C. The use of the cache will allow to save the compressed version of files A, B and C on the first compression, to use them again in the second compression.

Usage examples

The cache can be (and should be) used if you dynamically create some zip archive that contains frequently the same files. For example, you may want to allow the user to select some images, videos or other files from your gallery and allow them to download a compressed zip archive that contains these files.

If you do so without cache, your server will answer very slowly if a lot of users ask the files. With the cache, the files will be compressed only once.

On my machine (a thinkpad T42P with default factory equipment), generating a 200MB zip archive takes around 30s of CPU without the cache, 32s of CPU with an empty cache and 2s of CPU if all the files to compress are already in cache.


File_Cabinet

Table of Contents
Introduction -- Extraction of Microsoft Cabinet files

Microsoft Cabinet file extraction using either cabextract or expand

Introduction

Introduction -- Extraction of Microsoft Cabinet files

Synopsis

<?php
require_once 'File/Cabinet.php';

// optional step: specify the command static property
File_Cabinet::$command = '/usr/local/bin/cabextract';

$cabinet = new File_Cabinet('cabinet.cab');

// Extract the contents of 1 file
$file_contents = $cabinet->extract('a_file.txt');

// Extract the contents of multiple files (returns an array)
$file_contents = $cabinet->extract(array('a_file.txt', 'another_file.txt'));

// Extract using a glob (returns a concatenated string)
$file_contents = $cabinet->extract('*.txt');

// Extract to a directory
$cabinet->extract('a_file.txt', '/path/to/extraction/dir');
?>


File_DICOM

Table of Contents
Introduction -- using File_DICOM
File_DICOM::File_DICOM() -- Constructor.
File_DICOM::parse() -- Parse a DICOM file.
File_DICOM::write() -- Write current contents to a DICOM file.
File_DICOM::getValue() -- Gets the value for a DICOM element.
File_DICOM::setValue() -- Sets the value for a DICOM element.
File_DICOM::dumpImage() -- Dumps the contents of the image inside the DICOM file (element 0x0010 from group 0x7FE0) to a PGM (Portable Gray Map) file.

Package for reading and modifying DICOM files

Introduction

Introduction -- using File_DICOM

What is DICOM?

File_DICOM allows reading and modifying of DICOM files. DICOM stands for Digital Imaging and COmmunications in Medicine, and is a standard for creating, storing and transfering digital images (X-rays, tomography) and related information used in medicine. This package in particular does not support the exchange/transfer of DICOM data, nor any network related functionality. More information on the DICOM standard can be found at the NEMA site.

Please be aware that any use of the information produced by this package for diagnosing purposes is strongly discouraged by the author. See here for more information.

File_DICOM::File_DICOM()

File_DICOM::File_DICOM() -- Constructor.

Description

It creates a File_DICOM object.

Note

This function can not be called statically.

File_DICOM::parse()

File_DICOM::parse() -- Parse a DICOM file.

Description

Parse a DICOM file and get all of its header members.

Parameter

string $infile

The DICOM file to parse

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

File_DICOM::write()

File_DICOM::write() -- Write current contents to a DICOM file.

Description

This package is not documented yet.

Parameter

string $outfile

The name of the file to write. If not given it assumes the name of the file parsed. If no file was parsed and no name is given returns a PEAR_Error

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

File_DICOM::getValue()

File_DICOM::getValue() -- Gets the value for a DICOM element.

Description

Gets the value for a DICOM element of a given group from the parsed DICOM file

Parameter

mixed $group_or_name

The group the DICOM element belongs to (integer), or its name (string)

integer $element

The identifier for the DICOM element (unique inside a group). Optional

Return value

returns The value for the DICOM element on success, PEAR_Error on failure

Note

This function can not be called statically.

File_DICOM::setValue()

File_DICOM::setValue() -- Sets the value for a DICOM element.

Description

Sets the value for a DICOM element. Only works with strings now.

Parameter

integer $gp

The group the DICOM element belongs to

integer $el

The identifier for the DICOM element (unique inside a group)

mixed $value

Note

This function can not be called statically.

File_DICOM::dumpImage()

File_DICOM::dumpImage() -- Dumps the contents of the image inside the DICOM file (element 0x0010 from group 0x7FE0) to a PGM (Portable Gray Map) file.

Description

Use with Caution!!. For a 8.5MB DICOM file on a P4 it takes 28 seconds to dump it's image.

Parameter

string $filename

The file where to save the image

Return value

returns true on success, PEAR_Error on failure.

Note

This function can not be called statically.


File_Fortune

Table of Contents
Class Summary File_Fortune -- File_Fortune
Introduction --  File_Fortune aims to provide a simple OOP and array-like interface to fortune files. To this end, it implements the SPL interfaces Iterator, Countable, and ArrayAccess. With it, you may easily create and maintain fortune databases, as well as fulfill their primary use case: getting a random fortune.
Examples --  Common use cases.
File_Fortune::__construct() -- Constructor
File_Fortune::add() -- Add a new fortune
File_Fortune::create() -- Create a new fortune file from an array of fortunes
File_Fortune::delete() -- Delete an existing fortune
File_Fortune::getAll() -- Retrieve all fortunes from the current file
File_Fortune::getDirectory() -- Retrieve current directory of fortune files
File_Fortune::getFile() -- Retrieve current fortune file name
File_Fortune::getFiles() -- Retrieve list of currently set fortune files
File_Fortune::getHeaderFile() -- Retrieve current header file name
File_Fortune::getRandom() -- Retrieve random fortune
File_Fortune::save() -- Save changes
File_Fortune::setDirectory() -- Set directory from which to randomly select a fortune file
File_Fortune::setFile() -- Set fortune file
File_Fortune::setFiles() -- Set multiple fortune files
File_Fortune::setHeaderFile() -- Set header file name
File_Fortune::update() -- Update an existing fortune

Class Summary File_Fortune

Class Summary File_Fortune  -- File_Fortune

File_Fortune

File_Fortune: Interface to fortune cookie databases

The fortune program is a small but important part of *nix culture, and this package aims to provide support for its "fortune cookie" databases to PHP programmers.

Class Trees for File_Fortune

  • File_Fortune

  • File_Fortune_Exception

Introduction

Introduction --  File_Fortune aims to provide a simple OOP and array-like interface to fortune files. To this end, it implements the SPL interfaces Iterator, Countable, and ArrayAccess. With it, you may easily create and maintain fortune databases, as well as fulfill their primary use case: getting a random fortune.

Authors

  • Greg Ward is the original author of the Perl "Fortune.pm", on which work this heavily derives.

  • Matthew Weier O'Phinney is the author of this implementation.

Examples

Examples --  Common use cases.

Getting a random fortune

<?php
require_once 'File/Fortune.php';

// Grab from a single fortune file:
$fortunes = new File_Fortune('/path/to/fortune/file');
echo $fortunes->getRandom();

// Grab from a directory of fortune files:
$fortunes = new File_Fortune('/path/to/fortune/files/');
echo $fortunes->getRandom();
?>

Get all fortunes

<?php
require_once 'File/Fortune.php';

$fortunes = new File_Fortune('/path/to/fortune/file');
$cached = $fortunes->getAll();

// or all fortunes in all files:
$fortunes->setDirectory('/path/to/fortunes/');
$cached = $fortunes->getAll();
?>

Counting fortunes

<?php
require_once 'File/Fortune.php';

$fortunes = new File_Fortune('/path/to/fortune/file');
$count = count($fortunes);

// or all fortunes in all files:
$fortunes->setDirectory('/path/to/fortunes/');
$count = count($fortunes);
?>

Looping through fortunes

<?php
require_once 'File/Fortune.php';

$fortunes = new File_Fortune('/path/to/fortune/file');
foreach ($fortunes as $fortune) {
    echo $fortune;
}
?>

Note: this will raise exceptions if a directory or multiple files have been set.

Manipulating fortunes

<?php
require_once 'File/Fortune.php';

$fortunes = new File_Fortune('/path/to/fortune/file');

// Delete a fortune:
unset($fortunes[2]); // deletes fortune denoted at index 2

// Update a fortune:
$fortune[2] = "I never liked this fortune"; // update fortune at index 2
?>

Note: this will raise exceptions if a directory or multiple files have been set.

Adding fortunes

<?php
require_once 'File/Fortune.php';

$fortunes = new File_Fortune('/path/to/fortune/file');
$fortunes->add('Shiny, new fortune!');
?>

Note: this will raise exceptions if a directory or multiple files have been set.

Creating a new fortune file

<?php
require_once 'File/Fortune.php';

$newFortunes = array(
    'Fortune 1',
    'Fortune 2',
    'Fortune 3'
);

$fortunes = new File_Fortune('/path/to/fortune/file');
$fortunes->create($newFortunes);
?>

Note: this will raise exceptions if a directory or multiple files have been set.

File_Fortune::__construct()

File_Fortune::__construct()  -- Constructor

Synopsis

require_once 'File/Fortune.php';

File_Fortune File_Fortune::__construct (string|array [$file = NULL], string [$headerFile = NULL])

Description

Optionally pass a filename or directory name to set the fortune file or directory, and, if passing a fortune file name, optionally pass the name of the header file.

Parameter

string|array $file

Fortune file name, or name of a directory containing fortune files.

If passing an array, array of fortune files names.

string $headerFile

Optional location of binary header file to associate with file passed to $file; see setHeader() for more information.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::add()

File_Fortune::add()  -- Add a new fortune

Description

This package is not documented yet.

Parameter

string $fortune

Fortune string to add to fortune file. Fortune will be appended to fortune file.

If multiple files or a directory have been set, you cannot manipulate the fortune list, and this method will raise an exception.

Throws

throws File_Fortune_Exception

Note

This function can not be called statically.

File_Fortune::create()

File_Fortune::create()  -- Create a new fortune file from an array of fortunes

Description

This package is not documented yet.

Parameter

$fortunes

Array of fortunes to use to seed the new fortune file.

string $file

Optional file name to use when creating new fortune file. If not provided, attempts to use the file set via setFile()

Throws

throws File_Fortune_Exception

Note

This function can not be called statically.

File_Fortune::delete()

File_Fortune::delete()  -- Delete an existing fortune

Description

delete() may be used to delete a fortune at a given index. However, the easier usage is to simply use unset with array notation:

<?php
unset($fortunes[$index]);

If multiple files or a directory have been set, you cannot manipulate the fortune list, and this method will raise an exception.

Parameter

integer $index

Throws

throws File_Fortune_Exception

Note

This function can not be called statically.

File_Fortune::getAll()

File_Fortune::getAll()  -- Retrieve all fortunes from the current file

Description

getAll() can be used to pull the entire fortune database into an array. Typically this is a bad idea as fortune files are often very large. If you wish to do some processing with each fortune, use the File_Fortune object as an iterator:

<?php
foreach ($fortunes as $fortune) {
    // do something with the fortune
}
?>

Note: you can use getAll() when a directory or multiple files have been set; in such a context, it will return all fortunes in all files.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::getDirectory()

File_Fortune::getDirectory()  -- Retrieve current directory of fortune files

Description

getDirectory() returns the currently registered fortune file directory, if any.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::getFile()

File_Fortune::getFile()  -- Retrieve current fortune file name

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::getFiles()

File_Fortune::getFiles()  -- Retrieve list of currently set fortune files

Description

Retrieves a list of all currently set fortune files, as set either explicitly by setFiles() or implicitly by setDirectory().

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::getHeaderFile()

File_Fortune::getHeaderFile()  -- Retrieve current header file name

Description

Header files are explained in the setHeaderFile() documentation. This method returns the current header file name, if any.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::getRandom()

File_Fortune::getRandom()  -- Retrieve random fortune

Description

getRandom() pulls a random fortune. If a fortune file has been explicitly specified, the fortune will be pulled from that file; if a directory has been specified, a random fortune file will first be selected.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::save()

File_Fortune::save()  -- Save changes

Description

In most cases, it will not be necessary to save changes; __destruct() will save changes when the object goes out of scope. However, if you wish to manually ensure that changes are set, you may call save().

If multiple files or a directory have been set, you cannot manipulate the fortune list, and this method will raise an exception.

Throws

throws File_Fortune_Exception

Note

This function can not be called statically.

File_Fortune::setDirectory()

File_Fortune::setDirectory()  -- Set directory from which to randomly select a fortune file

Synopsis

require_once 'File/Fortune.php';

File_Fortune File_Fortune::setDirectory (string $directory)

Description

This package is not documented yet.

Parameter

string $directory

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::setFile()

File_Fortune::setFile()  -- Set fortune file

Synopsis

require_once 'File/Fortune.php';

File_Fortune File_Fortune::setFile (string $file, string [$headerFile = NULL])

Description

setFile() may be used to explicitly set a fortune file to use or create.

Parameter

string $file

string $headerFile

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::setFiles()

File_Fortune::setFiles()  -- Set multiple fortune files

Description

setFiles() may be used to define a list of files from which to pull fortunes. You may pass either a string single argument, an array single argument, or multiple string arguments. As examples:

<?php
// single file:
$fortunes->setFiles('/path/to/fortunefile');

// array of files:
$fortunes->setFiles(array('/path/to/fortunefile', '/another/fortunefile', '/more/fortunes'));

// multiple individual files:
$fortunes->setFiles('/path/to/fortunefile', '/another/fortunefile', '/more/fortunes');
?>

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::setHeaderFile()

File_Fortune::setHeaderFile()  -- Set header file name

Synopsis

require_once 'File/Fortune.php';

File_Fortune File_Fortune::setHeaderFile (string $headerFile)

Description

Fortune files consist of an ASCII file containing fortunes separated by a delimiter, and a binary header file that contains meta information such as the delimter used, number of fortunes, minimum and maximum length of fortunes contained in the file, and the offsets where each fortune exist in the file.

In most cases, this file is simply the name of the fortune file plus the extension 'dat', and File_Fortune will automatically detect this. If this is not the case, however, you may explicitly set the header file name using this method.

Parameter

string $headerFile

Throws

throws no exceptions thrown

Note

This function can not be called statically.

File_Fortune::update()

File_Fortune::update()  -- Update an existing fortune

Description

update() may be used to update fortunes. However, the recommended practice is to use array access:

<?php
$fortunes[2] = 'Updated fortunes are fun!';

If multiple files or a directory have been set, you cannot manipulate the fortune list, and this method will raise an exception.

Parameter

integer $index

string $fortune

Throws

throws File_Fortune_Exception

Note

This function can not be called statically.


File_Fstab

Table of Contents
Introduction --  Introduction to File_Fstab.
Entries --  Working with entries
Saving --  Saving your changes

This package reads and writes fstab files, or other files sharing their format, such as /proc/mounts on Linux systems.

Introduction

Introduction --  Introduction to File_Fstab.

Overview

This package allows you to read, manipulate, and write fstab-format files, such as /etc/fstab, /etc/mtab, and /proc/mounts.

Entries

Entries --  Working with entries

Entry overview

The File_Fstab_Entry class represents all the information available about a particular entry in a Fstab file.

Entry properties

The entry has a number of properties which represent the information in the fstab file.

$device

This is the path to the block device for this entry. $device, $uuid, and $label are mutually exclusive; only one of the three may be set.

$uuid

The UUID of the device.

$label

The label for this device.

$mountPoint

The directory this device is mounted on.

$fsType

The type of filesystem on $device.

$mountOptions

Array of mount options for this device.

$dumpFrequency

How often / if this filesystem should be backed up by dump.

$fsckPassNo

Order of / if this device should be checked by fsck when the system boots.

You may want to read fstab(5) for more information about what these fields mean.

Finding entries

There are a number of ways of finding a specific entry from the fstab. You may find based on device, mountpoint, filesystem label, or UUID.

Finding by device

To find by device, you want to use the getEntryForDevice() function. The single argument this function accepts is the path to the block device for an entry.

Finding by path (mountpoint)

You may want to find a device based on the path it is mounted on; for example, you may want to get the entry for /cdrom, without caring if the CD device is /dev/hdb, /dev/cdrom, or some other device. To do this, use the getEntryForPath() function.

Finding by UUID

Some systems use a filesystem UUID to specify the device to mount. A UUID may look like this: b46ad2ee-01f3-4041-96ca-91d35d059417. The getEntryForUUID() function handles this.

Finding by label

Some filesystems allow you to specify a textual label to a filesystem. For example, you may label your root device rootdev, the device you mount on /home could be named homedirs and so forth. File_Fstab supports getting entries based on the device label. This is accomplished by using the getEntryForLabel() function.

Saving

Saving --  Saving your changes

File_MARC

Table of Contents
Reading MARC data --  Reading MARC data with File_MARC
Formatting MARC data --  Formatting MARC data with File_MARC

This package creates, reads, and modifies Machine Readable Cataloging (MARC) formatted files.

Reading MARC data

Reading MARC data --  Reading MARC data with File_MARC

Overview

File_MARC allows you to read Machine Readable Cataloging (MARC) data in MARC 21 format. File_MARCXML, which is bundled with File_MARC, allows you to read MARCXML formatted data.

Reading MARC data from different sources

Your input source can be a PHP stream (File_MARC::SOURCE_FILE) or a string (File_MARC::SOURCE_STRING). The source location and source types are the first and second arguments to the File_MARC and File_MARCXML constructors.

Reading MARC data from different sources

A File_MARC object consists of a leader and an iterable set of File_MARC_Record objects representing MARC records. Each of these, in turn, consists of an iterable set of File_MARC_Data_Field or File_MARC_Control_Field objects representing MARC fields. A File_MARC_Data_Field consists of a set of iterable File_MARC_Subfield objects representing MARC subfields.

All of this means that File_MARC makes it easy to read in a set of MARC records and iterate through the contents to retrieve specific fields and subfields. File_MARC offers convenience methods for retrieving specific fields without forcing you to iterate through the fields. getField returns the first field that matches the field name, while getFields returns an array of all of the fields that match the specified field name. Both of these methods accept an optional boolean parameter that specifies whether your match string should be treated as a Perl Compatible Regular Expression.

Iterating through fields and subfields

When you iterate over a File_MARC_Data_Field object using foreach(), the MARC tag for the given field is returned as the key for the element and the set of subfields is returned as the value of the element.

Similarly, when you iterate over a File_MARC_Subfield object using foreach(), the code for the given subfield is returned as the key of the element and the value of the given subfield is returned as the value of the element.

Formatting MARC data

Formatting MARC data --  Formatting MARC data with File_MARC

Overview

The File_MARC_Record class enables you to write Machine Readable Cataloging (MARC) data in MARC 21 format, in a human-readable string format, and (with some restrictions) in MARCXML format.

Formatting MARCXML data

To return a record in MARCXML format, call the toXML() method on the File_MARC_Record object.

Significant restrictions on the toXML() method

  • Most significantly, PHP offers no means of converting from the MARC8 encoding that most legacy MARC records have been encoded in to a valid XML encoding such as UTF-8. MARC libraries in other languages have worked around this basic lack of infrastructure by creating their own character encoding conversion libraries. At this time, the author of File_MARC does not have the capacity to build the same support as a PEAR package but would welcome any assistance. Better still would be the addition of ANSEL and MARC8 encoding support to the iconv and ICU toolkits that are used to supply encoding conversion by most open-source projects and languages.

  • The toXML() method currently produces a single, complete, valid XML MARCXML document for a single File_MARC_Record object. You cannot simply concatenate the results of calling toXML() on two File_MARC_Record objects, because that will produce invalid an invalid XML document. At this time, it is up to the developer to extract the record node from each MARCXML document and concatenate them inside a collection root element if they want to create a MARCXML document that contains more than a single record.


File_Passwd

Package to manage passwd-style files


Introduction

Introduction

Introduction -- 

New File_Passwd Facilities

The new File_Passwd package provides facilities to manage many different kinds of password files.

Currently supported password file formats: Unix, CVS, SMB, AuthUserFile, AuthDigestFile and custom formatted passwd files.

Fileformat

passwd-style means, the file has a format like this:
user<delimiter>password

The delimiting character is usually the colon.

With the new File_Passwd_Custom class you can choose your delimiting character, but be aware that any column of your passwd file MUST NOT contain the delimiter!


File_Passwd

Table of Contents
File_Passwd Constants -- Constants used by File_Passwd
File_Passwd::apiVersion() -- Get API version
File_Passwd::factory() -- Factory for extensions
File_Passwd::staticAuth() -- Fast authentication

The File_Passwd class provides a factory for all special purpose classes, static authentication and common encryption methods.

File_Passwd Constants

File_Passwd Constants -- Constants used by File_Passwd

Constants

File_Passwd::apiVersion()

File_Passwd::apiVersion() -- Get API version

Description

Returns API version of the File_Passwd package.

Return value

Returns string API version (currently 1.0.0).

Note

This function can be called statically.

File_Passwd::factory()

File_Passwd::factory() -- Factory for extensions

Description

Load the desired worker class (extension).

  • Unix - for standard Unix passwd files

  • CVS - for CVS pserver passwd files

  • SMB - for SMB server passwd files

  • Authbasic - for AuthUserFiles

  • Authdigest - for AuthDigestFiles

  • Custom - for custom formatted passwd files

Parameter

string $class

the desired extension of File_Passwd

Return value

Returns object File_Passwd extension or PEAR_Error on failure.

Note

This function should be called statically.

File_Passwd::staticAuth()

File_Passwd::staticAuth() -- Fast authentication

Description

Static user autentication.

Though this approach should be reasonable fast, it is NOT with APR compatible MD5 encryption used for htpasswd style password files encrypted in MD5.

Generating one MD5 password takes about 0.25 seconds!

Depending on $type, $opt should be:

  • Smb:

    encryption method (NT or LM)

  • Unix:

    encryption method (des or md5)

  • Authbasic:

    encryption method (des, sha or md5)

  • Authdigest:

    the realm the user is in

  • Cvs:

    n/a (empty)

  • Custom:

    array of 2 elements: encryption function and delimiter

Parameter

string $type

Unix, Cvs, Smb, Authbasic or Authdigest

string $file

path to passwd file

string $user

the user to authenticate

string $pass

the plaintext password

mixed $opt

  • Smb:

    nt | lm

  • Unix:

    des | md5

  • Authbasic:

    des | sha | md5

  • Authdigest:

    the realm the user is in

  • Cvs:

    n/a (empty)

  • Custom:

    array of 2 elements: encryption function and delimiter

Note

This function should be called statically.


File_Passwd_Common

Table of Contents
Childs -- Classes that extend File_Passwd_Common and their inherited methods
File_Passwd_Common::delUser() -- Delete a certain user
File_Passwd_Common::listUser() -- List user
File_Passwd_Common::userExists() -- Check if user exists
File_Passwd_Common::getFile() -- Get path of passwd file
File_Passwd_Common::setFile() -- Set path to passwd file
File_Passwd_Common::load() -- Loads the file
File_Passwd_Common::parse() -- Parse the content of the file
File_Passwd_Common::save() -- Apply changes and rewrite passwd file
File_Passwd_Common::_auth() -- Base method for File_Passwd::staticAuth()
File_Passwd_Common::_open() -- Open a file
File_Passwd_Common::_close() -- Closes a prior opened and locked file handle
File_Passwd_Common::_save() -- Save the modified content to the passwd file
File_Passwd_Common::__construct() -- Constructor (ZE2)

Base class for worker class extensions.

Childs

Childs -- Classes that extend File_Passwd_Common and their inherited methods

File_Passwd_Common::delUser()

File_Passwd_Common::delUser() -- Delete a certain user

Description

Delete a certain user.

Parameter

string $user

username

Note

This function can not be called statically.

File_Passwd_Common::listUser()

File_Passwd_Common::listUser() -- List user

Description

List one user's properties or all users.

Parameter

string $user

the user to list or all users if empty

Note

This function can not be called statically.

File_Passwd_Common::userExists()

File_Passwd_Common::userExists() -- Check if user exists

Description

Check if a certain user already exists.

Parameter

string $user

the name of the user to check if already exists

Return value

Returns boolean whether user already exists.

Note

This function can not be called statically.

File_Passwd_Common::getFile()

File_Passwd_Common::getFile() -- Get path of passwd file

Description

Get the path of the passwd file.

Return value

Returns string path of passwd file.

Note

This function can not be called statically.

File_Passwd_Common::setFile()

File_Passwd_Common::setFile() -- Set path to passwd file

Description

Set path to passwd file.

Parameter

string $file

path to passwd file

Note

This function can not be called statically.

File_Passwd_Common::load()

File_Passwd_Common::load() -- Loads the file

Description

Loads the passwd file and calls the parse() method of the extending child class.

Note

This function can not be called statically.

File_Passwd_Common::parse()

File_Passwd_Common::parse() -- Parse the content of the file

Description

This is kinda abstract method which only returns a PEAR_Error, so it is to be overwritten in the extending child class.

You must overwrite this method in your File_Passwd_* class.

(package developer related)

Return value

Returns object PEAR_Error FILE_PASSWD_E_METHOD_NOT_IMPLEMENTED.

Note

This function can not be called statically.

File_Passwd_Common::save()

File_Passwd_Common::save() -- Apply changes and rewrite passwd file

Description

This is kinda abstract method which only returns a PEAR_Error, so it is to be overwritten in the extending child class.

You must overwrite this method in your File_Passwd_* class.

(package developer related)

Return value

Returns object PEAR_Error FILE_PASSWD_E_METHOD_NOT_IMPLEMENTED.

Note

This function can not be called statically.

File_Passwd_Common::_auth()

File_Passwd_Common::_auth() -- Base method for File_Passwd::staticAuth()

Description

Base method for File_Passwd_*::staticAuth()

(package developer related)

Parameter

string $file

path to passwd file

string $id

user_id to search for

Note

This function can not be called statically.

File_Passwd_Common::_open()

File_Passwd_Common::_open() -- Open a file

Description

Opens a file, locks it exclusively and returns the filehandle.

(package developer related)

Parameter

string $mode

the mode to open the file with

string $file

path to passwd file

Note

This function can not be called statically.

File_Passwd_Common::_close()

File_Passwd_Common::_close() -- Closes a prior opened and locked file handle

Description

Closes a prior with File_Passwd_Common::_open() opened and locked file handle.

(package developer related)

Parameter

resource &$file_handle

the file handle to operate on

Note

This function can not be called statically.

File_Passwd_Common::_save()

File_Passwd_Common::_save() -- Save the modified content to the passwd file

Description

Save content to file.

(package developer related)

Parameter

string $content

file content

Note

This function can not be called statically.

File_Passwd_Common::__construct()

File_Passwd_Common::__construct() -- Constructor (ZE2)

Description

Implemented for Zend Engine 2 compatibility.

(package developer related)

Parameter

string $file

path to passwd file

Return value

Returns object File_Passwd_* - new instance of an File_Passwd_* object.

Note

This function can not be called statically.


File_Passwd_Custom

Manipulate custom formatted passwd files. (inherited methods)

File_Passwd_Custom::staticAuth()

File_Passwd_Custom::staticAuth() -- Fast authentication

Description

Static user authentication.

Parameter

string $file

path to passwd file

string $user

user to authenticate

string $pass

plaintext password

array $opts

A two element array containing the encryption function to use and the delimiting character: e.g. array('md5', '|')

Note

This function should be called statically.

File_Passwd_Custom::File_Passwd_Custom()

File_Passwd_Custom::File_Passwd_Custom() -- Constructor

Description

Initialize a new File_Passwd_Custom object with the specified path to passwd file.

Parameter

string $file

path to passwd file

Return value

Returns object File_Passwd_Custom.

Note

This function can not be called statically.

File_Passwd_Custom::parse()

File_Passwd_Custom::parse() -- Parse passwd file

Description

Parse the custom passwd file. (package developer related)

This usually happens in File_Passwd_Custom::load() .

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_INVALID_FORMAT, if passwd file has illegal format.

Note

This function can not be called statically.

File_Passwd_Custom::save()

File_Passwd_Custom::save() -- Save changes

Description

Apply changes and rewrite passwd file.

Note

This function can not be called statically.

File_Passwd_Custom::addUser()

File_Passwd_Custom::addUser() -- Add an user

Description

The username must start with an alphabetical character and must NOT contain any other characters than alphanumerics, the underline and dash.

The username MUST NOT contain the custom delimiter!

If you use the 'name map' you should also use these naming in the supplied extra array, because your values would get mixed up if they are in the wrong order, which is always true if you DON'T use the 'name map'!

So be warned and USE the 'name map'!

Parameter

string $user

the name of the user to add

string $pass

the password of the user to add

array $extra

extra properties of user to add

Note

This function can not be called statically.

File_Passwd_Custom::modUser()

File_Passwd_Custom::modUser() -- Modify user

Description

You shouldn't modify the password of the user with this method, use File_Passwd_Custom::changePasswd() instead.

You should use this method only if the 'name map' is used, too.

Parameter

string $user

the user to modify

array $properties

an associative array of properties to modify

Note

This function can not be called statically.

File_Passwd_Custom::changePasswd()

File_Passwd_Custom::changePasswd() -- Change password

Description

Change the password of a certain user.

Parameter

string $user

the user whose password should be changed

string $pass

the new plaintext password

Note

This function can not be called statically.

File_Passwd_Custom::verifyPasswd()

File_Passwd_Custom::verifyPasswd() -- Verify password

Description

Verify the password of a certain user.

Parameter

string $user

the user whose password should be verified

string $pass

the password to verify

Note

This function can not be called statically.

File_Passwd_Custom::useMap()

File_Passwd_Custom::useMap() -- Whether to use the 'name map'

Description

Whether to use the 'name map' of the extra properties or not.

You first must supply a 'name map' to use it.

Parameter

boolean $bool

whether to use the 'name map' or not

Return value

Returns boolean TRUE if you set a value, or the actual value if called without param.

Note

This function can not be called statically.

File_Passwd_Custom::getMap()

File_Passwd_Custom::getMap() -- Get 'name map'

Description

Get the 'name map' which is used for the extra properties of the user.

Return value

Returns array 'name map'.

Note

This function can not be called statically.

File_Passwd_Custom::setMap()

File_Passwd_Custom::setMap() -- Set 'name map'

Description

Set the 'name map' to use with the extra properties of the user.

This map is used for naming the associative array of the extra properties.

Parameter

array $map

the 'name map'

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_PARAM_MUST_BE_ARRAY, if the supplied 'name map' was not of type array.

Note

This function can not be called statically.


File_Passwd_Unix

Table of Contents
File_Passwd_Unix::staticAuth() -- Fast authentication
File_Passwd_Unix::File_Passwd_Unix() -- Constructor
File_Passwd_Unix::parse() -- Parse passwd file
File_Passwd_Unix::save() -- Save changes
File_Passwd_Unix::addUser() -- Add an user
File_Passwd_Unix::modUser() -- Modify user
File_Passwd_Unix::changePasswd() -- Change password
File_Passwd_Unix::verifyPasswd() -- Verify password
File_Passwd_Unix::useMap() -- Whether to use the 'name map'
File_Passwd_Unix::getMap() -- Get 'name map'
File_Passwd_Unix::setMap() -- Set 'name map'
File_Passwd_Unix::getMode() -- Get actual encryption mode
File_Passwd_Unix::setMode() -- Set encryption mode
File_Passwd_Unix::listModes() -- Get supported encryption modes
File_Passwd_Unix::isShadowed() -- Check if passwd file is shadowed
File_Passwd_Unix::generatePassword() -- Generate password

Manipulate standard Unix passwd files. (inherited methods)

File_Passwd_Unix::staticAuth()

File_Passwd_Unix::staticAuth() -- Fast authentication

Description

Static user authentication.

Parameter

string $file

path to passwd file

string $user

user to authenticate

string $pass

plaintext password

string $mode

des or md5

Note

This function should be called statically.

File_Passwd_Unix::File_Passwd_Unix()

File_Passwd_Unix::File_Passwd_Unix() -- Constructor

Description

Initialize a new File_Passwd_Unix object with the specified path to passwd file.

Parameter

string $file

path to passwd file

Return value

Returns object File_Passwd_Unix.

Note

This function can not be called statically.

File_Passwd_Unix::parse()

File_Passwd_Unix::parse() -- Parse passwd file

Description

Parse the unix passwd file. (package developer related)

This usually happens in File_Passwd_Unix::load() .

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_INVALID_FORMAT, if passwd file has illegal format.

Note

This function can not be called statically.

File_Passwd_Unix::save()

File_Passwd_Unix::save() -- Save changes

Description

Apply changes and rewrite passwd file.

Note

This function can not be called statically.

File_Passwd_Unix::addUser()

File_Passwd_Unix::addUser() -- Add an user

Description

The username must start with an alphabetical character and must NOT contain any other characters than alphanumerics, the underline and dash.

If you use the 'name map' you should also use these naming in the supplied extra array, because your values would get mixed up if they are in the wrong order, which is always true if you DON'T use the 'name map'!

So be warned and USE the 'name map'!

If the passwd file is shadowed, the user will be added though, but with an 'x' as password, and a PEAR_Error will be returned, too.

Parameter

string $user

the name of the user to add

string $pass

the password of the user to add

array $extra

extra properties of user to add

Note

This function can not be called statically.

File_Passwd_Unix::modUser()

File_Passwd_Unix::modUser() -- Modify user

Description

You shouldn't modify the password of the user with this method, use File_Passwd_Unix::changePasswd() instead.

You should use this method only if the 'name map' is used, too.

Parameter

string $user

the user to modify

array $properties

an associative array of properties to modify

Note

This function can not be called statically.

File_Passwd_Unix::changePasswd()

File_Passwd_Unix::changePasswd() -- Change password

Description

Change the password of a certain user.

Parameter

string $user

the user whose password should be changed

string $pass

the new plaintext password

Note

This function can not be called statically.

File_Passwd_Unix::verifyPasswd()

File_Passwd_Unix::verifyPasswd() -- Verify password

Description

Verify the password of a certain user.

Parameter

string $user

the user whose password should be verified

string $pass

the password to verify

Note

This function can not be called statically.

File_Passwd_Unix::useMap()

File_Passwd_Unix::useMap() -- Whether to use the 'name map'

Description

Whether to use the 'name map' of the extra properties or not.

Default Unix passwd files look like: user:password:user_id:group_id:gecos:home_dir:shell

The default 'name map' for properties except user and password looks like:

  • uid

  • gid

  • gecos

  • home

  • shell

If you want to change the naming of the standard map use File_Passwd_Unix::setMap().

Parameter

boolean $bool

whether to use the 'name map' or not

Return value

Returns boolean TRUE if you set a value, or the actual value if called without param.

Note

This function can not be called statically.

File_Passwd_Unix::getMap()

File_Passwd_Unix::getMap() -- Get 'name map'

Description

Get the 'name map' which is used for the extra properties of the user.

Return value

Returns array 'name map'.

Note

This function can not be called statically.

File_Passwd_Unix::setMap()

File_Passwd_Unix::setMap() -- Set 'name map'

Description

Set the 'name map' to use with the extra properties of the user.

This map is used for naming the associative array of the extra properties.

Parameter

array $map

the 'name map'

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_PARAM_MUST_BE_ARRAY, if the supplied 'name map' was not of type array.

Note

This function can not be called statically.

File_Passwd_Unix::getMode()

File_Passwd_Unix::getMode() -- Get actual encryption mode

Description

Get actual encryption mode (des|md5).

Return value

Returns string actual encryption mode.

Note

This function can not be called statically.

File_Passwd_Unix::setMode()

File_Passwd_Unix::setMode() -- Set encryption mode

Description

Set encryption mode to use.

Supported encryption modes are 'des' and 'md5'.

You can use the constants FILE_PASSWD_MD5 and FILE_PASSWD_DES for this purpose.

Parameter

string $mode

encryption mode to use

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_INVALID_ENC_MODE, if supplied encryption mode is not supported.

Note

This function can not be called statically.

File_Passwd_Unix::listModes()

File_Passwd_Unix::listModes() -- Get supported encryption modes

Description

List the supported encryption modes.

<pre> array + md5 + des </pre>

Return value

Returns array supported encryption modes.

Note

This function can not be called statically.

File_Passwd_Unix::isShadowed()

File_Passwd_Unix::isShadowed() -- Check if passwd file is shadowed

Description

Check if the passwords of this passwd file are shadowed in another file.

Return value

Returns boolean whether passwords of this passwd file are shadowed in another file.

Note

This function can not be called statically.

File_Passwd_Unix::generatePassword()

File_Passwd_Unix::generatePassword() -- Generate password

Description

Generate a "Un*x" style password.

The encryption mode can be of any type File_Passwd provides, although FILE_PASSWD_MD5 and FILE_PASSWD_DES are the most common.

Parameter

string $pass

the plaintext password to encrypt

string $mode

the encryption mode to use

string $salt

the salt to use for encryption (usually empty)

Return value

Returns string encrypted password, or PEAR_Error FILE_PASSWD_E_INVALID_ENC_MODE if encryption mode is not supported.

Note

This function should be called statically.


File_Passwd_Cvs

Manipulate CVS pserver passwd files. (inherited methods)

File_Passwd_Cvs::staticAuth()

File_Passwd_Cvs::staticAuth() -- Fast authentication

Description

Static user authentication.

Parameter

string $file

path to passwd file

string $user

user to authenticate

string $pass

plaintext password

Note

This function should be called statically.

File_Passwd_Cvs::File_Passwd_Cvs()

File_Passwd_Cvs::File_Passwd_Cvs() -- Constructor

Description

Initialize a new File_Passwd_Cvs object with the given path to passwd file.

Parameter

string $file

path to passwd file

Return value

Returns object File_Passwd_Cvs.

Note

This function can not be called statically.

File_Passwd_Cvs::parse()

File_Passwd_Cvs::parse() -- Parse file

Description

Parse the CVS passwd file. (package developer related)

This usually happens in File_Passwd_Cvs::load() .

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_INVALID_FORMAT, if passwd file has invalid format.

Note

This function can not be called statically.

File_Passwd_Cvs::save()

File_Passwd_Cvs::save() -- Save changes

Description

Apply changes and rewrite CVS passwd file.

Note

This function can not be called statically.

File_Passwd_Cvs::addUser()

File_Passwd_Cvs::addUser() -- Add an user

Description

The username must start with an alphabetical character and must NOT contain any other characters than alphanumerics, the underline and dash.

Parameter

string $user

the name of the user to add

string $pass

the password of the user tot add

string $system_user

the systemuser this user maps to

Note

This function can not be called statically.

File_Passwd_Cvs::changeSysUser()

File_Passwd_Cvs::changeSysUser() -- Change syste user

Description

Change the corresponding system user of a certain cvs user.

Parameter

string $user

the user to change the system user for

string $system

the new system user name

Note

This function can not be called statically.

File_Passwd_Cvs::changePasswd()

File_Passwd_Cvs::changePasswd() -- Change password

Description

Change the password of a certain user.

Parameter

string $user

the user whose password should be changed

string $pass

the new plaintext password

Return value

$return.success-pearerror;

Returns PEAR_Error FILE_PASSWD_E_EXISTS_ALREADY, if user already exists.

Note

This function can not be called statically.

File_Passwd_Cvs::verifyPasswd()

File_Passwd_Cvs::verifyPasswd() -- Verify password

Description

Verify the password of a certain user.

Parameter

string $user

user whose password should be verified

string $pass

the plaintext password that should be verified

Return value

Returns TRUE if passwords equal, FALSE if the don't or PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_EXISTS_NOT, if user doesn't exist.

Note

This function can not be called statically.

File_Passwd_Cvs::generatePassword()

File_Passwd_Cvs::generatePassword() -- Generate password

Description

Generate a "CVS" pserver style password.

Parameter

string $pass

the plaintext password to encrypt

string $salt

the salt to use for encryption (usually empty)

Return value

Returns string encrypted password.

Note

This function should be called statically.


File_Passwd_Smb

Manipulate SMB server passwd files. (inherited methods)

File_Passwd_Smb::staticAuth()

File_Passwd_Smb::staticAuth() -- Fast authentication

Description

Static user authentication.

Parameter

string $file

path to passwd file

string $user

user to authenticate

string $pass

plaintext password

string $mode

encryption mode ('nt'|'lm') NTHASH or LMHASH

Note

This function should be called statically.

File_Passwd_Smb::File_Passwd_Smb()

File_Passwd_Smb::File_Passwd_Smb() -- Constructor

Description

Initialize a new File_Passwd_Smb object with the given path to passwd file.

Parameter

string $file

path to SMB passwd file

Return value

Returns object File_Passwd_Smb.

Note

This function can not be called statically.

File_Passwd_Smb::parse()

File_Passwd_Smb::parse() -- Parse file

Description

Parse the SMB passwd file. (package developer related)

This usually happens in File_Passwd_Smb::load() .

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_INVALID_FORMAT, if passwd file has invalid format.

Note

This function can not be called statically.

File_Passwd_Smb::save()

File_Passwd_Smb::save() -- Save changes

Description

Apply changes and rewrite SMB passwd file.

Note

This function can not be called statically.

File_Passwd_Smb::addUser()

File_Passwd_Smb::addUser() -- Add an user

Description

Add an SMB user/machine account.

Parameter

string $user

the user/machine to add

string $pass

the new plaintext password

array $params

additional properties of account:

  • userid

  • flags

  • lct

  • comment

boolean $isMachine

whether to add an machine account

Note

This function can not be called statically.

File_Passwd_Smb::modUser()

File_Passwd_Smb::modUser() -- Modify a user

Description

Modify a certain user.

You shouldn't modify the password with this method, use File_Passwd_Smb::changePasswd() instead.

Parameter

string $user

the user to modify

array $params

an associative array of properties to change

Note

This function can not be called statically.

File_Passwd_Smb::changePasswd()

File_Passwd_Smb::changePasswd() -- Change password

Description

Change the passwd of a certain user.

Parameter

string $user

the user whose passwd should be changed

string $pass

the new plaintext passwd

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error FILE_PASSWD_E_EXISTS_NOT, if user doesn't exist.

Note

This function can not be called statically.

File_Passwd_Smb::verifyPasswd()

File_Passwd_Smb::verifyPasswd() -- Verify password

Description

Verifies an account with the given plaintext password.

Parameter

string $user

username

string $pass

the plaintext password

Note

This function can not be called statically.

File_Passwd_Smb::verifyEncryptedPasswd()

File_Passwd_Smb::verifyEncryptedPasswd() -- Verify encrypted password

Description

Verify the encrypted password of an user/machine.

We prefer NT-Hash instead of weak LAN-Manager-Hash.

Parameter

string $user

username

string $nthash

NT-Hash in hex

string $lmhash

LAN-Manager-Hash in hex

Note

This function can not be called statically.

File_Passwd_Smb::generatePassword()

File_Passwd_Smb::generatePassword() -- Generate password

Description

Generate a "Samba" server style password.

The encryption mode can either be FILE_PASSWD_NT or FILE_PASSWD_LM.

Parameter

string $pass

the plaintext password to encrypt

string $mode

the encryption mode to use

Return value

Returns string encrypted password.

Note

This function should be called statically.


File_Passwd_Authbasic

Manipulate AuthUserFiles. (inherited methods)

File_Passwd_Authbasic::staticAuth()

File_Passwd_Authbasic::staticAuth() -- Fast authentication

Description

Static user authentication.

Parameter

string $file

path to passwd file

string $user

user to authenticate

string $pass

plaintext password

string $mode

des, sha or md5

Note

This function should be called statically.

File_Passwd_Authbasic::File_Passwd_Authbasic()

File_Passwd_Authbasic::File_Passwd_Authbasic() -- Constructor

Description

Initialise a new File_Passwd_Authbasic object with the given path to the passwd file.

Parameter

string $file

path to AuthUserFile

Return value

Returns object File_Passwd_Authbasic.

Note

This function can not be called statically.

File_Passwd_Authbasic::parse()

File_Passwd_Authbasic::parse() -- Parse the AuthUserFile

Description

Parse the AuthUserFile. (package developer related)

This usually happens in File_Passwd_Authbasic::load() .

Note

This function can not be called statically.

File_Passwd_Authbasic::save()

File_Passwd_Authbasic::save() -- Save changes

Description

Apply changes and rewrite AuthUserFile.

Note

This function can not be called statically.

File_Passwd_Authbasic::addUser()

File_Passwd_Authbasic::addUser() -- Add an user

Description

The username must start with an alphabetical character and must NOT contain any other characters than alphanumerics, the underline and dash.

Parameter

string $user

username

string $pass

plaintext password

Note

This function can not be called statically.

File_Passwd_Authbasic::changePasswd()

File_Passwd_Authbasic::changePasswd() -- Change password

Description

Change the password of a certain user.

Parameter

string $user

the user whose password should be changed

string $pass

the new plaintext password

Note

This function can not be called statically.

File_Passwd_Authbasic::verifyPasswd()

File_Passwd_Authbasic::verifyPasswd() -- Verify password

Description

Verify the password of a certain user.

Parameter

string $user

the user whose password should be verified

string $pass

the plaintext password to verify

Note

This function can not be called statically.

File_Passwd_Authbasic::getMode()

File_Passwd_Authbasic::getMode() -- Get actual encryption mode

Description

Get the actual encryption mode.

Return value

string - actual encryption mode

Note

This function can not be called statically.

File_Passwd_Authbasic::setMode()

File_Passwd_Authbasic::setMode() -- Set the encryption mode

Description

You can choose one of md5, sha or des.

ATTN: DES encryption not available on Win32!

Returns a PEAR_Error if a specific encryption mode is not supported.

Parameter

string $mode

the encryption mode to use

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_Passwd_Authbasic::listModes()

File_Passwd_Authbasic::listModes() -- Get supported encryption modes

Description

Returns an array of supported encryption modes.

<pre> array + md5 + sha + des </pre>

ATTN: DES encryption not available on Win32!

Return value

array - supported encryption modes.

Note

This function can not be called statically.

File_Passwd_Authbasic::generatePassword()

File_Passwd_Authbasic::generatePassword() -- Generate password

Description

Generate a password usable for "AuthBasic" authentication.

The encryption mode can either be FILE_PASSWD_DES, FILE_PASSWD_SHA or FILE_PASSWD_MD5.

Parameter

string $pass

the plaintext password to encrypt

string $mode

the encryption mode to use

string $salt

the salt to use for encryption (usually empty)

Return value

Returns string encrypted password, or PEAR_Error FILE_PASSWD_E_INVALID_ENC_MODE if encryption mode is not supported.

Note

This function should be called statically.


File_Passwd_Authdigest

Manipulate AuthDigestFiles. (inherited methods)

File_Passwd_Authdigest::staticAuth()

File_Passwd_Authdigest::staticAuth() -- Fast authentication

Description

Static user authentication.

Parameter

string $file

path to passwd file

string $user

user to authenticate

string $pass

plaintext password

string $realm

the realm the user should be in

Note

This function should be called statically.

File_Passwd_Authdigest::File_Passwd_Authdigest()

File_Passwd_Authdigest::File_Passwd_Authdigest() -- Constructor

Description

Initialize a new object of File_Passwd_Authdigest with the specified path to the AuthDigestFile.

Parameter

string $file

path to AuthDigestFile

Return value

Returns object File_Passwd_Authdigest.

Note

This function can not be called statically.

File_Passwd_Authdigest::parse()

File_Passwd_Authdigest::parse() -- Parse the AuthDigestFile

Description

Parse the AuthDigestFile. (package developer related)

This usually happens in File_Passwd_Authdigest::load() .

Note

This function can not be called statically.

File_Passwd_Authdigest::save()

File_Passwd_Authdigest::save() -- Save changes

Description

Apply changes and rewrite AuthDigestFile.

Note

This function can not be called statically.

File_Passwd_Authdigest::addUser()

File_Passwd_Authdigest::addUser() -- Add an user

Description

Add an user to the AuthDigestFile.

$user and $realm must start with an alphabetical charachter and must NOT contain any other characters than alphanumerics, the underline and dash.

Parameter

string $user

the user to add

string $realm

the realm the user should be in

string $pass

the plaintext password

Note

This function can not be called statically.

File_Passwd_Authdigest::changePasswd()

File_Passwd_Authdigest::changePasswd() -- Change password

Description

Change the password of a certain user in a specific realm.

This method in fact adds the user whith the new password after deleting the user.

Parameter

string $user

the user whose password should be changed

string $realm

the realm the user is in

string $pass

the new plaintext password

Note

This function can not be called statically.

File_Passwd_Authdigest::verifyPasswd()

File_Passwd_Authdigest::verifyPasswd() -- Verifiy password

Description

Verify the password of an user in a certain realm.

Parameter

string $user

the user whose password should be verified

string $realm

the realm the user is in

string $pass

the plaintext password to verify

Note

This function can not be called statically.

File_Passwd_Authdigest::delUserInRealm()

File_Passwd_Authdigest::delUserInRealm() -- Delete a user

Description

Delete a certain user in a specific realm.

Parameter

string $user

the user to remove

string $inRealm

the realm the user should be in

Note

This function can not be called statically.

File_Passwd_Authdigest::listUserInRealm()

File_Passwd_Authdigest::listUserInRealm() -- List user

Description

List all user af either one specific or all realms.

Parameter

string $inRealm

the realm to list users of

Return value

Returns array:

  • associative array of users of ONE realm if $inRealm was supplied <pre> realm1 + user1 =&gt; pass + user2 =&gt; pass + user3 =&gt; pass </pre>

  • associative array of all realms with all users <pre> array + realm1 =&gt; array + user1 =&amp;gt; pass + user2 =&amp;gt; pass + user3 =&amp;gt; pass + realm2 =&gt; array + user3 =&amp;gt; pass + realm3 =&gt; array + user1 =&amp;gt; pass + user2 =&amp;gt; pass </pre>

Note

This function can not be called statically.

File_Passwd_Authdigest::userInRealm()

File_Passwd_Authdigest::userInRealm() -- Ckeck if a certain user is in a specific realm

Description

Ckeck if a certain user is in a specific realm.

Parameter

string $user

the user to check

string $realm

the realm the user shuold be in

Return value

Returns TRUE if user is in realm, FALSE if not or PEAR_Error on failure.

Note

This function can not be called statically.

File_Passwd_Authdigest::generatePassword()

File_Passwd_Authdigest::generatePassword() -- Generate password

Description

Generate a password usable for "AuthDigest" authentication.

Parameter

string $user

the username

string $realm

the realm the user is in

string $pass

the plaintext password

Return value

Returns string encrypted password.

Note

This function should be called statically.


MP3_Id

Table of Contents
Constants -- Constants defined in and used by MP3_Id
MP3_Id::MP3_Id() -- constructor
MP3_Id::copy() -- copy the tags of another instance
MP3_Id::genres() -- get Genre list
MP3_Id::getGenre() -- return genre name by number
MP3_Id::getGenreNo() -- get number of genre
MP3_Id::getTag() -- get the value of a tag
MP3_Id::read() -- reads and parses file
MP3_Id::remove() -- remove tags
MP3_Id::setTag() -- sets a tag content
MP3_Id::study() -- does extra work to get the MPEG frame info
MP3_Id::write() -- save changed tags

This package offers methods for reading and writing IDv1-information tags of MP3 files.

Constants

Constants -- Constants defined in and used by MP3_Id

MP3_Id::MP3_Id()

MP3_Id::MP3_Id() -- constructor

Description

Constructor

Parameter

boolean $study

Enables an in-deep look in the file (increase execution time!)

Note

This function can not be called statically.

MP3_Id::copy()

MP3_Id::copy() -- copy the tags of another instance

Description

Sets the ID3 tags to the same as the tags in $from

Parameter

string $from

Name of the variable storing an other instance of MP3_Id

Note

This function can not be called statically.

MP3_Id::genres()

MP3_Id::genres() -- get Genre list

Description

Returns a list of genre numbers and names

Return value

array - list of genres

Note

This function can not be called statically.

MP3_Id::getGenre()

MP3_Id::getGenre() -- return genre name by number

Description

Return the name of a genre number, if no genre number is specified the genre number found in the file will be used.

Parameter

integer $genreno

Number of the genre

Return value

mixed FALSE, if no genre found, else string

Note

This function can not be called statically.

MP3_Id::getGenreNo()

MP3_Id::getGenreNo() -- get number of genre

Description

Get the number of a genre.

Parameter

string $genre

Name of the genre

integer $default

The value to return in case of genre not found

Note

This function can not be called statically.

MP3_Id::getTag()

MP3_Id::getTag() -- get the value of a tag

Description

Get the value of a tag

Parameter

string $name

the name of the tag to get

mixed $default

returned, if the tag not exists

Return value

mixed The value of the field

Note

This function can not be called statically.

MP3_Id::read()

MP3_Id::read() -- reads and parses file

Description

Reads the given file and parses it.

Parameter

string $file

the name of the file to parse

Note

This function can not be called statically.

MP3_Id::remove()

MP3_Id::remove() -- remove tags

Description

Removes all tags from a file.

Parameter

boolean $id3v1

TRUE to remove tags

boolean $id3v2

unused

Note

This function can not be called statically.

MP3_Id::setTag()

MP3_Id::setTag() -- sets a tag content

Parameter

mixed $name

Name of the tag to set or hash with the key as fieldname

mixed $value

the value to set

Note

This function can not be called statically.

MP3_Id::study()

MP3_Id::study() -- does extra work to get the MPEG frame info

Description

Does extra work to get the MPEG frame info.

Note

This function can not be called statically.

MP3_Id::write()

MP3_Id::write() -- save changed tags

Description

Updates the tags on the file.

Parameter

boolean $v1

if TRUE update/create an Version 1-tag on the file

Note

This function can not be called statically.


Spreadsheet_Excel_Writer

Table of Contents
Introduction -- how to generate Excel files
Formatting Tutorial -- how to format cells in a spreadsheet
Workbook::close -- Calls finalization methods for the workbook
Workbook::&addWorksheet -- Add a new worksheet to the Excel workbook.
Workbook::&addFormat -- Add a new format to the Excel workbook.
Workbook::&setTempDir -- Sets the temp dir used for storing the OLE file.
Workbook::setCustomColor -- Change the RGB components of the elements in the colour palette.
Worksheet::getName -- Retrieve the worksheet name. This is usefull when creating worksheets
Worksheet::setInputEncoding -- Allow writing for different charsets.
Worksheet::select -- Set this worksheet as a selected worksheet, i.e. the worksheet has its tab
Worksheet::activate -- Set this worksheet as the active worksheet, i.e. the worksheet that is
Worksheet::setFirstSheet -- Set this worksheet as the first visible sheet. This is necessary
Worksheet::protect -- Set the worksheet protection flag
Worksheet::setColumn -- Set the width of a single column or a range of columns.
Worksheet::setSelection -- Set which cell or cells are selected in a worksheet
Worksheet::freezePanes -- Set panes and mark them as frozen.
Worksheet::thawPanes -- Set panes and mark them as unfrozen.
Worksheet::setPortrait -- Set the page orientation as portrait.
Worksheet::setLandscape -- Set the page orientation as landscape.
Worksheet::setPaper -- Set the paper type. Ex. 1 = US Letter, 9 = A4
Worksheet::setHeader -- Set the page header caption and optional margin.
Worksheet::setFooter -- Set the page footer caption and optional margin.
Worksheet::centerHorizontally -- Center the page horizontally.
Worksheet::centerVertically -- Center the page vertically.
Worksheet::setMargins -- Set all the page margins to the same value in inches.
Worksheet::setMargins_LR -- Set the left and right margins to the same value in inches.
Worksheet::setMargins_TB -- Set the top and bottom margins to the same value in inches.
Worksheet::setMarginLeft -- Set the left margin in inches.
Worksheet::setMarginRight -- Set the right margin in inches.
Worksheet::setMarginTop -- Set the top margin in inches.
Worksheet::setMarginBottom -- Set the bottom margin in inches.
Worksheet::repeatRows -- Set the rows to repeat at the top of each printed page.
Worksheet::repeatColumns -- Set the columns to repeat at the left hand side of each printed page.
Worksheet::printArea -- Set the area of each worksheet that will be printed.
Worksheet::hideGridlines -- Set the option to hide gridlines on the printed page.
Worksheet::printRowColHeaders -- Set the option to print the row and column headers on the printed page.
Worksheet::fitToPages -- Store the vertical and horizontal number of pages that will define the
Worksheet::setHPagebreaks -- Store the horizontal page breaks on a worksheet (for printing).
Worksheet::setVPagebreaks -- Store the vertical page breaks on a worksheet (for printing).
Worksheet::setZoom -- Set the worksheet zoom factor.
Worksheet::setPrintScale -- Set the scale factor for the printed page.
Worksheet::write -- Map to the appropriate write method acording to the token recieved.
Worksheet::writeNumber -- Write a double to the specified row and column (zero indexed).
Worksheet::writeString -- Write a string to the specified row and column (zero indexed).
Worksheet::writeNote -- Writes a note associated with the cell given by the row and column.
Worksheet::writeBlank -- Write a blank cell to the specified row and column (zero indexed).
Worksheet::writeFormula -- Write a formula to the specified row and column (zero indexed).
Worksheet::writeUrl -- Write a hyperlink. This is comprised of two elements: the visible label and
Worksheet::setRow -- This method is used to set the height and XF format for a row.
Worksheet::mergeCells -- This is an Excel97/2000 method. It is required to perform more complicated
Worksheet::insertBitmap -- Insert a 24bit bitmap image in a worksheet. The main record required is
Worksheet::setOutline -- This method sets the properties for outlining and grouping
Spreadsheet_Excel_Writer::Spreadsheet_Excel_Writer -- The constructor. It just creates a Workbook
Spreadsheet_Excel_Writer::send -- Send HTTP headers for the Excel file.
Spreadsheet_Excel_Writer::rowcolToCell -- Utility function for writing formulas.
Format::setAlign -- Set cell alignment.
Format::setVAlign -- Set cell alignment.
Format::setHAlign -- Set cell alignment.
Format::setMerge -- This is an alias for the unintuitive setAlign('merge')
Format::setBold -- Sets the boldness of the text.
Format::setBottom -- Sets the width for the bottom border of the cell
Format::setTop -- Sets the width for the top border of the cell
Format::setLeft -- Sets the width for the left border of the cell
Format::setRight -- Sets the width for the right border of the cell
Format::setBorder -- Set cells borders to the same style
Format::setBorderColor -- Sets all the cell's borders to the same color
Format::setBottomColor -- Sets the cell's bottom border color
Format::setTopColor -- Sets the cell's top border color
Format::setLeftColor -- Sets the cell's left border color
Format::setRightColor -- Sets the cell's right border color
Format::setFgColor -- Sets the cell's foreground color
Format::setBgColor -- Sets the cell's background color
Format::setColor -- Sets the color of a cell's content
Format::setPattern -- Sets the fill pattern attribute of a cell
Format::setUnderline -- Sets the underline of the text
Format::setItalic -- Sets the font style as italic
Format::setSize -- Sets the font size
Format::setTextWrap -- Sets text wrapping
Format::setTextRotation -- Sets the orientation of the text
Format::setNumFormat -- Sets the numeric format.
Format::setStrikeOut -- Sets font as strikeout.
Format::setOutLine -- Sets outlining for a font.
Format::setShadow -- Sets font as shadow.
Format::setScript -- Sets the script type of the text
Format::setFontFamily -- Sets the font family.

Package for generating Excel spreadsheets

Introduction

Introduction -- how to generate Excel files

What is Spreadsheet_Excel_Writer?

Spreadsheet_Excel_Writer is a tool for creating Excel files without the need for COM components. The files generated by the current version of Spreadsheet_Excel_Writer correspond to the Excel 5 (BIFF5) format, so all functionality until that version of Excel (but not beyond) should be available.

Using it

The most common use for Spreadsheet_Excel_Writer will be spitting out large (or not so large) amounts of information in the form of a spreadsheet, which is easy to manipulate with a fairly ubiquitous spreadsheet program such as Excel (or OpenOffice).

So let's cut to the chase and see how this is done:

The first thing you should notice, is that we created a workbook before any worksheets. All worksheets are contained within a workbook, and a workbook may contain several worksheets.

Another important thing, which you should have in mind when programming with Spreadsheet_Excel_Writer, is that ampersand sign (&) that appears when we created our worksheet. That ampersand means we are referencing a Worksheet object instead of copying it. If you don't know what that means, don't worry, all you have to remember is to always use ampersands when calling addWorksheet() for creating a worksheet, or addFormat() for creating a format.

Saving to a regular file

You may have noticed also the following line:
// sending HTTP headers
$workbook->send('test.xls');
What that means is that we are sending our spreadsheet to a browser. But what if we just want to save the spreadsheet in our machine? Well, you just have to omit that line and give a valid file path to the workbook constructor.

For example, if we wanted to save the same spreadsheet we created in our first example to a file named 'test.xls', we would do it like so:

More tutorials

If you would like to learn about formatting (fonts, cell color, text alignment, etc...) with Spreadsheet_Excel_Writer, you can check the formatting tutorial here.

Formatting Tutorial

Formatting Tutorial -- how to format cells in a spreadsheet

What is a format?

A format is an object of type Spreadsheet_Excel_Writer_Format. This format can be applied to cells inside a spreadsheet so that these cells inherit the properties of the format (text alignment, background color, border colors, etc...).

Using it

Formats can't be created directly by a new call. You have to create a format using the addFormat() method from a Workbook, which associates your Format with this Workbook (you can't use the Format with another Workbook).

Let's see how addFormat() is used:

There, we just created a bold format. Notice the ampersand sign (&) that appears when we created our format. If you don't create your format like that it will appear as if all the format's properties you set are ignored.

Making something useful

Well, we just created our first format, but we didn't use it. Not very smart. So let's do something useful with a format.

Let's say you want to make your regular data filled spreadsheet. Only this time, when you proudly present your beautiful creation to your boss, the thing you most dread happens:

Pointy haired boss - Mmmmhhh, seems OK.

You - Yes, I added those totals as you requested.

Pointy haired boss - Mmmmhhh, you know, there's going to be a lot of customers using this spreadsheet...

You - So...

Pointy haired boss - Mmmmhhh, what do you think of changing the style for those headers there?

You - ...

Of course it won't be just those headers: "why don't we center this title here?", "Could you merge those cells over there?", "what do you think of using the company's colors for those titles?".

There are a number of ways for dealing with this situation, but in this tutorial we will stick to the one which will keep your job.

So let's begin work on the spreadsheet for DotCom.com.

There. Now all of those VC's out there are going to be calling like crazy asking for an oportunity to invest on DotCom.com. Wait a minute. These are not regular VC's we are talking about. These are very selective guys who wouldn't trust their money to the first start-up they happen to see on the internet. I know! Let's put the company's colors in there!

Merging cells

If you just tested the previous example you might have noticed that the title would need several cells to be seen correctly, but the format we applied only works for the first cell. So our title does not look very nice.

What can we do to fix that? Well, you could tell your boss that the title looks ok to you, and that he really needs to visit an ophthalmologist. Or you could use cell merging in order to make the title spread over several cells.

For this you have to use the setAlign() method with 'merge' as argument, and create some empty cells so the title can 'use' them as a sort of background (there will be a better way to do this in a future version of Spreadsheet_Excel_Writer).

Applying merging to our example script, we would have this:

Workbook::close

Workbook::close -- Calls finalization methods for the workbook

Description

Calls finalization methods for the workbook. This method should always be the last one to be called on every workbook.

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Workbook::&addWorksheet

Workbook::&addWorksheet -- Add a new worksheet to the Excel workbook.

Description

Add a new worksheet to the Excel workbook. If no name is given the name of the worksheet will be Sheeti with i in [1..].

Parameter

  • string $name - the optional name of the worksheet. Can not be longer than 31 characters.

Return value

returns a reference to a worksheet object on success, PEAR_Error on failure

Note

This function can not be called statically.

Workbook::&addFormat

Workbook::&addFormat -- Add a new format to the Excel workbook.

Description

Add a new format to the Excel workbook. Also, pass any properties to the Format constructor. Valid properties are:

  • Align

  • Bold

  • Bottom

  • Top

  • Left

  • Right

  • Border

  • BorderColor

  • BottomColor

  • TopColor

  • RightColor

  • LeftColor

  • FgColor

  • BgColor

  • Color

  • Pattern

  • Underline

  • TextRotation

  • Size

  • NumFormat

  • Script

Parameter

  • array $properties - array with properties for initializing the format.

Return value

object reference - to an Excel Format

Note

This function can not be called statically.

Workbook::&setTempDir

Workbook::&setTempDir -- Sets the temp dir used for storing the OLE file.

Description

Sets the temp dir used for storing the OLE file. Use this method if you don't have the right to write in the default temporary dir.

Parameter

  • string $dir - The dir to be used as temp dir

Return value

boolean - TRUE if given dir is valid, FALSE otherwise

Note

This function can not be called statically.

Workbook::setCustomColor

Workbook::setCustomColor -- Change the RGB components of the elements in the colour palette.

Description

Change the RGB components of the elements in the colour palette. The new color, defined by the given RGB components, will "overwrite" the color previously defined for the given index.

Parameter

  • integer $index - colour index

  • integer $red - red RGB value [0-255]

  • integer $green - green RGB value [0-255]

  • integer $blue - blue RGB value [0-255]

Return value

integer - The palette index for the custom color

Note

This function can not be called statically.

Worksheet::getName

Worksheet::getName -- Retrieve the worksheet name. This is usefull when creating worksheets

Description

Retrieve the worksheet name. This is usefull when creating worksheets without a name.

Return value

string - The worksheet's name

Note

This function can not be called statically.

Worksheet::setInputEncoding

Worksheet::setInputEncoding -- Allow writing for different charsets.

Description

It allows writing for different charsets by setting the worksheet's "current" charset. It has been tested for UTF-8, ISO-8859-7. It requires iconv for any charset other than UTF-16LE.

Parameter

  • string $encoding - The encoding. It suports all encodings supported by php's iconv() function.

Note

This function can not be called statically.

Worksheet::select

Worksheet::select -- Set this worksheet as a selected worksheet, i.e. the worksheet has its tab

Description

Set this worksheet as a selected worksheet, i.e. the worksheet has its tab highlighted.

Note

This function can not be called statically.

Worksheet::activate

Worksheet::activate -- Set this worksheet as the active worksheet, i.e. the worksheet that is

Description

Set this worksheet as the active worksheet, i.e. the worksheet that is displayed when the workbook is opened. Also set it as selected.

Note

This function can not be called statically.

Worksheet::setFirstSheet

Worksheet::setFirstSheet -- Set this worksheet as the first visible sheet. This is necessary

Description

Set this worksheet as the first visible sheet. This is necessary when there are a large number of worksheets and the activated worksheet is not visible on the screen.

Note

This function can not be called statically.

Worksheet::protect

Worksheet::protect -- Set the worksheet protection flag

Description

Set the worksheet protection flag to prevent accidental modification and to hide formulas if the locked and hidden format properties have been set.

Parameter

  • string $password - The password to use for protecting the sheet.

Note

This function can not be called statically.

Worksheet::setColumn

Worksheet::setColumn -- Set the width of a single column or a range of columns.

Description

Set the width of a single column or a range of columns.

Parameter

  • integer $firstcol - first column on the range

  • integer $lastcol - last column on the range

  • float $width - width to set

  • mixed $format - The optional XF format to apply to the columns

  • integer $hidden - The optional hidden atribute

Note

This function can not be called statically.

Worksheet::setSelection

Worksheet::setSelection -- Set which cell or cells are selected in a worksheet

Description

Set which cell or cells are selected in a worksheet

Parameter

  • integer $first_row - first row in the selected quadrant

  • integer $first_column - first column in the selected quadrant

  • integer $last_row - last row in the selected quadrant

  • integer $last_column - last column in the selected quadrant

Note

This function can not be called statically.

Worksheet::freezePanes

Worksheet::freezePanes -- Set panes and mark them as frozen.

Description

Set panes and mark them as frozen. One can use this method to mark certain regions in the worksheet so that they are "frozen" in the sense that when scrolling through the worksheet these regions are not affected by the scrolling and remain where they are on the screen. This is the same functionality as provided by Microsoft Excel through the Window+Freeze Panes menu command.

Parameter

  • array $panes - This is the only parameter received and is composed of the following: 0 => Vertical split position, 1 => Horizontal split position 2 => Top row visible 3 => Leftmost column visible 4 => Active pane

Note

This function can not be called statically.

Worksheet::thawPanes

Worksheet::thawPanes -- Set panes and mark them as unfrozen.

Description

Set panes and mark them as unfrozen.

Parameter

  • array $panes - This is the only parameter received and is composed of the following: 0 => Vertical split position, 1 => Horizontal split position 2 => Top row visible 3 => Leftmost column visible 4 => Active pane

Note

This function can not be called statically.

Worksheet::setPortrait

Worksheet::setPortrait -- Set the page orientation as portrait.

Description

Set the page orientation as portrait.

Note

This function can not be called statically.

Worksheet::setLandscape

Worksheet::setLandscape -- Set the page orientation as landscape.

Description

Set the page orientation as landscape.

Note

This function can not be called statically.

Worksheet::setPaper

Worksheet::setPaper -- Set the paper type. Ex. 1 = US Letter, 9 = A4

Description

Set the paper type. Ex. 1 = US Letter, 9 = A4

Parameter

  • integer $size - The type of paper size to use

Note

This function can not be called statically.

Worksheet::setHeader

Worksheet::setHeader -- Set the page header caption and optional margin.

Description

Set the page header caption and optional margin.

Parameter

  • string $string - The header text

  • float $margin - optional head margin in inches.

Note

This function can not be called statically.

Worksheet::setFooter

Worksheet::setFooter -- Set the page footer caption and optional margin.

Description

Set the page footer caption and optional margin.

Parameter

  • string $string - The footer text

  • float $margin - optional foot margin in inches.

Note

This function can not be called statically.

Worksheet::centerHorizontally

Worksheet::centerHorizontally -- Center the page horizontally.

Description

Center the page horizontally.

Parameter

  • integer $center - the optional value for centering. Defaults to 1 (center).

Note

This function can not be called statically.

Worksheet::centerVertically

Worksheet::centerVertically -- Center the page vertically.

Description

Center the page vertically.

Parameter

  • integer $center - the optional value for centering. Defaults to 1 (center).

Note

This function can not be called statically.

Worksheet::setMargins

Worksheet::setMargins -- Set all the page margins to the same value in inches.

Description

Set all the page margins to the same value in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::setMargins_LR

Worksheet::setMargins_LR -- Set the left and right margins to the same value in inches.

Description

Set the left and right margins to the same value in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::setMargins_TB

Worksheet::setMargins_TB -- Set the top and bottom margins to the same value in inches.

Description

Set the top and bottom margins to the same value in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::setMarginLeft

Worksheet::setMarginLeft -- Set the left margin in inches.

Description

Set the left margin in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::setMarginRight

Worksheet::setMarginRight -- Set the right margin in inches.

Description

Set the right margin in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::setMarginTop

Worksheet::setMarginTop -- Set the top margin in inches.

Description

Set the top margin in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::setMarginBottom

Worksheet::setMarginBottom -- Set the bottom margin in inches.

Description

Set the bottom margin in inches.

Parameter

  • float $margin - The margin to set in inches

Note

This function can not be called statically.

Worksheet::repeatRows

Worksheet::repeatRows -- Set the rows to repeat at the top of each printed page.

Description

Set the rows to repeat at the top of each printed page.

Parameter

  • integer $first_row - First row to repeat

  • integer $last_row - Last row to repeat. Optional.

Note

This function can not be called statically.

Worksheet::repeatColumns

Worksheet::repeatColumns -- Set the columns to repeat at the left hand side of each printed page.

Description

Set the columns to repeat at the left hand side of each printed page.

Parameter

  • integer $first_col - First column to repeat

  • integer $last_col - Last column to repeat. Optional.

Note

This function can not be called statically.

Worksheet::printArea

Worksheet::printArea -- Set the area of each worksheet that will be printed.

Description

Set the area of each worksheet that will be printed.

Parameter

  • integer $first_row - First row of the area to print

  • integer $first_col - First column of the area to print

  • integer $last_row - Last row of the area to print

  • integer $last_col - Last column of the area to print

Note

This function can not be called statically.

Worksheet::hideGridlines

Worksheet::hideGridlines -- Set the option to hide gridlines on the printed page.

Description

Set the option to hide gridlines on the printed page.

Note

This function can not be called statically.

Worksheet::printRowColHeaders

Worksheet::printRowColHeaders -- Set the option to print the row and column headers on the printed page.

Description

Set the option to print the row and column headers on the printed page.

Parameter

  • integer $print - Whether to print the headers or not. Defaults to 1 (print).

Note

This function can not be called statically.

Worksheet::fitToPages

Worksheet::fitToPages -- Store the vertical and horizontal number of pages that will define the

Description

Store the vertical and horizontal number of pages that will define the maximum area printed. It doesn't seem to work with OpenOffice.

Parameter

  • integer $width - Maximun width of printed area in pages

  • integer $height - Maximun heigth of printed area in pages

Note

This function can not be called statically.

Worksheet::setHPagebreaks

Worksheet::setHPagebreaks -- Store the horizontal page breaks on a worksheet (for printing).

Description

Store the horizontal page breaks on a worksheet (for printing). The breaks represent the row after which the break is inserted.

Parameter

  • array $breaks - Array containing the horizontal page breaks

Note

This function can not be called statically.

Worksheet::setVPagebreaks

Worksheet::setVPagebreaks -- Store the vertical page breaks on a worksheet (for printing).

Description

Store the vertical page breaks on a worksheet (for printing). The breaks represent the column after which the break is inserted.

Parameter

  • array $breaks - Array containing the vertical page breaks

Note

This function can not be called statically.

Worksheet::setZoom

Worksheet::setZoom -- Set the worksheet zoom factor.

Description

Set the worksheet zoom factor.

Parameter

  • integer $scale - The zoom factor

Note

This function can not be called statically.

Worksheet::setPrintScale

Worksheet::setPrintScale -- Set the scale factor for the printed page.

Description

Set the scale factor for the printed page. It turns off the "fit to page" option

Parameter

  • integer $scale - The optional scale factor. Defaults to 100

Note

This function can not be called statically.

Worksheet::write

Worksheet::write -- Map to the appropriate write method acording to the token recieved.

Description

Map to the appropriate write method acording to the token recieved.

Parameter

  • integer $row - The row of the cell we are writing to

  • integer $col - The column of the cell we are writing to

  • mixed $token - What we are writing

  • mixed $format - The optional format to apply to the cell

Note

This function can not be called statically.

Worksheet::writeNumber

Worksheet::writeNumber -- Write a double to the specified row and column (zero indexed).

Description

Write a double to the specified row and column (zero indexed). An integer can be written as a double. Excel will display an integer. $format is optional. Returns 0 : normal termination -2 : row or column out of range

Parameter

  • integer $row - Zero indexed row

  • integer $col - Zero indexed column

  • float $num - The number to write

  • mixed $format - The optional XF format

Note

This function can not be called statically.

Worksheet::writeString

Worksheet::writeString -- Write a string to the specified row and column (zero indexed).

Description

Write a string to the specified row and column (zero indexed). NOTE: there is an Excel 5 defined limit of 255 characters. $format is optional. Returns 0 : normal termination -1 : insufficient number of arguments -2 : row or column out of range -3 : long string truncated to 255 chars

Parameter

  • integer $row - Zero indexed row

  • integer $col - Zero indexed column

  • string $str - The string to write

  • mixed $format - The XF format for the cell

Note

This function can not be called statically.

Worksheet::writeNote

Worksheet::writeNote -- Writes a note associated with the cell given by the row and column.

Description

Writes a note associated with the cell given by the row and column. NOTE records don't have a length limit.

Parameter

  • integer $row - Zero indexed row

  • integer $col - Zero indexed column

  • string $note - The note to write

Note

This function can not be called statically.

Worksheet::writeBlank

Worksheet::writeBlank -- Write a blank cell to the specified row and column (zero indexed).

Description

Write a blank cell to the specified row and column (zero indexed). A blank cell is used to specify formatting without adding a string or a number. A blank cell without a format serves no purpose. Therefore, we don't write a BLANK record unless a format is specified. This is mainly an optimisation for the write_row() and write_col() methods. Returns 0 : normal termination (including no format) -1 : insufficient number of arguments -2 : row or column out of range

Parameter

  • integer $row - Zero indexed row

  • integer $col - Zero indexed column

  • mixed $format - The XF format

Note

This function can not be called statically.

Example

Example 41-1. Using writeBlank()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Worksheet::writeFormula

Worksheet::writeFormula -- Write a formula to the specified row and column (zero indexed).

Description

Write a formula to the specified row and column (zero indexed). In case of error it will write the error message (instead of the formula) in the corresponding row and column.

Parameter

  • integer $row - Zero indexed row

  • integer $col - Zero indexed column

  • string $formula - The formula text string

  • mixed $format - The optional XF format

Return value

integer - 0 for normal termination, -1 for an error in the formula, -2 for row or column out of range.

Note

This function can not be called statically.

Formulas must start with an equal sign ('=').

Arguments given to an Excel function should be separated by comas (','), not by semicolons (';').

Worksheet::writeUrl

Worksheet::writeUrl -- Write a hyperlink. This is comprised of two elements: the visible label and

Description

Write a hyperlink. This is comprised of two elements: the visible label and the invisible link. The visible label is the same as the link unless an alternative string is specified. The label is written using the writeString() method. Therefore the 255 characters string limit applies. $string and $format are optional and their order is interchangeable. The hyperlink can be to a http, ftp, mail, internal sheet, or external directory url. Returns 0 : normal termination -1 : insufficient number of arguments -2 : row or column out of range -3 : long string truncated to 255 chars

Parameter

  • integer $row - Row

  • integer $col - Column

  • string $url - URL string

  • string $string - Alternative label

  • mixed $format - The cell format

Note

This function can not be called statically.

Worksheet::setRow

Worksheet::setRow -- This method is used to set the height and XF format for a row.

Description

This method is used to set the height and XF format for a row. Writes the BIFF record ROW.

Parameter

  • integer $row - The row to set

  • integer $height - Height we are giving to the row. Use NULL to set XF without setting height

  • mixed $format - XF format we are giving to the row

Note

This function can not be called statically.

Worksheet::mergeCells

Worksheet::mergeCells -- This is an Excel97/2000 method. It is required to perform more complicated

Description

This is an Excel97/2000 method. It is required to perform more complicated merging than the normal setAlign('merge'). It merges the area given by its arguments.

Parameter

  • integer $first_row - First row of the area to merge

  • integer $first_col - First column of the area to merge

  • integer $last_row - Last row of the area to merge

  • integer $last_col - Last column of the area to merge

Note

This function can not be called statically.

Worksheet::insertBitmap

Worksheet::insertBitmap -- Insert a 24bit bitmap image in a worksheet. The main record required is

Description

Insert a 24bit bitmap image in a worksheet. The main record required is IMDATA but it must be proceeded by a OBJ record to define its position.

Parameter

  • integer $row - The row we are going to insert the bitmap into

  • integer $col - The column we are going to insert the bitmap into

  • string $bitmap - The bitmap filename

  • integer $x - The horizontal position (offset) of the image inside the cell.

  • integer $y - The vertical position (offset) of the image inside the cell.

  • integer $scale_x - The horizontal scale

  • integer $scale_y - The vertical scale

Note

This function can not be called statically.

Worksheet::setOutline

Worksheet::setOutline -- This method sets the properties for outlining and grouping

Description

This method sets the properties for outlining and grouping. The defaults correspond to Excel's defaults.

Parameter

  • bool $visible -

  • bool $symbols_below -

  • bool $symbols_right -

  • bool $auto_style -

Note

This function can not be called statically.

Spreadsheet_Excel_Writer::Spreadsheet_Excel_Writer

Spreadsheet_Excel_Writer::Spreadsheet_Excel_Writer -- The constructor. It just creates a Workbook

Description

The constructor. It just creates a Workbook

Parameter

  • string $filename - The optional filename for the Workbook.

Return value

object The - Workbook created

Note

This function can not be called statically.

Spreadsheet_Excel_Writer::send

Spreadsheet_Excel_Writer::send -- Send HTTP headers for the Excel file.

Description

Send HTTP headers for the Excel file.

Parameter

  • string $filename - The filename to use for HTTP headers

Note

This function can not be called statically.

Spreadsheet_Excel_Writer::rowcolToCell

Spreadsheet_Excel_Writer::rowcolToCell -- Utility function for writing formulas.

Description

Utility function for writing formulas. Converts a cell's coordinates to the A1 format.

Parameter

  • integer $row - Row for the cell to convert (0-indexed).

  • integer $col - Column for the cell to convert (0-indexed).

Return value

returns The cell identifier in A1 format on success, PEAR_Error on failure

Format::setAlign

Format::setAlign -- Set cell alignment.

Description

Set cell alignment.

Parameter

  • string $location - alignment for the cell

    Horizontal Alignments (pick one): left, center, right, fill, justify, merge, equal_space.

    Vertical Alignments (pick one): top, vcenter, bottom, vjustify, vequal_space.

    To implement a combination of Horizontal and Vertical Alignments, call this method two times.

Note

This function can not be called statically.

Format::setVAlign

Format::setVAlign -- Set cell alignment.

Description

Set cell alignment. This is an alternative to setAlign()

Parameter

  • string $location - alignment for the cell

    top, vcenter, bottom, vjustify, vequal_space.

Note

This function can not be called statically.

Format::setHAlign

Format::setHAlign -- Set cell alignment.

Description

Set cell alignment. This is an alternative to setAlign()

Parameter

  • string $location - alignment for the cell

    left, center, right, fill, justify, merge, equal_space.

Note

This function can not be called statically.

Format::setMerge

Format::setMerge -- This is an alias for the unintuitive setAlign('merge')

Description

This is an alias for the unintuitive setAlign('merge')

Note

This function can not be called statically.

Format::setBold

Format::setBold -- Sets the boldness of the text.

Description

Sets the boldness of the text. Bold has a range 100..1000. 0 (400) is normal. 1 (700) is bold.

Parameter

  • integer $weight - Weight for the text, 0 maps to 400 (normal text) 1 maps to 700 (bold text). Valid range is: 100-1000 It's Optional, default is 1 (bold).

Note

This function can not be called statically.

Format::setBottom

Format::setBottom -- Sets the width for the bottom border of the cell

Description

Sets the width for the bottom border of the cell

Parameter

  • integer $style - style of the cell border. 1 => thin, 2 => thick.

Note

This function can not be called statically.

Example

Example 41-1. Using setBottom()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setBottom(1);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Format::setTop

Format::setTop -- Sets the width for the top border of the cell

Description

Sets the width for the top border of the cell

Parameter

  • integer $style - style of the cell top border. 1 => thin, 2 => thick.

Note

This function can not be called statically.

Example

Example 41-1. Using setTop()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Format::setLeft

Format::setLeft -- Sets the width for the left border of the cell

Description

Sets the width for the left border of the cell

Parameter

  • integer $style - style of the cell left border. 1 => thin, 2 => thick.

Note

This function can not be called statically.

Example

Example 41-1. Using setLeft()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Format::setRight

Format::setRight -- Sets the width for the right border of the cell

Description

Sets the width for the right border of the cell

Parameter

  • integer $style - style of the cell right border. 1 => thin, 2 => thick.

Note

This function can not be called statically.

Example

Example 41-1. Using setRight()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Format::setBorder

Format::setBorder -- Set cells borders to the same style

Description

Set cells borders to the same style

Parameter

  • integer $style - style to apply for all cell borders. 1 => thin, 2 => thick.

Note

This function can not be called statically.

Format::setBorderColor

Format::setBorderColor -- Sets all the cell's borders to the same color

Description

Sets all the cell's borders to the same color

Parameter

  • mixed $color - The color we are setting. Either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Example

Example 41-1. Using setBorderColor()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Format::setBottomColor

Format::setBottomColor -- Sets the cell's bottom border color

Description

Sets the cell's bottom border color

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Format::setTopColor

Format::setTopColor -- Sets the cell's top border color

Description

Sets the cell's top border color

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Format::setLeftColor

Format::setLeftColor -- Sets the cell's left border color

Description

Sets the cell's left border color

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Format::setRightColor

Format::setRightColor -- Sets the cell's right border color

Description

Sets the cell's right border color

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Format::setFgColor

Format::setFgColor -- Sets the cell's foreground color

Description

Sets the cell's "foreground color".

The term "foreground color" is misleading. Here, "foreground" means the top layer of a cell's background. To set the color of a cell's contents, use the setColor() method.

The color actually seen may depend on the pattern and background color being used.

The example entitled "How background and foreground colors interact with patterns" is very helpful.

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    See the "Using colors" section, below, for more information.

Using colors

The following colors can be defined by name: black, white, red, green, blue, yellow, magenta and cyan.

To learn what the other indexed colors look like, read Color Palette and the 56 Excel ColorIndex Colors. Beware that the color indexes listed there are displaced by 1 with respect to those used by Spreadsheet_Excel_Writer.

If the predifined colors don't meet your requirements, use the setCustomColor() method.

Note

This function can not be called statically.

Format::setBgColor

Format::setBgColor -- Sets the cell's background color

Description

Sets the cell's "background color".

The term "background color" is misleading. Here, "background" means the bottom layer of a cell's background.

This method only comes into play when creating patterns via the setPattern() method. In general, chances are you are more interested in using the setFgColor() method.

The example entitled "How background and foreground colors interact with patterns" is very helpful.

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Format::setColor

Format::setColor -- Sets the color of a cell's content

Description

Sets the color of a cell's content

Parameter

  • mixed $color - either a string (like 'blue'), or an integer (range is [8...63]).

    Please see the "Using colors" section of the manual for more information.

Note

This function can not be called statically.

Format::setPattern

Format::setPattern -- Sets the fill pattern attribute of a cell

Description

Sets the fill pattern attribute of a cell. Use in combination with the setBgColor() and setFgColor() methods.

The example entitled "How background and foreground colors interact with patterns" is very helpful.

Parameter

  • integer $arg - Optional. Defaults to 1. Meaningful values are: 0-18. 0 = no background. 1 = solid "background" using the color set by setFgColor().

Note

This function can not be called statically.

Format::setUnderline

Format::setUnderline -- Sets the underline of the text

Description

Sets the underline of the text

Parameter

  • integer $underline - The value for underline. Possible values are 1 => underline, 2 => double underline.

Note

This function can not be called statically.

Format::setItalic

Format::setItalic -- Sets the font style as italic

Description

Sets the font style as italic

Note

This function can not be called statically.

Format::setSize

Format::setSize -- Sets the font size

Description

Sets the font size

Parameter

  • integer $size - The font size (in pixels I think).

Note

This function can not be called statically.

Example

Example 41-1. Using setSize()

require_once 'Spreadsheet/Excel/Writer.php';

$workbook = new Spreadsheet_Excel_Writer();
$worksheet =& $workbook->addWorksheet();
// we can set set all properties on instantiation
$upper_right_side_brick =& $workbook->addFormat(array('right' => 5, 'top' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
// or set all properties one by one
$upper_left_side_brick =& $workbook->addFormat();
$upper_left_side_brick->setLeft(5);
$upper_left_side_brick->setTop(5);
$upper_left_side_brick->setSize(15);
$upper_left_side_brick->setPattern(1);
$upper_left_side_brick->setBorderColor('blue');
$upper_left_side_brick->setFgColor('red');

$lower_right_side_brick =& $workbook->addFormat(array('right' => 5, 'bottom' => 5, 'size' => 15,
                                                      'pattern' => 1, 'bordercolor' => 'blue',
                                                      'fgcolor' => 'red'));
$lower_left_side_brick =& $workbook->addFormat(array('left' => 5, 'bottom' => 5, 'size' => 15,
                                                     'pattern' => 1, 'bordercolor' => 'blue',
                                                     'fgcolor' => 'red'));

$worksheet->setColumn(0, 20, 6);

// Sky
$sky =& $workbook->addFormat(array('fgcolor' => 'cyan', 'pattern' => 1, 'size' => 15));
for ($i = 0; $i <= 10; $i++)
{
    for ($j = 0; $j < 20; $j++) {
        $worksheet->writeBlank($i, $j, $sky);
    }
}

// Cloud
$cloud =& $workbook->addFormat(array('fgcolor' => 'white', 'pattern' => 1, 'size' => 15));
$worksheet->writeBlank(5, 7, $cloud);
$worksheet->writeBlank(4, 8, $cloud);
$worksheet->writeBlank(5, 8, $cloud);
$worksheet->writeBlank(6, 8, $cloud);
$worksheet->writeBlank(4, 9, $cloud);
$worksheet->writeBlank(5, 9, $cloud);
$worksheet->writeBlank(5, 10, $cloud);

// Bricks
for ($j = 0; $j < 20; $j++)
{
    for ($i = 5; $i <= 11; $i++)
    {
        if (($i + $j)%2 == 1) // right side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_right_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_right_side_brick);
        }
        else // left side of brick
        {
            $worksheet->writeBlank(2*$i, $j, $upper_left_side_brick);
            $worksheet->writeBlank(2*$i + 1, $j, $lower_left_side_brick);
        }
    }
}

// hide gridlines so they don't mess with our Excel art.
$worksheet->hideGridLines();

$workbook->send('bricks.xls');
$workbook->close();

Format::setTextWrap

Format::setTextWrap -- Sets text wrapping

Description

Sets text wrapping

Note

This function can not be called statically.

Format::setTextRotation

Format::setTextRotation -- Sets the orientation of the text

Description

Sets the orientation of the text

Parameter

  • integer $angle - The rotation angle for the text (clockwise). Possible values are: 0, 90, 270 and -1 for stacking top-to-bottom.

Note

This function can not be called statically.

Format::setNumFormat

Format::setNumFormat -- Sets the numeric format.

Description

Sets the numeric format. It can be date, time, currency, etc... The following table lists possible values for $num_format and the corresponding types that a numeric format expects as arguments.

Table 41-1. Numeric formats and types

0DecimalThe amount of zeros specifies the amount of digits that will be shown
0.00DecimalThe amount of zeros after the decimal dot specifies the amount of decimal digits that will be shown
#.##DecimalThe amount of sharp signs after the decimal dot specifies the maximum amount of decimal digits that will be shown
0%PercentThe amount of zeros specifies the amount of digits that will be shown.
0.000%PercentThe amount of zeros after the decimal dot specifies the amount of decimal digits that will be shown.
$#.#;[Red]($#.#)CurrencyZeros and sharp signs have the same meaning as in other formats.
??/??FractionThe amount of question signs in the denominator determines its precision (maximum amount of digits in the denominator).
# ??/??FractionA fraction with an integer part. Zeros and sharp signs are used for defining the integer part, and they have the same meaning as in other formats.
0.00E+#ScientificIn scientific notation base and exponent are formated according to the same rules applied to decimals. For scientific notation zeros and sharp signs appear to be equivalent.
D-MMM-YYDateA date represented in the given notation. Month can be a one or two digits month, or a three letter month. Year can have 2 or 4 digits. The argument to be formated as a date is considered to be the number of days since December 30 1899 (Excel's day zero). For dates preceding day zero, negative numbers can be used.
D/M/YYYY h:mm:ssDate/TimeA date represented in the given notation. The argument to be formated as a date is considered to be the number of days since Excel's day zero.
h:mm:ss AM/PMTimeA time represented in the given notation. Be careful, the argument to be formated as a time has to be given in days. For example an argument of 0.5 would be presented as '12:00:00 PM'.

The information here presented comes from OpenOffice.org's Documentation of the Microsoft Excel File Format (http://sc.openoffice.org/excelfileformat.pdf).

Parameter

  • string $num_format - The numeric format.

Note

This function can not be called statically.

Format::setStrikeOut

Format::setStrikeOut -- Sets font as strikeout.

Description

Sets font as strikeout.

Note

This function can not be called statically.

Format::setOutLine

Format::setOutLine -- Sets outlining for a font.

Description

Sets outlining for a font.

Note

This function can not be called statically.

Format::setShadow

Format::setShadow -- Sets font as shadow.

Description

Sets font as shadow.

Note

This function can not be called statically.

Format::setScript

Format::setScript -- Sets the script type of the text

Description

Sets the script type of the text

Parameter

  • integer $script - The value for script type. Possible values are 1 => superscript, 2 => subscript.

Note

This function can not be called statically.

Format::setFontFamily

Format::setFontFamily -- Sets the font family.

Description

Sets the font family.

Parameter

  • string $font_family - The font family name. Possible values are: 'Times New Roman', 'Arial', 'Courier'.

Note

This function can not be called statically.


Chapter 42. File System

Provides Packages for working with files and file system



Archive-Tar

Table of Contents
Archive_Tar::Archive_Tar() -- constructor
Archive_Tar::add() -- add files or directories
Archive_Tar::addModify() -- add files or directories
Archive_Tar::create() -- create archive file
Archive_Tar::createModify() -- create a new archive
Archive_Tar::extract() -- extract files
Archive_Tar::extractList() -- extract a list files
Archive_Tar::extractModify() -- extract files to a new dir
Archive_Tar::listContent() -- list files and directories in archive
Archive_Tar::extractInString() -- extract one file and return it as a string
Archive_Tar::addString() -- add a string in the archive

Archive_Tar provides an API for handling (compressed) Tar archives.

Archive_Tar::Archive_Tar()

Archive_Tar::Archive_Tar() -- constructor

Description

The constructor declares a new Archive_Tar object, identifying it by the name of the tar file.

Parameter

  • string $tarname - the name of the tar archive to work with

  • mixed $compress - if TRUE, indicates that the archive is compressed (using gzip). if NULL the archive is not compressed, if 'gz' or 'bz2', indicates that the archive is compressed with gzip or bz2. For compatibility reason the boolean value TRUE means 'gz'.

Archive_Tar::add()

Archive_Tar::add() -- add files or directories

Description

This method adds files and directories to an existing archive. If the archive does not exist, it attempts to create it. The files and directories listed are added at the end of the archive, even if a file with the same name is already archived.

Parameter

  • mixed $filelist - an array of filenames and directory names, or a single string with names separated by a single blank space. For each directory added in the archive, the files and sub-directories are also added.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Archive_Tar::addModify()

Archive_Tar::addModify() -- add files or directories

Description

This methods add files and directories listed in filelist at the end of the existing archive.

If the archive does not exists it attempts to create it. If a file or directory is already in the archive it will only be added at the end of the archive. There is no update of the existing archived file or directory. However while extracting the archive, the last file will replace the first one. This results in a none optimization of the archive size. If a file or directory does not exists, it is ignored.

Parameter

  • mixed $filelist - an array of filenames and directory names, or a single string with names separated by a single blank space.

  • string $add_dir - a string which contains a path to be added to the memorized path of each element in the list.

  • string $remove_dir - a string which contains a path to be removed from the memorized path of each element in the list, when relevant.

    The path indicated in add_dir will be added at the beginning of the memorized path of each file/directory listed. However it can be set to empty ''. The adding of a path is done after the removing of path. The path add/remove ability enables the user to prepare an archive for extraction in a different path than the original path.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Example

On Windows system, Windows path format can be used. However if the files are using a Windows path, the $remove_dir parameter must also be in Windows path format. The $add_dir parameter can be in Windows or Unix path format.

Archive_Tar::create()

Archive_Tar::create() -- create archive file

Description

This method creates the archive file and adds the listed files or directories.

If a file with the same tar name exists and is writable, it is replaced by the new tar archive (it is not an 'add', but a 'create'). If a file exists and is write-protected or is a folder, the method raises a PEAR_Error.

Parameter

  • mixed $filelist - an array of filenames and directory names, or a single string with names separated by a single blank space. For each directory added in the archive, the files and sub-directories are also added.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Archive_Tar::createModify()

Archive_Tar::createModify() -- create a new archive

Description

This method creates the archive file and adds the listed files or directories.

If the file already exists and is writable, it is replaced by the new tar. It is a 'create' and not a 'add'. If the file exists and is read-only or is a directory, it is not replaced.

Parameter

  • mixed $filelist - an array of filenames and directory names, or a single string with names separated by a single blank space.

  • string $add_dir - contains a path to be added to the memorized path of each element in the list.

  • string $remove_dir - contains a path to be removed from the memorized path of each element in the list, when relevant. Default is an empty string.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Archive_Tar::extract()

Archive_Tar::extract() -- extract files

Description

Extracts the files from the archive into the given path.

While extracting a file: If the file already exists it is replaced without looking for last modification date. If the file already exists and is write protected, the extraction is aborted. If a directory with the same name already exists, the extraction is aborted.

However the result can be a partial extraction that may need to be manually cleaned.

Parameter

  • string $path - the destination path to extract

Return value

boolean - Returns TRUE on success, FALSE on failure.

Throws

Table 42-1. Possible PEAR_Error values

Error codeError messageReasonSolution
NULL " Unable to open in read mode archive " The file is exclusively locked by another application. Check for other applications working on the file. This can not be caused by a competive processing the archive with Archive_Tar
NULL " Unable to open in write mode archive " The file is locked by another application. Check for other applications working on the file. This maybe caused by a competive processing the archive with Archive_Tar
NULL " Invalid extract mode mode " Implementation error Should not occur, please set up a bug report.
NULL " Directory name already exists as a file " A file is marked up as directory in the archive. Maybe a corrupted archive.
NULL " File name already exists as a directory " A directoy is marked up as file in the archive. Maybe a corrupted archive.
NULL " File name already exists and is write protected. " The archive contains a file which already exists in the destination dir and can not be overwritten. Extract the archive to an empty directory.
NULL " Unable to create path for name " One or more new nested directories could not be created in the destination directory. Ensure that the destination directory and all nested directories have the required permissions.
NULL " Unable to create directory name " A directory could not be created in the destination directory. Ensure that the destination directory has the required permissions.
NULL " Error while opening name in write binary mode " The file could not be created. The file is possibly locked.
NULL " Extracted file filename does not have the correct file size filesize (size expected). Archive may be corrupted. " Read the message. Read the message.

Note

This function can not be called statically.

Archive_Tar::extractList()

Archive_Tar::extractList() -- extract a list files

Description

This method extracts only the files from the archive that are indicated in the $filelist. These files are extracted in the current directory or in the directory indicated by the optional $path parameter.

Parameter

  • string $filelist - an array of filenames and directory names, or a single string with names separated by a single blank space.

  • string $path - the path of the directory where the files and/or directory need to by extracted.

  • string $remove_path - part of the memorized path that can be removed if present at the beginning of the files or directories path.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Throws

Table 42-1. Possible PEAR_Error values

Error codeError messageReasonSolution
NULL " Unable to open in read mode archive " The file is exclusively locked by another application. Check for other applications working on the file. This can not be caused by a competive processing the archive with Archive_Tar
NULL " Unable to open in write mode archive " The file is locked by another application. Check for other applications working on the file. This maybe caused by a competive processing the archive with Archive_Tar
NULL " Invalid extractlist mode mode " Implementation error Should not occur, please set up a bug report.
NULL " Directory name already exists as a file " A file is marked up as directory in the archive. Maybe a corrupted archive.
NULL " File name already exists as a directory " A directoy is marked up as file in the archive. Maybe a corrupted archive.
NULL " File name already exists and is write protected. " The archive contains a file which already exists in the destination dir and can not be overwritten. Extract the archive to an empty directory.
NULL " Unable to create path for name " One or more new nested directories could not be created in the destination directory. Ensure the destination directory and all nested directories have the required permissions.
NULL " Unable to create directory name " A directory could not be created in the destination directory. Ensure the destination directory has the required permissions.
NULL " Error while opening name in write binary mode " The file could not be created. The file is maybe locked.
NULL " Extracted file filename does not have the correct file size filesize (size expected). Archive may be corrupted. " Read the message. Read the message.

Note

This function can not be called statically.

Archive_Tar::extractModify()

Archive_Tar::extractModify() -- extract files to a new dir

Description

This method extracts all the content of the archive in the directory indicated by path. When relevant the memorized path of the files or directories can be modified by removing the remove_path path at the beginning of the file or directory path.

While extracting a file: If the file already exists it is replaced without looking for last modification date. If the file already exists and is write protected, the extraction is aborted. If a directory with the same name already exists, the extraction is aborted.

While extracting a directory, if a file with the same name already exists, the extraction is aborted. While extracting a file/directory if the destination directory exist and is write protected, or does not exist but can not be created, the extraction is aborted. If after extraction an extracted file does not show the correct stored file size, the extraction is aborted.

Parameter

  • string $path - the path of the directory where the files and/or directories need to by extracted.

  • string $remove_path - part of the memorized path that can be removed if present at the beginning of the files or directories path.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Throws

Table 42-1. Possible PEAR_Error values

Error codeError messageReasonSolution
NULL " Unable to open in read mode archive " The file is exclusive locked by another application. Check for other applications working on the file. This can not be caused by a competive processing the archive with Archive_Tar
NULL " Unable to open in write mode archive " The file is locked by another application. Check for other applications working on the file. This maybe caused by a competive processing the archive with Archive_Tar
NULL " Invalid extractmodify mode mode " Implementation error Should not occur, please set up a bug report.
NULL " Directory name already exists as a file " A file is marked up as directory in the archive. Maybe a corrupted archive.
NULL " File name already exists as a directory " A directoy is marked up as file in the archive. Maybe a corrupted archive.
NULL " File name already exists and is write protected. " The archive contains a file which already exists in the destination dir and can not be overwritten. Extract the archive to an empty directory.
NULL " Unable to create path for name " One or more new nested directories could not be created in the destination directory. Ensure the destination directory and all nested directories have the required rights.
NULL " Unable to create directory name " A directory could not be created in the destination directory. Ensure the destination directory has the required rights.
NULL " Error while opening name in write binary mode " The file could not be created. The file is maybe locked.
NULL " Extracted file filename does not have the correct file size filesize (size expected). Archive may be corrupted. " Read the message. Read the message.

Note

This function can not be called statically.

Archive_Tar::listContent()

Archive_Tar::listContent() -- list files and directories in archive

Description

Lists the files and the directories of the archive.

Return value

array - each array entry represents a file or folder. The array is not sorted, so the index shows the position of the file or directory in the archive.

Each entry contains the following information:

  • $file['filename'] - Name and path of the file/dir.

  • $file['mode'] - File permissions (result of fileperms())

  • $file['uid'] - user id

  • $file['gid'] - group id

  • $file['size'] - filesize

  • $file['mtime'] - Last modification time (result of filemtime())

  • $file['typeflag'] - empty for file, "5" for directory

Throws

Table 42-1. Possible PEAR_Error values

Error codeError messageReasonSolution
NULL " Unable to open in read mode archive " The file is exclusively locked by another application. Check for other applications working on the file. This can not be caused by a competive processing the archive with Archive_Tar
NULL " Invalid listcontent mode mode " Implementation error Should not occur, please set up a bug report.
NULL " Directory name already exists as a file " A file is marked up as directory in the archive. Maybe a corrupted archive.
NULL " File name already exists as a directory " A directoy is marked up as file in the archive. Maybe a corrupted archive.
NULL " File name already exists and is write protected. " The archive contains a file which already exists in the destination dir and can not be overwritten. Extract the archive to an empty directory.
NULL " Unable to create path for name " One or more new nested directories could not be created in the destination directory. Ensure the destination directory and all nested directories have the required rights.
NULL " Unable to create directory name " A directory could not be created in the destination directory. Ensure the destination directory has the required rights.
NULL " Error while opening name in write binary mode " The file could not be created. The file is maybe locked.
NULL " Extracted file filename does not have the correct file size filesize (size expected). Archive may be corrupted. " Read the message. Read the message.

Note

This function can not be called statically.

Archive_Tar::extractInString()

Archive_Tar::extractInString() -- extract one file and return it as a string

Description

This method extracts the file identified by path from the archive and returns it as a string. It does not use temporary files.

Parameter

  • string $path - the path of the file to extract

Return value

string - the content of the extracted file

Note

This function can not be called statically.

Archive_Tar::addString()

Archive_Tar::addString() -- add a string in the archive

Description

This method adds the string content in the archive like a file with full filename filename.

If the archive does not exists it attempts to create it.

Parameter

  • string $filename - the path and filename that will be associated with the added string in the archive.

  • string $content - the string to add in the archive as a file.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.


File

Table of Contents
Introduction --  Introduction to the File class
Constants -- Predefined Constants
File::buildpath() -- build a path from given parts array
File::close() -- closes an open file pointer
File::getTempDir() -- retrieves the system's temporary directory
File::getTempFile() -- returns a path to a temporary file
File::isAbsolute() -- checks wether the given path is an absolute path
File::read() -- read bytes from a file
File::readAll() -- reads a complete file
File::readChar() -- reads a single character from a file
File::readLine() -- reads a single line from a file
File::rewind() -- rewinds a file pointer
File::skipRoot() -- strips the root directory from a given path
File::stripLeadingSeparators() -- strip leading separators from a path
File::stripTrailingSeparators() -- strips trailing separators from a path
File::unlock() -- unlocks a locked file pointer
File::write() -- writes bytes to a file
File::writeChar() -- writes a single character to a file
File::writeLine() -- writes a single line to a file

Common file and directory routines

Introduction

Introduction --  Introduction to the File class

Description

File provides an easy interface to PHP's builtin file and directory functions, plus some functions to deal with paths.

Constants

Constants -- Predefined Constants

FILE_DEFAULT_READSIZE

The default number of bytes to read from a file.

FILE_MODE_WRITE

Using this mode, opened files will be truncated first and then new data will be written to them.

FILE_MODE_APPEND

Using this mode, new data will be appended to the end of opened files.

File::buildpath()

File::buildpath() -- build a path from given parts array

Description

Parameter

Return value

Throws

Deprecated

deprecated

Note

This function can be called statically.

See

File::close()

File::close() -- closes an open file pointer

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::getTempDir()

File::getTempDir() -- retrieves the system's temporary directory

Description

Parameter

Return value

Throws

Deprecated

deprecated

Note

This function can be called statically.

See

File::getTempFile()

File::getTempFile() -- returns a path to a temporary file

Description

Parameter

Return value

Throws

Deprecated

deprecated

Note

This function can be called statically.

See

File::isAbsolute()

File::isAbsolute() -- checks wether the given path is an absolute path

Description

This method checks whether the supplied path is an absolute path (eg. "/foo/bar" or "C:\foo\bar").

Parameter

string $path - the path the will be checked.

Return value

This method returns TRUE if the path is absolute, FALSE otherwise.

Note

This function can be called statically.

File::read()

File::read() -- read bytes from a file

Description

File::read() reads a specific amount of bytes from a specified file and returns them to the user.

Parameter

  • string $filename - the file to read from

  • int $size - the number of bytes to read from the file (defaults to FILE_DEFAULT_READSIZE)

  • mixed $lock - lock type to use, FALSE if none

Return value

mixed - this function returns the requested bytes from the file if there were no errors, FALSE if it reached EOF or a PEAR_Error object if an error has occured during reading from file.

Note

This function can be called statically.

File::readAll()

File::readAll() -- reads a complete file

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::readChar()

File::readChar() -- reads a single character from a file

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::readLine()

File::readLine() -- reads a single line from a file

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::rewind()

File::rewind() -- rewinds a file pointer

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::skipRoot()

File::skipRoot() -- strips the root directory from a given path

Description

This method strips the root directory from $path.

Parameter

string $path - the path to be processed.

Return value

If the path is absolute, this method returns the processed path, otherwise, it returns the path untouched.

Note

This function can be called statically.

File::stripLeadingSeparators()

File::stripLeadingSeparators() -- strip leading separators from a path

Description

This method removes the leading directory separator (like "/" on *nix) from a path name.

Parameter

  • string $path - the path name where the leading separator should be removed from.

  • string $separator - optional string that defines the separator. This parameter defaults to the value of the constant DIRECTORY_SEPARATOR that is pre-defined by PHP.

Return value

This methods returns the given path name without a leading directory separator.

Note

This function can be called statically.

File::stripTrailingSeparators()

File::stripTrailingSeparators() -- strips trailing separators from a path

Description

This method removes the trailing directory separator (like "/" on *nix) from a path name.

Parameter

  • string $path - the path name where the trailing separator should be removed from.

  • string $separator - optional string that defines the separator. This parameter defaults to the value of the constant DIRECTORY_SEPARATOR that is pre-defined by PHP.

Return value

This methods returns the given path name without a trailing directory separator.

Note

This function can be called statically.

File::unlock()

File::unlock() -- unlocks a locked file pointer

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::write()

File::write() -- writes bytes to a file

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::writeChar()

File::writeChar() -- writes a single character to a file

Description

Parameter

Return value

Throws

Note

This function can be called statically.

See

File::writeLine()

File::writeLine() -- writes a single line to a file

Description

Writes a single line, appending a linefeed by default.

Parameter

  • $filename - Name of file to write to

  • $line - Line of data to be written to file

  • $mode - Write mode, can be either FILE_MODE_WRITE or FILE_MODE_APPEND. Defaults to appending.

  • $crlf - Carriage return / line feed your system is using. Defaults to LF (\n), but can be set to anything. On Unix, \n is used, on Windows \r\n and Mac OS uses \r.

  • $lock - If the file shall be locked

Return value

PEAR_Error when an error occured, number of bytes written when all went well (crlf included).


File_Find

Table of Contents
Search methods --  Types of methods what can be used in search functions
File_Find::glob() -- find matches for a pattern in a directory
File_Find::maptree() -- create a view map for a directory
File_Find::mapTreeMultiple() -- create a recursive view map for a directory
File_Find::search() -- find matches for a pattern in a directory

Commonly needed functions to search for files and directories

Search methods

Search methods --  Types of methods what can be used in search functions

Search methods and their patterns

All search functions use $pattern parameter to specify match for filenames. Format of the $pattern depends on value of another parameter - $pattern_type.

  • If value of $pattern_type is 'php', then the pattern is case-sensitive string which follows the conventions of the ereg_*-functions.

  • In case of 'perl' pattern type it must follow the preg_*-functions pattern format. It is recommended to use 'perl', because it is faster.

  • The last 'shell' mode is most simple and should be familiar to everybody with basic computer skills. It is as easy as windows approach, but has some additional concepts borrowed from the FAR Manager software. The text of the following section was borrowed from the FAR Manager documentation.

'shell' search mode file masks

File masks are used to select single files and folders or groups of them. Masks may contain common valid file name symbols, wildcards ('*' and '?') and special expressions:

*any number of characters;
?any single character;
[c,x-z]any character enclosed by the brackets. Both separate characters and character intervals are allowed.

For example, files ftp.exe, fc.exe and f.ext may be selected using mask f*.ex?, mask *co* will select both color.ini and edit.com, mask [c-f,t]*.txt can select config.txt, demo.txt, faq.txt and tips.txt.

You may enter several file masks separated with commas or semicolons. For example, to select all the documents, you can specify *.doc,*.txt,*.wri in search pattern.

You may use exclude masks. An exclude mask is one or multiple file masks that must not be matched by the files matching the mask. The exclude mask is delimited from the main mask by the character '|'.

Usage examples of exclude masks:

  1. *.cpp

    All files with the extension cpp.

  2. *.*|*.bak,*.tmp

    All files except for the files with extensions bak and tmp.

  3. *.*|

    This mask has an error - the character | is entered, but the mask itself is not specified.

  4. *.*|*.bak|*.tmp

    Also an error - the character | may not be contained in the mask more than once.

  5. |*.bak

    The same as *|*.bak

The comma (or semicolon) is used for separating file masks from each other, and the '|' character separates include masks from exclude masks.

'shell' match mode is available from version 1.2.0 of File_Find

File_Find::glob()

File_Find::glob() -- find matches for a pattern in a directory

Description

Search the directory to find matches for the specified pattern.

Parameter

  • $pattern - a string containing the pattern to search the directory for.

  • $dirpath - a string containing the directory path to search.

  • $pattern_type - a string containing the type of pattern matching functions to use (can either be 'php', 'perl' or 'shell').

    The format of the $pattern depends on the $pattern_type-value. For more information see search methods

Return value

array - an array contains all filenames and name of subdirectories, which matches the pattern. Or a PEAR_Error.

Note

This function can be called statically.

File_Find::maptree()

File_Find::maptree() -- create a view map for a directory

Description

Map the directory tree given by the directory_path parameter.

Parameter

  • string $directory - contains the directory path that you want to map

Return value

array - a two element array, the first element containing a list of all the directories, the second element containing a list of all the files.

Note

This function can be called statically.

File_Find::mapTreeMultiple()

File_Find::mapTreeMultiple() -- create a recursive view map for a directory

Description

Map the directory tree given by the directory_path parameter. Depending on maxrecursion you get the content of the directory and the content of the subdirectories too.

Parameter

  • string $directory - contains the directory path that you want to map

  • integer $maxrecursion - defines the deep of recursive mapping of subdirectories

  • integer $count - can be ignored - internal parameter to track recursion level

Return value

array - a multidimensional array containing all subdirectories and their files

Note

This function can be called statically.

File_Find::search()

File_Find::search() -- find matches for a pattern in a directory

Description

Search the directory to find matches for the specified pattern.

Parameter

  • $pattern - a string containing the pattern to search the directory for.

  • $dirpath - a string containing the directory path to search.

  • $pattern_type - a string containing the type of pattern matching functions to use (can either be 'php', 'perl' or 'shell').

    The format of the $pattern depends on the $pattern_type-value. For more information see search methods

  • $fullpath - whether the string should be matched against the full path or only against the filename

  • $match - can be either 'files', 'directories' or 'both' to specify the kind of list to return

Return value

array - an array containing all filenames

Note

This function can be called statically.


File_SMBPasswd

Table of Contents
Introduction -- file format
File_SMBPasswd::File_SMBPasswd() -- constructor
File_SMBPasswd::load() -- load the contents of an existing smbpasswd file
File_SMBPasswd::getFile() -- get the value of the file property
File_SMBPasswd::getAccounts() -- get the value of the accounts property
File_SMBPasswd::addAccountEncrypted() -- adds a new account with pre-encrypted passwords.
File_SMBPasswd::addAccount() -- add a new account with the given plaintext-password.
File_SMBPasswd::addUser() -- add a new user with the given plaintext-password.
File_SMBPasswd::addMachine() -- add a new maschine-account with the given plaintext-password.
File_SMBPasswd::modAccountEncrypted() -- modify an existing account with the given encrypted password.
File_SMBPasswd::modAccount() -- modify an exsting account with the given plaintext-password.
File_SMBPasswd::modUser() -- modify an exsting account with the given plaintext-password.
File_SMBPasswd::delAccount() -- deletes an existing account.
File_SMBPasswd::delUser() -- deletes an existing user.
File_SMBPasswd::verifyAccountEncrypted() -- Verifies the given account with the given encrypted passwords.
File_SMBPasswd::verifyAccount() -- Verifies the given account with the given plaintext passwords.
File_SMBPasswd::lock() -- lock the smbpasswd file
File_SMBPasswd::unlock() -- unlock the smbpasswd file
File_SMBPasswd::save() -- saves the smbpasswd file
File_SMBPasswd::printAccounts() -- prints the contents of an existing smbpasswd file

Provides an API for managing SAMBA passwd-style files

Introduction

Introduction -- file format

SAMBA passwd-style files

SAMBA is a free implementation of CIFS/SMB. The password encryption on Unix and Windows is different, therefore SAMBA must have his own file where the passwords are encrypted either as NT-Hash and/or as LAN-Manager-Hash. LAN-Manager-Hashes are weak and shouldn't be used anymore, NT-Hashes are based on MD4, but no salt is used, therefore users with the same passwords have the same NT-Hash. In this file are also stored machine accounts, if the SAMBA server acts as PDC, such entries ends with $.

File_SMBPasswd::File_SMBPasswd()

File_SMBPasswd::File_SMBPasswd() -- constructor

Description

Creates a new File_SMBPasswd object and bind it to the given file.

Parameter

  • string $file - SAMBA password file to read

File_SMBPasswd::load()

File_SMBPasswd::load() -- load the contents of an existing smbpasswd file

Description

Load the contents of smbpasswd file.

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_SMBPasswd::getFile()

File_SMBPasswd::getFile() -- get the value of the file property

Description

Get the value of file property. This property contains the filename of the current smbpasswd file.

Return value

string containing the filename.

Note

This function can not be called statically.

File_SMBPasswd::getAccounts()

File_SMBPasswd::getAccounts() -- get the value of the accounts property

Description

Get the value of accounts property. This property contains all accounts of the current smbpasswd file.

Return value

array containing all accounts.

Note

This function can not be called statically.

File_SMBPasswd::addAccountEncrypted()

File_SMBPasswd::addAccountEncrypted() -- adds a new account with pre-encrypted passwords.

Description

Modifies an existing account. The passwords must be already encrypted.

Parameter

  • string $user - username to be added

  • int $userid - userid of the user

  • string $lmhash - LAN-Manager-Hash

  • string $nthash - NT-Hash

  • string $comment - comment

  • string $flags - flags

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Note that the user to be added must already exist in the systems password file.

File_SMBPasswd::addAccount()

File_SMBPasswd::addAccount() -- add a new account with the given plaintext-password.

Description

This method works in the same way as File_SMBPasswd::addAccountEncrypted() , except the password has to be given as plaintext. The encryption is done internaly.

Parameter

  • string $user - username to be added

  • int $userid - userid of the user

  • string $pass - plaintext-password

  • string $comment - comment

  • string $flags - flags

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Note that the user to be added must already exist in the system password file.

File_SMBPasswd::addUser()

File_SMBPasswd::addUser() -- add a new user with the given plaintext-password.

Description

This method works in the same way as File_SMBPasswd::addAccount() , except the flags are forced representing a user-account.

Parameter

  • string $user - username to be added

  • int $userid - userid of the user

  • string $pass - plaintext-password

  • string $comment - comment

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Note that the user to be added must already exist in the system password file.

File_SMBPasswd::addMachine()

File_SMBPasswd::addMachine() -- add a new maschine-account with the given plaintext-password.

Description

This method works in the same way as File_SMBPasswd::addAccount() , except the flags are forced representing a machine-account, a $ is implicitely added to the machinename.

Parameter

  • string $machine - machinename to be added

  • int $userid - userid of the user

  • string $comment - comment

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Note that the machine to be added must already exist in the system password file.

File_SMBPasswd::modAccountEncrypted()

File_SMBPasswd::modAccountEncrypted() -- modify an existing account with the given encrypted password.

Description

Modifies an existing account using pre-encrypted passwords.

Parameter

  • string $user - username to be added

  • int $userid - userid of the user

  • string $nthash - new NT-Hash

  • string $lmhash - new LM-Hash

  • string $comment - comment

  • string $flags - flags

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Note that the user to be added must already exist in the system password file.

File_SMBPasswd::modAccount()

File_SMBPasswd::modAccount() -- modify an exsting account with the given plaintext-password.

Description

This method works in the same way as File_SMBPasswd::modAccountEncrypted() , except the password has to be given as plaintext. The encryption is done internaly.

Parameter

  • string $user - username to be modified

  • int $userid - userid of the user

  • string $pass - plaintext-password

  • string $comment - comment

  • string $flags - flags

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_SMBPasswd::modUser()

File_SMBPasswd::modUser() -- modify an exsting account with the given plaintext-password.

Description

This method modifies an existing user, using a plaintext-password.

Parameter

  • string $user - username to be added

  • int $userid - userid of the user

  • string $pass - plaintext-password

  • string $comment - comment

  • string $flags - flags

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Note that the user to be added must already exist in the system password file.

File_SMBPasswd::delAccount()

File_SMBPasswd::delAccount() -- deletes an existing account.

Description

This method deletes an existing account.

Parameter

  • string $name - account name to be deleted (username or machinename)

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

File_SMBPasswd::delUser()

File_SMBPasswd::delUser() -- deletes an existing user.

Description

This method deletes an existing user.

Parameter

  • string $user - username to be deleted

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

File_SMBPasswd::verifyAccountEncrypted()

File_SMBPasswd::verifyAccountEncrypted() -- Verifies the given account with the given encrypted passwords.

Description

This method verifies the given username and passwords against the entry in the loaded smbpasswd file. The given passwords must already be a valid NT-Hash or LM-Hash, whereas the LM-Hash is optional.

Parameter

  • string $user - username to be verified

  • string $nthash - the NT-Hash

  • string $lmhash - the LM-Hash

Return value

mixed - Returns TRUE on success, FALSE on failure.

File_SMBPasswd::verifyAccount()

File_SMBPasswd::verifyAccount() -- Verifies the given account with the given plaintext passwords.

Description

This method verifies the given username and plaintext-password against the entry in the loaded smbpasswd file.

Parameter

  • string $user - username to be verified

  • string $pass - the plaintext password

Return value

mixed - Returns TRUE on success, FALSE on failure.

File_SMBPasswd::lock()

File_SMBPasswd::lock() -- lock the smbpasswd file

Description

lock the smbpasswd file.

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_SMBPasswd::unlock()

File_SMBPasswd::unlock() -- unlock the smbpasswd file

Description

unlock the smbpasswd file.

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_SMBPasswd::save()

File_SMBPasswd::save() -- saves the smbpasswd file

Description

Saves the contents of File_SMBPasswd object as a corresponding smbpasswd file on the disc. Save implicitely locks the file.

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_SMBPasswd::printAccounts()

File_SMBPasswd::printAccounts() -- prints the contents of an existing smbpasswd file

Description

Print all accounts of the loaded smbpasswd file.

Return value

void

Note

This function can not be called statically.


File_SearchReplace

Table of Contents
Introduction -- HowTo s'n'r in files
File_SearchReplace::File_SearchReplace() -- constructor
File_SearchReplace::getNumOccurences() -- return number of replaces
File_SearchReplace::doSearch() -- execute search&replace
File_SearchReplace::setDirectories() -- set file location
File_SearchReplace::setFiles() -- set the files to scan
File_SearchReplace::setFind() -- set pattern to find
File_SearchReplace::setIncludeSubdir() -- allow scan in sub directories
File_SearchReplace::setReplace() -- set replace string
File_SearchReplace::setSearchFunction() -- set search function to use

Provides an API for replacing text in files

Introduction

Introduction -- HowTo s'n'r in files

Types of search functions

File_SearchReplace supports different kinds of search functions. The type directly influence the format of the required $find-parameter

normal - default, the only type supporting the $IgnoreLines-parameter
quick - use str_replace()
preg - use preg_replace()
ereg - use ereg_replace()

To set the type, call setSearchFunction() before doSearch().

File_SearchReplace::File_SearchReplace()

File_SearchReplace::File_SearchReplace() -- constructor

Description

Constructor

Parameter

  • mixed $find - the string/regex or array of strings/regexes to find

  • mixed $replace - the string/regex or array of strings/regexes to replace $find

  • array $files - the file(s) to perform this operation on.

  • array $directories - the directories to perform this operation on.

  • boolean $include_subdir - if performing on directories, whether to traverse subdirectories.

  • array $ignore_lines - ignore lines beginning with any of the strings in this array. This feature only works with the "normal" search.

Note

This function can be called statically.

File_SearchReplace::getNumOccurences()

File_SearchReplace::getNumOccurences() -- return number of replaces

Description

Returns the number of replaced strings after a File_SearchReplace::doSearch() call.

Return value

integer - the number of occurences

Note

This function can not be called statically.

File_SearchReplace::doSearch()

File_SearchReplace::doSearch() -- execute search&replace

Description

Starts searching for the patterns and replaces them, if found.

Note

This function can not be called statically.

File_SearchReplace::setDirectories()

File_SearchReplace::setDirectories() -- set file location

Description

Set the directories where the files to scan reside.

Parameter

  • string $directories - the directories to perform

Note

This function can not be called statically.

File_SearchReplace::setFiles()

File_SearchReplace::setFiles() -- set the files to scan

Description

Set the files to scan.

Parameter

  • array $files - the file(s) to scan

Note

This function can not be called statically.

File_SearchReplace::setFind()

File_SearchReplace::setFind() -- set pattern to find

Description

Set the pattern for the string to find.

Parameter

  • mixed $find - the string/regex or arrays of them to find

Note

This function can not be called statically.

File_SearchReplace::setIncludeSubdir()

File_SearchReplace::setIncludeSubdir() -- allow scan in sub directories

Description

Enable or disable look up in sub directories for files to scan.

Parameter

  • boolean $inlude_subdir - Whether to traverse subdirectories or not.

Note

This function can not be called statically.

File_SearchReplace::setReplace()

File_SearchReplace::setReplace() -- set replace string

Description

Set the replacment string.

Parameter

  • mixed $replace - the string/regex or arrays of them to replace found string/regex with.

Note

This function can not be called statically.

File_SearchReplace::setSearchFunction()

File_SearchReplace::setSearchFunction() -- set search function to use

Description

Function to determine which search function is used.

Parameter

  • $search_function - The search function that should be used. Possible values: "normal", "quick", "preg", "ereg"

Note

This function can not be called statically.


File_HtAccess

Table of Contents
Introduction -- what are .htaccess files
File_HtAccess::file_htaccess() -- constructor
File_HtAccess::load() -- load the contents of existing .htaccess file
File_HtAccess::save() -- saves the .htaccess file
File_HtAccess::setRequire() -- set the value of require property
File_HtAccess::addRequire() -- add a value into require property
File_HtAccess::delRequire() -- remove a value from require property
File_HtAccess::getRequire() -- get the value(s) of require property
File_HtAccess::setProperties() -- set the values of objects properties
File_HtAccess::setAuthUserFile() -- set the value of authuserfile property
File_HtAccess::setAuthGroupFile() -- set the value of authgroupfile property
File_HtAccess::setAuthType -- set the value of authtype property
File_HtAccess::setAuthDigestFile -- set the value of authdigestfile property

Provides methods to create and manipulate .htaccess files.

Introduction

Introduction -- what are .htaccess files

What is File_HtAccess?

File_HtAccess provides common methods to create and manipulate Apache / NCSA style .htaccess files. These files together with accompanying password files are used to protect webserver directories. Since File_HtAccess does not provide any means to manipulate or create password files you should use it together with File_Passwd.

What are .htaccess files?

The most common and the original purpose of .htaccess files is to create per-directory password protection of resources. With modern webservers there is vast amount of other things .htaccess files can do. These include: custom error pages, ip based access control, redirecting users automatically, denying directory listing and using different files as an index file.

File_HtAccess concentrates only to password protection of directories, although it is possible to use it to control other things mentioned above too.

A .htaccess file is built from the following basic directives. They differ a bit whether youre using Basic or Digest authentication.

File_HtAccess provides method accessor methods with corresponding names for each of these directives, such as getAuthType() and setAuthType().

A typical .htaccess file looks like this:
AuthName "Protected"
AuthType Basic
AuthUserFile /usr/local/apache/conf/users.dat
require valid-user

What is Basic authentication

When a client requests resource protected with basic authentication webserver responds with a 401 Authentication Required header. When client receives 401 header it asks the user for username and password. If authentication succeeds, the protected resource will be sent to the client. Otherwise the access will be denied.

What is Digest authentication

Even though the passwords are stored encrypted on serverside they are sent cleartext between client and server when using Basic authentication. With Digest authentication the passwords are never sent cleartext but as a MD5 digest instead. The caveat is, most browsers do not support Digest authentication.

File_HtAccess::file_htaccess()

File_HtAccess::file_htaccess() -- constructor

Description

Creates an instance of a File_HtAccess object.

Parameter

  • string $file - filename to use. Defaults to .htaccess

  • array $params - a array of parameters which can be:

    • $params['authname'] - authname

    • $params['authtype'] - authtype

    • $params['authuserfile'] - authuserfile

    • $params['authgroupfile'] - authgroupfile

    • $params['require'] - require

    • $params['additional'] - additional

Return value

object - instance of File_HtAccess

File_HtAccess::load()

File_HtAccess::load() -- load the contents of existing .htaccess file

Description

Load the contents of .htaccess file.

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_HtAccess::save()

File_HtAccess::save() -- saves the .htaccess file

Description

Saves the contents of File_HtAccess object as a corresponding .htaccess file on the disc.

Return value

mixed - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

File_HtAccess::setRequire()

File_HtAccess::setRequire() -- set the value of require property

Description

Sets the value of require property.This overwrites the previous value. If you need to add a value (user) to require use File_HtAccess::addRequire() instead. Using this method you can control which users will be able to access the protected resources.

Parameter

  • mixed $require - value the requre property to be set to. Can be given as a string or an array. If given as a string separate multiple values with a space.

Return value

void

Note

This function can not be called statically.

File_HtAccess::addRequire()

File_HtAccess::addRequire() -- add a value into require property

Description

Adds a value (user) into require property. Using this method you can control which users will be able to access the protected resources.

Parameter

  • string $require - value (user) to be added to require property.

Return value

void

Note

This function can not be called statically.

File_HtAccess::delRequire()

File_HtAccess::delRequire() -- remove a value from require property

Description

Remove a value (user) from require property. Using this method you can control which users will be able to access the protected resources.

Parameter

  • string $require - value (user) to be added to require property.

Return value

void

Note

This function can not be called statically.

File_HtAccess::getRequire()

File_HtAccess::getRequire() -- get the value(s) of require property

Description

Get the value(s) of require property as an array. Require property contains the usernames or groups users who are allowed to access protected resources. Value valid-user means all users listed in password file are allowed to access.

Parameter

  • string $type - if 'string' return value will be a string with usernames separated by a space character. Otherwise return value will be an array(). Defaults to an array.

Return value

mixed string or array depending on $type parameter.

Note

This function can not be called statically.

File_HtAccess::setProperties()

File_HtAccess::setProperties() -- set the values of objects properties

Description

Set the values of objects properties as defined by hash given as a parameter. You can use this method as an alternative to passing property values in constructor .

Parameter

  • $params['authname'] - authname

  • $params['authtype'] - authtype

  • $params['authuserfile'] - authuserfile

  • $params['authgroupfile'] - authgroupfile

  • $params['require'] - require

  • $params['additional'] - additional

Return value

void

Note

This function can not be called statically.

File_HtAccess::setAuthUserFile()

File_HtAccess::setAuthUserFile() -- set the value of authuserfile property

Description

Sets the value of authuserfile property. AuthUserFile is the password file which contains username:password pairs for Basic authentication. You must give full path to the password file in order for it to work.

Parameter

  • string $file - absolute pathname to the password file.

Return value

void

Note

This function can not be called statically.

File_HtAccess::setAuthGroupFile()

File_HtAccess::setAuthGroupFile() -- set the value of authgroupfile property

Description

Sets the value of authgroupfile property. AuthGroupFile a file containing names of the groups and usernames belonging to the group. You must give full path to the group file in order for it to work.

Parameter

  • string $file - absolute pathname to the group file.

Return value

void

Note

This function can not be called statically.

File_HtAccess::setAuthType

File_HtAccess::setAuthType -- set the value of authtype property

Description

Sets the value of authtype property. Almost allways you will be using Basic authentication. Since most browsers don't yet support Digest authentication you should only use Digest if you can control what browsers will be accessing the resources.

Parameter

  • string $type - authentication type to use. Should be Basic os Digest. Defaults to Basic.

Return value

void

Note

This function can not be called statically.

File_HtAccess::setAuthDigestFile

File_HtAccess::setAuthDigestFile -- set the value of authdigestfile property

Description

Sets the value of authdigestfile property. AuthDigestFile is the password file which contains username:realm:password pairs for Digest authentication. You must give full path to the password file in order for it to work.

Parameter

  • string $file - absolute pathname to the password file.

Return value

void

Note

This function can not be called statically.


Chapter 43. Gtk

Provides useful packages for the PHP-Gtk extension.



FileDrop

Table of Contents
Introduction --  Why using Gtk_FileDrop?
Widget support --  Drops handled on different widget types
Example --  How to use Gtk_FileDrop

Setting up GtkWidgets to accept files via Drag'n'Drop in a very easy way.

Introduction

Introduction --  Why using Gtk_FileDrop?

Contributors

  • Christian Weiske

Description

Gtk_FileDrop provides an easy interface to set up GtkWidgets to receive files via Drag'n'Drop. Widgets can be told to accept a number of MIME-Types as well as a number of file extensions. Values of widgets can automatically be set when drops with valid files occur, or a callback function can be specified which is invoked in this case.

Now one may think that the whole setup process is really simple and would not need a class like this to make widgets accept files. That is right. The setup for making widgets accept drops is an ease - but there are two more steps to do:

  1. Make the widget accept only some types of files

  2. Convert the dropped filenames to usable filenames

The first item is not so hard to implement; we do this by either checking the file extension, or using the MIME_Type package to get the mime type. (Note: * is supported).

The second item is the main problem as all applications seem to ignore the standard for file name exchange and cook their own soup (so using their own format) when passing the file names. This package knows the differences and converts the dropped strings into usable local filenames, regardless of the format the source application uses. For a deeper insight in this topic you should read the PHP-Gtk FileDrop tutorial.

Note: A note about Mozilla/Firefox: Mozilla provides file names only with mime type text/plain only instead of text/uri-list. If we would accept this type as well, the problem arises that every text could be dropped - if it is a file or not. That's why the decision was made not to accept drops from Mozilla.

Widget support

Widget support --  Drops handled on different widget types

Example

Example --  How to use Gtk_FileDrop

Using Gtk_FileDrop

Note: When a file is dropped over a widget which accepts directories only, the directory of the filename is used.


Gtk_ScrollingLabel

Table of Contents
Introduction --  Getting started with Gtk_Scrollinglabel?
Gtk_ScrollingLabel::getFullText -- Returns the full text of the label.
Gtk_ScrollingLabel::getHiddenText -- Returns all of the text that is not currently visible.
Gtk_ScrollingLabel::getScrollingLabel -- Returns a GtkEventBox with the scrolling label inside.
Gtk_ScrollingLabel::getStyle -- Gets the label's style widget
Gtk_ScrollingLabel::getVisibleLength -- Returns the length of the visible area in characters.
Gtk_ScrollingLabel::pause -- Stops the label from scrolling without reseting the label text
Gtk_ScrollingLabel::setBounce -- Sets the text to bounce between the borders of the label
Gtk_ScrollingLabel::setStartSignal --  Connects the startScroll() method to a given event.
Gtk_ScrollingLabel::startScroll -- Begins scrolling the text from the start of the string.
Gtk_ScrollingLabel::unPause -- Begins scrolling the label from its current position

Warning

This package has been superseded. Please use Gtk2_ScrollingLabel for new projects.

A class that creates a scrolling marquee.

Introduction

Introduction --  Getting started with Gtk_Scrollinglabel?

Contributors

  • Scott Mattocks

Description

Gtk_ScrollingLabel is a class that creates a pseudo-widget which makes scrolling text within a label easy. The text within the label can be set to scroll from left to right, right to left, or bounce within the boundries of the label. The speed of the scrolling text can also be controlled. There are also built in methods to make the text pause or stop when the user moves the mouse over the label and start up again when the mouse leaves the label space.

Getting started with Gtk_ScrollingLabel is easy. All you need to do is instantiate the class, add it to a window, and start the scrolling. Take at look at the example below.

Gtk_ScrollingLabel::getFullText

Gtk_ScrollingLabel::getFullText -- Returns the full text of the label.

Description

Returns the full text of the label. The full text is the text that was set on construction or with setFullText() not just what is currently visible.

Return value

returns the full text of the label.

Note

This function can not be called statically.

Gtk_ScrollingLabel::getHiddenText

Gtk_ScrollingLabel::getHiddenText -- Returns all of the text that is not currently visible.

Description

Returns the portion of the full label text that is currently not being shown.

Return value

returns the label text that is not visible.

Note

This function can not be called statically.

Gtk_ScrollingLabel::getScrollingLabel

Gtk_ScrollingLabel::getScrollingLabel -- Returns a GtkEventBox with the scrolling label inside.

Description

Returns the GtkEventBox that contains the scrolling label.

Return value

returns the GtkEventBox containing the scrolling label.

Note

This function can not be called statically.

Gtk_ScrollingLabel::getStyle

Gtk_ScrollingLabel::getStyle -- Gets the label's style widget

Description

Returns the label's style widget. This lets you make changes to the style to alter the look and feel of the widget. You can change the font of the display, the color of the background, etc.

Return value

returns the GtkStyle widget for the label.

Note

This function can not be called statically.

Gtk_ScrollingLabel::getVisibleLength

Gtk_ScrollingLabel::getVisibleLength -- Returns the length of the visible area in characters.

Description

Returns the length of the visible area in characters. The length of the visible area is the maximum number of characters that are visible at one time.

Return value

integer the maximum number of characters that are visible at one time.

See

setVisibleLength()

Note

This function can not be called statically.

Gtk_ScrollingLabel::pause

Gtk_ScrollingLabel::pause -- Stops the label from scrolling without reseting the label text

Description

Stops the label from scrolling but does not reset the label text to the begining. If you want the label to stop scrolling and return to its original position (blank), use stopScroll().

Return value

returns true if the scrolling has stopped.

Note

This function can not be called statically.

Gtk_ScrollingLabel::setBounce

Gtk_ScrollingLabel::setBounce -- Sets the text to bounce between the borders of the label

Description

If $bounce is true, the text will scroll to the left until the first character hits the left edge of the visible window then it will scroll back to the right. When the last character hits the right edge of the visible window the text will scroll back to the left again.

If all of the scrolling text cannot be viewed at once, making the text bounce will have an undesired result. Therefore it is suggested that the length of the text always be at least one character less than the maximum viewable string length.

Parameter

  • boolean $bounce - Whether or not the text should change direction when it hits a label edge.

Return value

returns Whether or not the text is set to bounce

Note

This function can not be called statically.

Gtk_ScrollingLabel::setStartSignal

Gtk_ScrollingLabel::setStartSignal --  Connects the startScroll() method to a given event.

Description

setStartSignal() will make the event box listen for the signal $signal and will envoke startScroll() when ever it is heard. The signal should be a signal that GtkEventBox listens for normally or a button press event.

Parameter

  • string $signal - The Gtk signal to connect to startScroll().

Return value

returns The handler id for the connection.

Note

This function can not be called statically.

Gtk_ScrollingLabel::startScroll

Gtk_ScrollingLabel::startScroll -- Begins scrolling the text from the start of the string.

Description

startScroll() will make the text begin scrolling in the direction given by calling setDirection(). If the text is scrolling left to right (GTK_SCROLLINGLABEL_RIGHT), the current character position is set to the end of the text. This means that the last character of the label will be the first character shown. If the text is scrolling right to left (GTK_SCROLLINGLABEL_LEFT), the current character position is set to zero. This means that first character shown will be a blank space.

This method is best used when connected to an event.

Return value

returns true if the text has started scrolling. false otherwise.

Note

This function can not be called statically.

Gtk_ScrollingLabel::unPause

Gtk_ScrollingLabel::unPause -- Begins scrolling the label from its current position

Description

Begins scrolling the label from its current position. unPause() is different from startScroll() in that it does not reset the label to the begining of the text.

Return value

returns true if the text has started scrolling.

Note

This function can not be called statically.


Chapter 44. Gtk2

Provides useful packages for the PHP-Gtk2 extension.



Gtk2_EntryDialog

Table of Contents
Introduction -- About Gtk2_EntryDialog
constructor Gtk2_EntryDialog() -- Create a entry dialog instance.
Gtk2_EntryDialog::new_simple() -- Simplified constructor with not so much parameters.
Gtk2_EntryDialog::get() -- Show the dialog and retrieve the text
Gtk2_EntryDialog::run() -- Show the dialog and block until a button has been pressed.
Gtk2_EntryDialog::get_text() -- Returns the text input by the user.
Gtk2_EntryDialog::set_text() -- Sets the text for the entry
Gtk2_EntryDialog::set_default_response() -- Set the default response.

The package provides a simple dialogbox for text input.

Introduction

Introduction -- About Gtk2_EntryDialog

About Gtk2_EntryDialog

Gtk2_EntryDialog provides a dialog with a message and one single text input field, and some buttons like OK and Cancel. The class tries to make it as easy as possible to get the text from the user with only a few lines of code, while keeping the full power of the GtkDialog class.

The most easy way to retrieve the text with one line of code is using the get() static method.

constructor Gtk2_EntryDialog()

constructor Gtk2_EntryDialog()  -- Create a entry dialog instance.

Description

Creates a new entry dialog instance. After creating it, you can modify it and finally use the run() to show it and await the input.

You might want to use a more simple constructor, e.g. get() or new_simple()

<?php
require_once 'Gtk2/EntryDialog.php';

$id = new Gtk2_EntryDialog(
    null,                       //parent window
    0,                          //flags (GtkDialogFlags)
    Gtk::MESSAGE_QUESTION,      //type of message
    Gtk::BUTTONS_OK_CANCEL,     //which buttons shall be there
    'What\'s your name?',       //the message
    'Don\'t know'               //The default text
);

$answer = $id->run();
$id->destroy();
if ($answer == Gtk::RESPONSE_OK) {
    echo 'The name is: ';
    var_dump($id->get_text());
} else {
    echo "You cancelled\r\n";
}
?>

Parameter

GtkWindow $parent

Parent window (can be null).

GtkDialogFlags $flags

Dialog flags (use 0 as default)

GtkMessageType $type

Message type (e.g. Gtk::MESSAGE_QUESTION)

GtkButtonsType $buttons

Buttons to show (e.g. Gtk::BUTTONS_OK)

string $message

Message to display.

string $default

Default text for the entry.

Gtk2_EntryDialog::new_simple()

Gtk2_EntryDialog::new_simple()  -- Simplified constructor with not so much parameters.

Description

Simplified constructor with not so much parameters.

Message type is Gtk::MESSAGE_QUESTION, the flags will be Gtk::DIALOG_MODAL if the parent is set. Only one button, OK, will be visible.

<?php
require_once 'Gtk2/EntryDialog.php';

$id = Gtk2_EntryDialog::new_simple(
    'What\'s your name?',       //the message
    'Don\'t know'               //The default text
);

$answer = $id->run();
$id->destroy();
if ($answer == Gtk::RESPONSE_OK) {
    echo 'The name is: ';
    var_dump($id->get_text());
} else {
    echo "You cancelled\r\n";
}
?>

Parameter

string $message

Message to display.

string $default

Default text for the entry.

GtkWindow $parent

Parent window (can be null).

Gtk2_EntryDialog::get()

Gtk2_EntryDialog::get()  -- Show the dialog and retrieve the text

Description

Creates a dialog with the given parameters, runs it, and returns the text set. If the user cancelled the dialog, this method returns FALSE. In any other case (even when the text is empty), the a string with the text is returned.

<?php
require_once 'Gtk2/EntryDialog.php';

$text = Gtk2_EntryDialog::get(
    'What\'s your name?',       //the message
    'Don\'t know'               //The default text
);

if ($text !== false) {
    echo 'The name is: ';
    var_dump($text);
} else {
    echo "You cancelled\r\n";
}
?>

Parameter

string $message

Message to display.

string $default

Default text for the entry.

GtkWindow $parent

Parent window (can be null).

Return value

returns False if the user cancelled input, the text (string) otherwise.

Gtk2_EntryDialog::run()

Gtk2_EntryDialog::run()  -- Show the dialog and block until a button has been pressed.

Description

Show the dialog and block until a button has been pressed.

Return value

returns The response id of the pressed button.

Gtk2_EntryDialog::get_text()

Gtk2_EntryDialog::get_text()  -- Returns the text input by the user.

Description

Retrieves the text from the entry.

Return value

returns The input from the user.

Gtk2_EntryDialog::set_text()

Gtk2_EntryDialog::set_text()  -- Sets the text for the entry

Description

Sets the text for the entry.

Gtk2_EntryDialog::set_default_response()

Gtk2_EntryDialog::set_default_response()  -- Set the default response.

Description

Set the default response.

The button with the id will be the default one, allowing you to just press return to activate it.

Parameter

int $response_id

Response code


Gtk2_ExceptionDump

Table of Contents
Introduction -- Using Gtk2_ExceptionDump
Re-using Gtk2_ExceptionDump -- Embedding it in own applications

Catches and displays PHP errors, notices and warnings as well as PEAR Errors and uncaught exceptions.

Introduction

Introduction -- Using Gtk2_ExceptionDump

About Gtk2_ExceptionDump

Gtk2_ExceptionDump catches and displays common errors and warnings that can be produced in a PHP scripts: PHP errors, notices and warnings as well as PEAR Errors and uncaught exceptions. They are displayed in a Gtk2 window with a tree view, providing the error message and the backtrace with passed parameters.

The most easy thing to do is letting the class handle everything automatically. You can decide which errors should be catched: All, PHP errors, PEAR errors or uncaught exceptions. The following methods need to be called statically to set up error handling:

  • setupExceptionHandler()

  • setupPearErrorHandler()

  • setupPhpErrorHandler()

  • setupAllHandlers()

Handling exceptions by hand

If you don't want to let Gtk2_ExceptionDump handle errors automatically, you can display the window by hand, e.g. in a catch() statement.

More examples

As usually, the package has more examples in the doc directory: /path/to/pear/docs/Gtk2_ExceptionDump/examples/.

Re-using Gtk2_ExceptionDump

Re-using Gtk2_ExceptionDump -- Embedding it in own applications

Re-using Gtk2_ExceptionDump

You can make use of the brain power that went into the development of Gtk2_ExceptionDump by embedding the stack trace treeview into your own application.

There class you want is Gtk2_ExceptionDump_Stack. It's a subclass of GtkTreeView and should be embedded in a GtkScrolledWindow if you use it. The constructor takes the exception object, but it can be omitted and set later by using setException().


Gtk2_FileDrop

Table of Contents
Introduction --  Why using Gtk2_FileDrop?
Widget support --  Drops handled on different widget types
Example --  How to use Gtk2_FileDrop

Setting up GtkWidgets to accept files via Drag'n'Drop in a very easy way.

Introduction

Introduction --  Why using Gtk2_FileDrop?

Contributors

  • Christian Weiske

Description

Gtk2_FileDrop provides an easy interface to set up GtkWidgets to receive files via Drag'n'Drop. Widgets can be told to accept a number of MIME-Types as well as a number of file extensions. Values of widgets can automatically be set when drops with valid files occur, or a callback function can be specified which is invoked in this case.

Now one may think that the whole setup process is really simple and would not need a class like this to make widgets accept files. That is right. The setup for making widgets accept drops is an ease - but there are two more steps to do:

  1. Make the widget accept only some types of files

  2. Convert the dropped filenames to usable filenames

The first item is not so hard to implement; we do this by either checking the file extension, or using the MIME_Type package to get the mime type. (Note: * is supported).

The second item is the main problem as all applications seem to ignore the standard for file name exchange and cook their own soup (so using their own format) when passing the file names. This package knows the differences and converts the dropped strings into usable local filenames, regardless of the format the source application uses. For a deeper insight in this topic you should read the PHP-Gtk FileDrop tutorial.

Note: A note about Mozilla/Firefox: Mozilla provides file names only with mime type text/plain only instead of text/uri-list. If we would accept this type as well, the problem arises that every text could be dropped - if it is a file or not. That's why the decision was made not to accept drops from Mozilla.

Note: Gtk2_FileDrop is the port of Gtk_FileDrop to PHP-Gtk2 and PHP5. Thus, it has identical methods and behaves the same.

Widget support

Widget support --  Drops handled on different widget types

Example

Example --  How to use Gtk2_FileDrop

Using Gtk2_FileDrop

Note: When a file is dropped over a widget which accepts directories only, the directory of the filename is used.


Gtk2_IndexedComboBox

Table of Contents
Simple example -- To get started easily
Conquering Glade combo boxes -- How to use glade combos with this class
Gtk2_IndexedComboBox -- The main class
Gtk2_IndexedComboBox_Model -- Model class behind the scenes

Gtk2_IndexedComboBox is meant to be as easy to use as possible, and to have an API similar to the combo boxes created with GtkComboBox::new_text(). You can directly add key/value pairs to the widget instead of using the model (which is possible, too). Retrieving the currently selected key can be done with a single method call.

Both keys and values can be strings, thus allowing integers implicitly. This is very useful if you need a widget to select some row ID from a database, but want to display some descriptive string. By default, a single GtkCellRendererText is used as cell renderer.

Simple example

Simple example -- To get started easily

Simple example

In this example, we will create a combo box, add an array of key/value pairs and display the currently selected pair in a label.

At first, we create a new combo widget object. You already could pass the array of data in the constructor if you wanted to, but here we use the set_array() method to do this. After providing the data, entry with id 2 is made active/pre-selected.

Whenever the selection changes, the example displays the selected key and value in a label below the combo box. We use get_active_key() to retrieve the key, and get_active_text() to retrieve the value.

Conquering Glade combo boxes

Conquering Glade combo boxes -- How to use glade combos with this class

Conquering Glade combo boxes

While designing your user interface with Glade is really convenient and easy, it doesn't allow you to use custom classes as this combo here. Thanks to the MVC model in Gtk2, you still can use this class's power by using the same model as Gtk2_IndexedComboBox uses internally: Gtk2_IndexedComboBox_Model.

The important thing to remember is that you need to setup your own cell renderer, and tell it which column in the model shall be displayed. Beside that, you just do the normal model-creation-and-setting via set_model().

All data manipulation methods of Gtk2_IndexedComboBox you saw in the previous example are available in the model, Gtk2_IndexedComboBox_Model. Only get_active_key() and get_active_text() cannot be used on the model, since this doesn't know anything about selections. Retrieve the selected GtkTreeIter by combining the calls of get_active() and get_iter(), and pass this iter object to get_key() and get_text().

Gtk2_IndexedComboBox

Gtk2_IndexedComboBox -- The main class

Gtk2_IndexedComboBox

Gtk2_IndexedComboBox automatically creates the model and sets up the cell renderer when instantiating the widget. You may pass an array of key/value pairs to the constructor if you like to, but also can set them later.

The currently selected (active) key can be retrieved via get_active_key(), the selected (active) value by using get_active_text(). You can preselect a certain key with set_active_key().

If you don't like the renderer or want to change it or its attributes, use get_cell_renderer() and set_cell_renderer().

All other methods to retrieve/store data are convenience methods that act as proxy to the model. For example, Gtk2_IndexedComboBox' method set_array() internally calls the same method on the model, Gtk2_IndexedComboBox_Model. This allows you to quickly add some data to the combo without getting the model first and acting on it.

Gtk2_IndexedComboBox_Model

Gtk2_IndexedComboBox_Model -- Model class behind the scenes

Gtk2_IndexedComboBox_Model

The model class is the data storage for your key/value pairs. It contains two columns, both are of type Gtk::TYPE_STRING and can hold text and numbers. The first is used for the keys, the values are stored in the second column.

The class has several method that allow you to store data in the model: The classis set_array() takes an associative array of key/value pairs. Once set, you can use append_array() and prepend_array() to add new data after or before the current values. You also have the possibility to use insert_array() that takes the position as first, and the data array as second parameter.

Beside the *_array methods, you can add single key/value pairs by using append() and prepend() which take the key as first, and the value as second parameter. insert() wants an additional position number as first parameter, and key/value as second and third.

To delete data from the model, use remove_key(). After finishing your data manipulation, you can retrieve the full associative array of key/value pairs via get_array().

To obtain the key or value of a certain GtkTreeIter (that you got e.g. from the model by using get_iter()), use get_key() and get_text().


Gtk2_PHPConfig

Table of Contents
Introduction -- About Gtk2_PHPConfig
Usage -- Using Gtk2_PHPConfig

Provides a simple GUI to enable the user to edit php.ini values.

Introduction

Introduction -- About Gtk2_PHPConfig

Description

This package will be useful for PHP-GTK 2 based applications which require the user to make changes to php.ini. The class can parse any existing ini file, or create new ones. Parsing of existing files is currently a little inefficient, suggestions for improvement are welcome. New files and files previously generated by Gtk2_PHPConfig are parsed at a good speed though.

The interface displays all available configuration sections on the left pane, and their corresponding options in the top right pane. The bottom right pane displays the description of the option selected and the facility to change the value of that option.

Usage

Usage -- Using Gtk2_PHPConfig

Gtk2_ScrollingLabel

Table of Contents
Introduction --  Getting started with Gtk2_Scrollinglabel
Gtk2_ScrollingLabel -- Create a new Scrolling label.
Gtk2_ScrollingLabel::getFullText -- Returns the full text of the label.
Gtk2_ScrollingLabel::getHiddenText -- Returns all of the text that is not currently visible.
Gtk2_ScrollingLabel::getScrollingLabel -- Returns a GtkEventBox with the scrolling label inside.
Gtk2_ScrollingLabel::getStyle -- Gets the label's style widget
Gtk2_ScrollingLabel::getVisibleLength -- Returns the length of the visible area in characters.
Gtk2_ScrollingLabel::pause -- Stops the label from scrolling without reseting the label text
Gtk2_ScrollingLabel::setBounce -- Sets the text to bounce between the borders of the label
Gtk2_ScrollingLabel::setStartSignal --  Connects the startScroll() method to a given event.
Gtk2_ScrollingLabel::startScroll -- Begins scrolling the text from the start of the string.
Gtk2_ScrollingLabel::unPause -- Begins scrolling the label from its current position

A class that creates a scrolling marquee.

Introduction

Introduction --  Getting started with Gtk2_Scrollinglabel

Description

Gtk2_ScrollingLabel is a class that creates a pseudo-widget which makes scrolling text within a label easy. The text within the label can be set to scroll from left to right, right to left, or bounce within the boundries of the label. The speed of the scrolling text can also be controlled. There are also built in methods to make the text pause or stop when the user moves the mouse over the label and start up again when the mouse leaves the label space.

Getting started with Gtk2_ScrollingLabel is easy. All you need to do is instantiate the class, add it to a window, and start the scrolling. Take at look at the example below.

Gtk2_ScrollingLabel

Gtk2_ScrollingLabel -- Create a new Scrolling label.

Description

Class constructor

Parameter

  • string $text - The text to scroll

Note

This function can not be called statically.

Gtk2_ScrollingLabel::getFullText

Gtk2_ScrollingLabel::getFullText -- Returns the full text of the label.

Description

Returns the full text of the label. The full text is the text that was set on construction or with setFullText() not just what is currently visible.

Return value

returns the full text of the label.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::getHiddenText

Gtk2_ScrollingLabel::getHiddenText -- Returns all of the text that is not currently visible.

Description

Returns the portion of the full label text that is currently not being shown.

Return value

returns the label text that is not visible.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::getScrollingLabel

Gtk2_ScrollingLabel::getScrollingLabel -- Returns a GtkEventBox with the scrolling label inside.

Description

Returns the GtkEventBox that contains the scrolling label.

Return value

returns the GtkEventBox containing the scrolling label.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::getStyle

Gtk2_ScrollingLabel::getStyle -- Gets the label's style widget

Description

Returns the label's style widget. This lets you make changes to the style to alter the look and feel of the widget. You can change the font of the display, the color of the background, etc.

Return value

returns the GtkStyle widget for the label.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::getVisibleLength

Gtk2_ScrollingLabel::getVisibleLength -- Returns the length of the visible area in characters.

Description

Returns the length of the visible area in characters. The length of the visible area is the maximum number of characters that are visible at one time.

Return value

integer the maximum number of characters that are visible at one time.

See

setVisibleLength()

Note

This function can not be called statically.

Gtk2_ScrollingLabel::pause

Gtk2_ScrollingLabel::pause -- Stops the label from scrolling without reseting the label text

Description

Stops the label from scrolling but does not reset the label text to the begining. If you want the label to stop scrolling and return to its original position (blank), use stopScroll().

Return value

returns true if the scrolling has stopped.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::setBounce

Gtk2_ScrollingLabel::setBounce -- Sets the text to bounce between the borders of the label

Description

If $bounce is true, the text will scroll to the left until the first character hits the left edge of the visible window then it will scroll back to the right. When the last character hits the right edge of the visible window the text will scroll back to the left again.

If all of the scrolling text cannot be viewed at once, making the text bounce will have an undesired result. Therefore it is suggested that the length of the text always be at least one character less than the maximum viewable string length.

Parameter

  • boolean $bounce - Whether or not the text should change direction when it hits a label edge.

Return value

returns Whether or not the text is set to bounce

Note

This function can not be called statically.

Gtk2_ScrollingLabel::setStartSignal

Gtk2_ScrollingLabel::setStartSignal --  Connects the startScroll() method to a given event.

Description

setStartSignal() will make the event box listen for the signal $signal and will envoke startScroll() when ever it is heard. The signal should be a signal that GtkEventBox listens for normally or a button press event.

Parameter

  • string $signal - The Gtk signal to connect to startScroll().

Return value

returns The handler id for the connection.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::startScroll

Gtk2_ScrollingLabel::startScroll -- Begins scrolling the text from the start of the string.

Description

startScroll() will make the text begin scrolling in the direction given by calling setDirection(). If the text is scrolling left to right (GTK2_SCROLLINGLABEL_RIGHT), the current character position is set to the end of the text. This means that the last character of the label will be the first character shown. If the text is scrolling right to left (GTK2_SCROLLINGLABEL_LEFT), the current character position is set to zero. This means that first character shown will be a blank space.

This method is best used when connected to an event.

Return value

returns true if the text has started scrolling. false otherwise.

Note

This function can not be called statically.

Gtk2_ScrollingLabel::unPause

Gtk2_ScrollingLabel::unPause -- Begins scrolling the label from its current position

Description

Begins scrolling the label from its current position. unPause() is different from startScroll() in that it does not reset the label to the begining of the text.

Return value

returns true if the text has started scrolling.

Note

This function can not be called statically.


Gtk2_VarDump

Table of Contents
Introduction -- About Gtk2_VarDump
Re-using Gtk2_VarDump -- Embedding it in own applications

Provides a simple GUI to examine PHP variables, for example complex arrays or objects.

Introduction

Introduction -- About Gtk2_VarDump

About Gtk2_VarDump

Gtk2_VarDump is a simple GUI to examine PHP variables, for example complex arrays or objects. It displays the variable and all sub-variables/array keys/sub-objects in the left pane (a GtkTreeView), and the actual values in a list view on the right side.

The class is very easy to use: Just include the file, and call the static display method with the variable you want to have dumped.

Re-using Gtk2_VarDump

Re-using Gtk2_VarDump -- Embedding it in own applications

Re-using Gtk2_VarDump

Gtk2_VarDump consists of two main parts: A tree on the left, displaying the structure of the variable-to-dump, and a list on the right side, showing the keys and their values. They are arranged on a pane, which itself is contained in the main window.

Now you might want to dump some variables yourself, but integrate this display directly into your own application - without opening a new window for that. Gtk2_VarDump is prepared for that; you can re-use the existing classes.

Gtk2_VarDump_Pane

Gtk2_VarDump_Pane is the container for both tree and list. You can use instantiate it, add it to your interface and call the setVariable() method to display the contents of the variable. The method takes the variable as first parameter, and a user-definable title as optional second parameter.

Gtk2_VarDump_Tree

Gtk2_VarDump_Tree is an descendant of GtkTreeView, and as usual without any scrollbars. Remember to add it to a GtkScrolledWindow. The class has, as Gtk2_VarDump_Pane does, a setVariable() method that takes the variable to be displayed and an optional title that is used for the root element.

The tree has another method: setList() is used to set the list widget that shall display the values. Be sure that the list widget also provides a setVariable() method. Whenever the selection in the tree changes, the list's setVariable() method is called.

Gtk2_VarDump_List

Gtk2_VarDump_List is a descendant of GtkTreeView and simply displays plain key-value pairs. It has, like the other two classes, a setVariable() method that takes the variable to display as first parameter, and an optional title as second parameter.


Chapter 45. HTML

Provides packages for working and creating HTML



HTML_CSS

The PEAR::HTML_CSS package provides a simple interface for handling and generating cascading style sheets.


Introduction


System Requirements

Mandatory resources :

Optional resources :


About

Table of Contents
FAQ -- Answers to most Frequently Asked Questions
News -- What is New in version ?

FAQ

FAQ -- Answers to most Frequently Asked Questions

HTML_CSS FAQ

1. General questions
1.1. What does it cost ?
1.2. Do you offer support ?
1.3. I found a bug, what shall I do ?
1.4. What is CSS ?
1.5. What is PEAR ?
2. How to
2.1. I want to use HTML_CSS without PEAR. Is it possible ?
2.2. I want to know property value of a selector, but it can not exist
1. General questions

1.1. What does it cost ?

You can download and use it for free. But don't delete the copyright notice. You can read terms of the license.

1.2. Do you offer support ?

YES if there is no answer in this Guide and if you are ready to share some informations such as : your configuration (platform Win *nix mac, PHP version, PEAR packages installed) and perharps your script.

1.3. I found a bug, what shall I do ?

You can report it with the bug tracker at PEAR.

1.4. What is CSS ?

CSS (an acronym for Cascading Style Sheets) is a simple mechanism for adding style (e.g. fonts, colors, spacing) to Web documents.

HTML_CSS is a PEAR package that provides methods for handling stylesheet declarations.

Version 1.0.0 does not offers yet methods to validate a style sheet.

1.5. What is PEAR ?

PEAR (an acronym for PHP Extension and Application Repository) is a framework and distribution system for reusable PHP components.

Don't forget to read also the PEAR Manual and PEAR FAQ.

2. How to

2.1. I want to use HTML_CSS without PEAR. Is it possible ?

Yes it is. First, you need to download package PEAR::HTML_Common version 1.2 or greater.

Extract content (Common.php file) in same directory HTML/ as CSS.php file.

Last, you should create your own error handler, or disable it. See chapter Error Handler for details.

2.2. I want to know property value of a selector, but it can not exist

With previous release than 1.1.0 it was not possible because HTML_CSS::getStyle() require at least an existing property, or it will return HTML_CSS_ERROR_NO_ELEMENT_PROPERTY.

With new function HTML_CSS::grepStyle() of version 1.1.0, it's now possible.

01: <?php
02: require_once 'HTML/CSS.php';
03:
04: function myErrorHandler()
05: {
06:     return PEAR_ERROR_PRINT;  // always print all error messages
07: }
08:
09: $styles = '
10: h1, h2, h3, h4 { padding: 1em; }
11: .highlight p, .highlight ul { margin-left: .5em; }
12: #main p, #main ul { padding-top: 1em; }
13: ';
14:
15: $prefs = array(
16:     'push_callback' => 'myErrorHandler',
17: );
18: $attribs = null;
19:
20: $css = new HTML_CSS($attribs, $prefs);
21: $css->parseString($styles);
22:
23: $css->getStyle('.highlight p', 'color');
24:
25: $styles = $css->grepStyle('/highlight/', '/^color$/');
26: echo '<pre>'; var_dump($styles); echo '</pre>';
27: ?>

Lines 4-7, 15-17, 20 :

Custom error handler is defined to allow script to continue (print message), when HTML_CSS::getStyle() will raise error at line 23.

Lines 9-13, 21 :

Stylesheet used is :
h1, h2, h3, h4 { padding: 1em; }
.highlight p, .highlight ul { margin-left: .5em; }
#main p, #main ul { padding-top: 1em; }

Lines 23, 25 :

While HTML_CSS::getStyle() will raise error (printed by custom error handler), line 25 will return an empty array with no error raised.

Reason : color property does not exist for .highlight p class selector.

News

News -- What is New in version ?

Version 0.2.x

  • Initial PEAR public release occured at end of July 2003.

Version 0.3.x

  • Added the ability to parse CSS from string with HTML_CSS::parseString()

  • Added the ability to parse CSS from file with HTML_CSS::parseFile()

  • Added the ability to generate CSS and store it in a file with HTML_CSS::toFile()

  • Introduced error handling system with PEAR_ErrorStack.

  • Added unit tests with PHPUnit 1.x for API and bugs.

  • Retrieve the settings of individual properties

Version 1.0.x

  • Introduced a new error handling system: PEAR_ErrorStack was replaced by a simple way to plug in any error handling system you might want (default used PEAR_Error object)

  • HTML_CSS::apiVersion() returns now a string rather than a float; compatible with php.version_compare().

  • Added the ability to parse multiple data sources (filename, string) at once with HTML_CSS::parseData()

  • Added the ability to identify if HTML_CSS API output returns an error with HTML_CSS::isError()

  • Introduces package xml 2.0 and drop support of package xml 1.0

  • Unified API arguments for all group functions

  • Klaus Guenther (first package leader) became inactive.

Version 1.1.x

  • Added ability to search if an element/property is defined or not with HTML_CSS::grepStyle()

Version 1.2.x

Version 1.3.x

  • Prevent invalid CSS data source in to be parse

  • Add Content-Disposition to the headers in display() Implement request 12195

  • Remove pointless NEWS file from distribution, clone of ChangeLog.

Version 1.4.x

  • Upgrade requirement to PHP 4.3.0 and PEAR 1.5.4 (to avoid security vulnerability)

  • Coding Standard fixes: (errors/warnings) following recommandation by PHP_CodeSniffer

  • Unit test suites migrated from PHPUnit 1.x to 3.x

  • API 1.4.0 introduces new setter/getter PHP5 facility compatible (magic function __set, __get) for read/write CSS options.

  • Error handler allow now to use PEAR_ERROR_CALLBACK (local to HTML_CSS) to customize action when an error/exception is raised. No more need to use global PEAR::setErrorHandling.

Version 1.5.x

  • Check validity of CSS data source to be parse using the W3C CSS validator service with help of package PEAR::Services_W3C_CSSValidator (require PHP5)

  • Ability to retrieve all options in effect at once with HTML_CSS::getOptions()

  • Add support of At-Rules Implement request 12194


Reference guide

Table of Contents
API -- Application Programming Interface
constructor HTML_CSS::HTML_CSS() -- Class constructor
HTML_CSS::__get() -- Get option for the class
HTML_CSS::__set() -- Set option for the class
HTML_CSS::setXhtmlCompliance() -- Set xhtml flag
HTML_CSS::setCache() -- Set cache flag
HTML_CSS::setSingleLineOutput() -- Set oneline flag
HTML_CSS::setOutputGroupsFirst() -- Set groupsfirst flag
HTML_CSS::setTab() -- Set tab value
HTML_CSS::setLineEnd() -- Set lineend value
HTML_CSS::getCharset() -- Return the charset encoding string
HTML_CSS::setCharset() -- Set charset value
HTML_CSS::getOptions() -- Return all options for the class
HTML_CSS::getStyle() -- Return the value of a CSS property
HTML_CSS::setStyle() -- Set or add a CSS definition
HTML_CSS::createGroup() -- Create a new CSS definition group
HTML_CSS::unsetGroup() -- Remove a CSS definition group
HTML_CSS::getGroupStyle() -- Return CSS definition for a CSS group
HTML_CSS::setGroupStyle() -- Set or add a CSS definition for a CSS group
HTML_CSS::addGroupSelector() -- Add a selector to a CSS definition group.
HTML_CSS::removeGroupSelector() -- Remove a selector from a group
HTML_CSS::setSameStyle() -- Apply same styles on two selectors
HTML_CSS::parseString() -- Parse a string
HTML_CSS::parseFile() -- Parse file content
HTML_CSS::parseData() -- Parse multiple data sources
HTML_CSS::toArray() -- Return the CSS contents in an array
HTML_CSS::toInline() -- Return a string-properties for style attribute of an HTML element
HTML_CSS::toFile() -- Generate CSS and stores it in a file
HTML_CSS::toString() -- Return current CSS parsed data as a string
HTML_CSS::display() -- Output CSS Code
HTML_CSS::getContentDisposition() -- Return the Content-Disposition header
HTML_CSS::setContentDisposition() -- Set Content-Disposition header
HTML_CSS::grepStyle() -- Retrieve styles corresponding to an element filter
HTML_CSS::validate() -- Validate a CSS data source
HTML_CSS::getAtRulesList() -- Return list of supported At-Rules
HTML_CSS::createAtRule() -- Create a new simple declarative At-Rule
HTML_CSS::unsetAtRule() -- Remove an existing At-Rule
HTML_CSS::getAtRuleStyle() -- Get style value of an existing At-Rule
HTML_CSS::setAtRuleStyle() -- Define a conditional/informative At-Rule
Error Handler -- Flexible error handler plug-in system

API

API -- Application Programming Interface

Initialize parser/writer options

With the class constructor, you have ability to set many options :

Tip: HTML_CSS 1.4.0+ users may now set a single option directly like that:
<?php
require_once 'HTML/CSS.php';

$css = new HTML_CSS();

// with PHP5 only
$css->allowduplicates = true;

// with PHP4 use
$css->__set('allowduplicates', true);
?>

Handle selector and property values

Read and write single selector or even descendant selector is made easy with : HTML_CSS::getStyle() and HTML_CSS::setStyle()

Parsing data sources

Handle data sources are so easy than just one call of these three methods : HTML_CSS::parseString() , HTML_CSS::parseFile() , and HTML_CSS::parseData()

Checking data sources

Check validity of data source is now possible if you run HTML_CSS with PHP5. Use this function : HTML_CSS::validate()

Output

Send result directly to browser, send it to file or capture to a PHP variable, you will certainly use one of them. HTML_CSS::toArray() , HTML_CSS::toInline() , HTML_CSS::toFile() , HTML_CSS::toString() , HTML_CSS::display() , HTML_CSS::getContentDisposition() , and HTML_CSS::setContentDisposition()

Searching for selectors and/or properties

Ability to find if a selector or a property (with perl-compatible pattern) is already defined with HTML_CSS::grepStyle()

Important: This function is available since version 1.1.0

Handle At-Rules

List of at-rules supported can be obtained by call to function HTML_CSS::getAtRulesList()

Important: All these related at-rules functions are available since version 1.5.0

Distinguish simple declarative at-rules (without declaration style blocks) : @charset, @import, @namespace, handled by : HTML_CSS::createAtRule() and HTML_CSS::unsetAtRule()

And conditional/informative at-rules (with declaration style blocks) : @media, @page, @font-face, handled by : HTML_CSS::getAtRuleStyle() and HTML_CSS::setAtRuleStyle()

constructor HTML_CSS::HTML_CSS()

constructor HTML_CSS::HTML_CSS() -- Class constructor

Description

Class constructors : Zend Engine 1 uses HTML_CSS, while Zend Engine 2 uses __construct

Parameter

array $attributes

(optional) Pass options to the constructor. Valid options are :

  • xhtml (sets xhtml compliance),

  • tab (sets indent string),

  • filename (name of file to be parsed),

  • cache (determines whether the nocache headers are sent),

  • oneline (whether to output each definition on one line),

  • groupsfirst (determines whether to output groups before elements)

  • allowduplicates (allow to have duplicate rules in selector)

array $errorPrefs

(optional) has to configure error handler

Throws

throws no exceptions thrown

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::__get()

HTML_CSS::__get()  -- Get option for the class

Description

Return current value of an individual option. If option does not exist, returns value is NULL.

Parameter

string $option

Name of option to set

Throws

throws no exceptions thrown

Since

since version 1.4.0 (2007-12-13)

Note

This function can not be called statically.

HTML_CSS::__set()

HTML_CSS::__set()  -- Set option for the class

Description

Set an individual option value. Option must exist.

Parameter

string $option

Name of option to set

string $val

Value of option to set

Throws

throws no exceptions thrown

Since

since version 1.4.0 (2007-12-13)

Note

This function can not be called statically.

HTML_CSS::setXhtmlCompliance()

HTML_CSS::setXhtmlCompliance() -- Set xhtml flag

Description

Active or not the XHTML mode compliant

Parameter

boolean $value

flag to true if XHTML compliance needed, false otherwise

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.3.2 (2004-03-24)

Note

This function can not be called statically.

HTML_CSS::setCache()

HTML_CSS::setCache() -- Set cache flag

Description

Define if the document should be cached by the browser. Default to false.

Parameter

boolean $cache

(optional)

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::setSingleLineOutput()

HTML_CSS::setSingleLineOutput() -- Set oneline flag

Description

Determine whether definitions are output on a single line or multi lines

Parameter

boolean $value

flag to true if single line, false for multi lines

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.3.3 (2004-05-20)

Note

This function can not be called statically.

HTML_CSS::setOutputGroupsFirst()

HTML_CSS::setOutputGroupsFirst() -- Set groupsfirst flag

Description

Determine whether groups are output before elements or not

Parameter

boolean $value

flag to true if groups are output before elements, false otherwise

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.3.3 (2004-05-20)

Note

This function can not be called statically.

HTML_CSS::setTab()

HTML_CSS::setTab()  -- Set tab value

Description

Sets the string used to indent HTML

Parameter

string $string

String used to indent ("\11", "\t", ' ', etc.).

Throws

throws no exceptions thrown

Since

since version 1.4.0 (2007-12-13)

Note

This function can not be called statically.

HTML_CSS::setLineEnd()

HTML_CSS::setLineEnd()  -- Set lineend value

Description

Set the line end style to Windows, Mac, Unix or a custom string

Parameter

string $style

"win", "mac", "unix" or custom string.

Throws

throws no exceptions thrown

Since

since version 1.4.0 (2007-12-13)

Note

This function can not be called statically.

HTML_CSS::getCharset()

HTML_CSS::getCharset() -- Return the charset encoding string

Description

By default, HTML_CSS uses iso-8859-1 encoding.

Throws

throws no exceptions thrown

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::setCharset()

HTML_CSS::setCharset() -- Set charset value

Description

Define the charset for the file. Default to ISO-8859-1 because of CSS1 compatability issue for older browsers.

Parameter

string $type

(optional) Charset encoding; defaults to ISO-8859-1.

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::getOptions()

HTML_CSS::getOptions()  -- Return all options for the class

Description

Return all configuration options at once

Throws

throws no exceptions thrown

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

HTML_CSS::getStyle()

HTML_CSS::getStyle() -- Return the value of a CSS property

Description

Get the value of a property to an identifed simple CSS element

Parameter

string $element

Element (or class) to be defined

string $property

Property defined

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_ELEMENT, HTML_CSS_ERROR_NO_ELEMENT_PROPERTY

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::setStyle()

HTML_CSS::setStyle() -- Set or add a CSS definition

Description

Add or change a single value for an element property

Parameter

string $element

Element (or class) to be defined

string $property

Property defined

string $value

Value assigned

boolean $duplicates

(optional) Allow or disallow duplicates.

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::createGroup()

HTML_CSS::createGroup() -- Create a new CSS definition group

Description

Create a new CSS definition group. Return an integer identifying the group.

Parameter

string $selectors

Selector(s) to be defined, comma delimited.

mixed $group

(optional) Group identifier. If not passed, will return an automatically assigned integer.

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_INVALID_GROUP

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::unsetGroup()

HTML_CSS::unsetGroup() -- Remove a CSS definition group

Description

Remove a CSS definition group. Use the same identifier as for group creation.

Parameter

mixed $group

CSS definition group identifier

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_GROUP

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::getGroupStyle()

HTML_CSS::getGroupStyle() -- Return CSS definition for a CSS group

Description

Get the CSS definition for group created by setGroupStyle()

Parameter

mixed $group

CSS definition group identifier

string $property

Property defined

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_GROUP, HTML_CSS_ERROR_NO_ELEMENT

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::setGroupStyle()

HTML_CSS::setGroupStyle() -- Set or add a CSS definition for a CSS group

Description

Define the new value of a property for a CSS group. The group should exist. If not, use HTML_CSS::createGroup() first

Parameter

mixed $group

CSS definition group identifier

string $property

Property defined

string $value

Value assigned

boolean $duplicates

(optional) Allow or disallow duplicates.

Return value

returns Returns an integer if duplicates are allowed.

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_GROUP

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::addGroupSelector()

HTML_CSS::addGroupSelector() -- Add a selector to a CSS definition group.

Description

Add a selector to a CSS definition group

Parameter

mixed $group

CSS definition group identifier

string $selectors

Selector(s) to be defined, comma delimited.

Throws

throws HTML_CSS_ERROR_NO_GROUP, HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::removeGroupSelector()

HTML_CSS::removeGroupSelector() -- Remove a selector from a group

Description

Definitively remove a selector from a CSS group

Parameter

mixed $group

CSS definition group identifier

string $selectors

Selector(s) to be removed, comma delimited.

Throws

throws HTML_CSS_ERROR_NO_GROUP, HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::setSameStyle()

HTML_CSS::setSameStyle() -- Apply same styles on two selectors

Description

Set or change the properties of new selectors to the values of an existing selector

Parameter

string $new

New selector(s) that should share the same definitions, separated by commas

string $old

Selector that is already defined

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_ELEMENT

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::parseString()

HTML_CSS::parseString() -- Parse a string

Description

Parse a string that contains CSS information

Parameter

string $str

text string to parse

boolean $duplicates

(optional) Allows or disallows duplicate style definitions

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::parseFile()

HTML_CSS::parseFile() -- Parse file content

Description

Parse a file that contains CSS information

Parameter

string $filename

file to parse

boolean $duplicates

(optional) Allow or disallow duplicates.

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_FILE

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::parseData()

HTML_CSS::parseData() -- Parse multiple data sources

Description

Parse data sources, file(s) or string(s), that contains CSS information

Parameter

array $styles

data sources to parse

boolean $duplicates

(optional) Allow or disallow duplicates.

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 1.0.0RC2 (2005-12-15)

Note

This function can not be called statically.

HTML_CSS::toArray()

HTML_CSS::toArray() -- Return the CSS contents in an array

Description

Return the full contents of CSS data sources (parsed) in an array

Throws

throws no exceptions thrown

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::toInline()

HTML_CSS::toInline() -- Return a string-properties for style attribute of an HTML element

Description

Generate and return the CSS properties of an element or class as a string for inline use.

Parameter

string $element

Element or class for which inline CSS should be generated

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::toFile()

HTML_CSS::toFile() -- Generate CSS and stores it in a file

Description

Generate current parsed CSS data sources and write result in a user file

Parameter

string $filename

Name of file that content the stylesheet

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_WRITE_FILE

Since

since version 0.3.0 (2003-11-03)

Note

This function can not be called statically.

HTML_CSS::toString()

HTML_CSS::toString() -- Return current CSS parsed data as a string

Description

Generate current parsed CSS data sources and return result as a string

Throws

throws no exceptions thrown

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::display()

HTML_CSS::display() -- Output CSS Code

Description

Send the stylesheet content to standard output, handling cacheControl and contentDisposition headers

Throws

throws no exceptions thrown

Since

since version 0.2.0 (2003-07-31)

Note

This function can not be called statically.

HTML_CSS::getContentDisposition()

HTML_CSS::getContentDisposition() -- Return the Content-Disposition header

Description

Get value of Content-Disposition header (inline filename) used to display results

Throws

throws no exceptions thrown

Since

since version 1.3.0 (2007-10-22)

Note

This function can not be called statically.

Return value

returns boolean FALSE if no content disposition, otherwise string for inline filename

HTML_CSS::setContentDisposition()

HTML_CSS::setContentDisposition() -- Set Content-Disposition header

Description

Defines the Content-Disposition filename for the browser output. Defaults to basename($_SERVER['PHP_SELF']).'.css'

Parameter

boolean $enable

(optional)

string $filename

(optional)

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 1.3.0 (2007-10-22)

Note

This function can not be called statically.

HTML_CSS::grepStyle()

HTML_CSS::grepStyle() -- Retrieve styles corresponding to an element filter

Description

Return array entries of styles that match patterns (Perl compatible)

Parameter

string $elmPattern

Element or class pattern to retrieve

string $proPattern

(optional) Property pattern to retrieve

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 1.1.0 (2007-01-01)

Note

This function can not be called statically.

HTML_CSS::validate()

HTML_CSS::validate()  -- Validate a CSS data source

Description

Execute the W3C CSS validator service on each data source (filename or string) given by parameter $styles.

Parameter

array $styles

Data sources to check validity

array &$messages

Error and Warning messages issue from W3C CSS validator service

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_INVALID_DEPS, HTML_CSS_ERROR_INVALID_SOURCE

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

HTML_CSS::getAtRulesList()

HTML_CSS::getAtRulesList()  -- Return list of supported At-Rules

Description

Return the list of At-Rules supported by API 1.5.0 of HTML_CSS

Throws

throws no exceptions thrown

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

HTML_CSS::createAtRule()

HTML_CSS::createAtRule()  -- Create a new simple declarative At-Rule

Description

Create a simple at-rule without declaration style blocks. That include @charset, @import and @namespace

Parameter

string $atKeyword

at-rule keyword

string $arguments

argument list for @charset, @import or @namespace

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

HTML_CSS::unsetAtRule()

HTML_CSS::unsetAtRule()  -- Remove an existing At-Rule

Description

Remove an existing and supported at-rule. See HTML_CSS::getAtRulesList() for a full list of supported At-Rules.

Parameter

string $atKeyword

at-rule keyword

Throws

throws HTML_CSS_ERROR_INVALID_INPUT, HTML_CSS_ERROR_NO_ATRULE

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

HTML_CSS::getAtRuleStyle()

HTML_CSS::getAtRuleStyle()  -- Get style value of an existing At-Rule

Description

Retrieve arguments or style value of an existing At-Rule. See HTML_CSS::getAtRulesList() for a full list of supported At-Rules.

Parameter

string $atKeyword

at-rule keyword

string $arguments

argument list (optional for @font-face)

string $selectors

selectors of declaration style block (optional for @media, @page, @font-face)

string $property

property of a single declaration style block

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

HTML_CSS::setAtRuleStyle()

HTML_CSS::setAtRuleStyle()  -- Define a conditional/informative At-Rule

Description

Set arguments and declaration style block for at-rules that follow : "@media, @page, @font-face"

Parameter

string $atKeyword

at-rule keyword

string $arguments

argument list (optional for @font-face)

string $selectors

selectors of declaration style block (optional for @media, @page, @font-face)

string $property

property of a single declaration style block

string $value

value of a single declaration style block

boolean $duplicates

(optional) Allow or disallow duplicates

Throws

throws HTML_CSS_ERROR_INVALID_INPUT

Since

since version 1.5.0 (2008-01-15)

Note

This function can not be called statically.

Error Handler

Error Handler -- Flexible error handler plug-in system

Introduction

The HTML_CSS package is implemented with a flexible error handler plug-in system. You may use any error handler that you want. Using PEAR_Error object (default), but also the PEAR_ErrorStack package, or any other error handler you might want to plug in.

Without any configuration, each HTML_CSS API error (basic or exception) will raise a HTML_CSS_Error object that will be return to call script (user script).

Tip: Easy to distinct basic PEAR_Error from other PEAR packages to HTML_CSS errors, even if there is a better and more robust solution: HTML_CSS::isError(). But also provide a unique way to retrieve the level of error (warning, error, exception) with the HTML_CSS_Error::getLevel() method.

As usual you can use the PEAR error API as well.
<?php
require_once 'HTML/CSS.php';

$css = new HTML_CSS();

$result = $css->setStyle('div', 'color', 5);
if (PEAR::isError($result)) {
    // do something when an error is raised
}
?>
and output to screen will give something like :

Perhaps this standard behavior is not what you want. Don't worry, you can change everything :

  • display or ignore the error

  • display or hide part of message (error level, body, context)

Important: HTML_CSS obey at display_errors and log_errors protocol

Controlling error generation

There are many scenarios in which fine-grained control over error raising is absolutely necessary.

The first level to control error generation is the php.ini directives display_errors and log_errors. When these directives are set to TRUE, then browser and file outputs are effective.

Tip: If you want to ignore all errors raised (no display, no logs) and avoid to include PEAR core class, then you should have something like :
<?php
require_once 'HTML/CSS.php';

function myErrorHandler()
{
    return null;
}

$errorConf = array('error_handler' => 'myErrorHandler');
$css = new HTML_CSS(null, $errorConf);
// ...
?>

Note for users of HTML_CSS 1.4.0 or greater: You may want to decide to print (yes/no), log (yes/no) error messages with a full free user function local to HTML_CSS
<?php
require_once 'HTML/CSS.php';

function myErrorAction($css_error)
{
    // do what you want: print and/or log $css_error instance of HTML_CSS_Error object
}

$errorConf = array('error_callback' => 'myErrorAction');
$css = new HTML_CSS(null, $errorConf);
// ...
?>
rather than using global PEAR error handler (PEAR::setErrorHandling, PEAR::pushErrorHandling, PEAR::popErrorHandling).
<?php
require_once 'HTML/CSS.php';

function myErrorAction($css_error)
{
    // do what you want: print and/or log $css_error instance of HTML_CSS_Error object
}

PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'myErrorAction');

$css = new HTML_CSS();
// ...
?>

With push_callback option, you can decides to stop script execution (as done with exceptions by default: returns PEAR_ERROR_DIE constant), or continue without filtering (returns NULL).

If you want to write your own callback function for the push_callback option, this one should have two arguments: first one will get the error code, and second will get error level. These are all the necessary informations to do a filtering. Example that follow show how to be aware that a script use wrong argument data type.
<?php
require_once 'HTML/CSS.php';

function myErrorFilter($code, $level)
{
    if ($code === HTML_CSS_ERROR_INVALID_INPUT) {
        error_log('script: '.__FILE__.' used wrong argument data type', 1, 'admin@yoursite.com');
    }
    return null;
}

$errorConf = array('push_callback' => 'myErrorFilter');
$css = new HTML_CSS(null, $errorConf);
// ...
?>

Error Context Display

In some cases, you may want to customize error generation. For instance, for each error (basic/exception), it is useful to include file, line number, and class/function context information in order to trace it. The default option will be sufficient for most cases but you want perhaps customize the output format (render) of context information.

With this example we will change display and log renders.
<?php
require_once 'HTML/CSS.php';

$displayConfig = array(
    'lineFormat' => '<b>%1$s</b>: %2$s<br />%3$s',
    'contextFormat' =>   '<b>File:</b> %1$s <br />'
                       . '<b>Line:</b> %2$s <br />'
                       . '<b>Function:</b> %3$s '
);
$logConfig = array(
    'lineFormat' => '%1$s %2$s [%3$s] %4$s',
    'timeFormat' => '%b'
);

$prefs = array(
    'handler' => array('display' => $displayConfig,
                       'log'     => $logConfig
));

$css = new HTML_CSS(null, $prefs);
// ...
$result = $css->setStyle('div', 'color', 5);
?>

Display render will give something like:

Log render will give something like:

Jun 127.0.0.1(1) [exception(2)] invalid input, parameter #3 "$value" was expecting "string", instead got "integer"(3)
(1)
client ip address and execution date
(2)
error level
(3)
message body with context informations

Note: To have both display and log output, check the php.ini display_errors and log_errors values : must be set to TRUE.

Let review, step by step, how to get such results.

Remember that with default classes, there are two drivers : display and log that have both their own configuration parameters. You can override these parameters values with the handler entry in the hash of second argument of the HTML_CSS class constructor.

We did it here with the $prefs variable; it's a two key associative array. First key display defines the display driver values, and the second key log defines the log driver values.

Review the display driver custom values. Only two keys: lineFormat, contextFormat are redefined, thats means remains key eol keep its default value. See table below.

Tip: If you don't wish to see context information in the error message, then remove the parameter %3$ in the lineFormat option even if contextFormat is set.

Review now the log driver custom values. Only two keys lineFormat, timeFormat are redefined, thats means six remains keys eol, contextFormat, ident, message_type, destination, extra_headers keep their default values. See table below.

Tip: If you don't wish to see context information in the error message, then remove the parameter %5$ in the lineFormat option even if contextFormat is set.

Custom Error Message Generation

There are two methods of HTML_CSS_Error designed for use with generating error messages efficiently. To use them, you must set the options below in the HTML_CSS class constructor (argument #2):

Option: message_callback

The default message handling callback (HTML_CSS_Error::_getErrorMessage) get an array mapping error codes to error message templates, like so:
<?php
$messages = array(
    HTML_CSS_ERROR_UNKNOWN =>
        'unknown error',
    HTML_CSS_ERROR_INVALID_INPUT =>
        'invalid input, parameter #%paramnum% '
      . '"%var%" was expecting '
      . '"%expected%", instead got "%was%"'
);
?>
Basically, if a variable name is enclosed in percent signs (%), it will be replaced with the value passed in the associative array.

Option: context_callback

The default context handling callback (HTML_CSS_Error::getBackTrace) gets an array of execution functions and discovers where the error was generated.


HTML_Form

Table of Contents
Introduction -- Generating HTML forms.
Usage examples -- Using HTML_Form.

This is a simple HTML form generator. It supports all the HTML form element types including file uploads, may return or print the form, just individual form elements or the full form in "table mode" with a fixed layout.

Introduction

Introduction -- Generating HTML forms.

What is HTML_Form?

This is a simple HTML form generator. It supports all the HTML form element types including file uploads, may return or print the form, just individual form elements or the full form in "table mode" with a fixed layout.

Range of use

Generally one can use HTML_Form in HTML based projects of any form. But especially when using the package in "table mode" one may soon run into design problems, because the table that is created by HTML_Form cannot be equipped with CSS or other ways to control their look. Thus the main usage area of HTML_Form are sites where design does not play the most important role but where it is necessary to get fast results while keeping the code clean at the same time. (Examples are back office websites or places like pear.php.net, where the package is used at a lot of places.)

Simple usage example

The above example code creates a HTML form that only contains a single textfield with the name "name" and with the label "What's your name" and a submit button labeled "Go, Go".

Supported tags

The following HTML form tags are supported by HTML_Form: textfields, password fields, checkboxes, textareas, submit buttons, reset buttons, select fields, radio buttons, image fields, hidden fields, file upload fields. Additionally one can add blank spaces and plain text to the form.

Usage examples

Usage examples -- Using HTML_Form.

Creating the form in "table mode"

Creating a form in "table mode" means that the package returns the complete form in a fixed width table. Whilst this does not work very well for most frontend websites, it is a very convenient way to create forms during development phase or for backend systems where the design does not matter (much).

This will display a table where the left column holds the labels of the different fields. In the right column the different fields are placed.

Displaying single form tags

Apart from retrieving the table as a whole, one can also use the API of HTML_Form to directly display single form tags.

The above example will print the HTML markup being necessary to render a text input field. It will not print the surrounding <form /> tag or something else!

Returing single form tags

Similar to displaying form tags with the display*() functions HTML_Form can also return the tag instead of printing it.

The variable $str now contains HTML markup like <input type="password" name="password" />.


HTML_Menu

Table of Contents
Introduction -- Menu structure and supported output modes
constructor HTML_Menu::HTML_Menu() -- Initializes the menu, sets the type and menu structure.
HTML_Menu::forceCurrentUrl() -- Forces the given URL to be "current"
HTML_Menu::get() -- Returns the HTML menu.
HTML_Menu::getCurrentURL() -- Returns the URL of the currently selected page.
HTML_Menu::getPath() -- Returns the path of the current page in the menu 'tree'.
HTML_Menu::render() -- Renders the menu.
HTML_Menu::setMenu() -- Sets the menu structure.
HTML_Menu::setMenuType() -- Sets the type of the menu.
HTML_Menu::setURLEnvVar() -- Sets the environment variable to use to get the current URL.
HTML_Menu::setURLPrefix() -- Sets the prefix for the URLs in the menu
HTML_Menu::show() -- Prints the HTML menu.
Class Summary HTML_Menu_Renderer -- An abstract base class for HTML_Menu renderers (package developer related)
HTML_Menu_Renderer::finishLevel() -- Finish the tree level (for types 'tree' and 'sitemap') (package developer related)
HTML_Menu_Renderer::finishMenu() -- Finish the menu (package developer related)
HTML_Menu_Renderer::finishRow() -- Finish the row in the menu (package developer related)
HTML_Menu_Renderer::renderEntry() -- Renders the element of the menu (package developer related)
HTML_Menu_Renderer::setMenuType() -- Sets the type of the menu being rendered
Class Summary HTML_Menu_DirectRenderer -- The renderer that generates HTML for the menu all by itself.
DirectRenderer::setEntryTemplate() -- Sets the template for menu entry.
DirectRenderer::setMenuTemplate() -- Sets the menu template (HTML that wraps around rows)
DirectRenderer::setRowTemplate() -- Sets the row template (HTML that wraps around entries)
DirectRenderer::toHtml() -- returns the HTML generated for the menu
Class Summary HTML_Menu_DirectTreeRenderer -- The "direct" renderer for 'tree' and 'sitemap' menu types where level is represented by tags nesting.
DirectTreeRenderer::setEntryTemplate() -- Sets the template for menu entry.
DirectTreeRenderer::setItemTemplate() -- Sets the item template (HTML that wraps around entries)
DirectTreeRenderer::setLevelTemplate() -- Sets the level template (HTML that wraps around the submenu)
DirectTreeRenderer::toHtml() -- returns the HTML generated for the menu
Class Summary HTML_Menu_ArrayRenderer -- The renderer that creates an array of visible menu entries.
ArrayRenderer::toArray() -- returns the resultant array
Class Summary HTML_Menu_SigmaRenderer -- The renderer that uses HTML_Template_Sigma instance for menu output.
constructor HTML_Menu_SigmaRenderer() -- Class constructor.
Class Summary HTML_Menu_SigmaTreeRenderer -- HTML_Template_Sigma-based renderer for 'tree' and 'sitemap' type menus, where menu level is represented by tag nesting.
constructor HTML_Menu_SigmaTreeRenderer() -- Class constructor.
Class Summary HTML_MenuBrowser -- Simple filesystem browser that can be used to generated menu (3) hashes based on the directory structure.
constructor HTML_MenuBrowser::HTML_MenuBrowser() -- Creates the object and optionally sets the directory to scan.
HTML_MenuBrowser::addFileInfo() -- Adds further informations to the menu hash gathered from the files in it
HTML_MenuBrowser::browse() -- Recursive function that does the scan and builds the menu (3) hash.
HTML_MenuBrowser::exploreFile() -- Returns additional menu informations decoded in the file that appears in the menu.
HTML_MenuBrowser::getMenu() -- Returns a hash to be used with menu(3)'s setMenu().
HTML_MenuBrowser::setDirectory() -- Sets the directory to scan.
HTML_MenuBrowser::setIDPrefix() -- Sets the prefix for every id in the menu hash.
Package HTML_Menu Constants -- Constants defined in and used by HTML_Menu

With the HTML_Menu class one can easily create and maintain a navigation structure for websites, configuring it via a multidimensional hash structure. Different modes for the HTML output are supported.

Introduction

Introduction -- Menu structure and supported output modes

Menu hash structure

The menu structure is defined by a multidimensional hash. This makes it quite easy to generate and traverse:
Each entry should have at least 'url' and 'title' keys and may also have 'sub' key containing the children of this entry. Note that keys in the entry arrays serve as node identifiers and should be unique.

The menu entries can also contain custom keys. If such keys are present, then they will be used by renderers in creating the output (this usually means that the content of such a key will be assigned to the template placeholder with the same name).

Supported output modes

HTML_Menu supports five output modes: 'tree' (default), 'rows', 'urhere', 'prevnext' and 'sitemap'. Lets use the array defined above as menu structure assuming that element 'Menu item 1.2' is currently active and try each menu type.

constructor HTML_Menu::HTML_Menu()

constructor HTML_Menu::HTML_Menu() -- Initializes the menu, sets the type and menu structure.

Description

Initializes the menu, sets the menu structure, type and variable to use for determining the current URL. All parameters are optional and can be set later by corresponding methods.

Parameter

array $menu

Menu structure

string $type

Menu type: 'tree', 'rows', 'urhere', 'prevnext', 'sitemap'

string $urlEnvVar

Environment variable to use for determining the current URL.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::forceCurrentUrl()

HTML_Menu::forceCurrentUrl() -- Forces the given URL to be "current"

Description

Use this if you do not want to extract current URL from some environment variable (e.g. $_SERVER['PHP_SELF']) but rather use some custom logic to determine it.

Parameter

string $url

Url to use

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::get()

HTML_Menu::get() -- Returns the HTML menu.

Description

This method uses HTML_Menu_DirectRenderer for its work. The renderer is used with default templates, you should use the render() method if you want to customize the output.

Parameter

string $menuType

Menu type: 'tree', 'rows', 'urhere', 'prevnext', 'sitemap'

Return value

returns HTML of the menu

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::getCurrentURL()

HTML_Menu::getCurrentURL() -- Returns the URL of the currently selected page.

Description

The returned string is used for all test against the URL's in the menu structure hash.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::getPath()

HTML_Menu::getPath() -- Returns the path of the current page in the menu 'tree'.

Description

'Path' here means the sequence of entry IDs leading to the current menu entry.

Return value

returns path to the selected menu item

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::render()

HTML_Menu::render() -- Renders the menu.

Description

All logic to actually create the output is contained in the renderer. render() just calls the appropriate method to traverse the menu structure.

Parameter

object HTML_Menu_Renderer &$renderer

Renderer to use

string $menuType

type of the menu

Throws

throws PEAR_Error. If the renderer is not designed to handle this type of menu, it will throw an error.

Note

This function can not be called statically.

HTML_Menu::setMenu()

HTML_Menu::setMenu() -- Sets the menu structure.

Description

The menu structure is defined by a multidimensional hash.

Parameter

array $menu

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::setMenuType()

HTML_Menu::setMenuType() -- Sets the type of the menu.

Description

Available types are: 'tree', 'rows', 'urhere', 'prevnext', 'sitemap'.

Parameter

string $menuType

type name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::setURLEnvVar()

HTML_Menu::setURLEnvVar() -- Sets the environment variable to use to get the current URL.

Description

The default variable name is 'PHP_SELF', which means 'current script name'.

Parameter

string $urlEnvVar

environment variable for current URL

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::setURLPrefix()

HTML_Menu::setURLPrefix() -- Sets the prefix for the URLs in the menu

Description

This is useful if you have relative URLs in the menu description structure. This prefix will be appended to the URLs from this structure and the result will be compared to "current" URL.

Parameter

string $prefix

menu URL prefix

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu::show()

HTML_Menu::show() -- Prints the HTML menu.

Description

This method uses HTML_Menu_DirectRenderer for its work. The renderer is used with default templates, you should use the render() method if you want to customize the output.

Parameter

string $menuType

Menu type: 'tree', 'rows', 'urhere', 'prevnext', 'sitemap'

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_Menu_Renderer

Class Summary HTML_Menu_Renderer -- An abstract base class for HTML_Menu renderers (package developer related)

Description

This class defines methods that should be implemented by child classes to provide necessary output logic. You only need to read its description if you intend to write your own renderer.

HTML_Menu_Renderer::finishLevel()

HTML_Menu_Renderer::finishLevel() -- Finish the tree level (for types 'tree' and 'sitemap') (package developer related)

Description

This package is not documented yet.

Parameter

integer $level

current depth in the tree structure

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu_Renderer::finishMenu()

HTML_Menu_Renderer::finishMenu() -- Finish the menu (package developer related)

Description

This package is not documented yet.

Parameter

integer $level

current depth in the tree structure

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu_Renderer::finishRow()

HTML_Menu_Renderer::finishRow() -- Finish the row in the menu (package developer related)

Description

This package is not documented yet.

Parameter

integer $level

current depth in the tree structure

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu_Renderer::renderEntry()

HTML_Menu_Renderer::renderEntry() -- Renders the element of the menu (package developer related)

Description

This package is not documented yet.

Parameter

array $node

Element being rendered

integer $level

Current depth in the tree structure

integer $type

Type of the element (one of HTML_MENU_ENTRY_* constants)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_Menu_Renderer::setMenuType()

HTML_Menu_Renderer::setMenuType() -- Sets the type of the menu being rendered

Description

This package is not documented yet.

Parameter

string $menuType

menu type

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_Menu_DirectRenderer

Class Summary HTML_Menu_DirectRenderer -- The renderer that generates HTML for the menu all by itself.

Description

This renderer directly generates the menu HTML, thus the name. It is loosely based on HTML_Menu 1.0 code, but while it was needed to subclass HTML_Menu to customize its output, HTML_Menu_DirectRenderer has built-in methods for changing menu appearance.

Class Trees for HTML_Menu_DirectRenderer

HTML_Menu_DirectRenderer Inherited Methods

Table 45-1. Inherited from HTML_Menu_Renderer

Method NameSummary
HTML_Menu_Renderer::finishLevel()Finish the tree level (for types 'tree' and 'sitemap')
HTML_Menu_Renderer::finishMenu()Finish the menu
HTML_Menu_Renderer::finishRow()Finish the row in the menu
HTML_Menu_Renderer::renderEntry()Renders the element of the menu
HTML_Menu_Renderer::setMenuType()Sets the type of the menu being rendered.

DirectRenderer::setEntryTemplate()

DirectRenderer::setEntryTemplate() -- Sets the template for menu entry.

Description

The template should contain at least the {title} placeholder, can also contain {url} and {indent} placeholders, depending on entry type. Default templates are:
array(
    HTML_MENU_ENTRY_INACTIVE    => '<td>{indent}<a href="{url}">{title}</a></td>',
    HTML_MENU_ENTRY_ACTIVE      => '<td>{indent}<b>{title}</b></td>',
    HTML_MENU_ENTRY_ACTIVEPATH  => '<td>{indent}<b><a href="{url}">{title}</a></b></td>',
    HTML_MENU_ENTRY_PREVIOUS    => '<td><a href="{url}">&lt;&lt; {title}</a></td>',
    HTML_MENU_ENTRY_NEXT        => '<td><a href="{url}">{title} &gt;&gt;</a></td>',
    HTML_MENU_ENTRY_UPPER       => '<td><a href="{url}">^ {title} ^</a></td>',
    HTML_MENU_ENTRY_BREADCRUMB  => '<td><a href="{url}">{title}</a> &gt;&gt; </td>'
);

Parameter

mixed $type

either type (one of HTML_MENU_ENTRY_* constants) or an array 'type' => 'template'

string $template

template for this entry type if $type is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DirectRenderer::setMenuTemplate()

DirectRenderer::setMenuTemplate() -- Sets the menu template (HTML that wraps around rows)

Description

These are the strings that will be prepended and appended to HTML generated for menu rows on each call to finishMenu(). Defaults are
'<table border="1">'
and
'</table>'

Parameter

string $prepend

this will be prepended to the rows HTML

string $append

this will be appended to the rows HTML

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DirectRenderer::setRowTemplate()

DirectRenderer::setRowTemplate() -- Sets the row template (HTML that wraps around entries)

Description

These are the strings that will be prepended and appended to HTML generated for menu entries on each call to finishRow(). Defaults are
'<tr>'
and
'</tr>'

Parameter

string $prepend

this will be prepended to the entries HTML

string $append

this will be appended to the entries HTML

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DirectRenderer::toHtml()

DirectRenderer::toHtml() -- returns the HTML generated for the menu

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_Menu_DirectTreeRenderer

Class Summary HTML_Menu_DirectTreeRenderer -- The "direct" renderer for 'tree' and 'sitemap' menu types where level is represented by tags nesting.

Description

The renderer is designed to output only the menus of type 'tree' and 'sitemap'. It shows the level of the menu by tags nesting, not by outputting some indentation and is able to output e.g. nested HTML lists:
<ul>
    <li>Menu item 1
        <ul>
            <li>Menu item 1.1</li>
            <li>Menu item 1.2</li>
        </ul>
    </li>  
    <li>Menu item 2</li>
</ul>

Idea and initial code contributed by Uwe Mindrup.

Class Trees for HTML_Menu_DirectTreeRenderer

HTML_Menu_DirectTreeRenderer Inherited Methods

Table 45-1. Inherited from HTML_Menu_Renderer

Method NameSummary
HTML_Menu_Renderer::finishLevel()Finish the tree level (for types 'tree' and 'sitemap')
HTML_Menu_Renderer::finishMenu()Finish the menu
HTML_Menu_Renderer::finishRow()Finish the row in the menu
HTML_Menu_Renderer::renderEntry()Renders the element of the menu
HTML_Menu_Renderer::setMenuType()Sets the type of the menu being rendered.

DirectTreeRenderer::setEntryTemplate()

DirectTreeRenderer::setEntryTemplate() -- Sets the template for menu entry.

Description

The template should contain at least the {title} placeholder, can also contain {url} placeholder. Default templates are:
array(
    HTML_MENU_ENTRY_INACTIVE    => '<a href="{url}">{title}</a>',
    HTML_MENU_ENTRY_ACTIVE      => '<strong>{title}</strong>',
    HTML_MENU_ENTRY_ACTIVEPATH  => '<a href="{url}"><em>{title}</em></a>'
);
If custom keys are present in the original menu structure, they will be assigned to the corresponding placeholders.

Parameter

mixed $type

either type (one of HTML_MENU_ENTRY_* constants) or an array 'type' => 'template'

string $template

template for this entry type if $type is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DirectTreeRenderer::setItemTemplate()

DirectTreeRenderer::setItemTemplate() -- Sets the item template (HTML that wraps around entries)

Description

These are the strings that will be prepended and appended to HTML generated for menu entries. Defaults are
'<li>'
and
'</li>'

Parameter

string $prepend

this will be prepended to the entries HTML

string $append

this will be appended to the entries HTML

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DirectTreeRenderer::setLevelTemplate()

DirectTreeRenderer::setLevelTemplate() -- Sets the level template (HTML that wraps around the submenu)

Description

These are the strings that will be prepended and appended to HTML generated for menu level. Defaults are
'<ul>'
and
'</ul>'

Parameter

string $prepend

this will be prepended to the rows HTML

string $append

this will be appended to the rows HTML

Throws

throws no exceptions thrown

Note

This function can not be called statically.

DirectTreeRenderer::toHtml()

DirectTreeRenderer::toHtml() -- returns the HTML generated for the menu

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_Menu_ArrayRenderer

Class Summary HTML_Menu_ArrayRenderer -- The renderer that creates an array of visible menu entries.

Output array

The resultant array can be used with e.g. a template engine to produce a completely custom menu look.

All menu types except 'rows' are "rendered" into a one-dimensional array of entries:
array(
    'entry1',
    ...
    'entryN'
)
while 'rows' produce a two-dimensional array:
array(
    array('entry 1 for row 1', ..., 'entry M_1 for row 1'),
    ...
    array('entry 1 for row N', ..., 'entry M_N for row 1')
 )

Here entry is
array(
    'url'    => url element of menu entry
    'title'  => title element of menu entry
    'level'  => entry's depth in the tree structure
    'type'   => type of entry, one of HTML_MENU_ENTRY_* constants
 )
A list of the above mentioned HTML_MENU_ENTRY_* constants can be found here.

Class Trees for HTML_Menu_ArrayRenderer

HTML_Menu_ArrayRenderer Inherited Methods

Table 45-1. Inherited from HTML_Menu_Renderer

Method NameSummary
HTML_Menu_Renderer::finishLevel()Finish the tree level (for types 'tree' and 'sitemap')
HTML_Menu_Renderer::finishMenu()Finish the menu
HTML_Menu_Renderer::finishRow()Finish the row in the menu
HTML_Menu_Renderer::renderEntry()Renders the element of the menu
HTML_Menu_Renderer::setMenuType()Sets the type of the menu being rendered.

ArrayRenderer::toArray()

ArrayRenderer::toArray() -- returns the resultant array

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_Menu_SigmaRenderer

Class Summary HTML_Menu_SigmaRenderer -- The renderer that uses HTML_Template_Sigma instance for menu output.

Description

This renderer uses HTML_Template_Sigma for actual HTML generation. This will allow you to easily plug HTML_Menu into your site's structure if you are using this template engine.

The renderer offers more possibilites for output customization than HTML_Menu_DirectRenderer.

The renderer may also work with HTML_Template_IT instance, but as menu templates tend to have lots of blocks, HTML_Template_Sigma's cache feature will give a significant performance improvement.

Template structure

This minimal template will allow output of any available menu type:
<!-- BEGIN mu_menu_loop -->
<table cellpadding="2" cellspacing="0" border="1">
    <!-- BEGIN mu_row_loop -->
    <tr>
        <!-- BEGIN mu_entry_loop -->
        <!-- BEGIN mu_inactive -->
        <td><!-- BEGIN mu_inactive_indent -->&nbsp;&nbsp;<!-- END mu_inactive_indent --><a href="{mu_url}">{mu_title}</a></td>
        <!-- END mu_inactive -->
        <!-- BEGIN mu_active -->
        <td><!-- BEGIN mu_active_indent -->&nbsp;&nbsp;<!-- END mu_active_indent --><strong>{mu_title}</strong></td>
        <!-- END mu_active -->
        <!-- BEGIN mu_activepath -->
        <td><!-- BEGIN mu_activepath_indent -->&nbsp;&nbsp;<!-- END mu_activepath_indent --><a href="{mu_url}"><strong>{mu_title}</strong></a></td>
        <!-- END mu_activepath -->
        <!-- BEGIN mu_previous -->
        <td><a href="{mu_url}">&lt;&lt;&lt; {mu_title}</a></td>
        <!-- END mu_previous -->
        <!-- BEGIN mu_next -->
        <td><a href="{mu_url}">{mu_title} &gt;&gt;&gt;</a></td>
        <!-- END mu_next -->
        <!-- BEGIN mu_upper -->
        <td><a href="{mu_url}">^ {mu_title} ^</a></td>
        <!-- END mu_upper -->
        <!-- BEGIN mu_breadcrumb -->
        <td><a href="{mu_url}">{mu_title}</a> &gt;&gt;&gt;</td>
        <!-- END mu_breadcrumb -->
        <!-- END mu_entry_loop -->
    </tr>
    <!-- END mu_row_loop -->
</table>
<!-- END mu_menu_loop -->
A more complete example showing possible customizations can be found in the package archive.

Note that blocks and placeholders in the template have mu_ prefix. This is done to prevent name conflicts with existing blocks and placeholders, mu_ is the default prefix, another prefix can be passed to class constructor.

Blocks in the template (without prefix)

menu_loop

If present, this block will be parse()'d after outputting the current menu or (in case of 'rows' type) current menu level. If menu type is 'rows' and %level%_menu_loop block is present, it will be parse()'d instead.

row_loop

If present, this block will be parse()'d after outputting the current menu row. If menu type is 'rows' and %level%_row_loop block is present, it will be parse()'d instead.

entry_loop

This block should always be present and should be a parent for all menu entries' blocks. It is used to implement "flow", to render entries one after another.

If menu type is 'rows' and %level%_entry_loop block is present, it will be used instead.

inactive, active, activepath, previous, next, upper, breadcrumb

These blocks are used to output menu entries, they correspond to possible entry types. Each block should contain a {title} placeholder and may also contain {url} placeholder and indent block

If menu type is either of 'tree', 'sitemap' or 'rows' and %level%_%entry type% block exists, it will be used instead.

inactive_indent, active_indent, activepath_indent

If present, these blocks are used to indent the entries inside tree-type menus ('tree' and 'sitemap').

Class Trees for HTML_Menu_SigmaRenderer

HTML_Menu_SigmaRenderer Inherited Methods

Table 45-1. Inherited from HTML_Menu_Renderer

Method NameSummary
HTML_Menu_Renderer::finishLevel()Finish the tree level (for types 'tree' and 'sitemap')
HTML_Menu_Renderer::finishMenu()Finish the menu
HTML_Menu_Renderer::finishRow()Finish the row in the menu
HTML_Menu_Renderer::renderEntry()Renders the element of the menu
HTML_Menu_Renderer::setMenuType()Sets the type of the menu being rendered.

constructor HTML_Menu_SigmaRenderer()

constructor HTML_Menu_SigmaRenderer() -- Class constructor.

Description

Sets the template object to use and sets prefix for template blocks and placeholders. We use prefix to avoid name collisions with existing template blocks and it is customisable to allow output of several menus into one template.

Parameter

object HTML_Template_Sigma &$tpl

template object to use for output

string $prefix

prefix for template blocks and placeholders

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_Menu_SigmaTreeRenderer

Class Summary HTML_Menu_SigmaTreeRenderer -- HTML_Template_Sigma-based renderer for 'tree' and 'sitemap' type menus, where menu level is represented by tag nesting.

Description

The renderer generates outpu similar to that of HTML_Menu_DirectTreeRenderer but offers more possibilites for output customization.

The renderer may also work with HTML_Template_IT instance, but as menu templates tend to have lots of blocks, HTML_Template_Sigma's cache feature will give a significant performance improvement.

Template structure

This is the minimal template for HTML_Menu_SigmaTreeRenderer, containing all the required blocks:
<!-- BEGIN mu_tree_loop -->
    <!-- BEGIN mu_level_open -->
<ul>
    <!-- END mu_level_open -->
        <!-- BEGIN mu_entry_open -->
    <li>
        <!-- END mu_entry_open -->
        <!-- BEGIN mu_active -->
    <strong>{mu_title}</strong>
        <!-- END mu_active -->
        <!-- BEGIN mu_inactive -->
    <a href="{mu_url}">{mu_title}</a>
        <!-- END mu_inactive -->
        <!-- BEGIN mu_activepath -->
    <a href="{mu_url}"><em>{mu_title}</em></a>
        <!-- END mu_activepath -->
        <!-- BEGIN mu_entry_close -->
    </li>
        <!-- END mu_entry_close -->
    <!-- BEGIN mu_level_close -->
</ul>
    <!-- END mu_level_close -->
<!-- END mu_tree_loop -->
A more complete example showing possible customizations can be found in the package archive.

Note that blocks and placeholders in the template have mu_ prefix. This is done to prevent name conflicts with existing blocks and placeholders, mu_ is the default prefix, another prefix can be passed to class constructor.

Blocks in the template (without prefix)

tree_loop

This block should always be present and should be a parent for all other blocks. It is used to implement "flow", to render entries one after another.

level_open, level_close

These blocks will be used on start and end of each menu level. If level-specific blocks %level%_level_open and %level%_level_close are present, they will be used instead.

entry_open, entry_close

These blocks will be used on start and end of each menu entry. If level-specific blocks %level%_entry_open and %level%_entry_close are present, they will be used instead.

inactive, active, activepath

These blocks are used to output menu entries, they correspond to possible entry types. Each block should contain a {title} placeholder and may also contain {url} placeholder. As usual, if other keys are present in original menu array they will be assigned to corresponding placeholders in the template.

If level-specific block %level%_%entry type% exists, it will be used instead.

Class Trees for HTML_Menu_SigmaTreeRenderer

HTML_Menu_SigmaTreeRenderer Inherited Methods

Table 45-1. Inherited from HTML_Menu_Renderer

Method NameSummary
HTML_Menu_Renderer::finishLevel()Finish the tree level (for types 'tree' and 'sitemap')
HTML_Menu_Renderer::finishMenu()Finish the menu
HTML_Menu_Renderer::finishRow()Finish the row in the menu
HTML_Menu_Renderer::renderEntry()Renders the element of the menu
HTML_Menu_Renderer::setMenuType()Sets the type of the menu being rendered.

constructor HTML_Menu_SigmaTreeRenderer()

constructor HTML_Menu_SigmaTreeRenderer() -- Class constructor.

Description

Sets the template object to use and sets prefix for template blocks and placeholders. We use prefix to avoid name collisions with existing template blocks and it is customisable to allow output of several menus into one template.

Parameter

object HTML_Template_Sigma &$tpl

template object to use for output

string $prefix

prefix for template blocks and placeholders

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_MenuBrowser

Class Summary HTML_MenuBrowser -- Simple filesystem browser that can be used to generated menu (3) hashes based on the directory structure.

Simple filesystem browser that can be used to generated menu (3) hashes based on the directory structure.

Together with menu (3) and the (userland) cache you can use this browser to generate simple fusebox like applications / content systems.

Let the menubrowser scan your document root and generate a menu (3) structure hash which maps the directory structure, pass it to menu's setMethod() and optionally wrap the cache around all this to save script runs. If you do so, it looks like this:

// document root directory define('DOC_ROOT', '/home/server/www.example.com/');

// instantiate the menubrowser $browser = new menubrowser(DOC_ROOT);

// instantiate menu (3) $menu = new menu($browser->getMenu());

// output the sitemap $menu->show('sitemap');

Now, use e.g. simple XML files to store your content and additional menu informations (title!). Subclass exploreFile() depending on your file format.

Class Trees for HTML_MenuBrowser

  • HTML_MenuBrowser

constructor HTML_MenuBrowser::HTML_MenuBrowser()

constructor HTML_MenuBrowser::HTML_MenuBrowser() -- Creates the object and optionally sets the directory to scan.

Description

This package is not documented yet.

Parameter

string $dir

Directory to scan

string $index

Filename of index pages

string $file_suffix

Suffix for files containing the additional data

Throws

throws no exceptions thrown

See

see HTML_MenuBrowser::$dir

Note

This function can not be called statically.

HTML_MenuBrowser::addFileInfo()

HTML_MenuBrowser::addFileInfo() -- Adds further informations to the menu hash gathered from the files in it

Description

This package is not documented yet.

Parameter

mixed $menu

Return value

returns Modified menu hash with the new informations

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_MenuBrowser::browse()

HTML_MenuBrowser::browse() -- Recursive function that does the scan and builds the menu (3) hash.

Description

This package is not documented yet.

Parameter

string $dir

directory to scan

integer $id

entry id - used only for recursion

boolean $noindex

??? - used only for recursion

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_MenuBrowser::exploreFile()

HTML_MenuBrowser::exploreFile() -- Returns additional menu informations decoded in the file that appears in the menu.

Description

You should subclass this method to make it work with your own file formats. I used a simple XML format to store the content.

Parameter

string $file

filename

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_MenuBrowser::getMenu()

HTML_MenuBrowser::getMenu() -- Returns a hash to be used with menu(3)'s setMenu().

Description

This package is not documented yet.

Parameter

string $dir

directory to scan

string $prefix

id prefix

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_MenuBrowser::setDirectory()

HTML_MenuBrowser::setDirectory() -- Sets the directory to scan.

Description

This package is not documented yet.

Parameter

string $dir

directory to scan

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_MenuBrowser::setIDPrefix()

HTML_MenuBrowser::setIDPrefix() -- Sets the prefix for every id in the menu hash.

Description

This package is not documented yet.

Parameter

string $prefix

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package HTML_Menu Constants

Package HTML_Menu Constants -- Constants defined in and used by HTML_Menu

HTML_Page2

Table of Contents
Creation -- Making a new page
Headers -- Setting title and other meta data
Body -- Adding content
Output -- Finishing the page

API to create HTML Pages

Creation

Creation -- Making a new page

Description

A HTML page is created by instantiating a new HTML_Page2 object. While you may pass an array of attributes to the constructor, it isn't required since the default settings are fairly intuitive.

Default page settings

  • Unix line endings (\n)

  • UTF-8 charset

  • text/html MIME type

  • XHTML 1.0 Transitional doctype

  • English language

If you don't like these settings, you can either pass an array of settings to the constructor or use setter methods such as setDoctype(), setMimeEncoding() or setCharset() .

Headers

Headers -- Setting title and other meta data

Setting headers

The method you surely will use is setTitle() that sets the title of the page; the one that your browser displays in its title/window bar.

<?php
$page->setTitle('My first HTML page');
?>

Meta tags can be set with setMetaData() which takes two parameters, the tag name and the content.

<?php
$page->setMetaData('author', 'Christian Weiske');
?>

A link to a bookmark icon (favicon) can be set using addFavicon() .

Links to related pages (previous, next, home etc.) are added with addHeadLink() - the first parameter determines the URL, the second the relation.

<?php
$page->addHeadLink('home.htm', 'Start');
?>

Adding CSS - Cascading stylesheets

A HTML page may contain two types of stylesheets: Inline css and a link to external .css file.

Inline CSS declarations are made with addStyleDeclaration()

$page->addStyleDeclaration('
div.block {
    border: 1px solid #000;
}
');

Links to external CSS files are created by using addStyleSheet(). The optional third parameter determines which media type the stylesheet shall be used for.

<?php
$page->addStyleSheet('css/dark.css');
$page->addStyleSheet('css/print.css', 'text/css', 'print');
?>

Adding scripts

You may want to add some javascript code to your page; either inline or link to an external .js file.

Inline code blocks are added with addScriptDeclaration() . The optional second parameter defaults to text/javascript but can be changed as needed.

<?php
$page->addScriptDeclaration('
function javaScriptTest() {
    alert("Test");
}
');
?>

Links to external script files are created by using addScript().

<?php
$page->addScript('js/functions.js');
?>

Body

Body -- Adding content

Description

After creating the page and setting headers, you want to add actual content to the page. The method in charge is addBodyContent().

By default, if content already exists, the new content is appended. If you wish to overwrite whatever is in the body, use setBody(); unsetBody() completely empties the body without inserting new content. You can also use prependBodyContent() to prepend content to whatever is currently in the array of body elements.

The following constants are defined to be passed as the flag attribute: HTML_PAGE2_APPEND, HTML_PAGE2_PREPEND and HTML_PAGE2_REPLACE. Their usage should be quite clear from their names.

<?php
$page->addBodyContent('<h1>Hello!</h1>');
$page->addBodyContent('<p>This is a paragraph.</p>');
?>

Output

Output -- Finishing the page

Description

After adding all the headers and content to the page, you want to get the page to the user. display() directly echoes the page to the browser.

If you want to do something with the result page before pushing it to the browser, use toHtml() . It returns the page as string that can be modified further.

<?php
//push it to the browser
$page->display();
//or put it into a variable
$html = $page->toHtml();
?>

HTML_Progress

Warning

This package has been superseded. Please use HTML_Progress2 for new projects.


HTML_Progress2

Table of Contents
Introduction -- A feature overview

How to include a loading bar in your XHTML documents quickly and easily

Introduction

Introduction -- A feature overview

Description

HTML_Progress2 is designed to display a loading bar in your XHTML documents during a long process. Progress bar may be synchronous (COMET) or asynchronous (AJAX).

Features

  • create horizontal, vertival bar and also circle, ellipse and polygons (square, rectangle)

  • allows usage of existing external StyleSheet and/or JavaScript

  • all elements (progress, cells, labels) are customizable by their html properties

  • percent/labels are floating all around the progress meter

  • compliant with all CSS/XHMTL standards

  • integration with all template engines is very easy

  • implements Observer design pattern. It is possible to add Listeners

  • adds a customizable monitor pattern to display a progress bar. User-end can abort progress at any time

  • allows many progress meter on same page without uses of iframe solution

  • error handling system that support native PEAR_Error, but also PEAR_ErrorStack, and any other system you might want to plug-in.

External support resources


HTML_QuickForm

The PEAR::HTML_QuickForm package provides methods for creating, validating, processing HTML forms.


Introduction

Table of Contents
QuickStart -- A tutorial for HTML_QuickForm
QuickHelp -- Answers to most Frequently Asked Questions
QuickForm element types -- What elements can be added to QuickForm
Migration to version 3.2 -- API changes to observe
Subpackages -- An overview about subpackages and packages that use QuickForm

QuickForm is a convenience library for dealing with HTML forms. It provides Javascript and server-side form validation, and is customizable and extensible in many ways. QuickForm consists of multiple files. The main file is QuickForm.php and should be installed in your pear/HTML directory. The other important files are element.php, which handles all methods relative to form elements, and group.php, which deals with methods relative to groups of elements in the form. Both are located in your HTML/QuickForm directory along with the other form objects. input.php contains a common class for all the elements of input type (text, password...). QuickForm has objects for all the common form elements: select, text, password, checkbox, file, submit, reset, button, image, radio, hidden, textarea. QuickForm provides the possibility to create your own elements as long as you comply with the common API.

QuickStart

QuickStart -- A tutorial for HTML_QuickForm

Introduction

The purpose of this tutorial is to give the new users of QuickForm an overview of its features and usage patterns. It describes a small subset of available functionality, but points to the parts of the documentation that give a more in-depth overview.

There also exists a somewhat bigger tutorial on QuickForm usage made by Keith Edmunds.

Your first form

Lets review this example step by step.

Building the form

The line
$form = new HTML_QuickForm('firstForm');
creates a HTML_QuickForm object that will contain the objects representing elements and all the other necessary information. We only pass the form's name to the constructor, which means that default values will be used for other parameters. In particular, the form's method will default to POST and the form's action to the current file. When using QuickForm, it is easier to keep all the form related logic in one file.

You might guess that
$form->setDefaults(array(
    'name' => 'Joe User'
));
sets the default value for name element to 'Joe User'. QuickForm has the concept of default values (set via setDefaults() method) and constant ones (set via setConstants()). The difference between them is that user's input overrides default values but not constant ones.

Our form will consist of three elements:
$form->addElement('header', null, 'QuickForm tutorial example');
$form->addElement('text', 'name', 'Enter your name:', array('size' => 50, 'maxlength' => 255));
$form->addElement('submit', null, 'Send');
The first one is not the 'real' element, it is just a heading to improve presentation. The second one actually is a text input box and the third is a submit button. Note that parameters for addElement() method have different meanings for different elements. That is so because they are actually passed to these elements' constructors.

Checking input

The line
$form->applyFilter('name', 'trim');
defines a filter for the 'name' element value - the function that will be applied to it after form submit. In this case it is a builtin trim() function, but can be any valid callback. Thus we will strip all whitespace from the name, as we do not actually need it and as we want to be sure that a name was entered, not just some spaces.

Next we define a rule for the name field:
$form->addRule('name', 'Please enter your name', 'required', null, 'client');
This means that QuickForm will display an error message if the name was not entered. The 'client' modifier is here to switch on client-side JavaScript validation in addition to server-side one. Note also that QuickForm will automatically mark required fields in the form.

Validating and processing

We now have the form built and rules defined and need to decide whether to process it or display:
if ($form->validate()) {
    // Do some stuff
}
The validate() method will consider the form valid (i.e. return TRUE) if some data was actually submitted and all the rules defined for the form were satisfied. In our case this means that 'name' element was not empty.

If the form is validated we need to process the values
echo '<h1>Hello, ' . htmlspecialchars($form->exportValue('name')) . '!</h1>';
exit;
This is an example, in your scripts you'll usually want to store the values somewhere and to redirect to some other page to prevent a duplicate submit. The process() and exportvalues() methods may be of interest here.

The last line is pretty easy:
$form->display();
If the form is not valid, which means that it either was not yet submitted or that there were errors, it will be displayed. Error messages (if any) will be displayed near the corresponding elements.

Advanced features

You now should have an understanding of basic QuickForm functionality, but there are many more features in the package, each of them deserving a separate tutorial. This section will give a short overview of them and point you to the complete documentation.

Groups allow to combine several individual elements into one entity and to use it as one element. This is also used to create pseudo-elements like date and hierselect.

QuickForm offers a lot of possibilities to customize form layout and appearance. Form output is done via renderers - special classes containing necessary logic. There are renderers that directly output HTML and those that use template engines for this.

And finally, you can extend QuickForm by adding your own element types, rules and renderers.

QuickHelp

QuickHelp -- Answers to most Frequently Asked Questions

Description

This document is based on questions asked on PEAR general mailing list. You are encouraged to search the list archives to find more verbose answers and examples.

HTML_QuickForm FAQ

1. The forms I generate with HTML_QuickForm cannot be submitted. When I look at the page's HTML source, I see something like <formArray>.
2. When I pass some GET parameters to the script containing a form, QuickForm thinks that the form was already submitted, displaying validation errors.
3. How do I set default/constant values for 'date' element?
4. I receive weird "Call to a member function on a non-object" or "Undefined function" errors, especially when dealing with groups.
5. QuickForm generates code which does not validate as XHTML Strict!
6. The 'required' rule does not work for my elements!
7. How do I change * denotes required field and Invalid information entered. / Please correct these fields. validation messages?

1. The forms I generate with HTML_QuickForm cannot be submitted. When I look at the page's HTML source, I see something like <formArray>.

Recent versions of HTML_QuickForm package require HTML_Common package version 1.2.1 (CVS revision 1.8 in HTML/Common.php) to work properly. If (and only if) an older version of HTML_Common is loaded, these symptoms occur.

Please note that

$ pear list
              
command may tell you that you have HTML_Common 1.2.1 installed. In this case you also have an older version of HTML_Common somewhere and are including it instead of the proper one. Check your include_path setting in php.ini and/or use PHP's get_included_files() function to find out which file you are really including.

2. When I pass some GET parameters to the script containing a form, QuickForm thinks that the form was already submitted, displaying validation errors.

Constructor of HTML_QuickForm accepts a $trackSubmit parameter. Setting this to TRUE will make QuickForm check whether the form was actually submitted. This also helps if you have several forms defined on one page.

3. How do I set default/constant values for 'date' element?

Date element is essentially a group of selects, you define the structure of this group in the 'format' option when creating the element:
$form->addElement('date', 'foo', 'The date:', array('format' => 'Y m d'));
Thus you pass the defaults as an array, just like you do with any other group:
$form->setDefaults(array(
    'foo' => array('Y' => 2004, 'm' => 9, 'd' => 29)
));

To ease using it with database-backed applications, date element also accepts Unix timestamps (generated by mktime()) and strings. The strings are processed by strtotime() functions, so consider its limitations.

4. I receive weird "Call to a member function on a non-object" or "Undefined function" errors, especially when dealing with groups.

These errors tend to appear when you have something which is not a HTML_QuickForm_element in the $elements array passed to addGroup(). This "something" is usually either a PEAR_Error instance (check for these or setup a handler) or, if register_globals is switched on in php.ini, some submitted values (clear the array before adding elements to it).

5. QuickForm generates code which does not validate as XHTML Strict!

QuickForm does add a 'name' attribute to the <form> tag, which is invalid in XHTML Strict. Quickform does not depend on that attribute since release 3.2.2, and it's only kept for backwards compatibility. If you desire XHTML Strict compliance and your code does not depend on said attribute, you can remove it via removeAttribute() method.

6. The 'required' rule does not work for my elements!

  • If your element is a file upload, you should use 'uploadedfile' rule instead.

  • If your element is a group, you should use addGroupRule() method instead of addRule(). This applies to group-based elements like 'date' and 'hierselect' as well.

7. How do I change * denotes required field and Invalid information entered. / Please correct these fields. validation messages?

You should use setRequiredNote() and setJsWarnings() methods, respectively.

QuickForm element types

QuickForm element types -- What elements can be added to QuickForm

Elements overview

As of release 3.2.5, HTML_QuickForm knows 23 element types that can be created via createElement() and added to the form via addElement(). These can be divided into two big groups: standard HTML elements and custom elements.

Standard HTML elements

'button'

Class for <input type="button" /> elements, HTML_QuickForm_button

'checkbox'

Class for <input type="checkbox" /> elements, HTML_QuickForm_checkbox

'file'

Class for <input type="file" /> elements, HTML_QuickForm_file

'hidden'

Class for <input type="hidden" /> elements, HTML_QuickForm_hidden

'image'

Class for <input type="image" /> elements, HTML_QuickForm_image

'password'

Class for <input type="password" /> elements, HTML_QuickForm_password

'radio'

Class for <input type="radio" /> elements, HTML_QuickForm_radio

'reset'

Class for <input type="reset" /> elements, HTML_QuickForm_reset

'select'

Class for <select> elements, HTML_QuickForm_select. The class allows loading of <option> elements from array or database.

'submit'

Class for <input type="submit" /> elements, HTML_QuickForm_submit

'text'

Class for <input type="text" /> elements, HTML_QuickForm_text

'textarea'

Class for <textarea> elements, HTML_QuickForm_textarea

'xbutton'

Class for <button> elements, HTML_QuickForm_xbutton

Custom element types

'advcheckbox'

Class for an advanced checkbox type field, HTML_QuickForm_advcheckbox. Basically this fixes a problem that HTML has had where checkboxes can only pass a single value (the value of the checkbox when checked).

'autocomplete'

Class for a text field with autocompletion feature, HTML_QuickForm_autocomplete. The element looks like a normal HTML input text element that at every keypressed javascript event, searches the array of options for a match and autocompletes the text in case of match.

'date'

Class for a group of elements used to input dates (and times), HTML_QuickForm_date

'group'

Class for a form element group, HTML_QuickForm_group. QuickForm allows grouping of several elements into one entity and using this entity as a new element.

'header'

Class for adding headers to the form, HTML_QuickForm_header

'hiddenselect'

This class, HTML_QuickForm_hiddenselect, behaves as a select element, but instead of creating a <select> it creates hidden elements for all values already selected with setDefaults() or setConstants().

'hierselect'

Class to dynamically create "chained" HTML <select> elements, HTML_QuickForm_hierselect. Choosing an option in the first <select> changes the available options of the second select and so on.

'html'

Deprecated. A pseudo-element used for adding raw HTML to form, HTML_QuickForm_html. Intended for use with the default renderer only, template-based ones may (and probably will) completely ignore this.

'link'

Class for a link type field, HTML_QuickForm_link

'static'

Class for static data, HTML_QuickForm_static

Migration to version 3.2

Migration to version 3.2 -- API changes to observe

Why these changes?

HTML_QuickForm has improved a lot since version 2.x. With the addition of a new renderer layer, a lot of methods that were located in the main QuickForm class were actually duplicates of methods in the renderers. Those methods were kept to give user time to adjust their code. With release 3.2 they will be removed, making QuickForm class much lighter and consistent.

At the same time, file upload validation was moved to the file element as this is a more appropriate place.

Removed methods

  • QuickForm related

    • HTML_QuickForm::getAttributesString()

    • HTML_QuickForm::addElementGroup()

    • HTML_QuickForm::addHeader()

    • HTML_QuickForm::addData()

  • Renderer related

    • HTML_QuickForm::setElementTemplate()

    • HTML_QuickForm::setHeaderTemplate()

    • HTML_QuickForm::setFormTemplate()

    • HTML_QuickForm::setRequiredNoteTemplate()

    • HTML_QuickForm::clearAllTemplates()

    • HTML_QuickForm_group::setElementTemplate()

    • HTML_QuickForm_group::setGroupTemplate()

  • File upload related

    • HTML_QuickForm::isUploadedFile()

    • HTML_QuickForm::getUploadedFile()

    • HTML_QuickForm::moveUploadedFile()

How to adjust your code

QuickForm related

HTML_QuickForm::getAttributesString()

$form->getAttributes(true);
will return the same value by using HTML_Common::getAttributes() method.

HTML_QuickForm::addElementGroup()

Arguments order was changed to conform to the way elements are usually added to QuickForm by addElement(). Use HTML_QuickForm::addGroup() instead and swap the element label with the element name.

HTML_QuickForm::addHeader()

A header is now considered like any other element. There is a new HTML_QuickForm_header element that extends HTML_QuickForm_static. Just use
$form->addElement('header', $header_name, $header_text);
This will also allow you to customize the header rendering based on its name.

HTML_QuickForm::addData()

If you absolutely need this feature, use
$form->addElement('html', $data)
or consider using some template-based renderer.

Renderer related

Those methods are now handled by the renderers. How to use these methods depends on your choice of renderer. With QuickForm default renderer, you can use these methods like that:
$form =& new HTML_QuickForm('myform');

$renderer =& $form->defaultRenderer();
$renderer->setFormTemplate('<table><form{attributes}>{content}</form></table>');
$renderer->setHeaderTemplate('<tr><td colspan="2"><b>{header}</b></td></tr>');
$renderer->setGroupTemplate('<table><tr>{content}</tr></table>');
$renderer->setGroupElementTemplate('<td>{element}<br /><!-- BEGIN required -->*<!-- END required -->{label}</td>');
defaultRenderer()will return a reference to QuickForm integrated renderer. You can of course use any other renderer available in QuickForm such as Sigma, ITX, Smarty, Flexy and so on. Have a look at their documentation to see which methods are available for them.

File upload related

File-related methods and rules have been moved to the file element HTML_QuickForm_file because it makes more sense this way and you don't have to include upload-related code if you are not using uploads. You have access to these methods like that:
$form = new HTML_QuickForm('myform');
$file =& $form->addElement('file', 'myfile', 'Your file:');
$form->addRule('myfile', 'Cannot exceed 1776 bytes', 'maxfilesize', 1776);
if ($file->isUploadedFile()) {
    $file->moveUploadedFile('/tmp', 'testfile.txt');
}
or like that:
$file =& $form->getElement('myfile');
if ($file->isUploadedFile()) {
     $fileInfo = $file->getValue();
}

Subpackages

Subpackages -- An overview about subpackages and packages that use QuickForm

Subpackages for HTML_QuickForm

This section describes the available subpackages for HTML_QuickForm, e.g. custom elements or renderers.

HTML_QuickForm_advmultiselect

A custom element that emulates via two select boxes a select box that allows selecting of multiple options.

HTML_QuickForm_DHTMLRulesTableless

If you use the Tableless renderer (see below, HTML_QuickForm_Renderer_Tableless), this subpackage replaces the default client-side validation with a JavaScript alert window by dynamic (using DHTML) error messages that are printed directly above each erroneous element. (documentation)

HTML_QuickForm_Livesearch

This is another custom element. It creates an HTML input text element that at every keypressed javascript event, returns a list of options in a dynamic dropdown select box (especially useful to emulate a select box with a huge number of options). This element uses the AJAX technology.

HTML_QuickForm_Renderer_Tableless

This is a replacement for the default renderer of HTML_QuickForm that uses only XHTML and CSS but no table tags, and generates fully valid XHTML output. (documentation)

HTML_QuickForm_SelectFilter

Another custom element that is used to define dynamic filters on the client-side for select elements.

More subpackages

There are some more subpackages available that were not yet proposed as PEAR packages. An example is a DHTMLRules subpackage for forms using the default renderer by Justin Patrin that was not yet proposed as a PEAR package.

Packages that use HTML_QuickForm

This section describes some packages that makes working with HTML_QuickForm easier, either in the case of working with databases or in the case of forms that have multiple pages.

DB_DataObject_FormBuilder

FormBuilder aids in rapid application development using the packages DB_DataObject and HTML_QuickForm. (documentation)

DB_Table

This is a package that builds on PEAR DB and MDB2 to abstract datatypes and automate table creation, data validation, insert, update, delete, and select. It combines these with HTML_QuickForm to automatically generate input forms that match the table column definitions. (documentation)

HTML_QuickForm_Controller

If you want to create forms with multiple pages, this is the right package for you. It is an implementation of a PageController pattern. (documentation)

More packages

You can find more packages that have optional or required dependencies on HTML_QuickForm on the package site.


Creating a basic form

Table of Contents
constructor HTML_QuickForm::HTML_QuickForm() -- Class constructor
HTML_QuickForm::addElement() -- Adds an element into the form
HTML_QuickForm::apiVersion() -- Returns the current API version
HTML_QuickForm::createElement() -- Creates a new form element of the given type
HTML_QuickForm::elementExists() -- Checks if element is in the form
HTML_QuickForm::errorMessage() -- Returns an error message for error code
HTML_QuickForm::getElementType() -- Returns the type of an element
HTML_QuickForm::getElement() -- Returns a reference to the element
HTML_QuickForm::getMaxFileSize() -- Returns the value of MAX_FILE_SIZE hidden element
HTML_QuickForm::getRegisteredTypes() -- Returns registered element types
HTML_QuickForm::insertElementBefore() -- Inserts a new element right before the other element
HTML_QuickForm::isError() -- Tells whether a result is an error
HTML_QuickForm::isTypeRegistered() -- Checks whether the form element type is supported
HTML_QuickForm::registerElementType() -- Registers a new element type
HTML_QuickForm::removeElement() -- Removes an element
HTML_QuickForm::setMaxFileSize() -- Sets the value of MAX_FILE_SIZE hidden element
HTML_QuickForm::updateElementAttr() -- Updates Attributes for one or more elements

To be written.

constructor HTML_QuickForm::HTML_QuickForm()

constructor HTML_QuickForm::HTML_QuickForm() -- Class constructor

Description

Constructor, sets <form> tag attributes and loads submitted values.

Parameter

string $formName

Form's name.

string $method

(optional) Form's method

string $action

(optional) Form's action

string $target

(optional) Form's target

mixed $attributes

(optional) Extra attributes for <form> tag

boolean $trackSubmit

(optional) Whether to track if the form was submitted by adding a special hidden field. If the name of such field is not present in the $_GET or $_POST values, the form will be considered as not submitted.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm::addElement()

HTML_QuickForm::addElement() -- Adds an element into the form

Description

Adds an element into the form. If $element is a string representing an element type, then this method accepts variable number of parameters, their meaning and count depending on element type.

Parameters starting from second will be passed to the element's constructor, consult the docs for the appropriate element to find out which parameters to pass.

Parameter

mixed $element

element object or type of element to add (text, textarea, file...)

Return value

return reference to added element

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::apiVersion()

HTML_QuickForm::apiVersion() -- Returns the current API version

Description

Returns the current API version

Throws

throws no exceptions thrown

Note

since 1.0

This function can be called statically.

HTML_QuickForm::createElement()

HTML_QuickForm::createElement() -- Creates a new form element of the given type

Description

Creates a new form element of the given type. This method accepts variable number of parameters, their meaning and count depending on $elementType.

Parameters starting from second will be passed to the element's constructor, consult the docs for the appropriate element to find out which parameters to pass.

Parameter

string $elementType

type of element to create (text, textarea, file...)

Return value

return object, descendant of HTML_QuickForm_element

Note

since 1.0

This function can be called statically.

HTML_QuickForm::elementExists()

HTML_QuickForm::elementExists() -- Checks if element is in the form

Description

Returns TRUE if element is in the form, FALSE otherwise.

Parameter

string $element

form name of element to check

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::errorMessage()

HTML_QuickForm::errorMessage() -- Returns an error message for error code

Description

Returns a textual error message for QuickForm error code.

Parameter

integer $value

int error code

Return value

return error message

Throws

throws no exceptions thrown

Note

This function can be called statically.

HTML_QuickForm::getElementType()

HTML_QuickForm::getElementType() -- Returns the type of an element

Description

Returns the type of the given element.

Parameter

string $element

Name of form element

Return value

return element type or FALSE if element is not found

Throws

throws no exceptions thrown

Note

since 1.1

This function can not be called statically.

HTML_QuickForm::getElement()

HTML_QuickForm::getElement() -- Returns a reference to the element

Description

Returns a reference to the form element.

Parameter

string $element

Element name

Return value

return reference to element

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::getMaxFileSize()

HTML_QuickForm::getMaxFileSize() -- Returns the value of MAX_FILE_SIZE hidden element

Description

Returns the value of MAX_FILE_SIZE hidden element (used for file uploads).

Return value

return max file size in bytes

Throws

throws no exceptions thrown

Note

since 3.0

This function can not be called statically.

HTML_QuickForm::getRegisteredTypes()

HTML_QuickForm::getRegisteredTypes() -- Returns registered element types

Description

Returns an array of registered element types.

Throws

throws

Note

since 1.0

This function can be called statically.

HTML_QuickForm::insertElementBefore()

HTML_QuickForm::insertElementBefore() -- Inserts a new element right before the other element

Description

Inserts a new element right before the other element.

It is not possible to check whether the $element is already added to the form, therefore if you want to move the existing form element to a new position, you'll have to use removeElement():
$form->insertElementBefore($form->removeElement('foo', false), 'bar');

Parameter

object &$element

Element to insert (instance of HTML_QuickForm_element)

string $nameAfter

Name of the element before which the new one is inserted

Return value

return reference to inserted element.

Note

since 3.2.4

This function can not be called statically.

HTML_QuickForm::isError()

HTML_QuickForm::isError() -- Tells whether a result is an error

Description

Tells whether a result is an error (i.e. whether $value is an instance of HTML_QuickForm_Error).

Parameter

mixed $value

result of some QuickForm function

Return value

return whether $value is an error

Throws

throws no exceptions thrown

Note

This function can be called statically.

HTML_QuickForm::isTypeRegistered()

HTML_QuickForm::isTypeRegistered() -- Checks whether the form element type is supported

Description

Returns whether or not the form element type is supported. New types are added via HTML_QuickForm::registerElementType().

Parameter

string $type

Form element type

Throws

throws no exceptions thrown

Note

since 1.0

This function can be called statically.

HTML_QuickForm::registerElementType()

HTML_QuickForm::registerElementType() -- Registers a new element type

Description

Registers a new element type. After that, elements of this type may be created via createElement() and added to form via addElement().

Parameter

string $typeName

Name of element type

string $include

Include path for element type

string $className

Element class name

Throws

throws no exceptions thrown

Note

since 1.0

This function can be called statically.

HTML_QuickForm::removeElement()

HTML_QuickForm::removeElement() -- Removes an element

Description

Removes an element from the form.

Parameter

string $elementName

The element name

boolean $removeRules

TRUE if rules for this element are to be removed too

Return value

return reference to element being removed.

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::setMaxFileSize()

HTML_QuickForm::setMaxFileSize() -- Sets the value of MAX_FILE_SIZE hidden element

Description

Sets the value of MAX_FILE_SIZE hidden element (used for file uploads).

Parameter

integer $bytes

Size in bytes

Throws

throws no exceptions thrown

Note

since 3.0

This function can not be called statically.

HTML_QuickForm::updateElementAttr()

HTML_QuickForm::updateElementAttr() -- Updates Attributes for one or more elements

Description

Updates Attributes for one or more elements

Warning

This may not work for groups and group-based elements (date, hierselect). To ensure proper behaviour, you should update attributes of grouped elements manually.

Parameter

mixed $elements

Array of element names/objects or string of elements to be updated

mixed $attrs

Array or string of html attributes

Throws

throws no exceptions thrown

Note

since 2.10

This function can not be called statically.


Classes representing form elements

To be written


Base classes

Table of Contents
Class Summary HTML_QuickForm_element -- Base class for form elements
constructor HTML_QuickForm_element() -- Class constructor
HTML_QuickForm_element::accept() -- Accepts a renderer
HTML_QuickForm_element::apiVersion() -- Returns the current API version
HTML_QuickForm_element::exportValue() -- Returns a 'safe' element's value (package developer related)
HTML_QuickForm_element::freeze() -- Freezes the element
HTML_QuickForm_element::getFrozenHtml() -- Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel() -- Returns the label for the element
HTML_QuickForm_element::getName() -- Returns the element name
HTML_QuickForm_element::getType() -- Returns the element type
HTML_QuickForm_element::getValue() -- Returns the value of the form element
HTML_QuickForm_element::isFrozen() -- Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent() -- Called by HTML_QuickForm whenever form event is made on this element (package developer related)
HTML_QuickForm_element::setLabel() -- Sets a label for the element
HTML_QuickForm_element::setName() -- Sets the input field name
HTML_QuickForm_element::setPersistantFreeze() -- Sets whether element value should persist on freeze()
HTML_QuickForm_element::setValue() -- Sets the value of the form element
HTML_QuickForm_element::unfreeze() -- Unfreezes the element
Class Summary HTML_QuickForm_input -- Base class for input form elements
constructor HTML_QuickForm_input() -- Class constructor
HTML_QuickForm_input::setType() -- Sets the element type

Class Summary HTML_QuickForm_element

Class Summary HTML_QuickForm_element -- Base class for form elements

Description

This is a base class for all QuickForm elements. It defines the API that is implemented by all the child classes representing actual form elements. You should use these elements, there is no need to directly instantiate HTML_QuickForm_element.

If you would like to create your own element to use with QuickForm, you should extend this class or one of its descendants and make sure to implement all methods defined here. There is also toHtml() method defined in HTML_Common that should be implemented.

constructor HTML_QuickForm_element()

constructor HTML_QuickForm_element() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Name of the element

mixed $elementLabel

Label(s) for the element

mixed $attributes

Associative array of tag attributes or HTML attributes name="value" pairs

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::accept()

HTML_QuickForm_element::accept() -- Accepts a renderer

Description

This method rarely needs to be called directly, it is usually called from HTML_QuickForm::accept() method.

Parameter

object HTML_QuickForm_Renderer &$renderer

an instance of HTML_QuickForm_Renderer subclass

boolean $required

Whether an element is required

string $error

An error message associated with an element

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_element::apiVersion()

HTML_QuickForm_element::apiVersion() -- Returns the current API version

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::exportValue()

HTML_QuickForm_element::exportValue() -- Returns a 'safe' element's value (package developer related)

Description

This method is not intended to be called directly. It is called by HTML_QuickForm::exportValue() and HTML_QuickForm::exportValues() methods.

The method first tries to find a value for itself in a passed array, if such a value is not found it takes the display value via getValue(). It then filters out the values that cannot possibly be submitted by this element and returns the result.

Parameter

array &$submitValues

array of submitted values to search

boolean $assoc

whether to return the value as associative array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_element::freeze()

HTML_QuickForm_element::freeze() -- Freezes the element

Description

When the element is displayed after the call to freeze(), only its value is displayed without the input tags, thus the element cannot be edited. If persistant freeze is set, then hidden field containing the element value will be output, too.

Note: This method makes sense only with the elements that actually are editable in the first place. It has no effect on buttons, images, hidden fields, static content and the like.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_element::getFrozenHtml()

HTML_QuickForm_element::getFrozenHtml() -- Returns the value of field without HTML tags

Description

This method returns the HTML for the element in frozen state. There is rarely a need to call it directly.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::getLabel()

HTML_QuickForm_element::getLabel() -- Returns the label for the element

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see setLabel().

Note

since 1.3

This function can not be called statically.

HTML_QuickForm_element::getName()

HTML_QuickForm_element::getName() -- Returns the element name

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see setName().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::getType()

HTML_QuickForm_element::getType() -- Returns the element type

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::getValue()

HTML_QuickForm_element::getValue() -- Returns the value of the form element

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::isFrozen()

HTML_QuickForm_element::isFrozen() -- Returns whether or not the element is frozen

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see freeze().

Note

since 1.3

This function can not be called statically.

HTML_QuickForm_element::onQuickFormEvent()

HTML_QuickForm_element::onQuickFormEvent() -- Called by HTML_QuickForm whenever form event is made on this element (package developer related)

Description

Note: This method is not intended to be called directly.

If you are creating your own element, you should override this method and create handlers for each of available QuickForm events.

QuickForm events

'addElement'

This event is sent by HTML_QuickForm::addElement() method when adding a new element to the form. Its handler should usually send 'createElement' and 'updateValue' events.

'createElement'

This event is sent by HTML_QuickForm::createElement() method after the element object is instantiated. Its handler should usually call class constructor using the contents of $arg as parameters.

'setGroupValue'

The event is sent by HTML_QuickForm_group::setValue() method to each of the grouped elements. The handler generally should set the element's value to $arg.

'updateValue'

The event is sent by QuickForm when the element is added to the form and when form default and constant values are set. The handler for this event is the most complex one: it should search for element's value within form's constant, submit (if applicable) and default values (in that order) and set the element's value to the found one.

Parameter

string $event

Name of event

mixed $arg

event arguments

object &$caller

calling object

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::setLabel()

HTML_QuickForm_element::setLabel() -- Sets a label for the element

Description

Label is a description text that will be displayed near the element. Some renderers can handle multiple labels for the element.

Parameter

mixed $label

Display text for the element

Throws

throws no exceptions thrown

See

see getLabel().

Note

since 1.3

This function can not be called statically.

HTML_QuickForm_element::setName()

HTML_QuickForm_element::setName() -- Sets the input field name

Description

This package is not documented yet.

Parameter

string $name

Input field name attribute

Throws

throws no exceptions thrown

See

see getName().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::setPersistantFreeze()

HTML_QuickForm_element::setPersistantFreeze() -- Sets whether element value should persist on freeze()

Description

Sets whether an element value should be kept in an hidden field when the element is frozen or not.

Parameter

boolean $persistant

True if persistant value

Throws

throws no exceptions thrown

Note

since 2.0

This function can not be called statically.

HTML_QuickForm_element::setValue()

HTML_QuickForm_element::setValue() -- Sets the value of the form element

Description

This sets the display value for the element. It can be different from its submit value.

Parameter

mixed $value

Default value of the form element

Throws

throws no exceptions thrown

See

see getValue().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_element::unfreeze()

HTML_QuickForm_element::unfreeze() -- Unfreezes the element

Description

Unfreezes the element so that it becomes editable again.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_input

Class Summary HTML_QuickForm_input -- Base class for input form elements

Description

Since <input> elements have very similar HTML representations, they have this common base class. You don't need to instantiate it directly, use one of the child classes.

Class Trees for HTML_QuickForm_input

HTML_QuickForm_input Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_input()

constructor HTML_QuickForm_input() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Input field name attribute

mixed $elementLabel

Label(s) for the input field

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_input::setType()

HTML_QuickForm_input::setType() -- Sets the element type

Description

This package is not documented yet.

Parameter

string $type

Element type

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.


Standard HTML elements

Table of Contents
Class Summary HTML_QuickForm_button -- HTML class for a button type element
constructor HTML_QuickForm_button() -- Class constructor
Class Summary HTML_QuickForm_checkbox -- HTML class for a checkbox type field
constructor HTML_QuickForm_checkbox() -- Class constructor
HTML_QuickForm_checkbox::getChecked() -- Returns whether a checkbox is checked
HTML_QuickForm_checkbox::getText() -- Returns the checkbox text
HTML_QuickForm_checkbox::setChecked() -- Sets whether a checkbox is checked
HTML_QuickForm_checkbox::setText() -- Sets the checkbox text
Class Summary HTML_QuickForm_file -- HTML class for a file type element
constructor HTML_QuickForm_file() -- Class constructor
HTML_QuickForm_file::getSize() -- Returns size of file element
HTML_QuickForm_file::getValue() -- Returns information about the uploaded file
HTML_QuickForm_file::isUploadedFile() -- Checks if the element contains an uploaded file
HTML_QuickForm_file::moveUploadedFile() -- Moves an uploaded file into the destination
HTML_QuickForm_file::setSize() -- Sets size of file element
Class Summary HTML_QuickForm_hidden -- HTML class for a hidden type element
constructor HTML_QuickForm_hidden() -- Class constructor
Class Summary HTML_QuickForm_image -- HTML class for a image type element
constructor HTML_QuickForm_image() -- Class constructor
HTML_QuickForm_image::setAlign() -- Sets alignment for image element
HTML_QuickForm_image::setBorder() -- Sets border size for image element
HTML_QuickForm_image::setSource() -- Sets source for image element
Class Summary HTML_QuickForm_password -- HTML class for a password type field
constructor HTML_QuickForm_password() -- Class constructor
HTML_QuickForm_password::setMaxlength() -- Sets maxlength of password element
HTML_QuickForm_password::setSize() -- Sets size of password element
Class Summary HTML_QuickForm_radio -- HTML class for a radio type element
constructor HTML_QuickForm_radio() -- Class constructor
HTML_QuickForm_radio::getChecked() -- Returns whether radio button is checked
HTML_QuickForm_radio::getText() -- Returns the radio text
HTML_QuickForm_radio::setChecked() -- Sets whether radio button is checked
HTML_QuickForm_radio::setText() -- Sets the radio text
Class Summary HTML_QuickForm_reset -- HTML class for a reset type element
constructor HTML_QuickForm_reset() -- Class constructor
Class Summary HTML_QuickForm_select -- Class to dynamically create an HTML SELECT
constructor HTML_QuickForm_select() -- Class constructor
HTML_QuickForm_select::addOption() -- Adds a new OPTION to the SELECT
HTML_QuickForm_select::getMultiple() -- Returns the select mutiple attribute
HTML_QuickForm_select::getPrivateName() -- Returns the element name (possibly with brackets appended)
HTML_QuickForm_select::getSelected() -- Returns an array of the selected values
HTML_QuickForm_select::getSize() -- Returns the select field size
HTML_QuickForm_select::load() -- Loads options from different types of data sources
HTML_QuickForm_select::loadArray() -- Loads the options from an associative array
HTML_QuickForm_select::loadDbResult() -- Loads the options from DB_result object
HTML_QuickForm_select::loadQuery() -- Queries a database and loads the options from the results
HTML_QuickForm_select::setMultiple() -- Sets the select mutiple attribute
HTML_QuickForm_select::setSelected() -- Sets the default values of the select box
HTML_QuickForm_select::setSize() -- Sets the select field size, only applies to 'multiple' selects
Class Summary HTML_QuickForm_submit -- HTML class for a submit type element
constructor HTML_QuickForm_submit() -- Class constructor
Class Summary HTML_QuickForm_text -- HTML class for a text field
constructor HTML_QuickForm_text -- Class constructor
HTML_QuickForm_text::setMaxlength() -- Sets maxlength of text field
HTML_QuickForm_text::setSize() -- Sets size of text field
Class Summary HTML_QuickForm_textarea -- HTML class for a textarea type field
constructor HTML_QuickForm_textarea() -- Class constructor
HTML_QuickForm_textarea::setCols() -- Sets width in cols for textarea element
HTML_QuickForm_textarea::setRows() -- Sets height in rows for textarea element
HTML_QuickForm_textarea::setWrap() -- Sets wrap type for textarea element
Class Summary HTML_QuickForm_xbutton -- Class for HTML 4.0 <button> element
constructor HTML_QuickForm_xbutton() -- Class constructor
HTML_QuickForm_xbutton::setContent() -- Sets the contents of the element

Class Summary HTML_QuickForm_button

Class Summary HTML_QuickForm_button -- HTML class for a button type element

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_button

HTML_QuickForm_button Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_button()

constructor HTML_QuickForm_button() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $value

(optional)Input field value

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_checkbox

Class Summary HTML_QuickForm_checkbox -- HTML class for a checkbox type field

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_checkbox

HTML_QuickForm_checkbox Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-3. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_checkbox()

constructor HTML_QuickForm_checkbox() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $elementLabel

(optional)Input field label

string $text

(optional)Checkbox display text

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_checkbox::getChecked()

HTML_QuickForm_checkbox::getChecked() -- Returns whether a checkbox is checked

Description

Returns TRUE if checkbox has a "checked" attribute, FALSE otherwise. getValue() is an alias for this method. Thus the only value checkbox element can have in QuickForm is TRUE.

Throws

throws no exceptions thrown

See

see setChecked().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_checkbox::getText()

HTML_QuickForm_checkbox::getText() -- Returns the checkbox text

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see setText().

Note

since 1.1

This function can not be called statically.

HTML_QuickForm_checkbox::setChecked()

HTML_QuickForm_checkbox::setChecked() -- Sets whether a checkbox is checked

Description

This sets or removes the element's "checked" attribute based on $checked value. setValue() is an alias for this method.

Parameter

boolean $checked

Whether the field is checked or not

Throws

throws no exceptions thrown

See

see getChecked().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_checkbox::setText()

HTML_QuickForm_checkbox::setText() -- Sets the checkbox text

Description

This means the text that would be displayed with the checkbox, automatically enclosed in <label> tags. The label in QuickForm's sense is set via setLabel().

Parameter

string $text

Throws

throws no exceptions thrown

See

see getText().

Note

since 1.1

This function can not be called statically.

Class Summary HTML_QuickForm_file

Class Summary HTML_QuickForm_file -- HTML class for a file type element

Description

Alongside the usual element's methods, the class has special methods for working with uploaded files. When the class is included it also registers rules for validating the uploaded files.

Class Trees for HTML_QuickForm_file

HTML_QuickForm_file Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_file()

constructor HTML_QuickForm_file() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Input field name attribute

string $elementLabel

Input field label

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_file::getSize()

HTML_QuickForm_file::getSize() -- Returns size of file element

Description

This means 'size' attribute of the <input /> element, not size of the uploaded file.

Throws

throws no exceptions thrown

See

see setSize().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_file::getValue()

HTML_QuickForm_file::getValue() -- Returns information about the uploaded file

Description

Returns the information about the file upload, as in the $_FILES array. Note that while there exists a setValue() method, the method does nothing at all. The file element does not have a value if the form was not submitted.

Throws

throws no exceptions thrown

Note

since 3.0

This function can not be called statically.

HTML_QuickForm_file::isUploadedFile()

HTML_QuickForm_file::isUploadedFile() -- Checks if the element contains an uploaded file

Description

This package is not documented yet.

Return value

returns true if file has been uploaded, false otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_file::moveUploadedFile()

HTML_QuickForm_file::moveUploadedFile() -- Moves an uploaded file into the destination

Description

This package is not documented yet.

Parameter

string $dest

Destination directory path

string $fileName

New file name (if not given, original file name will be used).

Return value

returns true if file has been moved successfully, false otherwise.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_file::setSize()

HTML_QuickForm_file::setSize() -- Sets size of file element

Description

This package is not documented yet.

Parameter

integer $size

Size of file element

Throws

throws no exceptions thrown

See

see getSize().

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_hidden

Class Summary HTML_QuickForm_hidden -- HTML class for a hidden type element

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_hidden

HTML_QuickForm_hidden Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_hidden()

constructor HTML_QuickForm_hidden() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $value

(optional)Input field value

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_image

Class Summary HTML_QuickForm_image -- HTML class for a image type element

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_image

HTML_QuickForm_image Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_image()

constructor HTML_QuickForm_image() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Element name attribute

string $src

(optional)Image source

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_image::setAlign()

HTML_QuickForm_image::setAlign() -- Sets alignment for image element

Description

This is just a shortcut for
$element->updateAttributes(array('align' => $align));

Parameter

string $align

alignment for image element

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_image::setBorder()

HTML_QuickForm_image::setBorder() -- Sets border size for image element

Description

This is just a shortcut for
$element->updateAttributes(array('border' => $border));

Parameter

string $border

border for image element

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_image::setSource()

HTML_QuickForm_image::setSource() -- Sets source for image element

Description

This is just a shortcut for
$element->updateAttributes(array('src' => $src));

Parameter

string $src

source for image element

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_password

Class Summary HTML_QuickForm_password -- HTML class for a password type field

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_password

HTML_QuickForm_password Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_password()

constructor HTML_QuickForm_password() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $elementLabel

(optional)Input field label

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_password::setMaxlength()

HTML_QuickForm_password::setMaxlength() -- Sets maxlength of password element

Description

This is just a shortcut for
$element->updateAttributes(array('maxlength' => $maxlength));

Parameter

string $maxlength

Maximum length of password field

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_password::setSize()

HTML_QuickForm_password::setSize() -- Sets size of password element

Description

This is just a shortcut for
$element->updateAttributes(array('size' => $size));

Parameter

string $size

Size of password field

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_radio

Class Summary HTML_QuickForm_radio -- HTML class for a radio type element

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_radio

HTML_QuickForm_radio Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_radio()

constructor HTML_QuickForm_radio() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Input field name attribute

mixed $elementLabel

Label(s) for a field

string $text

Text to display near the radio

string $value

Input field value

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_radio::getChecked()

HTML_QuickForm_radio::getChecked() -- Returns whether radio button is checked

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see setChecked().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_radio::getText()

HTML_QuickForm_radio::getText() -- Returns the radio text

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see setText().

Note

since 1.1

This function can not be called statically.

HTML_QuickForm_radio::setChecked()

HTML_QuickForm_radio::setChecked() -- Sets whether radio button is checked

Description

This package is not documented yet.

Parameter

boolean $checked

Whether the field is checked or not

Throws

throws no exceptions thrown

See

see getChecked().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_radio::setText()

HTML_QuickForm_radio::setText() -- Sets the radio text

Description

This means the text that would be displayed with the radio, automatically enclosed in <label> tags. The label in QuickForm's sense is set via setLabel().

Parameter

string $text

Text to display near the radio button

Throws

throws no exceptions thrown

See

see getText().

Note

since 1.1

This function can not be called statically.

Class Summary HTML_QuickForm_reset

Class Summary HTML_QuickForm_reset -- HTML class for a reset type element

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_reset

HTML_QuickForm_reset Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_reset()

constructor HTML_QuickForm_reset() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $value

(optional)Input field value

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_select

Class Summary HTML_QuickForm_select -- Class to dynamically create an HTML SELECT

Description

The highlight of this class is that it allows populating the options from associative array or from the database.

Class Trees for HTML_QuickForm_select

HTML_QuickForm_select Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_select()

constructor HTML_QuickForm_select() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Select name attribute

mixed $elementLabel

Label(s) for the select

mixed $options

Data to be used to populate options

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

See

see load().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::addOption()

HTML_QuickForm_select::addOption() -- Adds a new OPTION to the SELECT

Description

This package is not documented yet.

Parameter

string $text

Display text for the OPTION

string $value

Value for the OPTION

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::getMultiple()

HTML_QuickForm_select::getMultiple() -- Returns the select mutiple attribute

Description

This method returns TRUE if a multiple attribute is present in the select, FALSE otherwise.

Return value

returns true if multiple select, false otherwise

Throws

throws no exceptions thrown

See

see setMultiple().

Note

since 1.2

This function can not be called statically.

HTML_QuickForm_select::getPrivateName()

HTML_QuickForm_select::getPrivateName() -- Returns the element name (possibly with brackets appended)

Description

If select has a multiple attribute present, then this method returns the name with brackets appended, else the result is identical to getName().

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::getSelected()

HTML_QuickForm_select::getSelected() -- Returns an array of the selected values

Description

This function is an alias to getValue().

Return value

returns of selected values

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::getSize()

HTML_QuickForm_select::getSize() -- Returns the select field size

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see setSize().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::load()

HTML_QuickForm_select::load() -- Loads options from different types of data sources

Description

This method is a simulated overloaded method. The arguments, other than the first are optional and only mean something depending on the type of the first argument.

If the first argument is an array then all arguments are passed in order to loadArray(). If the first argument is a DB_Result then all arguments are passed in order to loadDbResult(). If the first argument is a string or a DB connection then all arguments are passed in order to loadQuery().

Parameter

mixed &$options

Options source currently supports assoc array or DB_result

mixed $param1

(optional) See function detail

mixed $param2

(optional) See function detail

mixed $param3

(optional) See function detail

mixed $param4

(optional) See function detail

Return value

returns TRUE on success

Throws

throws PEAR_Error

Note

since 1.1

This function can not be called statically.

HTML_QuickForm_select::loadArray()

HTML_QuickForm_select::loadArray() -- Loads the options from an associative array

Description

The array should have the form 'option value' => 'option text'.

Parameter

array $arr

Associative array of options

mixed $values

(optional) Array or comma delimited string of selected values

Return value

returns TRUE on success

Throws

throws PEAR_Error

See

see load(), addOption().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::loadDbResult()

HTML_QuickForm_select::loadDbResult() -- Loads the options from DB_result object

Description

If no column names are specified the first two columns of the result are used as the text and value columns respectively.

Parameter

object &$result

DB_result object

string $textCol

(optional) Name of column to display as the OPTION text

string $valueCol

(optional) Name of column to use as the OPTION value

mixed $values

(optional) Array or comma delimited string of selected values

Return value

returns TRUE on success or PEAR_Error

Throws

throws PEAR_Error

See

see load(), addOption().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::loadQuery()

HTML_QuickForm_select::loadQuery() -- Queries a database and loads the options from the results

Description

If no column names are specified the first two columns of the result are used as the text and value columns respectively.

Parameter

mixed &$conn

Either an existing DB connection or a valid dsn

string $sql

SQL query string

string $textCol

(optional) Name of column to display as the OPTION text

string $valueCol

(optional) Name of column to use as the OPTION value

mixed $values

(optional) Array or comma delimited string of selected values

Throws

throws PEAR_Error

Note

since 1.1

This function can not be called statically.

HTML_QuickForm_select::setMultiple()

HTML_QuickForm_select::setMultiple() -- Sets the select mutiple attribute

Description

This method just adds or removes the multiple attribute of select depending on $multiple value.

Parameter

boolean $multiple

Whether the select supports multi-selections

Throws

throws no exceptions thrown

See

see getMultiple().

Note

since 1.2

This function can not be called statically.

HTML_QuickForm_select::setSelected()

HTML_QuickForm_select::setSelected() -- Sets the default values of the select box

Description

This method is an alias for setValue(). For multiple selects you can pass either an array or a comma delimited string of values.

Parameter

mixed $values

Array or comma delimited string of selected values

Throws

throws no exceptions thrown

See

see getSelected().

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_select::setSize()

HTML_QuickForm_select::setSize() -- Sets the select field size, only applies to 'multiple' selects

Description

This package is not documented yet.

Parameter

integer $size

Size of select field

Throws

throws no exceptions thrown

See

see getSize().

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_submit

Class Summary HTML_QuickForm_submit -- HTML class for a submit type element

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_submit

HTML_QuickForm_submit Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_submit()

constructor HTML_QuickForm_submit() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Input field name attribute

string $value

Input field value

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_text

Class Summary HTML_QuickForm_text -- HTML class for a text field

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_text

HTML_QuickForm_text Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-3. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_text

constructor HTML_QuickForm_text -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $elementLabel

(optional)Input field label

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_text::setMaxlength()

HTML_QuickForm_text::setMaxlength() -- Sets maxlength of text field

Description

This is just a shortcut for
$element->updateAttributes(array('maxlength' => $maxlength));

Parameter

string $maxlength

Maximum length of text field

Throws

throws no exceptions thrown

Note

since 1.3

This function can not be called statically.

HTML_QuickForm_text::setSize()

HTML_QuickForm_text::setSize() -- Sets size of text field

Description

This is just a shortcut for
$element->updateAttributes(array('size' => $size));

Parameter

string $size

Size of text field

Throws

throws no exceptions thrown

Note

since 1.3

This function can not be called statically.

Class Summary HTML_QuickForm_textarea

Class Summary HTML_QuickForm_textarea -- HTML class for a textarea type field

HTML class for a textarea type field

This package is not documented yet.

Class Trees for HTML_QuickForm_textarea

HTML_QuickForm_textarea Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_textarea()

constructor HTML_QuickForm_textarea() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Input field name attribute

mixed $elementLabel

Label(s) for a field

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_textarea::setCols()

HTML_QuickForm_textarea::setCols() -- Sets width in cols for textarea element

Description

This package is not documented yet.

Parameter

string $cols

Width expressed in cols

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_textarea::setRows()

HTML_QuickForm_textarea::setRows() -- Sets height in rows for textarea element

Description

This package is not documented yet.

Parameter

string $rows

Height expressed in rows

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_textarea::setWrap()

HTML_QuickForm_textarea::setWrap() -- Sets wrap type for textarea element

Description

This package is not documented yet.

Parameter

string $wrap

Wrap type

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_xbutton

Class Summary HTML_QuickForm_xbutton -- Class for HTML 4.0 <button> element

Class for HTML 4.0 <button> element

This class is named 'xbutton' since the name 'button' was already taken by class representing an <input type="button" /> HTML element. Available since HTML_QuickForm release 3.2.3

Class Trees for HTML_QuickForm_xbutton

HTML_QuickForm_xbutton Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_xbutton()

constructor HTML_QuickForm_xbutton() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional) Button name

string $elementContent

(optional) Button content (HTML to add between <button></button> tags)

mixed $attributes

(optional) Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

since 3.2.3

HTML_QuickForm_xbutton::setContent()

HTML_QuickForm_xbutton::setContent() -- Sets the contents of the element

Description

Sets the contents of the button element: HTML to add between <button></button> tags.

Parameter

string $content

HTML to add between <button></button> tags

Throws

throws no exceptions thrown

Note

This function can not be called statically.

since 3.2.3


Custom elements

Table of Contents
Class Summary HTML_QuickForm_advcheckbox -- HTML class for an advanced checkbox type field
constructor HTML_QuickForm_advcheckbox() -- Class constructor
HTML_QuickForm_advcheckbox::getOnclickJs() -- Create the javascript for the onclick event
HTML_QuickForm_advcheckbox::getPrivateName() -- Gets the private name for the element
HTML_QuickForm_advcheckbox::setValues() -- Sets the values used by the hidden element
Class Summary HTML_QuickForm_autocomplete -- HTML class for a text field with autocompletion feature
constructor HTML_QuickForm_autocomplete -- Class constructor
HTML_QuickForm_autocomplete::setoptions() -- Sets the options for the autocomplete input text element
Class Summary HTML_QuickForm_date -- Class for a group of elements used to input dates (and times).
constructor HTML_QuickForm_date() -- Class constructor
Class Summary HTML_QuickForm_header -- A pseudo-element used for adding headers to form
constructor HTML_QuickForm_header() -- Class constructor
Class Summary HTML_QuickForm_hiddenselect -- Creates hidden elements with select's values
constructor HTML_QuickForm_hiddenselect() -- Class constructor
Class Summary HTML_QuickForm_hierselect -- Class to dynamically create chained HTML Select elements, each select changes the content of the next.
constructor HTML_QuickForm_hierselect() -- Class constructor
HTML_QuickForm_hierselect::setOptions() -- Sets the options for the select elements
HTML_QuickForm_hierselect::setMainOptions() -- DEPRECATED: Sets the options for the first select
HTML_QuickForm_hierselect::setSecOptions() -- DEPRECATED: Sets the options for the secondary select
Class Summary HTML_QuickForm_html -- A pseudo-element used for adding raw HTML to form (deprecated)
constructor HTML_QuickForm_html() -- Class constructor
Class Summary HTML_QuickForm_link -- HTML class for a link type field
constructor HTML_QuickForm_link() -- Class constructor
HTML_QuickForm_link::setHref() -- Sets the links href
Class Summary HTML_QuickForm_static -- HTML class for static data
constructor HTML_QuickForm_static() -- Class constructor
HTML_QuickForm_static::setText() -- Sets the text

Class Summary HTML_QuickForm_advcheckbox

Class Summary HTML_QuickForm_advcheckbox -- HTML class for an advanced checkbox type field

Description

HTML class for an advanced checkbox type field. Basically this fixes a problem that HTML has had where checkboxes can only pass a single value (the value of the checkbox when checked). A value for when the checkbox is not checked cannot be passed, and furthermore the checkbox variable doesn't even exist if the checkbox was submitted unchecked.

It works by creating a hidden field with the passed-in name and creating the checkbox with no name, but with a javascript onclick which sets the value of the hidden field.

Class Trees for HTML_QuickForm_advcheckbox

HTML_QuickForm_advcheckbox Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_checkbox

Method NameSummary
Constructor HTML_QuickForm_checkbox::HTML_QuickForm_checkbox()Class constructor
HTML_QuickForm_checkbox::exportValue()Return true if the checkbox is checked, null if it is not checked (getValue() returns false)
HTML_QuickForm_checkbox::getChecked()Returns whether a checkbox is checked
HTML_QuickForm_checkbox::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_checkbox::getText()Returns the checkbox text
HTML_QuickForm_checkbox::getValue()Returns the value of the form element
HTML_QuickForm_checkbox::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_checkbox::setChecked()Sets whether a checkbox is checked
HTML_QuickForm_checkbox::setText()Sets the checkbox text
HTML_QuickForm_checkbox::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-3. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_advcheckbox()

constructor HTML_QuickForm_advcheckbox() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $elementLabel

(optional)Input field label

string $text

(optional)Text to put after the checkbox

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

mixed $values

(optional)Values to pass if checked or not checked

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_advcheckbox::getOnclickJs()

HTML_QuickForm_advcheckbox::getOnclickJs() -- Create the javascript for the onclick event

Description

Create the javascript for the onclick event which will set the value of the hidden field.

Parameter

string $elementName

The element name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_advcheckbox::getPrivateName()

HTML_QuickForm_advcheckbox::getPrivateName() -- Gets the private name for the element

Description

This is the name that will be used by the actual checkbox.

Parameter

string $elementName

The element name to make private

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_advcheckbox::setValues()

HTML_QuickForm_advcheckbox::setValues() -- Sets the values used by the hidden element

Description

If $values is a string then it will be used for checked state. If it is an array, then $values[0] will be used for unchecked state and $values[1] for checked.

Parameter

mixed $values

The values, either a string or an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_autocomplete

Class Summary HTML_QuickForm_autocomplete -- HTML class for a text field with autocompletion feature

Description

The element looks like a normal HTML input text element that at every keypressed javascript event searches the array of options for a match and autocompletes the text in case of match. This is similar to the browsers' behaviour when one enters the URL into the Address field.

Class Trees for HTML_QuickForm_autocomplete

HTML_QuickForm_autocomplete Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_input

Method NameSummary
Constructor HTML_QuickForm_input::HTML_QuickForm_input()Class constructor
HTML_QuickForm_input::exportValue()We don't need values from button-type elements (except submit) and files
HTML_QuickForm_input::getName()Returns the element name
HTML_QuickForm_input::getValue()Returns the value of the form element
HTML_QuickForm_input::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_input::setName()Sets the input field name
HTML_QuickForm_input::setType()Sets the element type
HTML_QuickForm_input::setValue()Sets the value of the form element

Table 45-3. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_autocomplete

constructor HTML_QuickForm_autocomplete -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

string $elementLabel

(optional)Input field label

array $options

Autocomplete options

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_autocomplete::setoptions()

HTML_QuickForm_autocomplete::setoptions() -- Sets the options for the autocomplete input text element

Description

The strings in this array will be checked by the javascript function for a match with the text being typed. In case of a match the text will be autocompleted.

Parameter

array $options

Array of options for the autocomplete input text element

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_date

Class Summary HTML_QuickForm_date -- Class for a group of elements used to input dates (and times).

Description

The element is basically a group of <select>s that allow to input dates and times.

Class Trees for HTML_QuickForm_date

HTML_QuickForm_date Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_group

Method NameSummary
Constructor HTML_QuickForm_group::HTML_QuickForm_group()Class constructor
HTML_QuickForm_group::accept()Accepts a renderer
HTML_QuickForm_group::exportValue()As usual, to get the group's value we access its elements and call
HTML_QuickForm_group::getElementName()Returns the element name inside the group such as found in the html form
HTML_QuickForm_group::getElements()Gets the grouped elements
HTML_QuickForm_group::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_group::getGroupType()Gets the group type based on its elements Will return 'mixed' if elements contained in the group are of different types.
HTML_QuickForm_group::getName()Returns the group name
HTML_QuickForm_group::getValue()Returns the value of the group
HTML_QuickForm_group::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_group::setElements()Sets the grouped elements
HTML_QuickForm_group::setName()Sets the group name
HTML_QuickForm_group::setValue()Sets values for group's elements

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_date()

constructor HTML_QuickForm_date() -- Class constructor

Description

The $options parameter controls the element's appearance. It is an associative array of the form 'option name' => 'option value'.

Recognised option names

'language'

Language code to use for display. Default is 'en'.

date element supports many languages. If your one is not supported, send us the translation, we'll gladly include it.

'format'

Format string for the date, based on PHP's date() function. The following characters are recognised:
D => Short names of days
l => Long names of days
d => Day numbers
M => Short names of months
F => Long names of months
m => Month numbers
Y => Four digit year
y => Two digit year
h => 12 hour format
H => 23 hour  format
i => Minutes
s => Seconds
a => am/pm
A => AM/PM
g => 12 hour format w/o leading zeroes
W => week of the year
Default is 'dMY'.

'minYear'

Minimum year in year select. Default is 2001.

'maxYear'

Maximum year in year select. Default is 2010.

On 'minYear' and 'maxYear': When 'minYear' > 'maxYear' the years in the select will be displayed in descending order.

'addEmptyOption'

Should an empty option be added to the top of each select box? Default is FALSE. This may be set for individual fields also, if one passes an array of the form array('format char' => TRUE, ..., 'another format char' => FALSE)

'emptyOptionValue'

The value passed by the empty option. Default is ''.

'emptyOptionText'

The text displayed for the empty option. Default is '&nbsp;'. This may be set for individual fields also, if one passes an array of the form array('format char' => 'some text', ..., 'another format char' => 'some other text')

'optionIncrement'

Step to increase the option values by. Works for 'i' and 's' formats currently. Default is array('i' => 1, 's' => 1).

Parameter

string $elementName

Element's name

mixed $elementLabel

Label(s) for an element

array $options

Options to control the element's display

mixed $attributes

Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_header

Class Summary HTML_QuickForm_header -- A pseudo-element used for adding headers to form

Description

This element is used for adding headers to the form. Unlike usual static elements, the headers are usually rendered using a special template.

Class Trees for HTML_QuickForm_header

HTML_QuickForm_header Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_static

Method NameSummary
Constructor HTML_QuickForm_static::HTML_QuickForm_static()Class constructor
HTML_QuickForm_static::exportValue()We override this here because we don't want any values from static elements
HTML_QuickForm_static::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_static::getName()Returns the element name
HTML_QuickForm_static::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_static::setName()Sets the element name
HTML_QuickForm_static::setText()Sets the text
HTML_QuickForm_static::setValue()Sets the text (uses the standard setValue call to emulate a form element.

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_header()

constructor HTML_QuickForm_header() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Header name

string $text

Header text

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_hiddenselect

Class Summary HTML_QuickForm_hiddenselect -- Creates hidden elements with select's values

Description

This class takes the same arguments as a select element, but instead of creating a <select> it creates hidden elements for all values already selected with setDefaults() or setConstants(). This is useful if you have a select ring that you don't want visible, but you need all selected values to be passed.

Class Trees for HTML_QuickForm_hiddenselect

HTML_QuickForm_hiddenselect Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_select

Method NameSummary
Constructor HTML_QuickForm_select::HTML_QuickForm_select()Class constructor
HTML_QuickForm_select::addOption()Adds a new OPTION to the SELECT
HTML_QuickForm_select::apiVersion()Returns the current API version
HTML_QuickForm_select::exportValue()We check the options and return only the values that _could_ have been
HTML_QuickForm_select::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_select::getMultiple()Returns the select mutiple attribute
HTML_QuickForm_select::getName()Returns the element name
HTML_QuickForm_select::getPrivateName()Returns the element name (possibly with brackets appended)
HTML_QuickForm_select::getSelected()Returns an array of the selected values
HTML_QuickForm_select::getSize()Returns the select field size
HTML_QuickForm_select::getValue()Returns an array of the selected values
HTML_QuickForm_select::load()Loads options from different types of data sources
HTML_QuickForm_select::loadArray()Loads the options from an associative array
HTML_QuickForm_select::loadDbResult()Loads the options from DB_result object
HTML_QuickForm_select::loadQuery()Queries a database and loads the options from the results
HTML_QuickForm_select::setMultiple()Sets the select mutiple attribute
HTML_QuickForm_select::setName()Sets the input field name
HTML_QuickForm_select::setSelected()Sets the default values of the select box
HTML_QuickForm_select::setSize()Sets the select field size, only applies to 'multiple' selects
HTML_QuickForm_select::setValue()Sets the value of the form element

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_hiddenselect()

constructor HTML_QuickForm_hiddenselect() -- Class constructor

Description

Note that some parameters are unused, as the element is in fact hidden.

Parameter

string $elementName

Select name attribute

mixed $elementLabel

Label(s) for the select (not used)

mixed $options

Data to be used to populate options

mixed $attributes

Either a typical HTML attribute string or an associative array (not used)

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_hierselect

Class Summary HTML_QuickForm_hierselect -- Class to dynamically create chained HTML Select elements, each select changes the content of the next.

Description

Class to dynamically create "chained" HTML Select elements. Choosing an option in the first <select> changes the content of the second select and so on.

This element is considered as a group. Selects will be named groupName[0], groupName[1], ...
Creating more than two select elements is just as simple.

Class Trees for HTML_QuickForm_hierselect

HTML_QuickForm_hierselect Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_group

Method NameSummary
Constructor HTML_QuickForm_group::HTML_QuickForm_group()Class constructor
HTML_QuickForm_group::accept()Accepts a renderer
HTML_QuickForm_group::exportValue()As usual, to get the group's value we access its elements and call
HTML_QuickForm_group::getElementName()Returns the element name inside the group such as found in the html form
HTML_QuickForm_group::getElements()Gets the grouped elements
HTML_QuickForm_group::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_group::getGroupType()Gets the group type based on its elements Will return 'mixed' if elements contained in the group are of different types.
HTML_QuickForm_group::getName()Returns the group name
HTML_QuickForm_group::getValue()Returns the value of the group
HTML_QuickForm_group::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_group::setElements()Sets the grouped elements
HTML_QuickForm_group::setName()Sets the group name
HTML_QuickForm_group::setValue()Sets values for group's elements

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_hierselect()

constructor HTML_QuickForm_hierselect() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Input field name attribute

Note: If you are displaying several forms on one page, then hierselects in these forms should have unique names. In the other case the values for last hierselect with the same name will overwrite the values for the previous one. It is extremely difficult to cleanly fix this behaviour with current QuickForm architecture, therefore please rely on this workaround. See Request #5718.

string $elementLabel

(optional)Input field label in form

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array.

mixed $separator

String to separate the grouped elements

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_hierselect::setOptions()

HTML_QuickForm_hierselect::setOptions() -- Sets the options for the select elements

Description

Sets the options for the select elements within hierselect. Note that the actual number of selects that will be displayed is governed by the number of the elements in the array passed to this function.

Parameter

array $options

Array of options for the elements, having the following structure:
array(
  // options for the first element
  array(
    'key_1' => 'value 1',
    'key_2' => 'value 2',
    ...
    'key_N' => 'value N',
  ),
  // options for the second element
  array(
    'key_1' => array(
      'key_1_1' => 'value 1.1',
      'key_1_2' => 'value 1.2',
      ...
      'key_1_M1' => 'value 1.M1'
    ),
    'key_2' => array(
      'key_2_1' => 'value 2.1',
      'key_2_2' => 'value 2.2',
      ...
      'key_2_M2' => 'value 2.M2'
    ),
    ...
    'key_N' => array(
      'key_N_1' => 'value N.1',
      'key_N_2' => 'value N.2',
      ...
      'key_N_MN' => 'value N.MN'
    )
  )
  // options for further elements
  ...
)

Note: The options for subsequent elements should have keys for all options of the previous elements. Having a select without options is invalid HTML and will break hierselect's JavaScript. See also Bug #5218.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

since 3.2.2

HTML_QuickForm_hierselect::setMainOptions()

HTML_QuickForm_hierselect::setMainOptions() -- DEPRECATED: Sets the options for the first select

Description

Format is standard key/value pairs for select elements. Example is available in the docs for setSecOptions().

This method has been deprecated. Use setOptions() instead.

Parameter

array $options

Array of options for the first select

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Deprecated in release 3.2.2

HTML_QuickForm_hierselect::setSecOptions()

HTML_QuickForm_hierselect::setSecOptions() -- DEPRECATED: Sets the options for the secondary select

Description

Sets the options for the secondary select. Options are passed as a two-dimensional array, where the first key is parent id and the second key is child id, as it is needed to know the parent option to which the secondary option relates.

This method has been deprecated. Use setOptions() instead.

Parameter

array $options

Array of options for the second select

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Deprecated in release 3.2.2

Class Summary HTML_QuickForm_html

Class Summary HTML_QuickForm_html -- A pseudo-element used for adding raw HTML to form (deprecated)

Description

A pseudo-element used for adding raw HTML to form output. Its contents are output as is, without applying any element template.

Warning

This element is deprecated. No fixes and changes to its behaviour will be done and it will be removed in the next major version of the package. If you really need to add raw html to the form, you may consider using 'static' element instead.

Warning

The element can be used with the Default Renderer only, all other Renderers completely ignore this. Consider using some template-based renderer instead of relying on this feature.

Class Trees for HTML_QuickForm_html

HTML_QuickForm_html Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_static

Method NameSummary
Constructor HTML_QuickForm_static::HTML_QuickForm_static()Class constructor
HTML_QuickForm_static::exportValue()We override this here because we don't want any values from static elements
HTML_QuickForm_static::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_static::getName()Returns the element name
HTML_QuickForm_static::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_static::setName()Sets the element name
HTML_QuickForm_static::setText()Sets the text
HTML_QuickForm_static::setValue()Sets the text (uses the standard setValue call to emulate a form element.

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_html()

constructor HTML_QuickForm_html() -- Class constructor

Description

This package is not documented yet.

Parameter

string $text

raw HTML to add

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_link

Class Summary HTML_QuickForm_link -- HTML class for a link type field

Description

This is used to add <a href="...">...</a> tag within a standard element template.

Class Trees for HTML_QuickForm_link

HTML_QuickForm_link Inherited Methods

Table 45-1. Inherited from HTML_QuickForm_static

Method NameSummary
Constructor HTML_QuickForm_static::HTML_QuickForm_static()Class constructor
HTML_QuickForm_static::exportValue()We override this here because we don't want any values from static elements
HTML_QuickForm_static::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_static::getName()Returns the element name
HTML_QuickForm_static::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_static::setName()Sets the element name
HTML_QuickForm_static::setText()Sets the text
HTML_QuickForm_static::setValue()Sets the text (uses the standard setValue call to emulate a form element.

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_link()

constructor HTML_QuickForm_link() -- Class constructor

Description

This package is not documented yet.

Parameter

mixed $elementName

string $elementLabel

(optional)Link label

string $href

(optional)Link href

string $text

(optional)Link display text

mixed $attributes

(optional)Either a typical HTML attribute string or an associative array

Throws

throws

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_link::setHref()

HTML_QuickForm_link::setHref() -- Sets the links href

Description

This is just a shortcut for
$element->updateAttributes(array('href' => $href));

Parameter

string $href

Throws

throws

Note

since 1.0

This function can not be called statically.

Class Summary HTML_QuickForm_static

Class Summary HTML_QuickForm_static -- HTML class for static data

Description

A static element is an element that cannot have a submit value and thus cannot change due to user input. Such elements are usually used to improve form presentation. Note that elements of HTML_QuickForm_static type are by default rendered inside the same template as the normal form elements.

Class Trees for HTML_QuickForm_static

HTML_QuickForm_static Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_static()

constructor HTML_QuickForm_static() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

Name of the element

mixed $elementLabel

(optional)Label

string $text

(optional)Display text

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_static::setText()

HTML_QuickForm_static::setText() -- Sets the text

Description

This text is essentially the static element itself. Note that setValue() is an alias for setText().

Parameter

string $text

text of the element

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Using groups

Table of Contents
HTML_QuickForm::addGroup() -- Adds an element group
Class Summary HTML_QuickForm_group -- HTML class for a form element group
constructor HTML_QuickForm_group() -- Class constructor
HTML_QuickForm_group::getElementName() -- Returns the name of an element inside the group
HTML_QuickForm_group::getElements() -- Gets the grouped elements
HTML_QuickForm_group::getGroupType() -- Gets the group type based on its elements.
HTML_QuickForm_group::setElements() -- Sets the grouped elements

To be written.

HTML_QuickForm::addGroup()

HTML_QuickForm::addGroup() -- Adds an element group

Description

Adds an element group.

Parameter

array $elements

array of elements composing the group

string $name

(optional) group name

mixed $groupLabel

(optional) group label

mixed $separator

(optional) string or array of strings to separate elements

boolean $appendName

(optional) specify whether the group name should be used in the form element name: groupName[elementName] vs elementName

Return value

return reference to added group of elements

Note

since 2.8

This function can not be called statically.

Class Summary HTML_QuickForm_group

Class Summary HTML_QuickForm_group -- HTML class for a form element group

Description

Groups allow you to combine several individual elements into one entity and to use it as usual form element. Most of the group's methods use the methods of the grouped elements to do their job. For example, groups do not have values themselves, their setValue() and getValue() methods just call the appropriate methods of grouped elements to set and get their values.

Groups can be used both for visual grouping of the elements (e.g. putting "Submit" and "Reset" buttons on one line), grouping of the elements with the same name (e.g. groups of checkboxes and radiobuttons) and logical grouping of the elements (e.g. group for person's name consisting of two text fields for first and last name).

Class Trees for HTML_QuickForm_group

HTML_QuickForm_group Inherited Methods

Table 45-2. Inherited from HTML_QuickForm_element

Method NameSummary
Constructor HTML_QuickForm_element::HTML_QuickForm_element()Class constructor
HTML_QuickForm_element::accept()Accepts a renderer
HTML_QuickForm_element::apiVersion()Returns the current API version
HTML_QuickForm_element::exportValue()Returns a 'safe' element's value
HTML_QuickForm_element::freeze()Freeze the element so that only its value is returned
HTML_QuickForm_element::getFrozenHtml()Returns the value of field without HTML tags
HTML_QuickForm_element::getLabel()Returns display text for the element
HTML_QuickForm_element::getName()Returns the element name
HTML_QuickForm_element::getType()Returns element type
HTML_QuickForm_element::getValue()Returns the value of the form element
HTML_QuickForm_element::isFrozen()Returns whether or not the element is frozen
HTML_QuickForm_element::onQuickFormEvent()Called by HTML_QuickForm whenever form event is made on this element
HTML_QuickForm_element::setLabel()Sets display text for the element
HTML_QuickForm_element::setName()Sets the input field name
HTML_QuickForm_element::setPersistantFreeze()Sets wether an element value should be kept in an hidden field when the element is frozen or not
HTML_QuickForm_element::setValue()Sets the value of the form element
HTML_QuickForm_element::unfreeze()Unfreezes the form element

constructor HTML_QuickForm_group()

constructor HTML_QuickForm_group() -- Class constructor

Description

This package is not documented yet.

Parameter

string $elementName

(optional)Group name

array $elementLabel

(optional)Group label

array $elements

(optional)Group elements

mixed $separator

(optional)Use a string for one separator, use an array to alternate the separators.

boolean $appendName

(optional)whether to change elements' names to the form $groupName[$elementName] or leave them as is.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm_group::getElementName()

HTML_QuickForm_group::getElementName() -- Returns the name of an element inside the group

Description

Returns the name of an element inside the group. This is the name that will be shown in the form HTML output.

Parameter

mixed $index

Element name or element index in the group

Return value

returns string with element name, false if not found

Throws

throws no exceptions thrown

Note

since 3.0

This function can not be called statically.

HTML_QuickForm_group::getElements()

HTML_QuickForm_group::getElements() -- Gets the grouped elements

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

since 2.4

This function can not be called statically.

HTML_QuickForm_group::getGroupType()

HTML_QuickForm_group::getGroupType() -- Gets the group type based on its elements.

Description

Will return 'mixed' if elements contained in the group are of different types.

Return value

returns group elements type

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_group::setElements()

HTML_QuickForm_group::setElements() -- Sets the grouped elements

Description

This package is not documented yet.

Parameter

array $elements

Array of elements

Throws

throws no exceptions thrown

Note

since 1.1

This function can not be called statically.


Working with elements' values

This section covers the methods QuickForm offers for managing form element's values and working with submitted values.


Getting, setting and processing element values

Table of Contents
HTML_QuickForm::setConstants() -- Sets constant form values
HTML_QuickForm::setDefaults() -- Sets default form values
HTML_QuickForm::isSubmitted() -- Tells whether the form was already submitted
HTML_QuickForm::exportValue() -- Returns the element's "safe" value
HTML_QuickForm::exportValues() -- Returns "safe" elements' values
HTML_QuickForm::getElementValue() -- Returns the element's raw value
HTML_QuickForm::getSubmitValue() -- Returns the submitted element's value
HTML_QuickForm::getSubmitValues() -- Returns the values submitted by the form
HTML_QuickForm::process() -- Performs the form data processing

HTML_QuickForm::setConstants()

HTML_QuickForm::setConstants() -- Sets constant form values

Description

Sets constant form values. These values won't be overridden by either default (set via setDefaults()) or submitted (POST or GET) values.

Parameter

array $constantValues

values used to fill the form, array('element name' => 'element value')

mixed $filter

(optional) filter(s) to apply to all default values

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::setDefaults()

HTML_QuickForm::setDefaults() -- Sets default form values

Description

Sets default form values. There are overriden by either constant (set via setConstants()) or submitted (POST or GET) values.

Parameter

array $defaultValues

values used to fill the form, array('element name' => 'element value')

mixed $filter

(optional) filter(s) to apply to all default values

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::isSubmitted()

HTML_QuickForm::isSubmitted() -- Tells whether the form was already submitted

Description

Tells whether the form was already submitted. Using this method when $trackSubmit parameter of QuickForm's constructor is used is more reliable than checking whether form's submit values are empty.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

since 3.2.5

HTML_QuickForm::exportValue()

HTML_QuickForm::exportValue() -- Returns the element's "safe" value

Description

This method first tries to find a cleaned-up submitted value, it will return a value set by setValue()/setDefaults()/setConstants() if submitted value does not exist for the given element.

The value that couldn't have possibly been submitted (e.g.: an option that is not present in <select> element's option list) is not considered valid and is not returned.

As the values returned by this method and by exportValues() are expected to be immediately processed and/or stored somewhere, values for file elements that obviously have special processing needs are not returned.

Parameter

string $element

Name of the element

Return value

return element value

Note

since 3.1

This function can not be called statically.

HTML_QuickForm::exportValues()

HTML_QuickForm::exportValues() -- Returns "safe" elements' values

Description

Returns the values for the form elements. First it tries to return filtered submitted values, if there were none then it takes the values set by setDefaults() or setConstants().

Unlike getSubmitValues(), this will return only the values corresponding to the elements added to the form and only the values that could actually be submitted: if we have 'Yes'/'No' radiobuttons 'Maybe' will not be considered a valid submit value. You also cannot get values for file elements via this method.

Parameter

mixed $elementList

Array/string of element names, whose values we want. If not set then return all elements.

Return value

return An assoc array of elements' values

Note

since 3.1

This function can not be called statically.

HTML_QuickForm::getElementValue()

HTML_QuickForm::getElementValue() -- Returns the element's raw value

Description

Returns the element's raw value such as submitted by the form (not filtered), set by setDefaults() or setConstants().

Parameter

string $element

Element name

Return value

return element value

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::getSubmitValue()

HTML_QuickForm::getSubmitValue() -- Returns the submitted element's value

Description

Returns the submitted element's value. The value is filtered.

Parameter

string $element

Element name

Return value

return submitted element value or NULL if not set

Throws

throws no exceptions thrown

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::getSubmitValues()

HTML_QuickForm::getSubmitValues() -- Returns the values submitted by the form

Description

Returns the values submitted by the form, possibly with uploaded files as well.

Parameter

boolean $mergeFiles

Whether uploaded files should be returned too

Throws

throws no exceptions thrown

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::process()

HTML_QuickForm::process() -- Performs the form data processing

Description

Performs the form data processing. It actually calls the $callback passing the submitted values (and files, when $mergeFiles=TRUE) to it.

Parameter

mixed $callback

Callback, either function name or array(&$object, 'method')

boolean $mergeFiles

Whether uploaded files should be processed too

Note

since 1.0

This function can not be called statically.


Validation and filters

Table of Contents
Introduction - validation and filters -- How to process submitted data
HTML_QuickForm::addRule() -- Adds a validation rule for the given field
HTML_QuickForm::addGroupRule() -- Adds a validation rule for the given group
HTML_QuickForm::addFormRule() -- Adds a global validation rule
HTML_QuickForm::isElementRequired() -- Returns whether the form element is required
HTML_QuickForm::validate() -- Performs the server side validation
HTML_QuickForm::getElementError() -- Returns error corresponding to validated element
HTML_QuickForm::setElementError() -- Set error message for a form element
HTML_QuickForm::registerRule() -- Registers a new validation rule
HTML_QuickForm::getRegisteredRules() -- Returns registered validation rules
HTML_QuickForm::isRuleRegistered() -- Returns whether the rule is supported
HTML_QuickForm::applyFilter() -- Applies a filter for the given field(s)

QuickForm also provides validation rules support. You can code your own validation rules, register them in QuickForm and then call them in your script. By default, QuickForm can handle validation against regular expressions (preg_match style) and check for required elements. If you want client-side validation, QuickForm can generate the javascript code needed. Server-side validation is always on by default.

QuickForm can also make use of filters for data import into the form or for data processing once the form has been submitted. Filters work the same way as rules except that you don't need to register them. You write your filter functions and call them in your script. You can call any php function (ie. trim, addslashes, htmlentities, etc.) and have them applied recursively to your element values.

Introduction - validation and filters

Introduction - validation and filters -- How to process submitted data

Validation rules

QuickForm makes client-side and server-side form validation easy. It allows for validation against regular expressions or custom functions and methods. You can define your own validation rules and apply them to the elements or groups you want. In this section, we will explore the different possibilities QuickForm offers to make validation easier.

QuickForm can verify if required elements are filled when the form is submitted. This works with every type of elements or groups, integer 0 is not considered as an empty value.
require_once 'HTML/QuickForm.php';

$form = new HTML_QuickForm('myform', 'post');
$form->addElement('text', 'email', 'Your email:');
$form->addElement('submit', 'submit', 'Submit');

// Validation rules

$form->addRule('email', 'E-Mail is required', 'required');

// Validation

if ($form->validate()) {
    $form->freeze();
}
$form->display();

On empty elements validation: If the element is empty, no validation rules other than required are checked for it. This means that empty element can be invalid only when it is required.

On required uploads: required rule does not work for file elements. Use uploadedfile.

The HTML_QuickForm::validate() method will scan through each rules in the order they have been set. If a rule is not validated, the error message corresponding to the element will be displayed and the form will be shown once again. You can use templates to set the position of this error message. The order you decide to set your validation rules is important because it will determine which error message is used.

Client-side validation

QuickForm can generate the javascript necessary to validate the form on the client side. This feature works for all standard elements and for groups. Server side validation is always performed in case the client has javascript turned off.
$form->addRule('email', 'E-Mail is required', 'required', null, 'client');

Tip: By setting the parameter 'client', you trigger the javascript automatic generation.

Built-in validation rules

QuickForm offers a few registered rules that are often used when validating forms. Some of the rules may need an extra $format parameter passed to addRule() / addGroupRule() to work properly.

Table 45-1. List of built-in validation rules

NameDescription$format parameter
requiredvalue is not empty 
maxlengthvalue must not exceed given number of charactersnumber of characters, integer
minlengthvalue must have more than given number of charactersnumber of characters, integer
rangelengthvalue must have between min and max charactersarray(min characters, max characters)
regexvalue must pass the regular expressionregular expression to check, string
emailvalue is a correctly formatted emailwhether to perform an additional domain check via checkdnsrr() function, boolean
lettersonlyvalue must contain only letters 
alphanumericvalue must contain only letters and numbers 
numericvalue must be a number 
nopunctuationvalue must not contain punctuation characters 
nonzerovalue must be a number not starting with 0 
compare The rule allows to compare the values of two form fields. This can be used for e.g. 'Password repeat must match password' kind of rule. Please note that you need to pass an array of elements' names to compare as a first parameter to addRule().

Type of comparison to perform, string:

'eq' or '=='

(default) the elements should have the same values

'neq' or '!='

the elements should have different values

'gt' or '>'

first element's value should be greater (compared as numbers)

'gte' or '>='

first element's value should be greater or equal (compared as numbers)

'lt' or '<'

first element's value should be smaller (compared as numbers)

'lte' or '<='

first element's value should be smaller or equal (compared as numbers)

callback This rule allows to use an external function/method for validation. This can be done either explicitly, by passing a callback as a format parameter or implicitly, by registering it via registerRule(). Function/method to use, callback.
Validation rules for file uploads
uploadedfilerequired file upload 
maxfilesizethe file size must not exceed the given number of bytesmaximum file size, integer
mimetypethe file must have a correct MIME typeeither a string for single allowed MIME type, or an array of allowed MIME types
filenamethe filename must match the given regexregular expression to test, string

On rules for file uploads: These rules are defined in HTML/QuickForm/file.php, and are automatically registered when a file type element is added to the form. These rules are server-side only, for obvious reasons.

Usage of builtin rules is covered in rules-builtin.php example provided with the package. The rules-custom.php example covers the usage of custom rule classes and callback type rules. It also contains a NumericRange class for checking whether a number is between a maximum and a minimum.

Validation classes

Since release 3.2 all builtin validation is performed by subclasses of HTML_QuickForm_Rule class. You can create your own subclass of it and implement validate() and getValidationScript() methods. Consult the source for the examples.

Validation functions and methods

When you need a more complex validation, QuickForm can use your own custom-made functions to validate an element or a group. QuickForm can also call a method of a class. This way, it is possible to use PEAR's Validate package or any other class. If you want to use your own functions, you basically have two options:

  1. Register the function via registerRule() using 'callback' as $type and giving the new rule a custom $ruleName. Later you add the rule with this name via addRule() like any buitin rule.

  2. Add the rule of callback type via addRule() passing the name of your function as $format. This way you'll have less characters to type, but will be unable to pass additional data to your function.

You can pass an extra parameter of the type you want to your function when set with HTML_QuickForm::addRule(). Here we used TRUE to enable the DNS check of our function.

If you use a method, you must specify the class your method is in. Use this syntax when you register your rule:
// Method checkEmail is in class Validate
$form->registerRule('checkmail', 'callback', 'checkEmail', 'Validate');

Tip: You can also use a javascript function to validate your form, give it the same name as your PHP function, have it return a boolean and set the 'client' parameter.

Group validation

Groups of elements can be validated the same way other elements are, or use a more complex validation scheme. To validate a group as a whole, just use HTML_QuickForm::addRule(). The group elements' values will be passed to the validation function as an array.

You can have more complex validation for your groups using the HTML_QuickForm::addGroupRule() method. This allows for a per element validation. It also makes it possible to specify the number of elements that need to be valid for the group to be valid too.

In this example, we have set rules for the elements inside our group. Instead of using their names, we could have used their index (determined by the order they were created) in the group, it would speed up the validation process.

The following example takes the same group and will validate the form only if at least one of our two elements is not empty. To achieve this, we use the howmany parameter and set it to 1.
$form->addGroupRule('id', 'Fill at least one element', 'required', null, 1);

Conclusion

You have seen that QuickForm makes it easy to validate your elements and groups without having to write all the usually necessary code to find the different values. It takes care of required elements, generates the javascript automatically and adds a lot of flexibility by allowing you to use your own validation functions and regular expressions. It's time to experiment...

Filters

If we add a rule like
$form->addRule('element', 'The element is required', 'required');
to the form, then any input will satisfy it, including, for example, a single space. This is because the rule simply ensures that there are one or more characters present, and a space character satisfies the rule.

Of course this can be fixed by making a custom regex rule, but there is an easier solution. We usually do not care about leading and trailing spaces at all, and we can make the element's value pass through builtin trim() function before doing any validation on it:
$form->applyFilter('element', 'trim');

Filters are applied recursively, which means that trim() on an array will work, too. You can pass any valid callback as an argument to applyFilter() method.

Use filters if you want to 'sanitize' user input and do not really care about invalid values.

HTML_QuickForm::addRule()

HTML_QuickForm::addRule() -- Adds a validation rule for the given field

Description

If the element is in fact a group, it will be considered as a whole, an array of group elements' values will be passed to validation function. To validate grouped elements as separate entities, use addGroupRule().

Parameter

mixed $element

Form element name(s). Currently the only builtin rule that expects and correctly handles an array here is compare:
$form->addElement('password', 'cmpPasswd', 'Password:');
$form->addElement('password', 'cmpRepeat', 'Repeat password:');
$form->addRule(array('cmpPasswd', 'cmpRepeat'), 'The passwords do not match', 'compare', null, 'client');
All other builtin rules will only handle a single element name. callback rules can also handle an array here, but the callback function you provide will obviously need to properly handle an array of values.

string $message

Message to display for invalid data

string $type

Rule type, use getRegisteredRules() to get types. You can also pass a classname for a descendant of HTML_QuickForm_Rule or an instance of such class.

string $format

(optional) Required for extra rule data

string $validation

(optional) Where to perform validation: "server", "client"

boolean $reset

For client-side validation: reset the form element to its original value if there is an error?

boolean $force

Force the rule to be applied, even if the target form element does not exist

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::addGroupRule()

HTML_QuickForm::addGroupRule() -- Adds a validation rule for the given group

Description

Adds a validation rule for the given group of elements

Only groups with a name can be assigned a validation rule. Use addGroupRule() when you need to validate elements inside the group. Also use addRule() if you need to validate the group as a whole.

Parameter

string $group

Form group name

mixed $arg1

Array for multiple elements or error message string for one element. If this is the array, its structure is the following:
array (
    'element name or index' => array(
        array(rule data),
        ...
        array(rule data)
    ),
    ...
    'element name or index' => array(
        array(rule data),
        ...
        array(rule data)
    )
)
rule data here matches the parameters' order and meaning for addRule() method.

Note: If this parameter is an array, all the subsequent parameters are ignored. You should pass all the modifiers for the rules being added within this array (see the example below).

string $type

(optional) Rule type. Use getRegisteredRules() to get types. You can also pass a classname for a descendant of HTML_QuickForm_Rule or an instance of such class.

string $format

(optional) Required for extra rule data

integer $howmany

(optional) How many valid elements should be in the group

string $validation

(optional)Where to perform validation: "server", "client"

boolean $reset

Client-side: whether to reset the element's value to its original state if validation failed.

Note

since 2.5

This function can not be called statically.

HTML_QuickForm::addFormRule()

HTML_QuickForm::addFormRule() -- Adds a global validation rule

Description

This should be used when you want to add a rule involving several fields or if you want to use some completely custom validation for your form. The rule function/method should return TRUE in case of successful validation and array('element name' => 'error') when there were errors.

Parameter

mixed $rule

A valid callback

Note

since 3.1

This function can not be called statically.

HTML_QuickForm::isElementRequired()

HTML_QuickForm::isElementRequired() -- Returns whether the form element is required

Description

Returns whether or not the form element is required, i.e. whether a 'required' rule was added for it.

Parameter

string $element

Form element name

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::validate()

HTML_QuickForm::validate() -- Performs the server side validation

Description

Performs the server side validation.

Return value

return TRUE if no error found

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::getElementError()

HTML_QuickForm::getElementError() -- Returns error corresponding to validated element

Description

Returns error corresponding to validated element. Errors are usually assigned to elements by validate() method.

Parameter

string $element

Name of form element to check

Return value

return error message corresponding to checked element

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::setElementError()

HTML_QuickForm::setElementError() -- Set error message for a form element

Description

Set error message for a form element. Errors are usually assigned to elements by validate() method. Use this if you need to explicitly set error message for an element.

Parameter

string $element

Name of form element to set error for

string $message

Error message

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::registerRule()

HTML_QuickForm::registerRule() -- Registers a new validation rule

Description

Registers a new validation rule

Parameter

string $ruleName

Name of validation rule

string $type

Either: 'regex' or 'callback' ('function' is also kept for backward compatibility). If registering a subclass of HTML_QuickForm_Rule you can pass anything here, preferrably NULL or empty string.

string $data1

Name of function, regular expression, classname of HTML_QuickForm_Rule subclass or an instance of such class.

The callback function needs to return true or false, determining if the rule is passed or not.

string $data2

Object parent of above function, name of the file containing the subclass of HTML_QuickForm_Rule.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::getRegisteredRules()

HTML_QuickForm::getRegisteredRules() -- Returns registered validation rules

Description

Returns an array of registered validation rules.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::isRuleRegistered()

HTML_QuickForm::isRuleRegistered() -- Returns whether the rule is supported

Description

Returns whether or not the given rule is supported. New rules are registered via registerRule() method.

Parameter

string $name

Validation rule name

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::applyFilter()

HTML_QuickForm::applyFilter() -- Applies a filter for the given field(s)

Description

Applies a data filter for the given field(s). Filter is applied recursively.

Parameter

mixed $element

Form element name or array of such names. Special name '__ALL__' means all the form elements.

mixed $filter

Callback, either function name or array(&$object, 'method')

Note

since 2.0

This function can not be called statically.


Outputting the form

Your form can be customised in many ways. QuickForm can use different kind of renderers and provides a default one which allows for customization of the form, the elements, the error messages, the headers, the required elements note and the required elements sign. You can also write your own renderers.


Form customization and output helpers

Table of Contents
HTML_QuickForm::freeze() -- "Freezes" the form's elements
HTML_QuickForm::isElementFrozen() -- Checks whether the element is frozen
HTML_QuickForm::isFrozen() -- Checks whether the form is frozen
HTML_QuickForm::setRequiredNote() -- Sets required note
HTML_QuickForm::setJsWarnings() -- Sets JavaScript warning messages
HTML_QuickForm::getRequiredNote() -- Returns the required note
HTML_QuickForm::getValidationScript() -- Returns the client side validation script
HTML_QuickForm::accept() -- Accepts a renderer
HTML_QuickForm::defaultRenderer() -- Returns a reference to default renderer object
HTML_QuickForm::toArray() -- Returns the form's contents in an array
HTML_QuickForm::toHtml() -- Returns an HTML version of the form
HTML_QuickForm::display() -- Outputs an HTML version of the form

HTML_QuickForm::freeze()

HTML_QuickForm::freeze() -- "Freezes" the form's elements

Description

Freezes the elements: elements' values will be displayed without HTML input tags.

Parameter

mixed $elementList

array or string of element(s) to be frozen. If NULL then all the form's elements will be frozen.

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::isElementFrozen()

HTML_QuickForm::isElementFrozen() -- Checks whether the element is frozen

Description

Returns whether or not the form element is frozen.

Parameter

string $element

Form element name

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::isFrozen()

HTML_QuickForm::isFrozen() -- Checks whether the form is frozen

Description

Returns whether or not the whole form is frozen.

Throws

throws no exceptions thrown

Note

since 3.0

This function can not be called statically.

HTML_QuickForm::setRequiredNote()

HTML_QuickForm::setRequiredNote() -- Sets required note

Description

Sets the required note. This note is usually displayed below the form when the form contains required fields.

Parameter

string $note

Message indicating some elements are required

Throws

throws no exceptions thrown

Note

since 1.1

This function can not be called statically.

HTML_QuickForm::setJsWarnings()

HTML_QuickForm::setJsWarnings() -- Sets JavaScript warning messages

Description

Sets JavaScript warning messages: the first is displayed before element errors, the second after them. Useless if the form had no rules added with 'client' modifier.

Parameter

string $pref

Prefix warning

string $post

Postfix warning

Throws

throws no exceptions thrown

Note

since 1.1

This function can not be called statically.

HTML_QuickForm::getRequiredNote()

HTML_QuickForm::getRequiredNote() -- Returns the required note

Description

Returns the required note. This note is usually displayed below the form when the form contains required fields.

Throws

throws no exceptions thrown

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::getValidationScript()

HTML_QuickForm::getValidationScript() -- Returns the client side validation script

Description

Returns JavaScript used to validate the form on client side. Returns an empty string if no rules were added with 'client' modifier.

Throws

throws no exceptions thrown

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::accept()

HTML_QuickForm::accept() -- Accepts a renderer

Description

Accepts a renderer. This method is a part of the Visitor design pattern implementation.

Parameter

object &$renderer

HTML_QuickForm_Renderer object

Throws

throws no exceptions thrown

Note

since 3.0

This function can not be called statically.

HTML_QuickForm::defaultRenderer()

HTML_QuickForm::defaultRenderer() -- Returns a reference to default renderer object

Description

Returns a reference to default renderer object. You can use this method to save a few keystrokes:
<?php
$renderer =& $form->defaultRenderer();
?>
instead of
<?php
require_once 'HTML/QuickForm/Renderer/Default.php';

$renderer =& new HTML_QuickForm_Renderer_Default();
?>
It is also used internally to implement toHtml() and some of the deprecated methods.

Return value

return default renderer object

Throws

throws no exceptions thrown

Note

since 3.0

This function can be called statically.

HTML_QuickForm::toArray()

HTML_QuickForm::toArray() -- Returns the form's contents in an array

Description

Returns the form's contents in an array, uses Array renderer for this.

Parameter

boolean $collectHidden

Whether to collect hidden elements (passed to the Renderer's constructor)

Return value

return array of form contents, structure is described in renderer documentation.

Throws

throws no exceptions thrown

Note

since 2.0

This function can not be called statically.

HTML_QuickForm::toHtml()

HTML_QuickForm::toHtml() -- Returns an HTML version of the form

Description

Returns an HTML version of the form, uses Default renderer for this.

Parameter

string $in_data

(optional) Any extra data to insert right before form is rendered. Data will be inserted via addElement('html', $in_data)

Return value

return Html version of the form

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.

HTML_QuickForm::display()

HTML_QuickForm::display() -- Outputs an HTML version of the form

Description

Outputs an HTML version of the form, uses Default renderer for this.

Throws

throws no exceptions thrown

Note

since 1.0

This function can not be called statically.


Basic renderers

These renderers are based on pre-3.0 HTML_QuickForm code and require no external classes to do their work.

Introduction - renderers

Introduction - renderers -- How to output the form

What are renderers?

Before release 3.0, form outputting logic was implemented as methods of HTML_QuickForm class. This led to two problems:

  1. Bloat of the said class (80+ methods!)

  2. Difficulties in adding new output logic (i.e. using template engines)

In release 3.0, new system was implemented. The form output logic is now contained in classes that extend HTML_QuickForm_Renderer, their behaviour is based on Visitor design pattern from the classic "Design Patterns" book. This gives the following advantages:

  1. Code for some particular output method is loaded only when the method is used.

  2. It is much easier to add new output method.

There are 8 renderers available since release 3.1.1, of which 2 are based on pre-3.0 code and 6 are new. The following template engines are directly suported: Smarty, HTML_Template_Sigma, HTML_Template_IT, HTML_Template_Flexy.

The main steps of using any available renderer are quite similar:
<?php
// include the renderer class
require_once 'HTML/QuickForm/Renderer/FooBar.php';
// instantiate the renderer
$renderer =& new HTML_QuickForm_Renderer_FooBar($options);
// do some customization
$renderer->adjustSomething('element1', '...');
// ...
$renderer->adjustSomething('elementN', '...');
// process the form
$form->accept($renderer);
// output the results
$renderer->toFooBar();
?>
Actual methods for customization and doing the output will of course depend on renderer type.

Concerning usage examples: Usage examples provided in the manual are pretty basic. More complex examples for Default renderer can be found in docs/ directory, for all other renderers - in docs/renderers/ directory of HTML_QuickForm.

HTML_QuickForm_Renderer_Default

HTML_QuickForm_Renderer_Default -- Default renderer

Description

This renderer directly generates and outputs form HTML. It is based on pre-3.0 built-in form output logic.

The renderer has built-in templates for elements, their format is similar to that of HTML_Template_Sigma or HTML_Template_IT (but only placeholders and blocks are supported). When renderer's renderSomething() method is called, it finds the template for the element, makes necessary substitutions and appends the result to the form's HTML.

Usage example

It is recommended to use the Default renderer when you are not using any template engine in your application or do not need to do any customization to form output. It is the fastest way to output a form.

Tip: HTML_QuickForm::toHtml() method uses the Default renderer internally.

HTML_QuickForm_Renderer_Default::clearAllTemplates()

HTML_QuickForm_Renderer_Default::clearAllTemplates() -- Clears all templates

Description

Clears all the HTML out of the templates that surround notes, elements, etc.

Useful when you want to use addElement('html', '...') to create a completely custom form look.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::setElementTemplate()

HTML_QuickForm_Renderer_Default::setElementTemplate() -- Sets element template

Description

Sets element template. When called with one parameter, it sets the default element template, when called with two parameters it sets template for the concrete element. The template should include at least the {element} placeholder.

The default element template is
"\n\t<tr>\n\t\t<td align=\"right\" valign=\"top\"><!-- BEGIN required --><span style=\"color: #ff0000\">*</span><!-- END required --><b>{label}</b></td>\n\t\t<td valign=\"top\" align=\"left\"><!-- BEGIN error --><span style=\"color: #ff0000\">{error}</span><br /><!-- END error -->\t{element}</td>\n\t</tr>"

Parameter

string $html

The HTML surrounding an element

string $element

(optional) Name of the element to apply template for

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::setFormTemplate()

HTML_QuickForm_Renderer_Default::setFormTemplate() -- Sets form template

Description

Sets form template. The template should include {attributes} and {content} placeholders.

The default form template is
"\n<form{attributes}>\n<table border=\"0\">\n{content}\n</table>\n</form>"

Parameter

string $html

The HTML surrounding the form tags

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::setGroupElementTemplate()

HTML_QuickForm_Renderer_Default::setGroupElementTemplate() -- Sets template for group elements

Description

Sets element template for elements within a group.

By default, the template is empty.

Parameter

string $html

The HTML surrounding an element

string $group

Name of the group to apply template for

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::setGroupTemplate()

HTML_QuickForm_Renderer_Default::setGroupTemplate() -- Sets template for a group wrapper

Description

Sets template for a group wrapper

This template is contained within a group-as-element template set via setElementTemplate() and contains group's element templates, set via setGroupElementTemplate().

By default, the template is empty.

Parameter

string $html

The HTML surrounding group elements

string $group

Name of the group to apply template for

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::setHeaderTemplate()

HTML_QuickForm_Renderer_Default::setHeaderTemplate() -- Sets header template

Description

Sets header template. The template should include the {header} placeholder.

The default header template is
"\n\t<tr>\n\t\t<td style=\"white-space: nowrap; background-color: #CCCCCC;\" align=\"left\" valign=\"top\" colspan=\"2\"><b>{header}</b></td>\n\t</tr>"

Parameter

string $html

The HTML surrounding the header

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::setRequiredNoteTemplate()

HTML_QuickForm_Renderer_Default::setRequiredNoteTemplate() -- Sets the template for 'required' note

Description

Sets the note indicating required fields template. The template should include the {requiredNote} placeholder.

The default template is
"\n\t<tr>\n\t\t<td></td>\n\t<td align=\"left\" valign=\"top\">{requiredNote}</td>\n\t</tr>"

Parameter

string $html

The HTML surrounding the required note

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Default::toHtml()

HTML_QuickForm_Renderer_Default::toHtml() -- Returns the HTML

Description

Returns the HTML generated for the form.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Array

HTML_QuickForm_Renderer_Array -- Array representation of the form

Description

This renderer does not output anything itself, it returns the form structure as an array. This array can later be used for generating the output. A usage example is available for this renderer and Smarty template engine, look in docs/renderers directory.

The form array structure is the following:
array(
  'frozen'           => 'whether the form is frozen',
  'javascript'       => 'javascript for client-side validation',
  'attributes'       => 'attributes for <form> tag',
  'requirednote      => 'note about the required elements',
  // if we set the option to collect hidden elements
  'hidden'           => 'collected html of all hidden elements',
  // if there were some validation errors:
  'errors' => array(
    '1st element name' => 'Error for the 1st element',
    ...
    'nth element name' => 'Error for the nth element'
  ),
  // if there are no headers in the form:
  'elements' => array(
    element_1,
    ...
    element_N
  )
  // if there are headers in the form:
  'sections' => array(
    array(
      'header'   => 'Header text for the first header',
      'name'     => 'Name of the first header',
      'elements' => array(
         element_1,
         ...
         element_K1
      )
    ),
    ...
    array(
      'header'   => 'Header text for the Mth header',
      'elements' => array(
         element_1,
         ...
         element_KM
      )
    )
  )
);
where element_i is an array of the form:
array(
  'name'      => 'element name',
  'value'     => 'element value',
  'type'      => 'type of the element',
  'frozen'    => 'whether element is frozen',
  'label'     => 'label for the element',
  'required'  => 'whether element is required',
  'error'     => 'error associated with the element',
  'style'     => 'some information about element style (e.g. for Smarty)',
  // if element is not a group
  'html'      => 'HTML for the element'
  // if element is a group
  'separator' => 'separator for group elements',
  'elements'  => array(
    element_1,
    ...
    element_N
  )
);

Tip: HTML_QuickForm::toArray() method uses the Array renderer internally.

constructor HTML_QuickForm_Renderer_Array::HTML_QuickForm_Renderer_Array()

constructor HTML_QuickForm_Renderer_Array::HTML_QuickForm_Renderer_Array() -- Constructor

Description

This package is not documented yet.

Parameter

boolean $collectHidden

TRUE: collect all hidden elements into string; FALSE: process them as usual form elements

boolean $staticLabels

TRUE: instead of putting an array of labels into the 'label' element of resultant array, create separate keys for them named 'label_$key' where $key is the key in the array of labels (key + 1 if it is numeric). The first element of the array occupies the 'label' element.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Array::setElementStyle()

HTML_QuickForm_Renderer_Array::setElementStyle() -- Sets a style to use for element rendering

Description

Sets a style to use for element rendering (this style can later be checked by e.g. a template engine).

Parameter

mixed $elementName

element name or array ('element name' => 'style name')

string $styleName

style name if $elementName is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Array::toArray()

HTML_QuickForm_Renderer_Array::toArray() -- Returns the resultant array

Description

Returns an array representation of the form built by the renderer.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Template-based renderers

Table of Contents
HTML_QuickForm_Renderer_ArraySmarty -- A renderer for 'static' Smarty templates
constructor HTML_QuickForm_Renderer_ArraySmarty::HTML_QuickForm_Renderer_ArraySmarty() -- Constructor
HTML_QuickForm_Renderer_ArraySmarty::setErrorTemplate() -- Sets the way elements with validation errors are rendered
HTML_QuickForm_Renderer_ArraySmarty::setRequiredTemplate() -- Sets the way required elements are rendered
HTML_QuickForm_Renderer_ITDynamic -- Dynamic renderer for Integrated Templates
constructor HTML_QuickForm_Renderer_ITDynamic::HTML_QuickForm_Renderer_ITDynamic() -- Constructor
HTML_QuickForm_Renderer_ITDynamic::setElementBlock() -- Sets the block to use for element rendering
HTML_QuickForm_Renderer_ITDynamic::setHeaderBlock() -- Sets the name of a block to use for header rendering
HTML_QuickForm_Renderer_ITStatic -- Static renderer for Integrated Templates
constructor HTML_QuickForm_Renderer_ITStatic::HTML_QuickForm_Renderer_ITStatic() -- Constructor
HTML_QuickForm_Renderer_ITStatic::setErrorTemplate() -- Sets the way elements with validation errors are rendered
HTML_QuickForm_Renderer_ITStatic::setRequiredTemplate() -- Sets the way required elements are rendered
HTML_QuickForm_Renderer_QuickHtml -- Render form elements into HTML in an easy and flexible manner
constructor HTML_QuickForm_Renderer_QuickHtml::HTML_QuickForm_Renderer_QuickHtml() -- Constructor
HTML_QuickForm_Renderer_QuickHtml::toHtml() -- Returns the HTML
HTML_QuickForm_Renderer_QuickHtml::elementToHtml() -- Renders a specific form element into HTML

These renderers use template engines to actually generate the HTML for the form.

HTML_QuickForm_Renderer_ArraySmarty

HTML_QuickForm_Renderer_ArraySmarty -- A renderer for 'static' Smarty templates

Description

This renderer was written by Thomas Schulz. It is based on pre-3.0 HTML_QuickForm::toArray() code and ITStatic renderer. It can be used to output the form into the 'static' Smarty template. Usage example for this is available in docs/renderers.

The form array structure is the following:
array (
 ['frozen']       => 'whether the complete form is frozen',
 ['javascript']   => 'javascript for client-side validation',
 ['attributes']   => 'attributes for <form> tag',
 ['hidden']       => 'html of all hidden elements',
 ['requirednote'] => 'note about the required elements',
 ['errors'] => Array
     (
         ['1st_element_name'] => 'Error for the 1st element',
         ...
         ['nth_element_name'] => 'Error for the nth element',
     ),

 ['header'] => Array
     (
         ['1st_header_name'] => 'Header text for the 1st header',
         ...
         ['nth_header_name'] => 'Header text for the nth header'
     ),

 ['1st_element_name'] => 'Array for the 1st element',
 ...
 ['nth_element_name'] => Array for the nth element'
);
where an element array has the form:
array(
         ['name']      => 'element name',
         ['value']     => 'element value',
         ['type']      => 'type of the element',
         ['frozen']    => 'whether element is frozen',
         ['label']     => 'label for the element',
         ['required']  => 'whether element is required',
// if element is not a group:
         ['html']      => 'HTML for the element',
// if element is a group:
         ['separator'] => 'separator for group elements',
         ['1st_gitem_name'] => 'Array for the 1st element in group',
         ...
         ['nth_gitem_name'] => 'Array for the nth element in group'
);

constructor HTML_QuickForm_Renderer_ArraySmarty::HTML_QuickForm_Renderer_ArraySmarty()

constructor HTML_QuickForm_Renderer_ArraySmarty::HTML_QuickForm_Renderer_ArraySmarty() -- Constructor

Description

This package is not documented yet.

Parameter

object &$tpl

A Smarty object to use for form output

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ArraySmarty::setErrorTemplate()

HTML_QuickForm_Renderer_ArraySmarty::setErrorTemplate() -- Sets the way elements with validation errors are rendered

Description

You can use {$label} or {$html} placeholders to let the renderer know where where the element label or the element html are positionned according to the error message. They will be replaced accordingly with the right value. The error message will replace the {$error} placeholder. For example: {if $error}<span style="color: red;">{$error}</span>{/if}{$html} will put the error message in red on top of the element html.

If you want all error messages to be output in the main error block, use the {$form.errors} part of the rendered array that collects all raw error messages.

If you want to place all error messages manually, do not specify {$html} nor {$label}.

Groups can have special layouts. With this kind of groups, you have to place the formated error message manually. In this case, use {$form.group.error} where you want the formated error message to appear in the form.

Parameter

string $template

The element error template

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ArraySmarty::setRequiredTemplate()

HTML_QuickForm_Renderer_ArraySmarty::setRequiredTemplate() -- Sets the way required elements are rendered

Description

You can use {$label} or {$html} placeholders to let the renderer know where where the element label or the element html are positionned according to the required tag. They will be replaced accordingly with the right value. You can use the full smarty syntax here, especially a custom modifier for I18N. For example: {if $required}<span style="color: red;">*</span>{/if}{$label|translate} will put a red star in front of the label if the element is required and translate the label.

Parameter

string $template

The required element template

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ITDynamic

HTML_QuickForm_Renderer_ITDynamic -- Dynamic renderer for Integrated Templates

Description

The word 'dynamic' in renderer name means that exact form layout is defined at script runtime. This also means that you can create one template file for all your forms. That template should contain a block for every distinct element 'look' appearing in your forms and also some special blocks. If a special block is not set for an element, the renderer falls back to a default one.

If most of your forms tend to share the same look (a good example would be back-office interface), your best bet will be to use Dynamic renderer. If each of your forms has a really special layout, you should go with a Static one.

Template structure

This is a somewhat minimal template, but it contains all the necessary elements to render any form you are able to define with the package.
{qf_javascript}
<form {qf_attributes}>
<!-- BEGIN qf_hidden_loop -->
{qf_hidden}
<!-- END qf_hidden_loop -->

<table>

<!-- BEGIN qf_errors -->
    <tr>
        <td>
            Collected errors:
            <ul>
                <!-- BEGIN qf_error_loop -->
                <li>{qf_error}</li>
                <!-- END qf_error_loop -->
            </ul>
        </td>
    </tr>
<!-- END qf_errors -->

<!-- BEGIN qf_main_loop -->
    <!-- BEGIN qf_header -->
    <tr>
        <th colspan="2">{qf_header}</th>
    </tr>
    <!-- END qf_header -->

    <!-- BEGIN qf_element -->
    <tr valign="top">
        <td align="right">
            <!-- BEGIN qf_element_required --><span style="color: #FF0000;">*</span><!-- END qf_element_required -->
            <b>{qf_label}</b>
        </td>
        <td>
            <!-- BEGIN qf_element_error --><span style="color: #FF0000;">{qf_error}</span><br /><!-- END qf_element_error -->
            {qf_element}
        </td>
    </tr>
    <!-- END qf_element -->

    <!-- BEGIN qf_group -->
    <tr valign="top">
        <td align="right">
            <!-- BEGIN qf_group_required --><span style="color: #FF0000;">*</span><!-- END qf_group_required -->
            <b>{qf_group_label}</b>
        </td>
        <td>
            <!-- BEGIN qf_group_error --><span style="color: #FF0000;">{qf_error}</span><br /><!-- END qf_group_error -->
            <!-- BEGIN qf_group_loop -->
                <!-- BEGIN qf_group_element -->{qf_separator}{qf_label}{qf_element}<!-- END qf_group_element -->
            <!-- END qf_group_loop -->
        </td>
    </tr>
    <!-- END qf_group -->

<!-- END qf_main_loop -->

<!-- BEGIN qf_required_note -->
    <tr>
        <td>&nbsp;</td>
        <td align="left" valign="top">{qf_required_note}</td>
    </tr>
<!-- END qf_required_note -->
</table>
</form>

Blocks in the template

qf_main_loop

This block should always be present and should be a parent for all visible elements' blocks. It is used to implement "flow", to render elements one after another.

qf_element

This is the default block for rendering form elements. This block should always be present, as the renderer uses the following logic to decide which block to use for an element's output:

  1. If a special block was set for an element, use that

  2. If a block qf_%element's type% (e.g. qf_password) exists, use that

  3. Use qf_element

qf_element_required

The block will be touch'd if an element is required.

qf_element_error

An error associated with an element will be output here.

qf_header

This is the default block used to output headers. Should be present unless you have no headers in your form.

qf_group

Default block to output groups. Should be present unless you do not use grouped elements.

qf_group_loop

An analog of qf_main_loop, used to render group's elements one after another. A %group's block%_loop should always be present inside %group's block%

qf_group_element

A default block to render group's elements, %group's block%_element should always be present inside %group's block%_loop (for the same reason as the qf_element should be present in qf_main_loop)

qf_error_loop

This is used to output collected errors for the elements that do not have a %element's block%_error block.

qf_hidden_loop

<input type="hidden" /> elements are rendered here.

Placeholders in the template

{qf_javascript}

Javascript for client-side form validation will be output here.

{qf_required_note}

If there are required elements in the form, a note will be output here

Usage example

Assuming the template is in ./qform.html:
<?php
require_once 'HTML/QuickForm/Renderer/ITDynamic.php';
require_once 'HTML/Template/Sigma.php';

// Instantiate the template object and load the template file
$tpl =& new HTML_Template_Sigma('.');
$tpl->loadTemplateFile('qform.html');

// Instantiate the renderer and process the form
$renderer =& new HTML_QuickForm_Renderer_ITDynamic($tpl);
$form->accept($renderer);

// Output the results
$tpl->show();
?>
Note that we do not show how the form is built here, that's because the example will work for virtually any form.

Template class compatibility: This renderer was developed and tested using HTML_Template_Sigma. While it probably will work with HTML_Template_IT, no warranties can be given.

Removing empty blocks: The renderer assumes that the template object was set up to remove empty blocks (this is the default behaviour). If that is not true, the results will be pretty discouraging.

constructor HTML_QuickForm_Renderer_ITDynamic::HTML_QuickForm_Renderer_ITDynamic()

constructor HTML_QuickForm_Renderer_ITDynamic::HTML_QuickForm_Renderer_ITDynamic() -- Constructor

Description

This package is not documented yet.

Parameter

object &$tpl

HTML_Template_ITX/HTML_Template_Sigma object to use

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ITDynamic::setElementBlock()

HTML_QuickForm_Renderer_ITDynamic::setElementBlock() -- Sets the block to use for element rendering

Description

Sets the block to use for element rendering.

Parameter

mixed $elementName

element name or array ('element name' => 'block name')

string $blockName

block name if $elementName is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ITDynamic::setHeaderBlock()

HTML_QuickForm_Renderer_ITDynamic::setHeaderBlock() -- Sets the name of a block to use for header rendering

Description

Sets the name of a block to use for header rendering

Parameter

string $blockName

block name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ITStatic

HTML_QuickForm_Renderer_ITStatic -- Static renderer for Integrated Templates

Description

The word 'static' in renderer name means that exact form layout is defined before the execution of the script starts. That also means that you should have an unique template for each form you want to display with this renderer.

The IT Static renderer, as opposed to the IT Dynamic renderer, offers more flexibility in the way you display your forms but might also takes more time to implement. Therefore, if your form is using always the same pattern to display form element labels and form element html, it is recommended to use the Dynamic renderer. On the other hand, if you have many different layouts for your form elements, for example if you alternate text and form elements, you will prefer to use the Static renderer.

Usage example

With the ITStatic renderer, you have to know beforehand which elements (or group of elements) will compose your form. So we will start by defining our elements.
Now our form contains these elements:

  • One header: 'Registration form'

  • One hidden field

  • One group of two textfields: firstname and lastname

  • One textfield for the E-Mail address

  • One selectbox for the country with an empty default value

  • Two buttons: Reset and Register

  • One checkbox to subscribe to the newsletter

Now that we know which elements compose our form, it will be easy to layout the form using a WYSIWYG or an HTML editor. The idea is to use placeholders instead of labels and element html. The placeholders are named after the form and element or group names: formName_elementName or formName_groupName_elementName. Then you add _label or _html. We will save the following code in a template.html file.

As you can notice, the layout is static. This makes the Static renderer only useful if your form does not change on runtime. Nevertheless, you can still hide blocks if you use the removeEmptyBlocks option of HTML_Template_IT / HTML_Template_Sigma. Now that we have the elements and the template, we are going to use our Static renderer.

You can optionally specify the way your required elements and validation errors are rendered using respectively setRequiredTemplate() and setErrorTemplate(). In the given string, you will place either the {label} or the {html} placeholder at the position you want. If you prefer to have all your errors displayed at the same place, pass an empty string to setErrorTemplate() and add this block to your template at the position you want:
<!-- BEGIN myform_error_loop -->
<font color="red">{myform_error}</font><br />
<!-- END myform_error_loop -->

With the Static renderer, it is also possible to customize the way your groups are rendered. If you simply use a placeholder for your whole group, the group will be rendered using HTML_QuickForm default renderer. This means that if a separator string (or an array of separators) was specified, it will be used the usual way. In our form, the group called 'name' was rendered this way, using a - to separate the elements.

The problem we have is that elements inside the group don't show their label, so it is not possible to guess which textfield is firstname and which one is lastname. By replacing the layout for the element 'name' by these new placeholders, can customize the way the group will be displayed:
(...)
 <tr>
  <td>{myform_name_label}</td>
  <td>
   <!-- BEGIN myform_name_error -->{myform_name_error}<!-- END myform_name_error -->
   <table>
    <tr><td>{myform_name_first_html}</td><td>{myform_name_last_html}</td></tr>
    <tr><td>{myform_name_first_label}</td><td>{myform_name_last_label}</td></tr>
    </table>
   </td>
 </tr>
(...)

We need to add a new block and placeholder to let the renderer know where to display the error relative to this group. As you have noticed, every placeholder take the name of his group along with its own name.

Tip: Also note that if you use elements with the same name, like radios that are not in a group, you will have to add an index to the placeholder name starting at 0, like this: {myform_myradio_0_html}, {myform_myradio_1_html}...

We have seen how to use the Static renderer with standard elements and groups of elements. We have seen how to display errors and required tags. They won't show in your form because we did not add any validation rules. Feel free to try to add them as an exercise. You can also add a special placeholder to your template {myform_required_note}, it will display the note that indicates how to find required elements. This renderer usage is very easy, when you feel comfortable with it, you can move on to the Dynamic renderer which might also fit your needs in an other way.

constructor HTML_QuickForm_Renderer_ITStatic::HTML_QuickForm_Renderer_ITStatic()

constructor HTML_QuickForm_Renderer_ITStatic::HTML_QuickForm_Renderer_ITStatic() -- Constructor

Description

This package is not documented yet.

Parameter

object &$tpl

HTML_Template_IT or other compatible Template object to use

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ITStatic::setErrorTemplate()

HTML_QuickForm_Renderer_ITStatic::setErrorTemplate() -- Sets the way elements with validation errors are rendered

Description

You can use {label} or {html} placeholders to let the renderer know where where the element label or the element html are positionned according to the error message. They will be replaced accordingly with the right value. The error message will replace the {error} place holder. For example: <font color="red">{error}</font>{html} will put the error message in red on top of the element html.

If you want all error messages to be output in the main error block, do not specify {html} nor {label}.

Groups can have special layouts. With this kind of groups, the renderer will need to know where to place the error message. In this case, use error blocks like: <!-- BEGIN form_group_error -->{form_group_error}<!-- END form_group_error --> where you want the error message to appear in the form.

Parameter

string $template

The element error template

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_ITStatic::setRequiredTemplate()

HTML_QuickForm_Renderer_ITStatic::setRequiredTemplate() -- Sets the way required elements are rendered

Description

You can use {label} or {html} placeholders to let the renderer know where where the element label or the element html are positionned according to the required tag. They will be replaced accordingly with the right value. For example: <font color="red">*</font>{label} will put a red star in front of the label if the element is required.

Parameter

string $template

The required element template

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_QuickHtml

HTML_QuickForm_Renderer_QuickHtml  -- Render form elements into HTML in an easy and flexible manner

Description

This renderer has three main distinctives: an easy way to create custom-looking forms, the ability to separate the creation of form elements from their display, and being able to use QuickForm in widget-based template systems.

All of the renderers allow you to create a custom-looking form. However, unlike the default renderer, QuickHtml is solely for creating custom forms and has the additional benefits discussed below.

It is often desirable to separate the creation of form elements and their accompanying rules from their actual display on a page. For example, in the MVC design pattern it may be useful to create the form elements and their rules in the Model classes which control how the submitted data will be saved (field lengths, allowed characters, etc.), but leave the rendering of those form elements to the View classes which only care about how to make the page look a certain way.

A widget is a chunk of re-usable html which can be used with other widgets to create a webpage. Any template system which supports widgets (and nearly all do) can be used with QuickHtml. An example widget may consist of a table with reserved places for the form elements. The form elements would be rendered into those places and then the form tags, any remaining form elements (such as hidden elements), and any accompanying javascript for validation would be wrapped around the table widget.

Usage example

The following is an example usage of the QuickHtml renderer. The "template" system we use is just a simple html widget in which the form elements are placed, but it could be replaced with a more complex template system. A more complex usage example is in docs/renderers/QuickHtml_example.php

Example 45-1. QuickHtml renderer usage

<?php
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/Renderer/QuickHtml.php';

// Create form elements and renderer
$form =& new HTML_QuickForm('tmp_form','POST');
$renderer =& new HTML_QuickForm_Renderer_QuickHtml();
// Create a hidden element.  Note how we don't render it explicitly,
// rather we let QuickHtml render it for us at the beginning of the form.
$form->addElement('hidden','tmp_hidden');
// Create 2 radio elements.  Note how we have to give a value when rendering
// them since that is the only way to tell them apart.
$form->addElement('radio','tmp_radio',null,null,'Y');
$form->addElement('radio','tmp_radio',null,null,'N');
// Create a group with a rule
$text = array();
$text[] =& HTML_QuickForm::createElement('text','',null,array('size' => 3));
$text[] =& HTML_QuickForm::createElement('text','',null,array('size' => 4));
$text[] =& HTML_QuickForm::createElement('text','',null,array('size' => 3));
$form->addGroup($text, 'tmp_phone', null, '-');
$form->addRule('tmp_phone','Phone number cannot be empty.','required',null,'client');

// Do the magic of creating the form.  NOTE: order is important here: this must 
// be called after creating the form elements, but before rendering them.
$form->accept($renderer);

// Create a very basic template for our form
$html_template = '
<div style="text-align: center; font-weight: bold;">QuickHtml - Basic Example</div>
<div style="text-align: center; background-color: #ccc; margin: 1px;">Phone: %phoneNumber%</div>
<div style="text-align: left; background-color: #ccc; margin: 1px;">Yes: %radioElementYes% No: %radioElementNo%</div>';

// Interpolate the form elements into our template
$html_template = str_replace('%phoneNumber%', $renderer->elementToHtml('tmp_phone'), $html_template);
$html_template = str_replace('%radioElementYes%', $renderer->elementToHtml('tmp_radio', 'Y'), $html_template);
$html_template = str_replace('%radioElementNo%', $renderer->elementToHtml('tmp_radio', 'N'), $html_template);

// The form tags, javascript, and hidden element will be wrapped around
// our html template
echo $renderer->toHtml($html_template);
?>

constructor HTML_QuickForm_Renderer_QuickHtml::HTML_QuickForm_Renderer_QuickHtml()

constructor HTML_QuickForm_Renderer_QuickHtml::HTML_QuickForm_Renderer_QuickHtml() -- Constructor

Description

The constructor for HTML_QuickForm_Renderer_QuickHtml().

Throws

throws no exceptions thrown

HTML_QuickForm_Renderer_QuickHtml::toHtml()

HTML_QuickForm_Renderer_QuickHtml::toHtml() -- Returns the HTML

Description

Returns the HTML generated for the form.

Parameter

$data

Any html to put inside the form tags. This would normally be the html template into which you have rendered the form elements.

Throws

throws no exceptions thrown

HTML_QuickForm_Renderer_QuickHtml::elementToHtml()

HTML_QuickForm_Renderer_QuickHtml::elementToHtml() -- Renders a specific form element into HTML

Description

Returns the HTML generated for a specific form element and marks that element as rendered.

Parameter

$elementName

The name of the form element that is being rendered.

$elementValue

The value given to the form element. This is only useful for elements that have the same name (such as a radio button), and can only be told apart based on the value assigned to them.

Throws

throws no exceptions thrown


Renderer infrastructure

Table of Contents
HTML_QuickForm_Renderer -- Abstract base class for renderers (package developer related)
HTML_QuickForm_Renderer::startForm() -- Start visiting a form (package developer related)
HTML_QuickForm_Renderer::finishForm() -- Finish visiting a form (package developer related)
HTML_QuickForm_Renderer::startGroup() -- Start visiting a group (package developer related)
HTML_QuickForm_Renderer::finishGroup() -- Finish visiting a group (package developer related)
HTML_QuickForm_Renderer::renderElement() -- Visit an element (package developer related)
HTML_QuickForm_Renderer::renderHeader() -- Visit a header (package developer related)
HTML_QuickForm_Renderer::renderHidden() -- Visit a hidden element (package developer related)
HTML_QuickForm_Renderer::renderHtml() -- Visit a raw HTML/text element (package developer related)

If you want to modify an existing renderer or write a new one, this section will be of interest to you.

HTML_QuickForm_Renderer

HTML_QuickForm_Renderer -- Abstract base class for renderers (package developer related)

Description

Defines the abstract methods that should be implemented by child classes.

QuickForm renderers implement the Visitor design pattern. That means that each form element has an accept() method that is called with a renderer instance as a parameter. This method does the following:

  • If the element contains other elements (HTML_QuickForm_group and HTML_QuickForm itself) then it iterates over them calling each element's accept() method and calls the methods for rendering the container itself (e.g. startForm() and finishForm()).

  • If the element is simple, then it calls the renderer's method for rendering itself (e.g. renderHeader()).

It may seem that renderer object has to have a renderConcreteElement() method for each HTML_QuickForm_concreteElement it may visit, but fortunately most of the elements have fairly similar rendering needs, so instead of separate renderTextarea() and renderCheckbox() we have a generic renderElement() method.

The renderer should take care of "accumulating" the information passed to its methods and of generating some type of output based on it. How this is implemented internally depends on the renderer type.

Creating your own renderer

The first thing you have to decide upon is how your renderer will accumulate the information. You'll probably have to create some data structures to keep it (unless you are going to pass the information to e.g. a template object at once).

Then you have to make concrete implementations for all the abstract methods defined in HTML_QuickForm_Renderer. One notable exception is renderHtml() method that is implemented only in the Default renderer and will probably stay this way.

You'll probably also want to add some public methods for customizing the output and getting the results of the renderer's work. But this depends on the type of the renderer very much.

If you want to contribute the renderer you made to QuickForm, consider the following

  • Your code should be useful to other people (e.g. renderer for some obscure private template engine is a bad contribution).

  • Your renderer should have non-trivial usage examples.

  • And last but not least, you code will have to conform to PEAR coding standards.

Tip: If you have examples for additional uses of an existing renderer, that will be a welcome contribution, too.

HTML_QuickForm_Renderer::startForm()

HTML_QuickForm_Renderer::startForm() -- Start visiting a form (package developer related)

Description

Called when visiting a form, before processing any form elements

Parameter

object &$form

HTML_QuickForm object being visited

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::finishForm()

HTML_QuickForm_Renderer::finishForm() -- Finish visiting a form (package developer related)

Description

Called when visiting a form, after processing all form elements

Parameter

object &$form

HTML_QuickForm object being visited

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::startGroup()

HTML_QuickForm_Renderer::startGroup() -- Start visiting a group (package developer related)

Description

Called when visiting a group, before processing any group elements

Parameter

object &$group

HTML_QuickForm_group object being visited

boolean $required

Whether a group is required

string $error

An error message associated with a group

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::finishGroup()

HTML_QuickForm_Renderer::finishGroup() -- Finish visiting a group (package developer related)

Description

Called when visiting a group, after processing all group elements

Parameter

object &$group

HTML_QuickForm_group object being visited

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::renderElement()

HTML_QuickForm_Renderer::renderElement() -- Visit an element (package developer related)

Description

Called when visiting an element

Parameter

object &$element

HTML_QuickForm_element object being visited

boolean $required

Whether an element is required

string $error

An error message associated with an element

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::renderHeader()

HTML_QuickForm_Renderer::renderHeader() -- Visit a header (package developer related)

Description

Called when visiting a header element

Parameter

object &$header

HTML_QuickForm_header element being visited

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::renderHidden()

HTML_QuickForm_Renderer::renderHidden() -- Visit a hidden element (package developer related)

Description

Called when visiting a hidden element

Parameter

object &$element

HTML_QuickForm_hidden object being visited

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.

HTML_QuickForm_Renderer::renderHtml()

HTML_QuickForm_Renderer::renderHtml() -- Visit a raw HTML/text element (package developer related)

Description

Called when visiting a raw HTML/text pseudo-element

Implementation of the method: HTML_QuickForm_html elements are used to directly add HTML to the form output. Thus they are useful with the Default renderer, but not with template-based one. Default renderer is currently the only one actually implementing this method, all others silently ignore HTML_QuickForm_html elements.

Parameter

object &$data

HTML_QuickForm_html element being visited

Throws

throws no exceptions thrown

Note

abstract

This function can not be called statically.


HTML_QuickForm_Controller

Table of Contents
Introduction -- What is this package useful for
FAQ -- Understanding package features
Class Summary HTML_QuickForm_Controller -- The class implementing a PageController pattern.
constructor HTML_QuickForm_Controller() -- Class constructor.
Controller::addAction() -- Registers a handler for a specific action.
Controller::addPage() -- Adds a new page to the form
Controller::applyDefaults() -- Sets the default values for the given page
Controller::container() -- Returns a reference to the form's values container.
Controller::exportValue() -- Returns the element's value
Controller::exportValues() -- Returns the form's values
Controller::findInvalid() -- Finds the (first) invalid page
Controller::getActionName() -- Finds the names of the current page and the current action.
Controller::getNextName() -- Returns the name of the page after the given.
Controller::getPage() -- Returns a page
Controller::getPrevName() -- Returns the name of the page before the given.
Controller::handle() -- Handles an action.
Controller::isModal() -- Checks whether the form is modal.
Controller::isValid() -- Checks whether the pages of the controller are valid
Controller::run() -- Processes the request.
Controller::setConstants() -- Initializes constant form values.
Controller::setDefaults() -- Initializes default form values.
Class Summary HTML_QuickForm_Page -- The class represents a page of a multipage form.
constructor HTML_QuickForm_Page() -- Class constructor
Page::addAction() -- Registers a handler for a specific action.
Page::buildForm() -- Builds a form.
Page::getButtonName() -- Returns a name for a submit button that will invoke a specific action.
Page::handle() -- Handles an action.
Page::isFormBuilt() -- Checks whether the form was already built.
Page::loadValues() -- Loads the submit values from the array.
Page::setDefaultAction() -- Sets the default action invoked on page-form submit.
Class Summary HTML_QuickForm_Action -- Class representing an action to perform on HTTP request.
Action::perform() -- Processes the request.
Class Summary HTML_QuickForm_Action_Back -- The action for a 'back' button of wizard-type multipage form.
Class Summary HTML_QuickForm_Action_Direct -- This action allows to go to a specific page of a multipage form.
Class Summary HTML_QuickForm_Action_Display -- This action handles the output of the form.
Class Summary HTML_QuickForm_Action_Jump -- The action handles the HTTP redirect to a specific page.
Class Summary HTML_QuickForm_Action_Next -- The action for a 'next' button of wizard-type multipage form.
Class Summary HTML_QuickForm_Action_Submit -- The action for a 'submit' button.

This is an add-on to HTML_QuickForm package that allows (among other things) to build multipage forms.

Cool features:

  • Includes several default Actions that allow easy building of multipage forms.

  • Includes usage examples for common usage cases (single-page form, wizard, tabbed form).

Introduction

Introduction -- What is this package useful for

Why "Controller"?

This package implements a PageController design pattern, which essentially means that there is a single page processing requests and actions this page performs depend on parameters passed in GET or POST data. The pattern is described in more detail on Martin Fowler's website and WACT project website.

What does this mean in application to QuickForm: we have a single script which shows and validates different forms depending on data in request. This allows to fairly easy build very complex forms consisting of several pages (think wizards and such).

The most basic implementation of the PageController pattern would look like
switch ($_REQUEST['action']) {
    case 'foo': 
        doFoo(); 
        break;
    case 'bar': 
        doBar(); 
        break;
    default:
        echo 'Hello, world!';
}
HTML_QuickForm_Controller is a bit more complex. There are three base classes:

  • HTML_QuickForm_Controller: this class extracts the action name from request and calls the appropriate handler. It includes several Pages.

  • HTML_QuickForm_Page: this class (extending HTML_QuickForm) represents a single page of a form.

  • HTML_QuickForm_Action: this class implements the Command design pattern, i.e. is essentially an OO callback.

The action sent in request consists of a page name and an action name, it defines which Page will process the request (e.g. display or validate the form) and what exactly this Page should do.

Basic usage example

Session initialization: This simple example does not use sessions since there is no need to pass data between pages. You'll need to use sessions when dealing with a real multipage form, though. HTML_QuickForm_Controller does not start a session automatically, you should explicitly call session_start() before instantiating the controller class.

To ease understanding of this package's features, lets take an example form from HTML_QuickForm tutorial and redo it using HTML_QuickForm_Controller:

You may note that the code is more verbose than the original. That is true, but to make a three page wizard-type form you'll only need to create three subclasses of HTML_QuickForm_Page and 'process' event handler based on HTML_QuickForm_Action and add them to Controller, while without the Controller infrastructure it will require a non-trivial amount of programming.

Creating custom pages

You need to subclass HTML_QuickForm_Page and override its buildForm() method. Its contents are pretty self-explanatory (if you are familiar with QuickForm), except for a few things:
$this->_formBuilt = true;
Form building is a "heavy" operation, thus we call buildForm() only when necessary. To prevent calling it twice (and getting two sets of elements instead of one) we set $_formBuilt property.

The second notable line is
$this->addElement('submit', $this->getButtonName('submit'), 'Send');
We use getButtonName() method to set the submit button's name and thus to trigger a 'submit' action when the button is clicked.

The third thing is
$this->setDefaultAction('submit');
The user can submit the form by pressing Enter button, not by clicking on any of the form buttons. Most browsers will not consider any submit button as clicked in this case and will not send its name. setDefaultAction() sets the action (by adding a special hidden element to the form) that will be called in this case.

Creating custom actions

You'll usually need to create handlers for two actions: 'process' and 'display'. While it is difficult to say anything about the former, as only you know how to process your form, for the latter you'll need to subclass HTML_QuickForm_Action_Display and override its _renderForm() method to call the appropriate Renderer and do form output customization.

Tying this all together

Next we instantiate the page class defined above
$page =& new FirstPage('firstForm');
and add our custom action handler to it
$page->addAction('process', new ActionProcess());
the 'process' action will be called by the default 'submit' action handler if the form is valid.

Then we instantiate the controller
$controller =& new HTML_QuickForm_Controller('tutorial');
Note that the name is a required parameter, and if you will have several Controllers in your application they should have different names, as the names are used to store values in sessions.

Then we set the defaults for the form and add the page to it
$controller->setDefaults(array(
    'name' => 'Joe User'
));
$controller->addPage($page);
It is perfectly legal to do call Page's setDefaults() from within buildForm(), but the former approach allows to set the defaults for the form as a whole, while the latter only for the page in question.

Finally we call the Controller's run() method
$controller->run();
which will take care of finding the name of the current action and calling the necessary handler. That's all.

Advanced usage examples

...are available in the package archive. Along with the example similar to the provided above, there are two multipage forms:

  • Wizard: form pages contain 'Next' and 'Back' buttons and you can't go to the next page unless the current page is valid.

  • Tabbed form: form has several pages and buttons allow to go directly to the corresponding page. Form is validated only when the global 'Submit' button is pressed.

FAQ

FAQ -- Understanding package features

Description

This document is based on questions asked on PEAR general mailing list. You are encouraged to search the list archives to find more verbose answers and examples.

How do I change the action attribute of the <form> tag?

The only reason constructor of HTML_QuickForm_Page does not provide a means to set the action attribute is to make it harder to shoot oneself in the foot. That being said, the attribute can still be changed by setAttribute() or updateAttributes() method of HTML_QuickForm_Page (these are inherited from HTML_Common, and you should really consider learning its API).

Meta-question: actions

To avoid confusion lets use the terms "action" for the string containing the name of the action and "action handler" for the subclass of HTML_QuickForm_Action.

Default actions and default action handlers

While you can invent your own action names and create custom handlers for them, you'll most certainly have to deal with the default actions and their handlers first.

Default action names

'display'

This action has a default handler, HTML_QuickForm_Action_Display, which displays the form using the Default renderer. You should subclass this handler if you want to customize the form output. This action is called automatically when the page needs to be displayed and should not be bound to buttons via getButtonName().

'submit'

This action should be bound to a "global" submit button for a form. It can be the "submit" button of a single-page or tabbed multi-page form, "finish" button of a wizard. This action has a default handler, HTML_QuickForm_Action_Submit, which checks whether all the pages of the form are valid, then either calls the 'process' handler or displays the invalid page.

'next'

This action should be bound to the "Next" button of (usually) a modal multipage form (AKA wizard). This action has a default handler, HTML_QuickForm_Action_Next, which checks the validity of the current page and redirects to the next one if the current is valid (or if the form is not modal). On the last page of a modal multipage form this behaves like the default 'submit' handler.

'back'

This action should be bound to the "Back" button of (usually) a modal multipage form (AKA wizard). This action has a default handler, HTML_QuickForm_Action_Back, which redirects to the previous page if one exists. As of QFC 0.9.3, no form validation takes place on 'back' action.

'jump'

This action has a default handler, HTML_QuickForm_Action_Jump, which just makes HTTP redirect to the given page of the form. This action should not be bound to buttons via getButtonName().

'process'

This is the action called by default 'submit' and 'next' (on the last page of the wizard only) handlers after successful (i.e. without validation errors) form submit. This action doesn't have a default handler, you should define the custom one yourself and implement all the necessary logic to process the form's values in it.

There is also a default handler, HTML_QuickForm_Action_Direct, that does not have a default action name. It is used to go to the specific page of the form and should be explicitly added via Page::addAction() or Controller::addAction() with the name of the target page as $actionName and bound to buttons via getButtonName() using the same name.

How to call an action handler?

You should use Page's handle() method:
$page->handle('action');
Controller's handle() method will be called automatically if needed.

How to make a custom action?

Create a subclass of HTML_QuickForm_Action, add the necessary logic to its perform() method. Add it to the Page or to the Controller via addAction() with the appropriate name.

If you intend to bind this action to some button via getButtonName(), you should care about storing values in the container():

  1. Build the form.

  2. Get a reference to container.

  3. Fill the container's ['values'][$pageName] and ['valid'][$pageName] elements.

As usual, see the default action handlers' source for the examples.

Can actions be bound to something other than submit buttons?

Controller is able to properly handle actions bound to <input type="image" /> controls, too. You don't have to do anything special, just set the control's name via getButtonName().

If you want to bind an action to something like a hyperlink, you must consider the following: the form must be submitted to be able to get its values, thus you need to write some javascript that will submit the form and somehow pass the action name to the controller.

How do I reset the form?

Controller keeps the form data and validation status in session in so-called container, accessible via container() method. To reset the form you need to clear this container, which is achieved by passing TRUE to container().

How to pass additional data between pages of the form?

The answer is quite simple: you need to use the container() method of HTML_QuickForm_Controller, like this:
// Note the reference
$data =& $page->controller->container();
$data['_my_stuff'] = $stuff;
On the target page you do
$data =& $page->controller->container();
$stuff = $data['_my_stuff'];
Please use some prefix for your fields or start their names with underscore to prevent possible name conflicts with the future versions of QFC.

Please note that Controller knows nothing about your additional data, so do not expect it to return it via exportValues() method or the like. You'll have to use the container() method and extract the data yourself. However, your data will be deleted when the container is reset.

How to use template-based renderers?

First of all, please understand that HTML_QuickForm_Page is a subclass of HTML_QuickForm, thus everything that applies to the parent class will apply to the child. You are encouraged to read the section about renderers in HTML_QuickForm and the docs to the renderer you are trying to use. The usage examples are available in docs/renderers/ directory of QuickForm distribution.

As was already pointed out, you should subclass the HTML_QuickForm_Action_Display class if you want to customize the form output and add an instance of this subclass as a handler for Page's 'display' action. Its _renderForm() will contain all renderer-specific code.

The only new problem Controller introduces is the buttons bound to specific actions via getButtonName(). If you are using some kind of Dynamic renderer this will not be a problem, as you need not care about the elements names, but you need these names to output the form via Static renderer.

We'll assume using ITStatic renderer but the same can be applied to other Static renderers as well. You basically have 3 options:

  1. Manually add the buttons/placeholders with the names that should be autogenerated via getButtonName() to the form. This is not recommended, as the names should not be of interest to anyone except Controller itself and should not be used directly.

  2. Put the auto-named buttons into group. You can name the group any way you like, just be sure to set $appendName to false. When ITStatic sees {form_element_html} placeholder, it'll assign group's HTML to it.

  3. Call getButtonName() from within template. Add the following to the template
    <input type="submit" value="Bla-bla" name="func_buttonName('action')" ... />
    and the following to the _renderForm() method of your custom HTML_QuickForm_Action_Display subclass
    $tpl->setCallbackFunction('buttonName', array(&$page, 'getButtonName'));
    This code will work with HTML_Template_Sigma, HTML_Template_ITX (note the X) will require some more tweaking.

How to create a wizard with optional pages?

Thanks to Donald Lobo for this contribution.

Lets assume we have a three-page wizard:

  • Page 1 has a control that lets the user choose the next page.

  • Based on input, the user is directed to either page 2A or page 2B.

  • Both page 2A and 2B go to page 3 (this is commonly referred to as a StateMachine in programming books).

You need to create several action handlers based on QFC's default HTML_QuickForm_Action_Next and HTML_QuickForm_Action_Back. You can do this either at the Page level or at the Controller level. The Page level subclassing is simple, but if you have a complex StateMachine you will end up having multiple subclasses.

For the above example, the 'next' action on page 1 sends the 'user' to either page 2 or page 3 based on input. The handler also sets the 'valid' flag of the page that will not be visited.

The 'back' action on pages 2A and 2B sends the user back to page 1, while the 'next' action sends him to page 3.

Finally, the 'back' action handler on page 3 should examine the input on page 1 and send the user to either 2A or 2B.

The working example is available in statemachine.php file.

I use client-side validation. How do I switch it off for 'Back' button?

Client-side validation is called by form's onSubmit handler, if you remove the handler, the validation will not run. Therefore you need to remove it if user clicks on 'Back' button. This can be achieved f.e. by adding the following as the button's onClick handler:
this.form.onsubmit = null; return true;

Class Summary HTML_QuickForm_Controller

Class Summary HTML_QuickForm_Controller -- The class implementing a PageController pattern.

Description

This class keeps track of pages and (default) action handlers for the form, it manages keeping the form values in session, setting defaults and constants for the form as a whole and getting its submit values.

Generally you don't need to subclass this.

Class Trees for HTML_QuickForm_Controller

  • HTML_QuickForm_Controller

constructor HTML_QuickForm_Controller()

constructor HTML_QuickForm_Controller() -- Class constructor.

Description

Sets the form name and modal/non-modal behaviour. Different multipage forms should have different names, as they are used to store form values in session. Modal forms allow passing to the next page only when all of the previous pages are valid.

Parameter

string $name

form name

boolean $modal

whether the form is modal

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::addAction()

Controller::addAction() -- Registers a handler for a specific action.

Description

This handler will be used if the Page that has to handle some action does not have a handler itself.

Parameter

string $actionName

name of the action

object HTML_QuickForm_Action &$action

the handler for the action

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::addPage()

Controller::addPage() -- Adds a new page to the form

Description

This package is not documented yet.

Parameter

object HTML_QuickForm_Page &$page

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::applyDefaults()

Controller::applyDefaults() -- Sets the default values for the given page

Description

This is used to load Page's default and constant values from the container.

Parameter

string $pageName

Name of a page

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::container()

Controller::container() -- Returns a reference to the form's values container.

Description

Session initialization: The package does store the data in session, but it does not start the session automatically. You must call session_start() function yourself before instantiating HTML_QuickForm_Controller.

Returns a reference to a session variable containing the form-page values and pages' validation status. This is a "low-level" method, use exportValues() if you want just to get the form's values.

The structure of the container is the following
array (
    'defaults'  => array(... default form values ...),
    'constants' => array(... constant form values ...),
    'values'    => array(
        'page1' => array(... submitted values for this page ...),
        ...
        'pageN' => array(... submitted values for this page ...)
    ),
    'valid'     => array(
        'page1' => null if the page was never validated, true if valid, false otherwise
        ...
        'pageN' => null if the page was never validated, true if valid, false otherwise
    )
)

Parameter

boolean $reset

If true, then reset the container: clear all default, constant and submitted values

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::exportValue()

Controller::exportValue() -- Returns the element's value

Description

This package is not documented yet.

Parameter

string $pageName

name of the page

string $elementName

name of the element in the page

Return value

returns value for the element

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::exportValues()

Controller::exportValues() -- Returns the form's values

Description

This package is not documented yet.

Parameter

string $pageName

name of the page, if not set then returns values for all pages

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::findInvalid()

Controller::findInvalid() -- Finds the (first) invalid page

Description

This package is not documented yet.

Return value

returns Name of an invalid page

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::getActionName()

Controller::getActionName() -- Finds the names of the current page and the current action.

Description

This method searches the $_REQUEST array for an element with a special name and splits the name into page name and action. If such an element is not found, the first page will be default and 'display' the default action.

Return value

returns first element is page name, second is action name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::getNextName()

Controller::getNextName() -- Returns the name of the page after the given.

Description

This package is not documented yet.

Parameter

string $pageName

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::getPage()

Controller::getPage() -- Returns a page

Synopsis

require_once 'HTML/QuickForm/Controller.php';

object HTML_QuickForm_Page &HTML_QuickForm_Controller::getPage (string $pageName)

Description

This package is not documented yet.

Parameter

string $pageName

Name of a page

Return value

returns A reference to the page

Throws

throws PEAR_Error

Note

This function can not be called statically.

Controller::getPrevName()

Controller::getPrevName() -- Returns the name of the page before the given.

Description

This package is not documented yet.

Parameter

string $pageName

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::handle()

Controller::handle() -- Handles an action.

Description

This will be called if the page itself does not have a handler to a specific action. The method also loads and uses default handlers for common actions, if specific ones were not added.

Parameter

object HTML_QuickForm_Page &$page

The page that failed to handle the action

string $actionName

Name of the action

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::isModal()

Controller::isModal() -- Checks whether the form is modal.

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::isValid()

Controller::isValid() -- Checks whether the pages of the controller are valid

Description

This package is not documented yet.

Parameter

string $pageName

If set, check only the pages before (not including) that page

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::run()

Controller::run() -- Processes the request.

Description

This finds the current page, the current action and passes the action to the page's handle() method.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::setConstants()

Controller::setConstants() -- Initializes constant form values.

Description

These values won't get overridden by POST or GET vars

Parameter

array $constantValues

constant values

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Controller::setDefaults()

Controller::setDefaults() -- Initializes default form values.

Description

This package is not documented yet.

Parameter

array $defaultValues

default values

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_Page

Class Summary HTML_QuickForm_Page -- The class represents a page of a multipage form.

Description

Generally you'll need to subclass this and define your buildForm() method that will build the form. While it is also possible to instantiate this class and build the form manually, this is not the recommended way.

Class Trees for HTML_QuickForm_Page

  • HTML_QuickForm

    • HTML_QuickForm_Page

constructor HTML_QuickForm_Page()

constructor HTML_QuickForm_Page() -- Class constructor

Description

Note that unlike constructor of HTML_QuickForm there is no $action, as the form is always submitted to the current page. Note also that $formName is not optional.

Parameter

string $formName

Form's name

string $method

Form's method

string $target

Form's target

mixed $attributes

Extra attributes for <form> tag

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::addAction()

Page::addAction() -- Registers a handler for a specific action.

Description

This package is not documented yet.

Parameter

string $actionName

name of the action

object HTML_QuickForm_Action &$action

the handler for the action

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::buildForm()

Page::buildForm() -- Builds a form.

Description

Builds a form. You should override this method when you subclass HTML_QuickForm_Page, it should contain all the necessary addElement(), applyFilter(), addRule() and possibly setDefaults() and setConstants() calls. The method will be called on demand, so please be sure to set $_formBuilt property to TRUE to assure that the method works only once.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::getButtonName()

Page::getButtonName() -- Returns a name for a submit button that will invoke a specific action.

Description

Returns a name for a submit button (or an <input type="image"> control) that will invoke a specific action. This means the following: if you do
$this->addElement('submit', $this->getButtonName('foo'), 'Foo');
inside the buildForm() method and the user later uses this button to submit the form, then the 'foo' handler (added via addAction() will be called.

Parameter

string $actionName

Name of the action

Return value

returns "name" attribute for a submit button

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::handle()

Page::handle() -- Handles an action.

Description

This method simply calls the perform() method of an Action object registered for this action name. If an Action object for it was not registered here, controller's handle() method will be called.

Parameter

string $actionName

Name of the action

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::isFormBuilt()

Page::isFormBuilt() -- Checks whether the form was already built.

Description

This is used to check whether it is necessary to call buildForm() or not.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::loadValues()

Page::loadValues() -- Loads the submit values from the array.

Description

The method is NOT intended for general usage. It should be used to assign form values from the container instead of from actual request data.

Parameter

array $values

'submit' values

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Page::setDefaultAction()

Page::setDefaultAction() -- Sets the default action invoked on page-form submit.

Description

This is necessary as the user may just press Enter instead of clicking one of the named submit buttons and then no action name will be passed to the script.

This method adds a special hidden element to the form the contents of which will be used by Controller if no action name is found in the submitted values.

Parameter

string $actionName

default action name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_Action

Class Summary HTML_QuickForm_Action -- Class representing an action to perform on HTTP request.

Description

The Controller will select the appropriate Action to call on the request and call its perform() method. The subclasses of this class should implement all the necessary business logic.

The default action handlers are described in the FAQ section.

Action::perform()

Action::perform() -- Processes the request.

Description

This method should be overriden by child classes to provide the necessary logic.

Parameter

object HTML_QuickForm_Page &$page

the current form-page

string $actionName

Current action name, as one Action object can serve multiple actions

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTML_QuickForm_Action_Back

Class Summary HTML_QuickForm_Action_Back -- The action for a 'back' button of wizard-type multipage form.

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_Action_Back

Class Summary HTML_QuickForm_Action_Direct

Class Summary HTML_QuickForm_Action_Direct -- This action allows to go to a specific page of a multipage form.

Description

Please note that the name for this action in addAction() should NOT be 'direct', but the name of the page you wish to go to.

Class Trees for HTML_QuickForm_Action_Direct

Class Summary HTML_QuickForm_Action_Display

Class Summary HTML_QuickForm_Action_Display -- This action handles the output of the form.

Description

If you want to customize the form display, subclass this class and override the _renderForm() method, you don't need to change the perform() method itself.

Class Trees for HTML_QuickForm_Action_Display

Class Summary HTML_QuickForm_Action_Jump

Class Summary HTML_QuickForm_Action_Jump -- The action handles the HTTP redirect to a specific page.

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_Action_Jump

Class Summary HTML_QuickForm_Action_Next

Class Summary HTML_QuickForm_Action_Next -- The action for a 'next' button of wizard-type multipage form.

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_Action_Next

Class Summary HTML_QuickForm_Action_Submit

Class Summary HTML_QuickForm_Action_Submit -- The action for a 'submit' button.

Description

This package is not documented yet.

Class Trees for HTML_QuickForm_Action_Submit


HTML_QuickForm_Renderer_Tableless

Replacement for the default renderer of HTML_QuickForm that uses only XHTML and CSS but no table tags, and generates fully valid XHTML output.


Introduction

Table of Contents
Introduction --  Introduction to HTML_QuickForm_Renderer_Tableless
FAQ -- Answers to most Frequently Asked Questions

Introduction

Introduction --  Introduction to HTML_QuickForm_Renderer_Tableless

Overview

HTML_QuickForm_Renderer_Tableless is a replacement of the default renderer of HTML_QuickForm. It has two main goals:

Accessibility: Because of the abandonment of table tags and the addition of for attributes to the label tags and id attributes to the form elements, the generated output provides good accessibility. Challenged person might use screen readers, and unhindered persons benefit from the possibility to click on the labels to set the focus to the belonging form element.

Validity: The generated output of the renderer is fully XHTML 1.1 valid.

Usage

To use this renderer, you just need to copy (and modify if you want) the stylesheet and do something like this:

require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/Renderer/Tableless.php';

$form =& new HTML_QuickForm();
$renderer =& new HTML_QuickForm_Renderer_Tableless();

// usual code, e.g. new form fields, rules, ...

$form->accept($renderer);
echo $renderer->toHtml();

For full XHTML validity, you need to add the following line to your code:

$form->removeAttribute('name');

FAQ

FAQ -- Answers to most Frequently Asked Questions

Description

This document is based on questions asked on PEAR general mailing list and other mailing lists and forums.

HTML_QuickForm_Renderer_Tableless FAQ

1. The div tag in the element template is broken, a closing quote mark is missing! Can you please fix this?
2. Why are the hidden form elements put into a div with style display: none?
3. The layout of the forms is broken in Windows Internet Explorer 7. Is there a solution for this problem?
4. The layout of the forms is broken in Firefox 1.x. Is there a solution for this problem?
5. How can I add explainations next to or after form fields with the renderer?
6. I'm having problems with the layout, the form and/or the other contents of my page are misplaced. How can I fix these problems?
7. When I use the tableless renderer together with HTML_QuickForm_Controller, I still see tables. What am I doing wrong?

1. The div tag in the element template is broken, a closing quote mark is missing! Can you please fix this?

No, it is not missing and there is no need to fix the element template.

HTML_QuickForm_Renderer_Tableless requires that HTML_QuickForm >= 3.2.6 is installed. Previous versions don't work correctly for element templates that have two error blocks.

Please use the PEAR installer to avoid such problems in the future. The installer takes care of the dependencies between packages.

2. Why are the hidden form elements put into a div with style display: none?

This might sound funny because a hidden element is obviously already hidden, but the simple reason for this is the XHTML validity.

XHTML allows input elements only within block elements. And as form is not a block element, but div is a block element, this trick is used to make the output XHTML valid.

3. The layout of the forms is broken in Windows Internet Explorer 7. Is there a solution for this problem?

Release 0.4.3 contains a fix for this problem. The solution is to remove the "height: 1px;" style from "form fieldset li" block in the stylesheet.

Warning: This breaks layout compatibility with Firefox 1.x browsers (Firefox 2.0 still works as expected). The next question contains a solution for Firefox 1.x compatibility.

4. The layout of the forms is broken in Firefox 1.x. Is there a solution for this problem?

You need to add a "float: left;" style to the "form fieldset li" block in the stylesheet. In addition, you need to add the following two blocks to your stylesheet:

* html form fieldset li {
    float: none;
}
*+html form fieldset li {
    float: none;
}

If you don't need compatibility with Windows Internet Explorer 7, you don't need the mentioned CSS hacks, but can just (re-)add the "height: 1px;" style to the "form fieldset li" block in the stylesheet.

5. How can I add explainations next to or after form fields with the renderer?

6. I'm having problems with the layout, the form and/or the other contents of my page are misplaced. How can I fix these problems?

Such problems are most likely caused by the style of the fieldsets. You can try two possible solutions.

At first, you can try to add

overflow: hidden;

to the "form fieldset" block.

If this does not solve the problems, then try to remove the following two styles from the "form fieldset" block.

clear: both;
float: left;

7. When I use the tableless renderer together with HTML_QuickForm_Controller, I still see tables. What am I doing wrong?

You have to tell HTML_QuickForm_Controller about the usage of another renderer. A short tutorial is available: Using the tableless renderer together with HTML_QuickForm_Controller


Important methods

Table of Contents
HTML_QuickForm_Renderer_Tableless::addStopFieldsetElements() -- Adds one or more element names that indicate the end of a fieldset (a new one will be opened when a the next header element occurs)
HTML_QuickForm_Renderer_Tableless::clearAllTemplates() -- Clears all the HTML out of the templates that surround notes, elements, etc.
HTML_QuickForm_Renderer_Tableless::setElementTemplate() -- Sets element template
HTML_QuickForm_Renderer_Tableless::setCloseFieldsetTemplate() -- Sets the template used when closing a fieldset
HTML_QuickForm_Renderer_Tableless::setFormTemplate() -- Sets form template
HTML_QuickForm_Renderer_Tableless::setGroupElementTemplate() -- Sets element template for elements within a group
HTML_QuickForm_Renderer_Tableless::setGroupTemplate() -- Sets template for a group wrapper
HTML_QuickForm_Renderer_Tableless::setHeaderTemplate() -- Sets header template
HTML_QuickForm_Renderer_Tableless::setOpenFieldsetTemplate() -- Sets the template used when opening a fieldset
HTML_QuickForm_Renderer_Tableless::setOpenHiddenFieldsetTemplate() -- Sets the template used when opening a hidden fieldset (i.e. a fieldset that is opened when there is no header element)
HTML_QuickForm_Renderer_Tableless::setRequiredNoteTemplate() -- Sets the note indicating required fields template
HTML_QuickForm_Renderer_Tableless::toHtml() -- returns the HTML generated for the form

HTML_QuickForm_Renderer_Tableless::addStopFieldsetElements()

HTML_QuickForm_Renderer_Tableless::addStopFieldsetElements() -- Adds one or more element names that indicate the end of a fieldset (a new one will be opened when a the next header element occurs)

Description

Adds one or more element names that indicate the end of a fieldset (a new one will be opened when the next header element occurs).

If a class name is given, it will be added to each (hidden) fieldset that is generated before each of the specified element. For example, if you specify an array with five element names, all five fieldsets with get this additional class name.

Parameter

mixed $element

Element name(s) (as array or string)

string $class

(optional) Class name for the fieldset(s)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::clearAllTemplates()

HTML_QuickForm_Renderer_Tableless::clearAllTemplates() -- Clears all the HTML out of the templates that surround notes, elements, etc.

Description

Useful when you want to use addData() to create a completely custom form look

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setElementTemplate()

HTML_QuickForm_Renderer_Tableless::setElementTemplate() -- Sets element template

Description

Sets the template for elements.

Parameter

string $html

The HTML surrounding an element

mixed $element

(optional) Name(s) of the element to apply template for (either single element name as string or multiple element names as an array)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setCloseFieldsetTemplate()

HTML_QuickForm_Renderer_Tableless::setCloseFieldsetTemplate() -- Sets the template used when closing a fieldset

Description

Sets the template used when closing a fieldset.

Parameter

string $html

The HTML used when closing a fieldset

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setFormTemplate()

HTML_QuickForm_Renderer_Tableless::setFormTemplate() -- Sets form template

Description

Sets the form template.

Parameter

string $html

The HTML surrounding the form tags

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setGroupElementTemplate()

HTML_QuickForm_Renderer_Tableless::setGroupElementTemplate() -- Sets element template for elements within a group

Description

Sets element template for elements within a group.

Parameter

string $html

The HTML surrounding an element

string $group

Name of the group to apply template for

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setGroupTemplate()

HTML_QuickForm_Renderer_Tableless::setGroupTemplate() -- Sets template for a group wrapper

Description

This template is contained within a group-as-element template set via setTemplate() and contains group's element templates, set via setGroupElementTemplate()

Parameter

string $html

The HTML surrounding group elements

string $group

Name of the group to apply template for

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setHeaderTemplate()

HTML_QuickForm_Renderer_Tableless::setHeaderTemplate() -- Sets header template

Description

Sets the header template.

Parameter

string $html

The HTML surrounding the header

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setOpenFieldsetTemplate()

HTML_QuickForm_Renderer_Tableless::setOpenFieldsetTemplate() -- Sets the template used when opening a fieldset

Description

Sets the template used when opening a fieldset.

Parameter

string $html

The HTML used when opening a fieldset

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setOpenHiddenFieldsetTemplate()

HTML_QuickForm_Renderer_Tableless::setOpenHiddenFieldsetTemplate() -- Sets the template used when opening a hidden fieldset (i.e. a fieldset that is opened when there is no header element)

Description

Sets the template used when opening a hidden fieldset (i.e. a fieldset that is opened when there is no header element).

Parameter

string $html

The HTML used when opening a hidden fieldset

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::setRequiredNoteTemplate()

HTML_QuickForm_Renderer_Tableless::setRequiredNoteTemplate() -- Sets the note indicating required fields template

Description

Sets the note indicating required fields template.

Parameter

string $html

The HTML surrounding the required note

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTML_QuickForm_Renderer_Tableless::toHtml()

HTML_QuickForm_Renderer_Tableless::toHtml() -- returns the HTML generated for the form

Description

Returns the HTML generated for the form.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


HTML_QuickForm_DHTMLRulesTableless

HTML_QuickForm_DHTMLRulesTableless is a DHTML replacement for the standard JavaScript alert window for client-side validation of forms built with HTML_QuickForm when using the HTML_QuickForm_Renderer_Tableless renderer.

In addition to the standard behaviour of HTML_QuickForm (i.e. showing the errors from client-side validation on the "onSubmit" event), this package can also show the errors on the "onBlur" and "onChange" events (see below for information on how to enable this).


Usage

To use this package you just need to do something like this:

require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/DHTMLRulesTableless.php';
require_once 'HTML/QuickForm/Renderer/Tableless.php';

$form = new HTML_QuickForm_DHTMLRulesTableless(...);
$renderer = new HTML_QuickForm_Renderer_Tableless();

// usual code, e.g. new form fields, rules, ...

$form->accept($renderer);
echo $renderer->toHtml();

As already said for the tableless renderer, you need to add the following line to your code to get full XHTML validity:

$form->removeAttribute('name');

To enable validation on "onBlur" and "onChange" events, you need to add the following line before the $form->accept($renderer); call:

$form->getValidationScript();

HTML_QuickForm_advmultiselect

Table of Contents
Introduction -- A feature overview

Element for HTML_QuickForm that emulate a multi-select.

Introduction

Introduction -- A feature overview

Description

HTML_QuickForm_advmultiselect (qfams) is designed as custom QuickForm element to emulates via two select boxes a select box that allows selecting of multiple options.

Features

  • ability to double click on either select box to move elements from one side to the other

  • added headers to the select boxes

  • ability to change layout easily, using CSS classes and a mini template

  • allows to change item size shown of each multiple select box

  • JavaScript functions can be renamed to avoid conflict with others scripts on the same page

  • ability to manage one single list with checkboxes to solve problem if javascript is unavailable

  • ability to sort lists (by programming, or user-end handling)

  • display live counter (selected/unselected items count) Available since version 1.3.0

External support resources


HTML_Table

Table of Contents
Introduction -- Creating an HTML-Table
FAQ -- Answers to most Frequently Asked Questions
Constructor HTML_Table::HTML_Table() -- Constructor
HTML_Table::addBody() -- Add body
HTML_Table::addCol() -- Add column
HTML_Table::addRow() -- Add row
HTML_Table::altRowAttributes() -- Alternate row attributes
HTML_Table::apiVersion() -- Return API version (DEPRECATED)
HTML_Table::display() -- Output HTML code
HTML_Table::getAutoFill() -- Return autoFill value
HTML_Table::getAutoGrow() -- Return autoGrow flag
HTML_Table::getBody() -- Return the table object for the tbody group
HTML_Table::getCellAttributes() -- Return cell attributes
HTML_Table::getCellContents() -- Return cell content
HTML_Table::getColCount() -- Return numbers of column
HTML_Table::getFooter() -- Return the table object for the tfoot group
HTML_Table::getHeader() -- Return the table object for the thead group
HTML_Table::getRowAttributes() -- Return row attributes
HTML_Table::getRowCount() -- Return number of rows
HTML_Table::setAllAttributes() -- Set attributes for all cells
HTML_Table::setAutoGrow() -- Set autoGrow flag
HTML_Table::setAutoFill() -- Set autoFill value
HTML_Table::setCaption() -- Set table caption
HTML_Table::setCellAttributes() -- Set cell attributes
HTML_Table::setCellContents() -- Set cell content
HTML_Table::setColAttributes() -- Set column attributes
HTML_Table::setColCount() -- Set number of columns
HTML_Table::setColGroup() -- Set a colgroup
HTML_Table::setColType() -- Set column type
HTML_Table::setHeaderContents() -- Set content of header cell
HTML_Table::setRowCount() -- Set row number
HTML_Table::setRowType() -- Set row type
HTML_Table::setRowAttributes() -- Set row attributes
HTML_Table::toHtml() -- Return HTML code
HTML_Table::updateAllAttributes() -- Update attributes of all cells
HTML_Table::updateCellAttributes() -- Update cell attributes
HTML_Table::updateColAttributes() -- Update column attributes
HTML_Table::updateRowAttributes() -- Update row attributes

API to create HTML tables

Introduction

Introduction -- Creating an HTML-Table

What is HTML_Table?

HTML_Table offers an interface for create a HTML table. You can work with the table like a spreadsheet. Instead of working with HTML code and linear adding of cells, you can address and fill cells independend of there position. There is no different, whether you start with fill a cell at the beginning, in the middle or at the end of the table, a row or a column.

The autoGrow and autoFill value

The autoGrow flag

Normaly, you would define a table with a constant number of rows and columns. But sometimes, you does not know, how many rows or columns you need: ie. transforming user input or the result of a database query to an HTML table.

In this case, you should enable the autoGrow feature. In this mode, HTML_Table adds new rows or columns automatically, if you use a cell address located in a not existing row or column.

The autoFill value

If you create a table of data, sometimes you have not to fill all cells with different values. Perhaps you do not know the value for a cell, or you want to insert a default value - ie. retrieving data about users. Not every user has a mobile, a email address etc., in this case, an "n/a" should be inserted into that specific cell.

So, simply define "n/a" as autoFill value and fill only the cells where data exist. You need not to fill every cell; unfilled cells contain automatically an "n/a".

Creating a table

The demonstation data

Our HTML table to create should contain the following data:
$data = array(
 '0' => array('Bakken', 'Stig', '', 'stig@example.com'),
 '1' => array('Merz', 'Alexander', 'alex.example.com', 'alex@example.com'),
 '2' => array('Daniel', 'Adam', '', '')
);

Start

Let us now start by creating a new instance of HTML_Table. The table should be 600 pixel wide. We do not know the quantity of the data to insert into the table - so we enable the autoGrow feature. Unfilled cells should contain an "n/a".
require_once 'HTML/Table.php';

$attrs = array('width' => '600');
$table = new HTML_Table($attrs);
$table->setAutoGrow(true);
$table->setAutoFill('n/a');
Setting table attributes is also possible by using the setAttributes() method. Therefore, the example from above can also be written as:
require_once 'HTML/Table.php';

$attrs = array('width' => '600');
$table = new HTML_Table();
$table->setAttributes($attrs);
// [...]

Add data rows

Now process every data entry. Here we use also the alternate feature of HTML_Table. Every second row will be colored red.
for ($nr = 0; $nr < count($data); $nr++) {
  $table->setHeaderContents($nr+1, 0, (string)$nr);
  for ($i = 0; $i < 4; $i++) {
    if ('' != $data[$nr][$i]) {
      $table->setCellContents($nr+1, $i+1, $data[$nr][$i]);
    }
  }
}
$altRow = array('bgcolor' => 'red');
$table->altRowAttributes(1, null, $altRow);

Add header cells

Now we want to define the cells in the first row and column as header cells. It should looks like a spreadsheet application, so we want to use the color "silver" as the background colour for each header cell. The first row contains a column headline, the first column the number of the data set row.
$table->setHeaderContents(0, 0, '');
$table->setHeaderContents(0, 1, 'Surname');
$table->setHeaderContents(0, 2, 'Name');
$table->setHeaderContents(0, 3, 'Website');
$table->setHeaderContents(0, 4, 'EMail');
$hrAttrs = array('bgcolor' => 'silver');
$table->setRowAttributes(0, $hrAttrs, true);
$table->setColAttributes(0, $hrAttrs);

Print the table

It is done! Our table is finished, now we can output the table as HTML code.
echo $table->toHtml();
The output will look like this:
<table width="600">
  <tr>
    <th bgcolor="silver">&nbsp;</th>
    <th bgcolor="silver">Surname</th>
    <th bgcolor="silver">Name</th>
    <th bgcolor="silver">Website</th>
    <th bgcolor="silver">EMail</th>
  </tr>
  <tr>
    <th bgcolor="silver">0</th>
    <td>Bakken</td>
    <td>Stig</td>
    <td>n/a</td>
    <td>stig@example.com</td>
  </tr>
  <tr>
    <th bgcolor="silver">1</th>
    <td bgcolor="red">Merz</td>
    <td bgcolor="red">Alexander</td>
    <td bgcolor="red">alex.example.com</td>
    <td bgcolor="red">alex@example.com</td>
  </tr>
  <tr>
    <th bgcolor="silver">2</th>
    <td>Daniel</td>
    <td>Adam</td>
    <td>n/a</td>
    <td>n/a</td>
  </tr>
</table>

Using thead, tfoot and tbody

If you want to divide your tables into thead, tfoot and tbody groups, you need to get table objects using getHeader(), getFooter(), and getBody(), which you can then use like the normal table object.
$table = new HTML_Table();
$head =& $table->getHeader();
$foot =& $table->getFooter();
$body =& $table->getBody();
$head->setCellContents(...);
$body->setCellContents(...);
echo $table->toHtml();
In this example, there is no content set for the tfoot group. Therefore, only thead and tbody will be rendered.

Note: The rendering order is thead, then tfoot and as the last group tbody. This is not a bug but intended behaviour because that's the way it is defined in the (X)HTML Standard.

Since release 1.8.0 getBody() and several other methods like setCellAttributes() accept an optional numeric parameter $body that allows you to generate multiple tbody groups in your table. A new group can be generated by using addBody() or, if the autoGrow feature is enabled, by using a new number in one of the mentioned method calls.

FAQ

FAQ -- Answers to most Frequently Asked Questions

Description

This document is based on questions asked on PEAR general mailing list and other mailing lists and forums.

HTML_Table FAQ

1. How can I add attributes to the thead, tfoot or tbody tags?
2. How can I set attributes for the table tag?
3. How can I easily add JavaScript sorting facilities to my tables?

1. How can I add attributes to the thead, tfoot or tbody tags?

Here is an example on how to set the attribute string id="header" for the thead tag. For the other two tags the procedure is similar.

$table = new HTML_Table();
// [...]
$thead =& $table->getHeader();
$thead->setAttributes(array('id' => 'header'));
// [...]
$table->display();

This would give the following result:

<table>
  <thead id="header">
    [...]
  </thead>
  [...]
</table>

2. How can I set attributes for the table tag?

Besides the possibility to pass attributes to the HTML_Table constructor, there are several more methods that can be used.

HTML_Table extends HTML_Common which offers methods like setAttributes() or updateAttributes(). A complete list of methods provided by HTML_Common can be found in its API documentation.

3. How can I easily add JavaScript sorting facilities to my tables?

Stuart Langridge has developed the SortTable JavaScript class that allows adding of sorting facilities to tables very easily. Another class for this purpose is Standardista Table Sorting.

Constructor HTML_Table::HTML_Table()

Constructor HTML_Table::HTML_Table() -- Constructor

Description

Class constructor

Parameter

  • array $attributes - Associative array of table tag attributes

  • integer $tabOffset - Tab offset of the table

  • boolean $useTGroups - Whether to use the thead, tfoot and tbody groups or not

Note

This function can not be called statically.

HTML_Table::addBody()

HTML_Table::addBody() -- Add body

Description

Adds a new body to the table and returns the body identifier

Parameter

  • array $attributes - Associative array of tbody tag attributes

Return value

int - the body identifier

Note

This function can not be called statically.

HTML_Table::addCol()

HTML_Table::addCol() -- Add column

Description

Adds a table column and returns the column identifier

Parameter

  • array $contents - Must be an indexed array of valid cell contents.

  • mixed $attributes - Associative array or string of table row attributes

  • string $type - Cell type either 'th' or 'td'

  • int $body - The number of the tbody group that should be used

Return value

int - the identifier for the column

Note

This function can not be called statically.

HTML_Table::addRow()

HTML_Table::addRow() -- Add row

Description

Adds a table row and returns the row identifier

Parameter

  • array $contents - Must be an indexed array of valid cell contents

  • mixed $attributes - Associative array or string of table row attributes. This can also be an array of attributes, in which case the attributes will be repeated in a loop.

  • string $type - Cell type either 'th' or 'td'

  • boolean $inTR - FALSE, if attributes are to be applied in TD tags; TRUE, if attributes are to be applied in TR tag

  • int $body - The number of the tbody group that should be used

Return value

int - the row identifier

Note

This function can not be called statically.

HTML_Table::altRowAttributes()

HTML_Table::altRowAttributes() -- Alternate row attributes

Description

Alternates the row attributes starting at $start

Parameter

  • int $start - Row index of row in which alternating begins

  • mixed $attributes1 - Associative array or string of table row attributes

  • mixed $attributes2 - Associative array or string of table row attributes

  • boolean $inTR - FALSE, if attributes are to be applied in td tags; TRUE, if attributes are to be applied in tr tag.

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::apiVersion()

HTML_Table::apiVersion() -- Return API version (DEPRECATED)

Description

DEPRECATED: Returns the API version of HTML_Table

Return value

double - the version number

Note

This function can not be called statically.

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

HTML_Table::display()

HTML_Table::display() -- Output HTML code

Description

Outputs the table structure as HTML

Note

This function can not be called statically.

HTML_Table::getAutoFill()

HTML_Table::getAutoFill() -- Return autoFill value

Description

Returns the autoFill value

Parameter

  • int $body - The number of the tbody group that should be used

Return value

mixed - the value, which will be inserted into empty cells

Note

This function can not be called statically.

HTML_Table::getAutoGrow()

HTML_Table::getAutoGrow() -- Return autoGrow flag

Description

Returns the value of the autoGrow flag. If a value into an cell, which not exists, HTML_Table will automatically add a necessary row or column, if the flag is TRUE.

Parameter

  • int $body - The number of the tbody group that should be used

Return value

boolean - the flag state

Note

This function can not be called statically.

HTML_Table::getBody()

HTML_Table::getBody() -- Return the table object for the tbody group

Description

Returns the table object for a tbody group

Parameter

  • int $body - The number of the tbody group that should be used

Return value

object - the table object for a tbody group

Note

This function can not be called statically.

HTML_Table::getCellAttributes()

HTML_Table::getCellAttributes() -- Return cell attributes

Description

Returns the attributes for a given cell

Parameter

  • int $row - Row index

  • int $col - Column index

  • int $body - The number of the tbody group that should be used

Return value

array - the attributes of the specific cell

Note

This function can not be called statically.

HTML_Table::getCellContents()

HTML_Table::getCellContents() -- Return cell content

Description

Returns the content of an existing cell

Parameter

  • int $row - Row index

  • int $col - Column index

  • int $body - The number of the tbody group that should be used

Return value

mixed - the content of the specified cell

Note

This function can not be called statically.

HTML_Table::getColCount()

HTML_Table::getColCount() -- Return numbers of column

Description

Returns the number of columns in the table

Parameter

  • int $row - The row number to serve for cols count

  • int $body - The number of the tbody group that should be used

Return value

int - number of columns

Note

This function can not be called statically.

HTML_Table::getFooter()

HTML_Table::getFooter() -- Return the table object for the tfoot group

Description

Returns the table object for the tfoot group

If the usage of the thead, tfoot and tbody groups was not activated via the third parameter of the constructor, the grouping will be activated automatically when calling this function.

Return value

object - the table object for the tfoot group

Note

This function can not be called statically.

HTML_Table::getHeader()

HTML_Table::getHeader() -- Return the table object for the thead group

Description

Returns the table object for the thead group

If the usage of the thead, tfoot and tbody groups was not activated via the third parameter of the constructor, the grouping will be activated automatically when calling this function.

Return value

object - the table object for the thead group

Note

This function can not be called statically.

HTML_Table::getRowAttributes()

HTML_Table::getRowAttributes() -- Return row attributes

Description

Returns the attributes for a given row as contained in the tr tag

Parameter

  • int $row - Row index

  • int $body - The number of the tbody group that should be used

Return value

array - the attributes of the row

Note

This function can not be called statically.

HTML_Table::getRowCount()

HTML_Table::getRowCount() -- Return number of rows

Description

Returns the number of rows in the table

Parameter

  • int $body - The number of the tbody group that should be used

Return value

int - number of rows

Note

This function can not be called statically.

HTML_Table::setAllAttributes()

HTML_Table::setAllAttributes() -- Set attributes for all cells

Description

Sets the attributes for all cells

Parameter

  • mixed $attributes - Associative array or string of table cell attributes

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::setAutoGrow()

HTML_Table::setAutoGrow() -- Set autoGrow flag

Description

If this flag is set to TRUE, HTML_Table will automatically add new rows or columns when you insert a value into a non-existing cell.

Parameter

  • bool $grow - TRUE to automatically grow

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::setAutoFill()

HTML_Table::setAutoFill() -- Set autoFill value

Description

The autoFill value will be insert into every cell not filled.

Parameter

  • mixed $fill - standard value for empty cells

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::setCaption()

HTML_Table::setCaption() -- Set table caption

Description

Sets the caption of a table. This does not refer to the <th>-tag. The <caption>-tag defines a headline for the whole table.

Parameter

  • string $caption - the caption string

  • mixed $attributes - Associative array or string of caption attributes

Note

This function can not be called statically.

HTML_Table::setCellAttributes()

HTML_Table::setCellAttributes() -- Set cell attributes

Description

Sets the cell attributes for an existing cell. If the given indices do not exist and autoGrow is TRUE then the given row and/or column is automatically added. If autoGrow is FALSE, an error is returned.

Parameter

  • int $row - Row index

  • int $col - Column index

  • mixed $attributes - Associative array or string of table cell attributes

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::setCellContents()

HTML_Table::setCellContents() -- Set cell content

Description

Sets the cell contents for an existing cell. If the given indices do not exist and autoGrow is TRUE then the given row and/or column is automatically added. If autoGrow is FALSE, then an error is returned.

Parameter

  • int $row - Row index

  • int $col - Column index

  • mixed $contents - May contain HTML or any object with a toHTML() method

  • string $type - Cell type either 'th' or 'td'

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::setColAttributes()

HTML_Table::setColAttributes() -- Set column attributes

Description

Sets the column attributes for an existing column

Parameter

  • int $col - Column index

  • mixed $attributes - Associative array or string of table column attributes

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::setColCount()

HTML_Table::setColCount() -- Set number of columns

Description

Sets the number of columns in the table

Parameter

  • int $cols - number of columns to create

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::setColGroup()

HTML_Table::setColGroup() -- Set a colgroup

Description

Allows to add a colgroup (with attributes)

Parameter

  • mixed $colgroup - Empty string, string with attributes or an associative array of attributes for the columns

  • mixed $attributes - Associative array or string of colgroup attributes

Note

This function can not be called statically.

HTML_Table::setColType()

HTML_Table::setColType() -- Set column type

Description

Sets the type of a column to 'th' or 'td'

Parameter

  • int $col - Column index

  • string $type - th or td

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::setHeaderContents()

HTML_Table::setHeaderContents() -- Set content of header cell

Description

Defines the specified cell as a header cell and sets the content

Parameter

  • int $row - row index

  • int $col - column index

  • mixed $contents - cell content

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::setRowCount()

HTML_Table::setRowCount() -- Set row number

Description

Sets the number of rows in the table

Parameter

  • int $rows - number of rows to create

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::setRowType()

HTML_Table::setRowType() -- Set row type

Description

Sets the type of a row to 'th' or 'td'

Parameter

  • int $row - Row index

  • string $type - 'th' or 'td'

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::setRowAttributes()

HTML_Table::setRowAttributes() -- Set row attributes

Description

Sets the attributes for an existing row

Parameter

  • int $row - Row index

  • mixed $attributes - Associative array or string of table row attributes. This can also be an array of attributes, in which case the attributes will be repeated in a loop.

  • boolean $inTR - FALSE, if attributes are to be applied in td tags; TRUE, if attributes are to be applied in tr tag

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::toHtml()

HTML_Table::toHtml() -- Return HTML code

Description

Returns the table structure as HTML

Return value

string - the generated HTML code

Note

This function can not be called statically.

HTML_Table::updateAllAttributes()

HTML_Table::updateAllAttributes() -- Update attributes of all cells

Description

Updates the attributes for all cells.

Parameter

  • mixed $attributes - Associative array or string of table row attributes

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::updateCellAttributes()

HTML_Table::updateCellAttributes() -- Update cell attributes

Description

Updates the cell attributes passed but leaves other existing attributes intact

Parameter

  • int $row - Row index

  • int $col - Column index

  • mixed $attributes - Associative array or string of table row attributes

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.

HTML_Table::updateColAttributes()

HTML_Table::updateColAttributes() -- Update column attributes

Description

Updates the column attributes for an existing column

Parameter

  • int $col - Column index

  • mixed $attributes - Associative array or string of table row attributes

  • int $body - The number of the tbody group that should be used. NULL indicates that all groups should be used.

Note

This function can not be called statically.

HTML_Table::updateRowAttributes()

HTML_Table::updateRowAttributes() -- Update row attributes

Description

Updates the row attributes for an existing row

Parameter

  • int $row - Row index

  • mixed $attributes - Associative array or string of table row attributes

  • boolean $inTR - FALSE if attributes are to be applied in td tags; TRUE, if attributes are to be applied in tr tag.

  • int $body - The number of the tbody group that should be used

Note

This function can not be called statically.


HTML_TagCloud

Table of Contents
Introduction -- Introduction to HTML_TagCloud.
Usage examples -- Using HTML_TagCloud.

Create and display defined "tags" (words) in a "tag cloud".

Introduction

Introduction -- Introduction to HTML_TagCloud.

Overview

This package can be used to generate tag coulds in HTML and CSS. A tag cloud is an visual representation of list of so-called "tags" or keywords, that do have a different font size depending on how often they occur on the page/blog.

More information on tag clouds is available in Wikipedia.

This package does not only visualize frequency, but also timeline infomation. The newer the tag is, the deeper its color will be; older tags will have a lighter color.

Usage examples

Usage examples -- Using HTML_TagCloud.

Generate HTML and CSS separately

HTML_TagCloud creates HTML and CSS. The HTML is a simple list, decorated by CSS. You are able to output HTML and CSS separately.

The HTML output depends on the tag data that have been added via addElement(), but the CSS output is static. You can use this package's CSS output statically.

Omit timeline feature

If you don't want to add timeline information and have the color changing accordingly, just omit the fourth parameter to addElement(). When doing this, the current time is set.


HTML_Template_Flexy

Table of Contents
Introduction --  What HTML_Template_Flexy can do
Configuration Options --  Setting the defaults for HTML_Template_Flexy
new HTML_Template_Flexy -- constructor
$flexy->compile() -- Converts a template from markup to PHP if required
$flexy->outputObject() -- Merges a controller object with the template and outputs the result
$flexy->bufferedOutputObject() -- Merges a controller object with the template and returns the result
$flexy->getElements() -- Fetch Dynamic HTML Elements from template
new HTML_Template_Flexy_Element -- Class constructor
$element->setValue() -- Utility function to set or store values from common tag types.
$element->setOptions() -- Utility function equivilant to HTML_Select - loadArray **
$element->removeAttributes() -- Removes an attributes
$element->setAttributes() -- Sets the HTML attributes
$element->toHtml -- Output HTML and children
$element->toHtmlnoClose() -- Output Open Tag and any children and not Child tag (designed for use with <form + hidden elements>
$factory->freeze() -- freeze - freeze's an element. - just copies the value to the override.
$factory->fromArray() -- fromArray - builds a set of elements from a key=>value array (eg. DO->toArray()) the second parameter is an optional HTML_Element array to merge it into.
$factory->fromArrayPrefixed() -- fromArrayPrefixed - takes a multi dimensional array, and builds the 'xxx[sss][xx]' => value
$factory->setErrors() -- setErrors - sets the suffix of an element to a value..
$factory->setRequired() -- setRequired - sets the prefix of an element to a value..
{variable} -- creates PHP code to echo a variable
{method(arguments,#quoted arguments#)} -- creates a PHP method call, and echos the results
{foreach:variable,key,value} -- creates a PHP foreach loop
{if:variable} -- creates a PHP if statement
{end:} -- closes an if or foreach block
{else:} -- adds an PHP else in an if block
<FORM NAME="name" -- configures automatic form elements
<INPUT NAME="name"> -- creates PHP variable for input values
<TEXTAREA NAME="name"> -- creates PHP variable for textarea value
<SELECT NAME="name"> -- creates PHP variable and code for select lists
flexy:if="variable or method()" -- creates a PHP if conditional tag
flexy:foreach="variable,key,value" -- creates a PHP foreach loop using a html attribute
flexy:start="here" -- Start the output, using this tag and its children.
flexy:startchildren="here" -- Start the output using its children.
flexy:ignore="yes" -- Prevent Automatic form value replacement
flexy:nameuses="variable" -- Use a variable in the name for a flexy form element
<FLEXY:TOJAVASCRIPT JSVAR="PHPVAR"> ... -- Provides a simple way to pass data from PHP to Javascript

An extremely flexible Template core, with multiple engines.

Introduction

Introduction --  What HTML_Template_Flexy can do

Introduction

HTML_Template_Flexy started its life as a simplification of HTML_Template_Xipe, However the long term aim of Flexy is to provide a universal Template Base API for Compiling and native PHP type templates.

Flexy currently supports a number of backends (Template Formats), and is designed to be extended to support more, The Key Formats are:

  • Standard - A rich Tokenizer driven engine, that uses {variable_placeholders}, attribute based (flexy:foreach="...."), and custom tag <flexy:tojavascript ... To rapidly create PHP code from simple markup. These templates are designed to be editable in WYSIWYG HTML editors, without breaking the tags

  • Regex - A classic templating backend, for supporting Smarty, Xipe, or Email type convertion to PHP code.

  • Raw - A non compiling backend, that enables you to create templates using PHP, Useful if you intend to redistribute your application and are concerned about compilation

Data can be assigned in two ways with flexy, depending on your preferred style of working.

  • Push - you put data into the template engine, using $flexy->setData(), and $flexy->setDataByRef(), this is similar to the way Smarty and other templates work.

  • Push/Pull - You provide the outputer with a Data Provider Object, (either a Data Object, or a Controller) that contains the data to display (and objects with methods that can be called). This has the added benefit of making the Variables in the template documentable, using PEAR standards, eg. PHPDoc comments.

With all this Flexibility, it still manages to achieve

  • Very Lightweight Simple API, which easy to learn

  • In Normal operation very little code is actually loaded (so it's fast)

How does HTML_Template_Flexy differ from other template systems

If you look around you will see there are other template systems available in PHP, they generally fall into two categories, Replacement Systems, or PHP Code builders.

Replacement systems like HTML_Template_IT, FastTemplate, PhpLib Template tend to be slower at doing block and nested block type templates and involve alot of code to add each variable to the template.

Php Code builders like Flexy, Smarty, SimpleTemplate (now HTML_Template_Xipe) tend to be better at more complex templates, and can offer a better approach to extendability. (the long term aim of Flexy is to integrate support for all of these PHP Generator templates into a simple package)

The Standard Compiling Backend uses a Tokenizer, which offers the possiblities of using HTML tags and attributes to provide looping and conditionals, and make dynamic XML_Tree like elements of HTML Forms that can be manipulated in your code. (This conversion is only done once when the template compiles)

Typical use example

Flexy template is normally called from within a Controller Class (in the Model,View,Controller paragam). You just send HTML_Template_Flexy, the name of the template, and the object to output. - any variable you want printing out just has to be set in the object being used to ouput.

Example 45-1. Typical usage example for HTML_Template_Flexy

<?php

/* configure the application - probably done elsewhere */
require_once 'HTML/Template/Flexy.php';
require_once 'PEAR.php';
$options = &PEAR::getStaticProperty('HTML_Template_Flexy','options');
$config = parse_ini_file('example.ini',TRUE);
$options = $config['HTML_Template_Flexy'];


/* the page controller class */

class controller_test 
{

    var $template = "home.html"; // name of template
    var $title;                  // this relates to {title};
    var $numbers = array();      // this relates to {numbers} , used with foreach
    var $anObject;

    var $elements = array();      // this is where the elements are stored

    /* start section - deals with posts, get variables etc.*/

    function controller_test() 
    {
        $this->start();
        $this->output();
    }


    function start() 
    {
        // the title
        $this->title = "Hello World";

        // store an object.
        $this->anObject = new StdClass;

        // assign a value to a member.
        $this->anObject->member = 'Object Member';

        // if you need form elements - you have to include them.
        require_once 'HTML/Template/Flexy/Element.php';

        // create an HTML Element for the form element.
        $this->elements['input'] = new HTML_Template_Flexy_Element;

        // assign a value to it
        $this->elements['input']->setValue('Hello');


        for ($i = 1;$i< 5;$i++) {
            $this->numbers[$i] = "Number $i";
        }
    }

    /* output section - probably best to put this in the default_controller class */

    function output() {
        $output = new HTML_Template_Flexy();
        $output->compile($this->template);
        $output->outputObject($this,$this->elements);
    }


    function someMethod() {
        return "<b>Hello From A Method</b>";
    }



}

/* the page controller instantaation - probably done with a factory method in your master page controller class */

new controller_test();

?>

Now the example template,

And the output

Configuration Options

Configuration Options --  Setting the defaults for HTML_Template_Flexy

Configuration Options

templateDir directory

This is the directory where all your templates are located

compileDir directory

The directory where the compiled templates will be stored, This directory should be writable by the web server

forceCompile boolean

Normally 0, means that the template will only be compiled once (or if the template file is altered), this is only really usefull if you are developing filters and need to test the result.

debug integer

The default debugging level (default 0=off), 1= shows some debugging information

locale string

Default is 'en' - english. The language use for reading/writing templates. Currently it is only used in the compiled files filename = eg. originalname.html.en.php

Flexy uses get_text() internally if it is installed, and will replace all strings in a HTML page with the return value of get_text(). - This enables the creation of multilanguage sites with a little less pain.

A file {templatename}.strings.serial is created for each file that is parsed, you can use this with PHP's unserialize function to retrieve an array of all the strings in a file. (for translating), or just use the tool xgettext.

compiler string

Default is 'Flexy' - The Flexy Tokenizer Driver engine. Other engines available are regex (similar to Xipe's engine), Raw (For plain PHP files with no replacement or compiling) and Standard (depreciated). You can use this field to load your own engines, either based Off the core code, or totally seperate..

multiSource boolean

Default is false - Allow the same template to exist in multiple places (eg. if you have theme's and want to fall back to a default template if the themed version doesnt exist.)

templateDirOrder string

Default is '' - by default, the first matched template is used, if you have multiple paths, and want the last in the list to be used, then set this to 'reverse'

filters array|string

an array or comma seperated string of filters ONLY USED BY THE Regex backend, available filters are: BodyOnly (strip everything before and after body tag), Mail (add an extra line break after php tags.), Php (removes php code, not very reliably), SimpleTags (variable, method etc. replacement), XML (replace XML opening tag with echos.)

nonHTML boolean

default is false - if you use the Flexy compiler, it turns off parsing of HTML, (not heavily tested)

allowPHP boolean|string

default is false - allows php code in templates, normally off to help you reduce the chance of you shooting your self in the foot by forgetting to escape output.. (can be usefull for complex looping), but not normally recommended. setting to true, enables PHP code, setting to 'delete' removes php code. (although it doesnt prevent XSS attacks, so it is only suited to trusted users)

flexyIgnore boolean

default is false - setting to true, will turn off the conversion of html form elements into HTML_Template_Flexy_Element's

numberFormat string

default is ",2,'.',','" - this is the piece of code that is appended to the output engine when using the :n modifier, eg. {xxxx:n} is replaced with number_format($t->xxxx,2,'.',','); see the php manual page for number_format the default output would be: 1,200.00

url_rewrite string

when compiling the template flexy can rewrite <img src, <script src, <a href and xul stylesheet urls. The format is "match/original:new/url, match/another/original:new/url" each combo is seperated by a comma, and the colon seperates the pair. This helps previewing templates without using the engine.

compileToString boolean

default false - if set to true, the compile will return a string of the compiled template, rather than writing it to the cache file. eg. {object._myvar}

privates boolean

default false - if set to true, you can access variables prefixed with an underscore (normally private in PEAR's coding standards) eg. {someobject._myprivatevar} and {_myprivate}

globals boolean

default false - if set to true, you can access php's globals and superglobals, eg. {_POST[myvar]}, {GLOBALS[somevalue]}

globalfunctions boolean

default false - if set to true, you can access any native php function using the GLOBALS. prefix eg. {GLOBALS.date(#d/m/Y#)} obviously you should trust your template authors, as they can easily run exec() if this is enabled.

locale string

default 'en' - either used to search for language specific templates with {filename}.{locale}.{extension} or in conjunction with the Translation2 language translation toolkit, to set the language used to translate templates to at compile time.

Translation2 mixed

default false - you can set this to an array or an existing Translation2 object eg. Translation2 => array('driver'=>'dataobjectsimple', options=>array()));

strict boolean

default false - By default warnings about undefined variabes are hidden, this turns on all PHP warnings during the outputObject calls. Can be usefull for finding bugs hidden by method callbacks.

fatalError int

default constant HTML_TEMPLATE_FLEXY_ERROR_DIE - this determines the behaviour when compiling a template fails, normally flexy will die and report the error to the screen, you can change this to HTML_TEMPLATE_FLEXY_ERROR_RETURN, if you want to recieve a PEAR_Error object from compile().

plugins string|array

loads plugin classes, (by default from the Plugin folder), these can be used either via {plugin.nameofmethod} or as a modifier {outputstring:dateformat}, default formats are normally collected via configuration options plugin.dateformat, plugin.numberformat.decimals, plugin.numberformat.point, plugin.numberformat.thousands

new HTML_Template_Flexy

new HTML_Template_Flexy -- constructor

Description

The Object Constructor accepts options as its arguments. Normally, you do not need to provide any options, as they are set by the PEAR::getStaticPropery(), as described in the configuration.

Parameter

  • array $options - anything you need to change from the default settings

Note

This function can not be called statically.

$flexy->compile()

$flexy->compile() -- Converts a template from markup to PHP if required

Description

If neccessary it will convert the Template markup into PHP code, and writes it to the compiledTemplate directory adding the {locale}.php to the end of the filename. The Template is only compiled if

  • No compiled file exists

  • The file modification date of the template is greater than the compiled one

  • The forceCompile Flag was set in config or when you created the template object.

It is not normally neccessary to set the forceCompile flag, unless you are working on the engine itself.

Parameter

  • string $template - Used in conjuction with the config variable 'templateDir' to locate the template to compile into PHP code.

Return value

string - the location of the compiled file (which could be used with include) - although it is recommended to use the outputObject methods.

Note

This function can not be called statically.

$flexy->outputObject()

$flexy->outputObject() -- Merges a controller object with the template and outputs the result

Description

This makes the values of the supplied object (and optionally loads the HTML_Template_Flexy_Elements) available to the template when it is run.

Parameter

  • object $controllerObject - The object you want to use with the template, the values of the object will relate to the $controllerObject->tag will map to {tag} on the template

  • array $elements - This is an associative array of form, or dynamic elements names (or id's) which will be merged with the one defined in the template.

Note

This function can not be called statically.

$flexy->bufferedOutputObject()

$flexy->bufferedOutputObject() -- Merges a controller object with the template and returns the result

Description

This maps the values of the supplied object and runs the compiled template, and returns the result.

This can be used in conjuction with PEAR::Cache, or in the example below, with a email template (note this still needs testing.. - the backend should eventually support a native tokenizer for email templates.)

Parameter

  • object $controllerObject - The object you want to use with the template, the values of the object will relate to the $controllerObject->tag will map to {tag} on the template

  • array $elements - This is an associative array of form, or dynamic elements names (or id's) which will be merged with the one defined in the template.

Return value

string - the object variables overlayed on the template

Note

This function can not be called statically.

Example

$flexy->getElements()

$flexy->getElements() -- Fetch Dynamic HTML Elements from template

Description

All Form elements, FORM, INPUT, SELECT and any HTML tag that includes the attribute flexy:dynamic Is converted into HTML_Template_Flexy_Element's and stored serialized in the same folder as the Compiled flexy template.

You can use this array to make changes to these elements or find out what form elements exist on a page.

Note: you should put the modified result as the $elements argument of >outputObject(), you do not however have to fetch the elements to assign them, you can just create blank elements, and merge them.

Return value

array - of Elements contained within the template. (or an empty array if no form/dynamic elements are used)

Note

This function can not be called statically.

new HTML_Template_Flexy_Element

new HTML_Template_Flexy_Element -- Class constructor

Description

Flexy uses a single lightweight class to represent All HTML Tags, All the variables of the class are public, and you are encouraged to use them. And the methods provide generic assignment and conversion abilities.

To force the toHtml() method to generate XHTML, rather than standard HTML, use $element->setAttributes(array('flexy:xhtml'=>true)); or add flexy:xhtml="true" to the attribute of the element in the template.

Parameter

  • $tag - The name of the HTML Tag eg. img for <img ....

  • $attributes - Associative array of attributes, where key="value" is output when you turn it in toHtml(), If you need to represent a attribute without a value, use TRUE as the value. This also accepts a string in the format "href='/test.jpg' alt='test'", which will be parsed into the attributes array of the object.

Public Properties

string $element->tag

The name of the html element eg. img for <img...

array $element->attributes

Attributes for the element

array $element->children

All the sub elements inside this, can be any object that implements toHtml(), or a string.

string $element->override

this value of thiswill be output when toHtml() is called, rather than the tags.

string|object $element->prefix

string or object that implements toHtml() method, and is returned by toHtml() before the tag HTML

string|object $element->suffix

string or object that implements toHtml() method, and is returned by toHtml() after the tag HTML

mixed $element->value

when you create an element, that is to be merged later with a full definition, you can assign the value here, and during toHtml(), the toValue() method will be called and select options, checkboxes and input values will be correctly filled in.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Example

$element->setValue()

$element->setValue() -- Utility function to set or store values from common tag types.

Description

This is used to set the values of form elements, results depend on the type of element

  • text,password inputs, buttons Fills in the value attribute

  • checkboxs / radio buttons adds a checked tag to the matching element

  • textarea fills in the text area content

  • checkbox with arrays adds checked to the matching elements

  • selects adds selected to the

Parameter

  • $value The value to assign a form element, (use arrays for multiple selects or checkbox groups)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$element->setOptions()

$element->setOptions() -- Utility function equivilant to HTML_Select - loadArray **

Description

Used with HTML Selects, to fill in the options available

Parameter

  • $array the options to appear.

  • $noValue don't use the keys from the array sent as the value= part of the option tag.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$element->removeAttributes()

$element->removeAttributes() -- Removes an attributes

Description

use this to remove attributes from the tag when the element is rendered, It may be easier to access the attributes array directly and assign the value to false.

Parameter

  • $attributes name or array of names to remove from tag

Throws

throws

Note

This function can not be called statically.

$element->setAttributes()

$element->setAttributes() -- Sets the HTML attributes

Description

Can be used to set attribute values, It is easier to set the attributes directly using the public attributes property.

Parameter

  • $attributes Either a typical HTML attribute string or an associative array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$element->toHtml

$element->toHtml -- Output HTML and children

Description

returns the HTML to represent the object. If you wish to implement your own element, you only need to implement this method, and assign it to the element array..

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$element->toHtmlnoClose()

$element->toHtmlnoClose() -- Output Open Tag and any children and not Child tag (designed for use with <form + hidden elements>

Description

Used by the template to represent form tags, which only the opening tag are rendered dynamically (so, all tags inside the tag are not forced to be dynamic).

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$factory->freeze()

$factory->freeze() -- freeze - freeze's an element. - just copies the value to the override.

Description

this probably needs more thought.. - it would probably need to merge the full tag info with types, to be usefull..

$ar = HTML_Element_Factory::freeze($ar);

Parameter

  • $array (return by refernce key(tag name) => HTML_Template_Flexy_Element

Return value

return Array of HTML_Template_Flexy_Elements

Throws

throws no exceptions thrown

Note

Not documented yet.

$factory->fromArray()

$factory->fromArray() -- fromArray - builds a set of elements from a key=>value array (eg. DO->toArray()) the second parameter is an optional HTML_Element array to merge it into.

Description

This package is not documented yet.

Parameter

  • $ar key(tag name) => value

  • $ret array key(tag name) => HTML_Element

Return value

return Array of HTML_Template_Flexy_Elements

Throws

throws no exceptions thrown

Note

Not documented yet.

$factory->fromArrayPrefixed()

$factory->fromArrayPrefixed() -- fromArrayPrefixed - takes a multi dimensional array, and builds the 'xxx[sss][xx]' => value

Description

This package is not documented yet.

Parameter

  • $prefix

  • $ar

  • $ret

Return value

return Array of HTML_Template_Flexy_Elements

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$factory->setErrors()

$factory->setErrors() -- setErrors - sets the suffix of an element to a value..

Description

HTML_Element_Factory::setErrors($elements,array('name','not long enough'));

Parameter

  • $prefix

  • $ar

  • $ret

Return value

return Array of HTML_Template_Flexy_Element's

Throws

throws no exceptions thrown

Note

This function can not be called statically.

$factory->setRequired()

$factory->setRequired() -- setRequired - sets the prefix of an element to a value..

Description

HTML_Element_Factory::setRequired($elements,array('name',true));

Parameter

  • $prefix

  • $ar

  • $ret

Return value

return Array of HTML_Template_Flexy_Element's

Throws

throws no exceptions thrown

Note

This function can not be called statically.

{variable}

{variable} -- creates PHP code to echo a variable

Description

creates PHP code to echo a variable, with optional modifier. Modifiers are

  • No Modifier - does htmlspecialchars($variable)

  • :h - echos without any change - eg. raw

  • :u - echos urlencode($variable)

by default variables are assumed to have calling scope, and are prefixed with $t->, however if they are inside a loop (foreach), then the variables created by the loop are added to the scope and the prefix is not added.

{method(arguments,#quoted arguments#)}

{method(arguments,#quoted arguments#)} -- creates a PHP method call, and echos the results

Description

creates an PHP method call, any with any number of arguments, as variables or literals (quoted in #). the return value is echoed, and passed by a modifier (like variables)

  • No Modifier - does htmlspecialchars($variable)

  • :h - echos without any change - eg. raw

  • :u - echos urlencode($variable)

{foreach:variable,key,value}

{foreach:variable,key,value} -- creates a PHP foreach loop

Description

creates a foreach loop, needs an {end:} tag. note that the engine will add the variable to the scope, so they will not be prefixed with $t-> when used inside the loop.

Parameter

  • string variable - relates to $object->variable

  • string key - creates a variable 'key' in the current scope.

  • string value - optionally creates a variable 'value' in the current scope. (as in $key=>$value)

{if:variable}

{if:variable} -- creates a PHP if statement

Description

creates an if statement, with the argument as a variable or method. You must close an if statement with an {end:} statement, and you may use {else:} with it.

{end:}

{end:} -- closes an if or foreach block

Description

adds a closing brace in PHP so that blocks of conditional HTML are shown correctly. You do not need to use {end:} tags if you are using HTML tag attributes like IF="a,b", as the closing HTML tag will indicate that.

{else:}

{else:} -- adds an PHP else in an if block

Description

adds an else statement in PHP so that blocks of conditional HTML are shown correctly.

<FORM NAME="name"

<FORM NAME="name" -- configures automatic form elements

Description

By default, all forms are converted to HTML_Template_Flexy_Elements, so they can be altered at runtime.

Example

<INPUT NAME="name">

<INPUT NAME="name"> -- creates PHP variable for input values

Description

fills in the form with values based on the form name and the tag name. If flexyignore is used, it is left alone (or if the body or form has a flexyignore tag it will be left alone).

<TEXTAREA NAME="name">

<TEXTAREA NAME="name"> -- creates PHP variable for textarea value

Description

fills in the form with values based on the form name and the tag name. If flexyignore is used, it is left alone (or if the body or form has a flexyignore tag it will be left alone).

<SELECT NAME="name">

<SELECT NAME="name"> -- creates PHP variable and code for select lists

Description

fills in the select values based on the form name and the tag name and adds code to check if the object variable matches them. If flexyignore is used, it is left alone. If static is set, the currently defined options will be used.

flexy:if="variable or method()"

flexy:if="variable or method()" -- creates a PHP if conditional tag

Description

creates an if condition surrounding the tag that it's included in.

Parameter

  • string variable - relates to $object->variable

  • string method - relates to $object->method()

  • string object.method relates to $object->object->method()

flexy:foreach="variable,key,value"

flexy:foreach="variable,key,value" -- creates a PHP foreach loop using a html attribute

Description

creates a foreach loop, around the tag and close tag.

Parameter

  • string variable - relates to $object->variable

  • string key - creates a variable 'key' in the current scope.

  • string value - optionally creates a variable 'value' in the current scope. (as in $key=>$value)

flexy:start="here"

flexy:start="here" -- Start the output, using this tag and its children.

Description

Tells the generator to start outputing using this tag. This can be useful if you want to edit the template in a editor that expects a head/footer, and you can list the available tags in the comments at the top of the page.

The actual value of the tag is not relivant.

flexy:startchildren="here"

flexy:startchildren="here" -- Start the output using its children.

Description

Tells the generator to start outputing using the children of this tag. This can be useful if you want to edit the template in a editor that expects a head/footer, normally adding this to body

The actual value of the tag is not relivant.

flexy:ignore="yes"

flexy:ignore="yes" -- Prevent Automatic form value replacement

Description

Tells the generator not to replace form elements with PHP code. Can be used with a Form Tag, or individual elements.

Note: <input>s and <textarea>s with flexy:include or flexy:ignore: If you are turning off flexy element creation with flexy:ignore="yes", then this is not inherited by included templates, and you need to add that tag to the included template as well.

flexy:nameuses="variable"

flexy:nameuses="variable" -- Use a variable in the name for a flexy form element

Description

If you have a form with multiple input boxes (eg. group members), which are dynamically generated, then this attribute can be used to generate flexy elements based on sprintf'ing the variable value into the name attribute value.

Example

<FLEXY:TOJAVASCRIPT JSVAR="PHPVAR"> ...

<FLEXY:TOJAVASCRIPT JSVAR="PHPVAR"> ... -- Provides a simple way to pass data from PHP to Javascript

Description

To reduce the "WTF" effect of magically having javascript code that looks like flexy tags completely broken by the template engine, Flexy deliberately turns the parser OFF when dealing with script contents (see Configuration Options for details of PHP in script tags)

As a result of this, it is not possible to put any flexy tags within blocks of javascript code. the flexy:tojavascript tag solves this in a way that enables javascript to be tested seperatly from the application, and also serves to encourage better coding practices. (eg. seperating your code with distinct lines of communication)

This feature depends on PEAR's HTML_Javascript Library

Example


HTML_Template_IT

Table of Contents
Introduction -- Creating and Parsing templates
HTML_Template_IT::HTML_Template_IT() -- constructor
HTML_Template_IT::get() -- get a block including replacments
HTML_Template_IT::getGlobalvariables() -- returns an array of all global variables from the variable cache
HTML_Template_IT::loadTemplatefile() -- load a template file
HTML_Template_IT::parse() -- parse a block
HTML_Template_IT::parseCurrentBlock() -- parse the current block
HTML_Template_IT::setCurrentBlock() -- set the current block
HTML_Template_IT::setRoot() -- set the template root directory
HTML_Template_IT::setOption() -- sets an option
HTML_Template_IT::setTemplate() -- set a template
HTML_Template_IT::setVariable() -- set a variable
HTML_Template_IT::show() -- print a block including replacments
HTML_Template_IT::touchBlock() -- preserve empty block

Introduction

Introduction -- Creating and Parsing templates

Templates

A template consists of text and special labeled blocks and placeholders. The content of blocks can be re-used and parsed multiple times with different placeholder values.

Placeholder

Placeholders can be defined in templates and are filled from PHP code with content. The format of placeholder up to version (1.1.x) is

{[0-9A-Za-z_-]+}

Since version 1.2.x dots are allowed, too.

{[\.0-9A-Za-z_-]+}

This means, the name of the placeholder can consist of upper- and lowercase letters, underscores and hypens. The name must be placed between curly brackets without any spaces. Valid names are i.e.:

{Placeholder}
{place2_holder}
{PLACEHOLDER1}
{Place-Holder}

Valid names since version 1.2.x

{Place.Holder}

Non-valid names are i.e.

{ Placeholder 3 } (spaces)
{place*holder} (char isn't permitted)

Blocks

The format of a block is

<!-- BEGIN [0-9A-Za-z_-]+ -->
... block content ...
<!-- END [0-9A-Za-z_-]+ -->

Since version 1.2.x dots are allowed in block definitions

<!-- BEGIN [\.0-9A-Za-z_-]+ -->
... block content ...
<!-- END [\.0-9A-Za-z_-]+ -->

The rules for the block name are the same like for placeholders. In contrast to placeholders the spaces in the block markup are required.

The nesting of blocks is permitted, but be careful while parsing. You have to set and parse the deepest inner block first and then set and parse from inner to outer.

In IT the whole template file itself is nested in a meta block called "__global__". Most block-related functions use this block name as default.

HTML_Template_IT::HTML_Template_IT()

HTML_Template_IT::HTML_Template_IT() -- constructor

Description

Constructor. Create a new instance of HTML_Template_IT and sets the search path for templates.

Parameter

  • string $root - path to the directory of the template files

Return value

object - a new HTML_Template_IT object

Note

This function can be called statically.

HTML_Template_IT::get()

HTML_Template_IT::get() -- get a block including replacments

Description

This functions return a block with all replacements done.

Parameter

  • string $block - The block to return. If not used, the whole template is returned.

Return value

string - the template with all replacements done.

Note

This function can not be called statically.

HTML_Template_IT::getGlobalvariables()

HTML_Template_IT::getGlobalvariables() -- returns an array of all global variables from the variable cache

Description

Gets an array of all global variables in the variable cache. Only variables that are filled using HTML_Template_IT::setVariable() are returned. The returned has two values. The first values holds an array with the names of the global variables, the second value holds an array with all the values.

Return value

array - An array. The key 0 holds an array with the names of all filled variables, the key 1 holds an array with names of the according values.

Note

This function can not be called statically.

HTML_Template_IT::loadTemplatefile()

HTML_Template_IT::loadTemplatefile() -- load a template file

Description

Loads a template from a file and generates internal lists for blocks and variables.

Parameter

  • string $filename - file to load

  • boolean $removeUnknownVariables - if TRUE, not substituted placeholders in a block will be removed

  • boolean $removeEmptyBlocks - if TRUE, not touched blocks will be removed. Blocks can be touched with HTML_Template_IT::touchBlock().

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

HTML_Template_IT::parse()

HTML_Template_IT::parse() -- parse a block

Description

Parses the defined block, performs all substitutions and appends the result to already parsed blocks.

Parameter

  • string $block - block to parse. When not set the complete template is used.

  • boolean $flag_recursion - Used internally. Can be ignored

Return value

boolean - Returns TRUE if there was no placeholder to substitute, otherwise FALSE or IT_Error.

Note

This function can not be called statically.

HTML_Template_IT::parseCurrentBlock()

HTML_Template_IT::parseCurrentBlock() -- parse the current block

Description

Parses the current block. The current block can be set with HTML_Template_IT::setCurrentBlock().

Return value

boolean - Returns TRUE if there was no placeholder to substitute, otherwise FALSE or IT_Error.

Note

This function can not be called statically.

HTML_Template_IT::setCurrentBlock()

HTML_Template_IT::setCurrentBlock() -- set the current block

Description

Sets the name of the current block, where placeholder should be substituted. The current block can be parsed with HTML_Template_IT::parseCurrentTemplate().

Parameter

  • string $block - block to set, if not given, the complete template is set

Return value

boolean - TRUE, if found and succcessful set, otherwise IT_Error will be returned.

Note

This function can not be called statically.

HTML_Template_IT::setRoot()

HTML_Template_IT::setRoot() -- set the template root directory

Description

Sets the path to the template directory where HTML_Template_IT::loadTemplatefile() searches for templates. Every filename is prefixed with the given string.

Parameter

  • string $root - Path to the template directory.

Note

This function can not be called statically.

HTML_Template_IT::setOption()

HTML_Template_IT::setOption() -- sets an option

Description

Sets an option. Please notice that changing some option might result in an unexpected behaviour of HTML_Template_IT.

Return value

int - Returns 1 on success, otherwise an IT_Error object.

Parameter

  • mixed $option - Option identifier

  • mixed $value - New value of the option

Options

Table 45-1. Possible options:

OptionDefault valueDescription
removeUnknownVariables TRUE If TRUE all template variables, which are not filled, are removed while parsing. This option is usually set by calling HTML_Template_IT::loadTemplatefile() or HTML_Template_IT::setTemplate().
removeEmptyBlocks TRUE If TRUE all blocks not containing any filled template variables are removed. This option is usually set by calling HTML_Template_IT::loadTemplatefile() or HTML_Template_IT::setTemplate().
clearCache FALSE If TRUE parsed blocks are not cached. If you don't know exactly what you do, just leave the default value.
clearCacheOnParse FALSE If TRUE the variable cache will be cleaned after parsing. If you don't know exactly what you do, just leave the default value.
openingDelimiter '{' Defines the character, every template variable has to start with. If you change this value, you have to call init() to reinitialise the template. If you don't know exactly what you do, just leave the default value.
closingDelimiter '}' Defines the character, every template variable has to end with. If you change this value, you have to call init() to reinitialise the template. If you don't know exactly what you do, just leave the default value.
blocknameRegExp '[\.0-9A-Za-z_-]+' The regular expression, thats used to parse block names. If you change this value, you have to call init() to reinitialise the template. If you don't know exactly what you do, just leave the default value.
variablenameRegExp '[\.0-9A-Za-z_-]+' The regular expression, thats used to parse template variable names. If you change this value, you have to call init() to reinitialise the template. If you don't know exactly what you do, just leave the default value.

Note

This function can not be called statically.

HTML_Template_IT::setTemplate()

HTML_Template_IT::setTemplate() -- set a template

Description

Loads template from a string and controls the behavior in case of unused variables and blocks

Parameter

  • string $template - The content of the template.

  • boolean $removeUnknowVariables - if TRUE, not substituted placeholders in a block will be removed

  • boolean $removeEmptyBlocks - if TRUE, not touched blocks will be removed

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

HTML_Template_IT::setVariable()

HTML_Template_IT::setVariable() -- set a variable

Description

Set the value of a variable in the current template block. If $placeholder is an array, the key of an element is treated as a placeholder name while the value is treated as its substitution.

Parameter

  • mixed $placeholder - name of the placeholder to substitute or a array with the placeholder as key and the data to assign as value.

  • mixed $variable - if $placeholder is not a array, the value to assign to the placeholder.

Note

This function can not be called statically.

HTML_Template_IT::show()

HTML_Template_IT::show() -- print a block including replacments

Description

This functions prints a block with all replacements done.

Parameter

  • string $block - The block to return. If not used, the whole template is returned.

Note

This function can not be called statically.

HTML_Template_IT::touchBlock()

HTML_Template_IT::touchBlock() -- preserve empty block

Description

Preserves an empty template block, even if $removeEmptyBlocks is TRUE and no substition of placeholders took place.

Parameter

  • string $block - block to preserve

Return value

boolean - TRUE, if block was found, otherwise IT_Error.

Note

This function can not be called statically.


HTML_Template_PHPLIB

HTML_Template_PHPLIB is the PEARified version of the once-so-famous PHPLIB template class. It provides variables and repeatable blocks. The original PHPLIB code can be found at phplib.sf.net.


HTML_Template_Sigma

Table of Contents
Introduction - template syntax -- Creating and editing templates
Introduction - cache -- How Sigma caches the "prepared" templates
constructor HTML_Template_Sigma() -- constructor
addBlock() -- Adds a block to the template
addBlockfile() -- Adds a block contained in the file to the template
blockExists() -- Checks if the block exists in the template
clearVariables() -- Clears the variables
errorMessage() -- Returns a textual error message for an error code
get() -- Returns a block with all replacements done.
getBlockList() -- Returns a list of blocks within a template.
getCurrentBlock() -- Returns the current block name
getPlaceholderList() -- Returns a list of placeholders within a block.
hideBlock() -- Hides the block even if it is not "empty".
loadTemplateFile() -- Loads a template file.
parse() -- Parses the given block.
parseCurrentBlock() -- Parses the current block
placeholderExists() -- Checks whether the placeholder exists
replaceBlock() -- Replaces an existing block with new content.
replaceBlockfile() -- Replaces an existing block with new content from a file.
setCacheRoot() -- Sets the directory to cache "prepared" templates in.
setCallbackFunction() -- Sets a callback function.
setCurrentBlock() -- Sets the name of the current block.
setGlobalVariable() -- Sets a global variable value.
setOption() -- Sets the option for the template class
setRoot() -- Sets the file root for templates.
setTemplate() -- Sets the template.
setVariable() -- Sets a variable value.
show() -- Prints a block with all replacements done.
touchBlock() -- Preserves the block even if empty blocks should be removed.

HTML_Template_Sigma: implementation of Integrated Templates API with template 'compilation' added.

Class Trees for HTML_Template_Sigma()

  • PEAR

    • HTML_Template_Sigma

Introduction - template syntax

Introduction - template syntax -- Creating and editing templates

Placeholders

The default format of placeholder is
{[0-9A-Za-z_-]+}
This means, the name of the placeholder can consist of upper- and lowercase letters, underscores and hyphens. The name must be placed between curly brackets without any spaces.

Actual values for the placeholders are set using setVariable() and setGlobalVariable() methods. Placeholders for which no values were set are removed from output by default.

Blocks

The format of a block is
<!-- BEGIN [0-9A-Za-z_-]+ -->
... block content ...
<!-- END [0-9A-Za-z_-]+ -->
The rules for the block name are the same like for placeholders. In contrast to placeholders the spaces in the block markup are required.

The nesting of blocks is permitted, but be careful while parsing. You have to parse() the innermost block first and then go from inner to outer.

In Sigma the whole template itself is treated as a virtual block called "__global__". Most block-related functions use this block name as default.

<!-- INCLUDE --> statements

It is possible to include a template file from within another template file using an <!-- INCLUDE filename --> statement:
... some content ...
<!-- INCLUDE filename.html -->
... some more content ...
When such a template file gets loaded, the <!-- INCLUDE filename.html --> will be replaced by contents of filename.html.

Some things to note:

  • Although this functionality is implemented using addBlockfile(), unlike addBlockfile() no new blocks are created in the template.

  • <!-- INCLUDE --> calls are processed before any variable substitution can take place. So <!-- INCLUDE {placeholder} --> will not work unless you actually have a file named {placeholder} and want to load it.

Template functions

Sigma templates can contain simple function calls. This means that the author of the template can add a special placeholder to it
... some content ...
func_h1("embedded in h1")
... some more content ...
Sigma will parse the template for these placeholders and will allow you to define a callback function for them via setCallbackFunction(). Callback will be called automatically when the block containing such function call is parse()'d.

Format of such function name is as follows
func_[_a-zA-Z]+[A-Za-z_0-9]*
that means that it should start with a 'func_' prefix, then has a letter or an undercore and then a sequence of letters, digits or underscores. Arguments to these template functions can contain variable placeholders
func_translate('Hello, {username}')
but not blocks or other function calls.

Quoting of template function arguments

Note: The information in this section applies to HTML_Template_Sigma version 1.1.2 and later, please upgrade if you have problems with template function arguments in previous versions.

Quoting of function arguments is not mandatory, the following is a perfectly valid template function:
func_uppercase(Some unquoted text)
But consider the following: function arguments are contained within parentheses and separated by commas. Therefore if closing parenthesis ')' or comma ',' appears in function argument, it should be quoted.

The next thing to consider is that HTML_Template_Sigma is mostly targeted for generating HTML. Therefore a quoted string within an argument is most probably a tag attribute. The contents of such strings are not parsed for commas and parentheses. Therefore the following is also a perfectly valid template function:
func_foo(<a href="javascript:foo(bar, baz)">Do foo</a>)
But if you have an unmatched single or double quote in your argument or if the argument starts with a quote, it should be quoted.

Finally, the argument should be quoted if it is an empty string or if its leading or trailing whitespace is significant (leading and trailing whitespace will be removed from unquoted arguments).

The arguments can be quoted using either single or double quotes. If an argument contains a quote of the same type, then it should be escaped using the backslash symbol '\'. The backslash symbol itself should also be escaped,
func_foo('O\'really')
func_foo('AC\\DC')
will pass O'really and AC\DC to the relevant callbacks.

Shorthand for template functions

Since release 1.1.0, instead of using
func_callback({var})
you can write
{var:callback}
There are 3 automatically registered template functions

Thus, if you add {var:h} placeholder to the template, var will be have unsafe characters replaced by corresponding HTML entitites.

Usage Example

Other usage examples: There are several usage examples in the package archive that cover most of its functionality. You are encouraged to review them along with the docs.

Introduction - cache

Introduction - cache -- How Sigma caches the "prepared" templates

Cache FAQ

1. What exactly is this cache feature?
2. What about data?
3. Is the cached version regenerated when the template changes?
4. Is there any TTL setting?
5. Any way to flush the cache?
6. Does this give significant performance gains?

1. What exactly is this cache feature?

This is the way to bypass RegExp parsing on template load. Instead of parsing the original template on every request, we keep its internal representation (a serialized array, essentially) and load it instead.

Think about template compilation in Smarty. Only Sigma does not compile templates to PHP code.

2. What about data?

No data caching is taking place. If you want to do this, consider using some of the PEAR's cache packages.

3. Is the cached version regenerated when the template changes?

Yes.

4. Is there any TTL setting?

No. Cached version is considered valid until the source template changes.

5. Any way to flush the cache?

Yes, just delete all the files in the cache dir.

6. Does this give significant performance gains?

Yes. The answer is based on personal experience.

If you are going to perform some benchmarks, then use some real-world complex templates, not artificial ones. The performance gain will be greater with bigger and more complex (dozens of blocks) ones.

Cache usage

Caching is completely transparent. To take advantage of this feature you only have to either pass a second parameter to the constructor or call a setCacheRoot() method later.
<?php
require_once 'HTML/Template/Sigma.php';

$tpl =& new HTML_Template_Sigma('./templates', './templates/prepared');

$tpl->loadTemplateFile('default.html');

// go on

?>

For each distinct template file in ./templates loaded with either loadTemplatefile(), addBlockfile(), replaceBlockfile() or <!-- INCLUDE --> a prepared version will be generated in ./templates/prepared.

constructor HTML_Template_Sigma()

constructor HTML_Template_Sigma() -- constructor

Description

Constructor: builds some complex regular expressions and optionally sets the root directories.

Make sure that you call this constructor if you derive your template class from this one.

Parameter

string $root

root directory for templates

string $cacheRoot

directory to cache "prepared" templates in

Throws

throws no exceptions thrown

Note

This function can not be called statically.

addBlock()

addBlock() -- Adds a block to the template

Description

Adds a block to the template changing a variable placeholder to a block placeholder. This means that a new block will be integrated into the template in place of a variable placeholder. The variable placeholder will be removed and the new block will behave in the same way as if it was inside the original template.

The block content must not start with <!-- BEGIN blockname --> and end with <!-- END blockname -->, if it does the error will be thrown.

Parameter

string $placeholder

name of the variable placeholder, the name must be unique within the template.

string $block

name of the block to be added

string $template

content of the block

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

addBlockfile()

addBlockfile() -- Adds a block contained in the file to the template

Description

Adds a block taken from a file to the template, changing a variable placeholder to a block placeholder.

Parameter

string $placeholder

name of the variable placeholder

string $block

name of the block to be added

string $filename

template file that contains the block

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

blockExists()

blockExists() -- Checks if the block exists in the template

Description

Checks if the block exists in the template

Parameter

string $block

block name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

clearVariables()

clearVariables() -- Clears the variables

Description

Global variables are not affected, only the ones set via setVariable(). The method is useful when you add a lot of variables via setVariable() and are not sure whether all of them appear in the block you parse(). If you clear the variables after parse(), you don't risk them suddenly showing up in other blocks.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

errorMessage()

errorMessage() -- Returns a textual error message for an error code

Description

Returns a textual error message for an error code. This is usually called when throwing a error, there is seldom need to call this method directly.

Parameter

integer $code

error code

string $data

additional data to insert into message

Return value

return error message

Throws

throws no exceptions thrown

Note

This function can not be called statically.

get()

get() -- Returns a block with all replacements done.

Description

Returns a parsed block: block with all replacements done.

This method will automatically call parse(), only if called with $block='__global__' when '__global__' was not parse()'d before. In all other cases you should call parse() before calling get()

Parameter

string $block

block name

boolean $clear

whether to clear parsed block contents

Return value

return block with all replacements done

Note

This function can not be called statically.

getBlockList()

getBlockList() -- Returns a list of blocks within a template.

Description

Returns a list of blocks within a template.

If $recursive is FALSE, it returns just a 'flat' array of $parent's direct subblocks. If $recursive is TRUE, it builds a tree of template blocks using $parent as root. Tree structure is compatible with PEAR::Tree's Memory_Array driver.

Parameter

string $parent

parent block name

boolean $recursive

whether to return a tree of child blocks (TRUE) or a 'flat' array (FALSE)

Return value

return a list of child blocks

Note

This function can not be called statically.

getCurrentBlock()

getCurrentBlock() -- Returns the current block name

Description

Returns the current block name (set by HTML_Template_Sigma::setCurrentBlock())

Return value

return block name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

getPlaceholderList()

getPlaceholderList() -- Returns a list of placeholders within a block.

Description

Returns a list of placeholders within a block.

Only 'normal' placeholders are in the list, not ones automatically created for blocks and template functions.

Parameter

string $block

block name

Return value

return a list of placeholders

Note

This function can not be called statically.

hideBlock()

hideBlock() -- Hides the block even if it is not "empty".

Description

Hides the block even if it is not "empty".

Is somewhat an opposite to touchBlock().

Consider a block (a 'edit' link for example) that should be visible to registered/"special" users only, but its visibility is triggered by some little 'id' field passed in a large array into setVariable(). You can either carefully juggle your variables to prevent the block from appearing (a fragile solution) or simply call hideBlock()

Parameter

string $block

block name

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

loadTemplateFile()

loadTemplateFile() -- Loads a template file.

Description

Loads a template file. If caching is on, then it checks whether a "prepared" template exists. If it does, it gets loaded instead of the original, if it does not, then the original gets loaded and prepared and then the prepared version is saved. addBlockfile() and replaceBlockfile() implement quite the same logic.

Parameter

string $filename

filename

boolean $removeUnknownVariables

remove unknown/unused variables?

boolean $removeEmptyBlocks

remove empty blocks?

Return value

return SIGMA_OK on success, error object on failure

See

see HTML_Template_Sigma::setTemplate(), HTML_Template_Sigma::$removeUnknownVariables, HTML_Template_Sigma::$removeEmptyBlocks

Note

This function can not be called statically.

parse()

parse() -- Parses the given block.

Description

Parses the given block. It substitutes local and global variables appearing in the block and set via setVariable() and setGlobalVariable(), calls all the callback functions and recursively processes the subblocks of the block.

Parameter

string $block

block name

boolean $flagRecursion

TRUE if the function is called recursively (do not set this to TRUE yourself!)

boolean $fakeParse

TRUE if parsing a "hidden" block (do not set this to TRUE yourself!)

Note

This function can not be called statically.

parseCurrentBlock()

parseCurrentBlock() -- Parses the current block

Description

Parses the current block (set by HTML_Template_Sigma::setCurrentBlock())

Throws

throws no exceptions thrown

Note

This function can not be called statically.

placeholderExists()

placeholderExists() -- Checks whether the placeholder exists

Description

Checks whether the placeholder exists in the template, returns the name of the (first) block that contains the specified placeholder.

Parameter

string $placeholder

Name of the placeholder you're searching

string $block

Name of the block to scan. If left out (default) all blocks are scanned.

Return value

return Name of the (first) block that contains the specified placeholder. If the placeholder was not found an empty string is returned.

Note

This function can not be called statically.

replaceBlock()

replaceBlock() -- Replaces an existing block with new content.

Description

Replaces an existing block with new content. This function will replace a block of the template and all blocks contained in it and add a new block instead. This means you can dynamically change your template.

Sigma analyses the way you've nested blocks and knows which block belongs into another block. This nesting information helps to make the API short and simple. Replacing blocks does not only mean that Sigma has to update the nesting information (relatively time consuming task) but you have to make sure that you do not get confused due to the template change yourself.

Parameter

string $block

name of a block to replace

string $template

new content

boolean $keepContent

TRUE if the parsed contents of the block should be kept

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

replaceBlockfile()

replaceBlockfile() -- Replaces an existing block with new content from a file.

Description

Replaces an existing block with new content from a file.

Parameter

string $block

name of a block to replace

string $filename

template file that contains the block

boolean $keepContent

TRUE if the parsed contents of the block should be kept

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

setCacheRoot()

setCacheRoot() -- Sets the directory to cache "prepared" templates in.

Description

Sets the directory to cache "prepared" templates in, the directory should be writable for PHP.

The "prepared" template contains an internal representation of template structure: essentially a serialized array of $_blocks, $_blockVariables, $_children and $_functions, may also contain $_triggers. This allows to bypass expensive calls to HTML_Template_Sigma::_buildBlockVariables() and especially HTML_Template_Sigma::_buildBlocks() when reading the "prepared" template instead of the "source" one.

The files in this cache do not have any TTL and are regenerated when the source templates change.

Parameter

string $root

directory name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

setCallbackFunction()

setCallbackFunction() -- Sets a callback function.

Description

Sets a callback function. Sigma templates can contain simple function calls. This means that the author of the template can add a special placeholder to it: func_h1("embedded in h1") Sigma will parse the template for these placeholders and will allow you to define a callback function for them. Callback will be called automatically when the block containing such function call is parse()'d.

Please note that arguments to these template functions can contain variable placeholders: func_translate('Hello, {username}'), but not blocks or other function calls.

This should NOT be used to add logic (except some presentation one) to the template. If you use a lot of such callbacks and implement business logic through them, then you're reinventing the wheel. Consider using XML/XSLT, native PHP or some other template engine.

Script:
<?php
function h_one($arg)
{     
    return '<h1>' . $arg . '</h1>';
}  
// ...  
$tpl = new HTML_Template_Sigma(' ... ');
// ...  
$tpl->setCallbackFunction('h1', 'h_one');
// ...
$tpl->show()
?>
template:
...
func_h1('H1 Headline')
...

Parameter

string $tplFunction

Function name in the template

mixed $callback

A callback: anything that can be passed to call_user_func_array()

boolean $preserveArgs

If TRUE, then no variable substitution in arguments will take place before function call

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

setCurrentBlock()

setCurrentBlock() -- Sets the name of the current block.

Description

Sets the name of the current block: the one in which variables will be substituted.

Parameter

string $block

block name

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

setGlobalVariable()

setGlobalVariable() -- Sets a global variable value.

Description

Sets a global variable value. Global variables are "special": they do not get cleared after substitution and do not make blocks not empty if substituted.

Parameter

mixed $variable

variable name or array ('varname'=>'value')

string $value

variable value if $variable is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

setOption()

setOption() -- Sets the option for the template class

Description

Sets the option for the template class. Currently it understands the following options:

preserve_data

If set to TRUE, then do not substitute variables and remove unused placeholders in data added through setVariable() and setGlobalVariable(). See also bugs #20199 and #21951. Default is FALSE, for performance reasons.

trim_on_save

Whether to trim extra whitespace from template on cache save. Generally safe to have this on, unless you have <pre></pre> in templates or want to preserve HTML indentantion. Default is TRUE

Parameter

string $option

option name

mixed $value

option value

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

setRoot()

setRoot() -- Sets the file root for templates.

Description

Sets the file root for templates. The file root gets prefixed to all filenames passed to the object.

Parameter

string $root

directory name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

setTemplate()

setTemplate() -- Sets the template.

Description

Sets the template. You can either load a template file from disk with loadTemplateFile() or set the template manually using this function.

Parameter

string $template

template content

boolean $removeUnknownVariables

remove unknown/unused variables?

boolean $removeEmptyBlocks

remove empty blocks?

Return value

return SIGMA_OK on success, error object on failure

Note

This function can not be called statically.

setVariable()

setVariable() -- Sets a variable value.

Description

Sets a variable value. The function can be used either like setVariable("varname", "value") or with one array $variables["varname"] = "value" given setVariable($variables)

Parameter

mixed $variable

variable name or array ('varname'=>'value')

string $value

variable value if $variable is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

show()

show() -- Prints a block with all replacements done.

Description

Prints a block with all replacements done.

Parameter

string $block

block name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

touchBlock()

touchBlock() -- Preserves the block even if empty blocks should be removed.

Description

Sometimes you have blocks that should be preserved although they are empty (no placeholder replaced). Think of a shopping basket. If it's empty you have to show a message to the user. If it's filled you have to show the contents of the shopping basket. Now where to place the message that the basket is empty? It's not a good idea to place it in you application as customers tend to like unecessary minor text changes. Having another template file for an empty basket means that one fine day the filled and empty basket templates will have different layouts.

So blocks that do not contain any placeholders but only messages like "Your shopping basked is empty" are introduced. Now if there is no replacement done in such a block the block will be recognized as "empty" and by default ($removeEmptyBlocks = true) be stripped off. To avoid this you can call touchBlock()

Parameter

string $block

block name

Return value

return SIGMA_OK on success, error object on failure

See

see HTML_Template_Sigma::$removeEmptyBlocks

Note

This function can not be called statically.


HTML_Template_Xipe

Table of Contents
Introduction --  A simple, fast and powerful template engine.

The template engine is a compiling engine, all templates are compiled into PHP-files. This will make the delivery of the files faster on the next request, since the template doesn't need to be compiled again. If the template changes it will be recompiled. There is no new template language to learn. Beside the default mode, there is a set of constructs since version 1.6 which allow you to edit your templates with WYSIWYG editors

Introduction

Introduction --  A simple, fast and powerful template engine.

HTML_Template_Xipe Description

The template engine is a compiling engine, all templates are compiled into PHP-files. This will make the delivery of the files faster on the next request, since the template doesn't need to be compiled again. If the template changes it will be recompiled. There is no new template language to learn. Beside the default mode, there is a set of constructs since version 1.6 which allow you to edit your templates with WYSIWYG editors. By default the template engine uses indention for building blocks (you can turn that off). This feature was inspired by Python and by the need I felt to force myself to write proper HTML-code, using proper indentions, to make the code better readable.

Unfortunately, complete documentation is not available at the moment.


Pager

Table of Contents
Introduction -- Usage of Pager 2.x
Pager "Jumping" vs. "Sliding" -- Feature comparison of the two pager styles
Pager::factory() -- Creates a pager instance
Pager::setOptions() -- Set or change option after the Pager object has been constructed
Pager::build() --  Generate or refresh the links and paged data after a call to setOptions()
Pager::getCurrentPageID() -- Returns current page number
Pager::getLinks() --  Returns back/next/first/last and page links, both as ordered and associative array.
Pager::getNextPageID() -- Returns next page number.
Pager::getOffsetByPageId() -- Returns offsets for given pageID.
Pager::getPageData() -- Returns an array of current pages data
Pager::getPageIdByOffset() -- Returns the page number for the given offset
Pager::getPageRangeByPageId() -- Returns offsets for given pageID.
Pager::getPreviousPageID() -- Returns previous page number.
Pager::getPerPageSelectBox() -- Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.
Pager::isFirstPage() -- Returns whether current page is first page
Pager::isLastPage() -- Returns whether current page is last page
Pager::isLastPageComplete() -- Returns whether last page is complete
Pager::numItems() -- Returns number of items
Pager::numPages() -- Returns number of pages
Pager::Pager() -- Creates a pager instance

Data paging class which also builds links to the pages.

Introduction

Introduction -- Usage of Pager 2.x

What is Pager?

Pager is a class to page an array of data. It is taken as input and it is paged according to various parameters. Pager also builds links within a specified range, and allows complete customization of the output (it even works with mod_rewrite). It is compatible with Pager v.1.x and Pager_Sliding API

Example 1

This simple example will page the array of alphabetical letters, giving back pages with 3 letters per page, and links to the previous two / next two pages:
require_once 'Pager.php';
$params = array(
    'mode'       => 'Jumping',
    'perPage'    => 3,
    'delta'      => 2,
    'itemData'   => array('a','b','c','d','e',[...omissis...],'z')
);
$pager = & Pager::factory($params);
$data  = $pager->getPageData();
$links = $pager->getLinks();
//$links is an ordered+associative array with 'back'/'pages'/'next'/'first'/'last'/'all' links.
//NB: $links['all'] is the same as $pager->links;

//echo links to other pages:
echo $links['all'];

//Pager can also generate <link rel="first|prev|next|last"> tags
echo $pager->linkTags;

//Show data for current page:
echo 'PAGED DATA: ' ; print_r($data);

//Results from methods:
echo 'getCurrentPageID()...: '; var_dump($pager->getCurrentPageID());
echo 'getNextPageID()......: '; var_dump($pager->getNextPageID());
echo 'getPreviousPageID()..: '; var_dump($pager->getPreviousPageID());
echo 'numItems()...........: '; var_dump($pager->numItems());
echo 'numPages()...........: '; var_dump($pager->numPages());
echo 'isFirstPage()........: '; var_dump($pager->isFirstPage());
echo 'isLastPage().........: '; var_dump($pager->isLastPage());
echo 'isLastPageComplete().: '; var_dump($pager->isLastPageComplete());
echo '$pager->range........: '; var_dump($pager->range);
In case you're wondering, $pager->range is a numeric array; its keys are the numbers of the pages in the current range, and the matching values are booleans (TRUE if its key represents currentPage, FALSE otherwise). This array can be useful to build the links manually, e.g. when using a template engine.

Example 2

This example shows how you can use this class with mod_rewite. Let's suppose we have a .htaccess like this:
---------
RewriteEngine on
#Options FollowSymlinks

RewriteBase /
RewriteRule ^articles/([a-z]{1,12})/art([0-9]{1,4})\.html$ /article.php?num=$2&amp;month=$1 [L]
---------
It should transform an url like "/articles/march/art15.html" into "/article.php?num=15&month=march"

require_once 'Pager.php';

$month = 'september';
$params = array(
    'mode'      => 'Sliding',
    'append'    => false,
    'urlVar'    => 'num',
    'path'      => 'http://myserver.com/articles/' . $month,
    'fileName'  => 'art%d.html',  //Pager replaces "%d" with page number...
    'itemData'  => array('a','b','c',[...omissis...],'z'),
    'perPage'   => 3
);
$pager = & Pager::factory($params);

$data  = $pager->getPageData();
echo $pager->links;
echo 'Data for current page: '; print_r($data);

More pagers in a single page

Using more than one pager in a single page is as simple as using a different urlVar for each pager:
require_once 'Pager.php';

//first pager
$params1 = array(
    'perPage'    => 3,
    'urlVar'     => pageID_articles,  //1st identifier
    'itemData'   => $someArray
);
$pager1 = & Pager::factory($params1);
$data1  = $pager1->getPageData();
$links1 = $pager1->getLinks();

//second pager
$params2 = array(
    'perPage'    => 8,
    'urlVar'     => pageID_news,      //2nd identifier
    'itemData'   => $someOtherArray
);
$pager2 = & Pager::factory($params2);
$data2  = $pager2->getPageData();
$links2 = $pager2->getLinks();

Pager and big db resultsets

If you want to paginate db resultsets, fetching them all into an array and passing it to Pager might not be the best option. You can still leverage Pager and have good performances using a wrapper. There is a sample wrapper for each one of the PEAR db abstraction systems in the /docs/examples/ dir of the package. You may use it as-is or customize it to your needs.

Adding extra variables to the querystring

If you need to add some extra variables to the querystring, use the extraVars parameter:
$params = array(
    'extraVars' => array(
        'firstKey'  => 'firstValue',
        'secondKey' => 'secondValue',
        //...
    ),
    //...
);
$pager1 = & Pager::factory($params);

Important note for PHP 5 users

Since version 2.2.1, Pager works with PHP 5 too, but you must use the factory() method instead of the constructor (which is deprecated):
require_once 'Pager.php';

//wrong: 
//$pager =& new Pager($params);

//right
$pager =& Pager::factory($params);

//continue as you did before

If you are using a previous revision and cannot update, you must write the following code on PHP 5:
//chose your preferred mode [Jumping | Sliding]:

//require_once 'Pager/Jumping.php';
require_once 'Pager/Sliding.php';

//$pager =& new Pager_Jumping($params);
$pager =& new Pager_Sliding($params);

//continue as you did before

Pager "Jumping" vs. "Sliding"

Pager "Jumping" vs. "Sliding" -- Feature comparison of the two pager styles

What are the differences between the two styles?

Since an example is worth 1000 words:

"Jumping" Pager logic

Let's suppose that the data spans on 15 pages, and the window width is 5 page links. The links are built on "frames" of 5 pages each: [1-5] [6-10] [11-15] Pager in "Jumping" mode always shows the same 5 page links while you are on one of these pages. Here's a temporal succession of the links, starting from page 1 and moving forward. There are brakets around current page number to highlight this:
a)    {1} 2  3  4  5  =>   // first frame: [1-5]
b) <=  1 {2} 3  4  5  =>
c) <=  1  2 {3} 4  5  =>
d) <=  1  2  3 {4} 5  =>
e) <=  1  2  3  4 {5} =>   // HERE IT JUMPS TO THE NEXT FRAME
f) <= {6} 7  8  9 10  =>   // second frame: [6-10]
g) <=  6 {7} 8  9 10  =>
h) <=  6  7 {8} 9 10  =>
and so on. See what a "jumping window" frame is? When you reach a limit (in the example, you go from page 5 to page 6), it "jumps" to next frame (links from page 6 to 10).

"Sliding" Pager logic

Instead of jumping from one frame to the other, with Pager in "Sliding" mode the change is done smoothly, and the current page is always shown at the center of the "window" (except of course for the first and the last pages):
a)       {1} 2  3  4  5  => [15]
b) [1] <= 1 {2} 3  4  5  => [15]
c) [1] <= 1  2 {3} 4  5  => [15]  // HERE IT's STARTING WORKING AS DESIGNED
d) [1] <= 2  3 {4} 5  6  => [15]  // see: current page number is at the center of the window
e) [1] <= 3  4 {5} 6  7  => [15]  // and it stays there...
f) [1] <= 4  5 {6} 7  8  => [15]
g) [1] <= 5  6 {7} 8  9  => [15]
h) [1] <= 6  7 {8} 9 10  => [15]
and so on.

Other differences

Apart from the different "philosophy", there is one difference in the delta parameter: in "Jumping" mode, it's the number of page numbers to show; in "Sliding" mode it's the number of page numbers to show before and after the current one.

Pager::factory()

Pager::factory() -- Creates a pager instance

Parameter

Pager::factory() method takes an associative array of parameters as input values. This is the complete list of these options:

  • itemData [array]

    Array of items to page.

  • totalItems [integer]

    Number of items to page (used only if itemData is not provided).

  • perPage [integer]

    Number of items to display on each page.

  • delta [integer]

    Number of page numbers to display before and after the current one.

  • mode [string]

    "Jumping" or "Sliding" -window - It determines pager behaviour.

  • httpMethod [string]

    Specifies the HTTP method to use. Valid values are 'GET' or 'POST'.

  • formID [string]

    Specifies which HTML form to use in POST mode.

  • importQuery [boolean]

    if true (default behaviour), variables and values are imported from the submitted data (query string) and used in the generated links, otherwise they're ignored completely

  • currentPage [integer]

    Initial page number (if you want to show page #2 by default, set currentPage to 2)

  • expanded [boolean]

    if TRUE, window size is always 2*delta+1

  • linkClass [string]

    Name of CSS class used for link styling.

  • urlVar [string]

    Name of URL var used to indicate the page number. Default value is "pageID".

  • path [string]

    Complete path to the page (without the page name).

  • fileName [string]

    name of the page, with a "%d" if append == TRUE.

  • fixFileName [boolean]

    If set to FALSE, the fileName option is not overridden. Use at your own risk.

  • append [boolean]

    If TRUE pageID is appended as GET value to the URL. If FALSE it is embedded in the URL according to fileName specs.

  • altFirst [string]

    Alt text to display on the link of the first page. Default value is "first page"; if you want a string with the page number, use "%d" as a placeholder (for instance "page %d")

  • altPrev [string]

    Alt text to display on the link of the previous page. Default value is "previous page";

  • altNext [string]

    Alt text to display on the link of the next page. Default value is "next page";

  • altLast [string]

    Alt text to display on the link of the last page. Default value is "last page"; if you want a string with the page number, use "%d" as a placeholder (for instance "page %d")

  • altPage [string]

    Alt text to display before the page number. Default value is "page " (followed by the page number). You can optionally use "%d" as a placeholder (for instance "page n. %d") to place the page number where you want.

  • prevImg [string]

    Something to display instead of "<<". It can be text such as "<< PREV" or an <img/> as well.

  • nextImg [string]

    Something to display instead of ">>". It can be text such as "NEXT >>" or an <img/> as well.

  • separator [string]

    What to use to separate numbers. It can be an <img/>, a comma, an hyphen, or whatever.

  • spacesBeforeSeparator [integer]

    Number of spaces before the separator.

  • spacesAfterSeparator [integer]

    Number of spaces after the separator.

  • curPageLinkClassName [string]

    CSS class name for the current page link.

  • curPageSpanPre [string]

    Text before the current page link.

  • curPageSpanPost [string]

    Text after the current page link.

  • firstPagePre [string]

    String used before the first page number. It can be an <img/>, a "{", an empty string, or whatever.

  • firstPageText [string]

    String used in place of the first page number.

  • firstPagePost [string]

    String used after the first page number. It can be an <img/>, a "}", an empty string, or whatever.

  • lastPagePre [string]

    Similar to firstPagePre, but used for last page number.

  • lastPageText [string]

    Similar to firstPageText, but used for last page number.

  • lastPagePost [string]

    Similar to firstPagePost, but used for last page number.

  • clearIfVoid [boolean]

    if there's only one page, don't display pager links (returns an empty string).

  • extraVars [array]

    additional URL vars to be added to the querystring.

  • excludeVars [array]

    URL vars to be excluded from the querystring.

  • useSessions [boolean]

    if TRUE, number of items to display per page is stored in the $_SESSION[$_sessionVar] var.

  • closeSession [boolean]

    if TRUE, the session is closed just after R/W.

  • sessionVar [string]

    Name of the session var for perPage value. A value different from default can be useful when using more than one Pager istance in the page.

  • showAllText [string]

    Text to be used for the 'show all' option in the select box generated by getPerPageSelectBox()

  • pearErrorMode [constant]

    PEAR_ERROR mode for raiseError(). Default is PEAR_ERROR_RETURN.

REQUIRED options are:

  • fileName IF append==FALSE (default is TRUE)

  • itemData OR totalItems (if itemData is set, totalItems is overwritten)

Return value

object - a specific Pager instance or a PEAR_Error object, if fails

Pager::setOptions()

Pager::setOptions() -- Set or change option after the Pager object has been constructed

Description

Remember to call build() after this method to regenerate the data and the links.

Parameter

  • integer $index - an associative array of options. See Pager::factory() for the full list of options.

Return value

return PAGER_OK constant on success

Pager::build()

Pager::build() --  Generate or refresh the links and paged data after a call to setOptions()

Description

  • If you want to change an option after the Pager object has been constructed, after the call to setOptions() you have to generate or refresh the links and paged data with this method.

Pager::getCurrentPageID()

Pager::getCurrentPageID() -- Returns current page number

Return value

integer - Current page number.

Pager::getLinks()

Pager::getLinks() --  Returns back/next/first/last and page links, both as ordered and associative array.

Parameter

  • integer $pageID - Optional pageID. If specified, linksfor that page are provided instead of current one.

Return value

return back/pages/next/first/last/all links, both as numeric and associative array.

Pager::getNextPageID()

Pager::getNextPageID() -- Returns next page number.

Description

If current page is last page this function returns FALSE, otherwise returns next page number.

Return value

return Next page number or FALSE

Pager::getOffsetByPageId()

Pager::getOffsetByPageId() -- Returns offsets for given pageID.

Description

Returns offsets for given pageID. Eg, if you pass it pageID one and your perPage limit is 10 it will return (1, 10). pageID=2 would give you (11, 20).

if the method is called without parameter, pageID is set to currentPage

Parameter

  • integer $pageid - PageID to get offsets for

Return value

return array with first and last offsets

Deprecated

deprecated

Pager::getPageData()

Pager::getPageData() -- Returns an array of current pages data

Parameter

  • integer $pageID - Desired page ID (optional)

Return value

return array of data for this page.

Pager::getPageIdByOffset()

Pager::getPageIdByOffset() -- Returns the page number for the given offset

Description

This method is only available in "Jumping" mode.

Parameter

  • integer $index - Offset to get pageID for

Return value

return Page number for this offset

Pager::getPageRangeByPageId()

Pager::getPageRangeByPageId() -- Returns offsets for given pageID.

Description

Given a PageId, it returns the limits of the range of pages displayed. While getOffsetByPageId() returns the offset of the data within the current page, this method returns the offsets of the page numbers interval.

E.g., in "Jumping" mode, if you have pageId=3 and delta=10, it will return (1, 10). pageID=8 would give you (1, 10) as well, because 1 <= 8 <= 10. pageID=11 would give you (11, 20).

In "Sliding" mode, if you have pageId=5 and delta=2, it will return (3, 7). pageID of 9 would give you (4, 8).

if the method is called without parameter, pageID is set to currentPage number

Parameter

  • integer $pageid - PageID to get offsets for

Return value

return array with first and last offsets

Pager::getPreviousPageID()

Pager::getPreviousPageID() -- Returns previous page number.

Description

If current page is first page this function returns FALSE, otherwise returns previous page number.

Return value

return Previous page number or FALSE.

Pager::getPerPageSelectBox()

Pager::getPerPageSelectBox() -- Returns a string with a XHTML SELECT menu, to choose how many items per page should be displayed.

Parameter

  • integer $start - Min. number of items per page (optional)

  • integer $end - Max. number of items per page (optional)

  • integer $step - Increment between two options (optional)

  • boolean $showAllData - If true, perPage is set equal to totalItems (optional)

  • array $extraParams (optional)

    • 'optionText': text to show in each option. Use '%d' where you want to see the number of pages selected.

    • 'attributes': (html attributes) Tag attributes or HTML attributes (id="foo" pairs), will be inserted in the <select> tag.

    • 'checkMaxLimit': if true, Pager checks if $end is bigger than $totalItems, and doesn't show the extra select options.

Description

Returns a string with a XHTML SELECT menu, useful for letting the user choose how many items per page should be displayed. If parameter useSessions is TRUE, this value is stored in a session var. The string isn't echoed right away so you can use it with template engines.

Example

This example shows how you can create a select box to let your users choose the number of items to display on each page.
include 'Pager/Pager.php';

$params = array(
    'mode'       => 'Jumping',
    'perPage'    => 3,
    'delta'      => 2,
    'itemData'   => array('a','b','c','d','e',[...omissis...],'z')
);
$pager = & Pager::factory($params);

$selectBox = $pager->getPerPageSelectBox();

echo '<form action="' . htmlspecialchars($_SERVER['PHP_SELF']) . '" method="GET">';
echo $selectBox;
echo '<input type="submit" value="submit" />';
echo '</form>';

Return value

return string with the XHTML SELECT menu.

Pager::isFirstPage()

Pager::isFirstPage() -- Returns whether current page is first page

Return value

return TRUE or FALSE, wrt it is the first page or not.

Pager::isLastPage()

Pager::isLastPage() -- Returns whether current page is last page

Return value

return TRUE or FALSE, wrt it is the last page or not.

Pager::isLastPageComplete()

Pager::isLastPageComplete() -- Returns whether last page is complete

Return value

return TRUE or FALSE, wrt the last page is complete (i.e. it has perPage values in the array for the last page) or not.

Pager::numItems()

Pager::numItems() -- Returns number of items

Return value

return integer - Number of items

Pager::numPages()

Pager::numPages() -- Returns number of pages

Return value

return integer - Number of pages

Pager::Pager()

Pager::Pager() -- Creates a pager instance

Deprecated

The constructor is deprecated in favour of the new factory() method, which is PHP5 compatible too.

Parameter

Pager constructor takes an associative array of parameters as input values. This is the complete list of these options:

  • itemData [array]

    Array of items to page.

  • totalItems [integer]

    Number of items to page (used only if itemData is not provided).

  • perPage [integer]

    Number of items to display on each page.

  • delta [integer]

    Number of page numbers to display before and after the current one.

  • mode [string]

    "Jumping" or "Sliding" -window - It determines pager behaviour.

  • expanded [boolean]

    if TRUE, window size is always 2*delta+1

  • linkClass [string]

    Name of CSS class used for link styling.

  • urlVar [string]

    Name of URL var used to indicate the page number. Default value is "pageID".

  • path [string]

    Complete path to the page (without the page name).

  • fileName [string]

    name of the page, with a "%d" if append == TRUE.

  • append [boolean]

    If TRUE pageID is appended as GET value to the URL. If FALSE it is embedded in the URL according to fileName specs.

  • altPrev [string]

    Alt text to display for prev page, on prev link. Default value is "previous page";

  • altNext [string]

    Alt text to display for next page, on next link. Default value is "next page";

  • altPage [string]

    Alt text to display before the page number. Default value is "page ".

  • prevImg [string]

    Something to display instead of "<<". It can be text such as "<< PREV" or an <img/> as well.

  • nextImg [string]

    Something to display instead of ">>". It can be text such as "NEXT >>" or an <img/> as well.

  • separator [string]

    What to use to separate numbers. It can be an <img/>, a comma, an hyphen, or whatever.

  • spacesBeforeSeparator [integer]

    Number of spaces before the separator.

  • spacesAfterSeparator [integer]

    Number of spaces after the separator.

  • firstPagePre [string]

    String used before first page number. It can be an <img/>, a "{", an empty string, or whatever.

  • firstPageText [string]

    String used in place of first page number.

  • firstPagePost [string]

    String used after first page number. It can be an <img/>, a "}", an empty string, or whatever.

  • lastPagePre [string]

    Similar to firstPagePre, but used for last page number.

  • lastPageText [string]

    Similar to firstPageText, but used for last page number.

  • lastPagePost [string]

    Similar to firstPagePost, but used for last page number.

  • curPageLinkClassName [string]

    Name of CSS class used for current page link.

  • clearIfVoid [boolean]

    if there's only one page, don't display pager (returns an empty string).

  • useSessions [boolean]

    if TRUE, number of items to display per page is stored in the $_SESSION[$_sessionVar] var.

  • closeSession [boolean]

    if TRUE, the session is closed just after R/W.

  • sessionVar [string]

    Name of the session var for perPage value. A value different from default can be useful when using more than one Pager istance in the page.

  • pearErrorMode [constant]

    PEAR_ERROR mode for raiseError(). Default is PEAR_ERROR_RETURN.

REQUIRED options are:

  • fileName IF append==FALSE (default is TRUE)

  • itemData OR totalItems (if itemData is set, totalItems is overwritten)

Return value

object - a specific Pager instance or a PEAR_Error object, if fails


Pager_Sliding

Table of Contents
Introduction -- Usage of Pager_Sliding
Pager (v.1.x) vs. Pager_Sliding -- Feature comparison of the two classes
Pager_Sliding::getCurrentPageID() -- Returns current page number
Pager_Sliding::getLinks() --  Returns back/next/first/last and page links, both as ordered and associative array.
Pager_Sliding::getNextPageID() -- Returns next page number.
Pager_Sliding::getOffsetByPageId() -- Returns offsets for given pageID.
Pager_Sliding::getPageData() -- Returns an array of current pages data
Pager_Sliding::getPageIdByOffset() -- Overload PEAR::Pager method. VOID.
Pager_Sliding::getPreviousPageID() -- Returns previous page number.
Pager_Sliding::isFirstPage() -- Returns whether current page is first page
Pager_Sliding::isLastPage() -- Returns whether current page is last page
Pager_Sliding::isLastPageComplete() -- Returns whether last page is complete
Pager_Sliding::numItems() -- Returns number of items
Pager_Sliding::numPages() -- Returns number of pages
Pager_Sliding::Sliding() -- Creates a pager instance

Data paging class which also builds links to the pages.

Introduction

Introduction -- Usage of Pager_Sliding

What is Pager_Sliding?

Pager_Sliding is a class to page an array of data. It is taken as input and it is paged according to various parameters. Pager_Sliding also builds links within a specified range, and allows complete customization of the output (it even works with mod_rewrite). It is compatible with PEAR::Pager's API

Deprecated

This package is deprecated in favour of the new Pager v.2.x.

Example 1

This simple example will page the array of alphabetical letters, giving back pages with 3 letters per page, and links to the previous two / next two pages:
require_once 'Pager/Sliding.php';
$params = array(
            'perPage'    => 3,
            'delta'      => 2,
            'itemData'   => array('a','b','c','d','e',[...omissis...],'z')
            );
$pager = & new Pager_Sliding($params);
$data  = $pager->getPageData();
$links = $pager->getLinks();
//$links is an ordered+associative array with 'back'/'pages'/'next'/'first'/'last'/'all' links.
//NB: $links['all'] is the same as $pager->links;

//echo links to other pages:
echo $links['all']

//Show data for current page:
echo 'PAGED DATA: ' ; print_r($data);

//Results from methods:
echo 'getCurrentPageID()...: '; var_dump($pager->getCurrentPageID());
echo 'getNextPageID()......: '; var_dump($pager->getNextPageID());
echo 'getPreviousPageID()..: '; var_dump($pager->getPreviousPageID());
echo 'numItems()...........: '; var_dump($pager->numItems());
echo 'numPages()...........: '; var_dump($pager->numPages());
echo 'isFirstPage()........: '; var_dump($pager->isFirstPage());
echo 'isLastPage().........: '; var_dump($pager->isLastPage());
echo 'isLastPageComplete().: '; var_dump($pager->isLastPageComplete());
echo '$pager->range........: '; var_dump($pager->range);
In case you're wondering, $pager->range is a numeric array; its keys are the numbers of the pages in the current range, and the matching values are booleans (TRUE if its key represents currentPage, FALSE otherwise). This array can be useful to build the links manually, e.g. when using a template engine.

Example 2

This example shows how you can use this class with mod_rewite. Let's suppose we have a .htaccess like this:
---------
RewriteEngine on
#Options FollowSymlinks

RewriteBase /
RewriteRule ^articles/([a-z]{1,12})/art([0-9]{1,4})\.html$ /article.php?num=$2&amp;month=$1 [L]
---------
It should transform an url like "/articles/march/art15.html" into "/article.php?num=15&month=march"

require_once 'Pager/Sliding.php';

$month = 'september';
$params = array(
            'append'    => false,
            'urlVar'    => 'num',
            'path'      => 'http://myserver.com/articles/' . $month,
            'fileName'  => 'art%d.html',  //Pager replaces "%d" with page number...
            'itemData'  => array('a','b','c',[...omissis...],'z'),
            'perPage'   => 3
            );
$pager = & new Pager_Sliding($params);

$data  = $pager->getPageData();
echo $pager->links;
echo 'Data for current page: '; print_r($data);

More pagers in a single page

Using more than one pager in a single page is as simple as using a different urlVar for each pager:
require_once 'Pager/Sliding.php';

//first pager
$params1 = array(
            'perPage'    => 3,
            'urlVar'     => pageID_articles,  //1st identifier
            'itemData'   => $someArray
            );
$pager1 = & new Pager_Sliding($params1);
$data1  = $pager1->getPageData();
$links1 = $pager1->getLinks();

//second pager
$params2 = array(
            'perPage'    => 8,
            'urlVar'     => pageID_news,      //2nd identifier
            'itemData'   => $someOtherArray
            );
$pager2 = & new Pager_Sliding($params2);
$data2  = $pager2->getPageData();
$links2 = $pager2->getLinks();

Pager (v.1.x) vs. Pager_Sliding

Pager (v.1.x) vs. Pager_Sliding -- Feature comparison of the two classes

What are the differences with Pager?

While Pager v.1.x has a "jumping window" style, Pager_Sliding has a "sliding window" style. What does that mean? Let's see an example:

Pager v.1.x logic

Let's suppose that the data spans on 15 pages, and the window width is 5 page links. The links are built on "frames" of 5 pages each: [1-5] [6-10] [11-15] Pager v.1.x always shows the same 5 page links while you are on one of these pages. Here's a temporal succession of the links, starting from page 1 and moving forward. There are brakets around current page number to highlight this:
a)    {1} 2  3  4  5  =>   // first frame: [1-5]
b) <=  1 {2} 3  4  5  =>
c) <=  1  2 {3} 4  5  =>
d) <=  1  2  3 {4} 5  =>
e) <=  1  2  3  4 {5} =>   // HERE IT JUMPS TO THE NEXT FRAME
f) <= {6} 7  8  9 10  =>   // second frame: [6-10]
g) <=  6 {7} 8  9 10  =>
h) <=  6  7 {8} 9 10  =>
and so on. See what a "jumping window" frame is? When you reach a limit (in the example, you go from page 5 to page 6), it "jumps" to next frame (links from page 6 to 10).

Pager_Sliding logic

Instead of jumping from one frame to the other, with Pager_Sliding the change is done smoothly, and the current page is always shown at the center of the "window" (except of course for the first and the last pages):
a)       {1} 2  3  4  5  => [15]
b) [1] <= 1 {2} 3  4  5  => [15]
c) [1] <= 1  2 {3} 4  5  => [15]  // HERE IT's STARTING WORKING AS DESIGNED
d) [1] <= 2  3 {4} 5  6  => [15]  // see: current page number is at the center of the window
e) [1] <= 3  4 {5} 6  7  => [15]  // and it stays there...
f) [1] <= 4  5 {6} 7  8  => [15]
g) [1] <= 5  6 {7} 8  9  => [15]
h) [1] <= 6  7 {8} 9 10  => [15]
and so on.

Other differences

Apart from the different "philosophy", Pager_Sliding is also designed to be highly customizable.

UPDATE: since Pager 2.x release, every option once only available in Pager_Sliding is now fully implemented in Pager too, and more. As stated in the Intro, Pager_Sliding is now deprecated in favour of the new Pager v.2.x. You can have both behaviours ("Jumping" and "Sliding") in Pager v.2.x, just change the mode. Please refer to Pager docs for more details.

  • There are *many* options to change the look and feel of the links in your page. They are explained in the constructor docs.

  • It can work with Apache mod_rewrite module too, see the examples for that.

  • It is "template"-friendly, i.e. you can assign the processed links and page numbers to your custom vars and use them to draw your link bar according to your page layout, without worrying about the underlying logic.

  • You can easily extend the class; this is useful if you plan to use the class in many different pages and you don't want to set the same options everytime: just set your preferred default values in your extending class and you're done!

Pager_Sliding::getCurrentPageID()

Pager_Sliding::getCurrentPageID() -- Returns current page number

Return value

integer - Current page number.

Pager_Sliding::getLinks()

Pager_Sliding::getLinks() --  Returns back/next/first/last and page links, both as ordered and associative array.

Parameter

  • integer $pageID - Optional pageID. If specified, linksfor that page are provided instead of current one.

Return value

return back/pages/next/first/last/all links, both as numeric and associative array.

Pager_Sliding::getNextPageID()

Pager_Sliding::getNextPageID() -- Returns next page number.

Description

If current page is last page this function returns FALSE, otherwise returns next page number.

Return value

return Next page number or FALSE

Pager_Sliding::getOffsetByPageId()

Pager_Sliding::getOffsetByPageId() -- Returns offsets for given pageID.

Description

Eg, if you pass it pageID = 5 and your delta is 2 it will return you 3 and 7. PageID of 6 would give you 4 and 8

NB: The behaviour of this function could be misleading: it was left only for compatibility with PEAR::Pager. It could raise some confusion when pageID is within delta positions from an extreme: in fact this method returns also the extremes, while $this->_getPageLinks leaves them out. Pager_Sliding works this way: if pageID is NOT an extreme, show first and last page within brackets: [1] << 5 | _6_ | 7 >> [15] So when dealing with pageID within delta positions from an extreme, this method would return the extreme as well, while $this->_getPageLinks would return (for instance) 2 | _3_ | 4 | 5 even if pageID is 3 and delta is 2. Consider this method deprecated and/or subject to changes.

Parameter

  • integer $pageid - PageID to get offsets for

Return value

return array with first and last offsets

Deprecated

deprecated

Pager_Sliding::getPageData()

Pager_Sliding::getPageData() -- Returns an array of current pages data

Parameter

  • integer $pageID - Desired page ID (optional)

Return value

return array of data for this page.

Pager_Sliding::getPageIdByOffset()

Pager_Sliding::getPageIdByOffset() -- Overload PEAR::Pager method. VOID.

Parameter

  • integer $index - Offset to get pageID for

Return value

return Page number for this offset

Deprecated

deprecated. It is only here for compatibility with PEAR::Pager.

Pager_Sliding::getPreviousPageID()

Pager_Sliding::getPreviousPageID() -- Returns previous page number.

Description

If current page is first page this function returns FALSE, otherwise returns previous page number.

Return value

return Previous page number or FALSE.

Pager_Sliding::isFirstPage()

Pager_Sliding::isFirstPage() -- Returns whether current page is first page

Return value

return TRUE or FALSE, wrt it is the first page or not.

Pager_Sliding::isLastPage()

Pager_Sliding::isLastPage() -- Returns whether current page is last page

Return value

return TRUE or FALSE, wrt it is the last page or not.

Pager_Sliding::isLastPageComplete()

Pager_Sliding::isLastPageComplete() -- Returns whether last page is complete

Return value

return TRUE or FALSE, wrt the last page is complete (i.e. it has perPage values in the array for the last page) or not.

Pager_Sliding::numItems()

Pager_Sliding::numItems() -- Returns number of items

Return value

return integer - Number of items

Pager_Sliding::numPages()

Pager_Sliding::numPages() -- Returns number of pages

Return value

return integer - Number of pages

Pager_Sliding::Sliding()

Pager_Sliding::Sliding() -- Creates a pager instance

Parameter

Pager_Sliding constructor takes an associative array of parameters as input values. This is the complete list of these options:

  • itemData [array]

    Array of items to page.

  • totalItems [integer]

    Number of items to page (used only if itemData is not provided).

  • perPage [integer]

    Number of items to display on each page.

  • delta [integer]

    Number of page numbers to display before and after the current one.

  • expanded [boolean]

    if TRUE, window size is always 2*delta+1

  • linkClass [string]

    Name of CSS class used for link styling.

  • urlVar [string]

    Name of URL var used to indicate the page number. Default value is "pageID".

  • path [string]

    Complete path to the page (without the page name).

  • fileName [string]

    name of the page, with a "%d" if append == TRUE.

  • append [boolean]

    If TRUE pageID is appended as GET value to the URL. If FALSE it is embedded in the URL according to fileName specs.

  • altPrev [string]

    Alt text to display for prev page, on prev link. Default value is "previous page";

  • altNext [string]

    Alt text to display for next page, on next link. Default value is "next page";

  • altPage [string]

    Alt text to display before the page number. Default value is "page ".

  • prevImg [string]

    Something to display instead of "<<". It can be text such as "<< PREV" or an <img/> as well.

  • nextImg [string]

    Something to display instead of ">>". It can be text such as "NEXT >>" or an <img/> as well.

  • separator [string]

    What to use to separate numbers. It can be an <img/>, a comma, an hyphen, or whatever.

  • spacesBeforeSeparator [integer]

    Number of spaces before the separator.

  • spacesAfterSeparator [integer]

    Number of spaces after the separator.

  • firstPagePre [string]

    String used before first page number. It can be an <img/>, a "{", an empty string, or whatever.

  • firstPagePost [string]

    String used after first page number. It can be an <img/>, a "}", an empty string, or whatever.

  • lastPagePre [string]

    Similar to firstPagePre, but used for last page number.

  • lastPagePost [string]

    Similar to firstPagePost, but used for last page number.

  • curPageLinkClassName [string]

    Name of CSS class used for current page link.

  • lastPagePost [boolean]

    if there's only one page, don't display pager (returns an empty string).

REQUIRED options are:

  • fileName IF append==FALSE (default is TRUE)

  • itemData OR totalItems (if itemData is set, totalItems is overwritten)

Return value

object - a specific Pager_Sliding instance or a PEAR_Error object, if fails


Chapter 46. HTTP

Provides Packages for working with the Hyper-Text-Transfer-Protocol.



HTTP

Table of Contents
HTTP::Date -- format a date
HTTP::head -- sends a "HEAD" command
HTTP::negotiateLanguage -- Negotiate language with the user's browser
HTTP::redirect -- redirects the client

Provides a set of usefull, static functions related to the Hyper-Text-Transfer-Protocol.

HTTP::Date

HTTP::Date -- format a date

Description

Converts a UNIX timestamp into an RFC compliant HTTP header line. This function honors the "y2k_compliance" php.ini directive.

Parameter

  • integer $time - a UNIX timestamp

Return value

string - a RFC compliant date header line

Note

This function can be called statically.

HTTP::head

HTTP::head -- sends a "HEAD" command

Description

Sends a "HEAD" HTTP command to a server and returns the headers in an associative array.

Parameter

  • string $url - a valid absolute URL

Return value

array - an array containing the header lines or a PEAR_Error.

Example output:
Array
(
    [response_code] => 200
    [response] => HTTP/1.1 200 OK
    [Date] => Tue, 25 Nov 2003 22:08:57 GMT
    [Server] => Apache/1.3.27 (Unix)  (Red-Hat/Linux)
    [Last-Modified] => Wed, 08 Jan 2003 23:11:55 GMT
    [ETag] => "3f80f-1b6-3e1cb03b"
    [Accept-Ranges] => bytes
    [Content-Length] => 438
    [Connection] => close
    [Content-Type] => text/html
)

Note

This function can be called statically.

HTTP::negotiateLanguage

HTTP::negotiateLanguage -- Negotiate language with the user's browser

Description

Negotiate language with the user's browser through the Accept-Language HTTP header or the user's host address. Language codes are generally in the form "ll" for a language spoken in only one country, or "ll-CC" for a language spoken in a particular country. For example, U.S. English is "en-US", while British English is "en-UK". Portugese as spoken in Portugal is "pt-PT", while Brazilian Portugese is "pt-BR". Two-letter country codes can be found in the ISO 3166 standard.

Quantities in the Accept-Language: header are supported, for example:
Accept-Language: en-UK;q=0.7, en-US;q=0.6, no;q=1.0, dk;q=0.8

Example

This example negotiates with the user agent if any of the languages, which are specified in supported, are supported on the user's system. If the negotiation has a positive result, the language code of the most preferred language is printed. Otherwise the default language code (en-US) is printed.

Being able to perform language negotiation is a big help when developing internationalized website with pages, that are available in more than one language. Using negotiation, the user will always get pages in the language which he prefers. (Assuming that their user agent is configured properly.)

Parameter

  • array $supported - an associative array indexed by language codes (country codes) supported by the application. Values must evaluate to TRUE.

  • string $default - the default language that should be used if none of the other languages are found during negotiation.

Return value

string - a language code

Note

This function can be called statically.

The returned language is only a hint! Sending the accepted languages by the client is optional. The language settings of the browser do not have to meet the user's native language - for example a german traveller in a spanish internet cafe. You can improve your result by combining it with the result of the Net_Geo package. Apart from that, you should still give the user the chance to manually choose their preferred language menu.

HTTP::redirect

HTTP::redirect -- redirects the client

Description

This function redirects the client. This is done by issuing a Location: header and exiting.

Parameter

  • string $url - the new URL, where to client should be redirected to.

Note

This function can be called statically.

Avoid sending any kind of data to the client before calling redirect().

The location header requires an absolute URL. If not given, redirect() tries to build one from $url. So if the redirect fails, set the absolute URL manually as argument.


HTTP_Client

Table of Contents
Class Summary HTTP_Client -- A simple HTTP client class.
constructor HTTP_Client::HTTP_Client() -- Constructor
HTTP_Client::attach() -- Adds a Listener to the list of listeners that are notified of the object's events
HTTP_Client::currentResponse() -- Returns the most recent HTTP response
HTTP_Client::detach() -- Removes a Listener from the list of listeners
HTTP_Client::get() -- Sends a 'GET' HTTP request
HTTP_Client::head() -- Sends a 'HEAD' HTTP request
HTTP_Client::post() -- Sends a 'POST' HTTP request
HTTP_Client::reset() -- Clears object's internal properties
HTTP_Client::setDefaultHeader() -- Sets default header(s) for HTTP requests
HTTP_Client::setMaxRedirects() -- Sets the maximum number of redirects that will be processed.
HTTP_Client::setRequestParameter() -- Sets parameter(s) for HTTP requests
Class Summary HTTP_Client_CookieManager -- Stores cookies and passes them between HTTP requests.
constructor HTTP_Client_CookieManager::HTTP_Client_CookieManager() -- Constructor
HTTP_Client_CookieManager::addCookie() -- Explicitly adds cookie to the list
HTTP_Client_CookieManager::passCookies() -- Adds cookies to the request
HTTP_Client_CookieManager::reset() -- Clears the cookies list
HTTP_Client_CookieManager::updateCookies() -- Updates cookie list from HTTP server response

Class Summary HTTP_Client

Class Summary HTTP_Client -- A simple HTTP client class.

HTTP_Client

A simple HTTP client class. The class wraps around HTTP_Request providing a higher-level API for performing multiple HTTP requests. It handles HTTP redirects, stores cookies and sets referrers between requests.

Class Trees for HTTP_Client

  • HTTP_Client

constructor HTTP_Client::HTTP_Client()

constructor HTTP_Client::HTTP_Client() -- Constructor

Description

Sets default request parameters and default headers.

Parameter

array $defaultRequestParams

Parameters to pass to HTTP_Request's constructor

array $defaultHeaders

Default headers to send on every request

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client::attach()

HTTP_Client::attach() -- Adds a Listener to the list of listeners that are notified of the object's events

Description

The attached Listeners are notified of the following events:

'request'

sent before a HTTP request that is not a result of previous redirect.

'httpSuccess'

sent upon receiving a successfull 2xx response (or 3xx response, if it is not a redirect or if redirect processing is disabled).

'httpRedirect'

sent when a 3xx redirection response is received, before following a redirect

'httpError'

sent on 4xx, 5xx response

If $propagate is TRUE the Listener will be attached to the created HTTP_Request objects and will be notified of their events as well.

Parameter

object HTTP_Request_Listener &$listener

Listener instance to attach

boolean $propagate

Whether the listener should be attached to the created HTTP_Request objects

Return value

returns whether the listener was successfully attached

Throws

throws no exceptions thrown

See

see detach()

Note

This function can not be called statically.

HTTP_Client::currentResponse()

HTTP_Client::currentResponse() -- Returns the most recent HTTP response

Description

The returned array has the following keys: 'code', 'headers', 'body'.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client::detach()

HTTP_Client::detach() -- Removes a Listener from the list of listeners

Description

This package is not documented yet.

Parameter

object HTTP_Request_Listener &$listener

Listener instance to detach

Return value

returns whether the listener was successfully detached

Throws

throws no exceptions thrown

See

see attach()

Note

This function can not be called statically.

HTTP_Client::get()

HTTP_Client::get() -- Sends a 'GET' HTTP request

Description

This package is not documented yet.

Parameter

string $url

URL

mixed $data

additional data to send

boolean $preEncoded

Whether the data is already urlencoded

Return value

returns HTTP response code

Throws

throws PEAR_Error

Note

This function can not be called statically.

HTTP_Client::head()

HTTP_Client::head() -- Sends a 'HEAD' HTTP request

Description

This package is not documented yet.

Parameter

string $url

URL

Return value

returns HTTP response code

Throws

throws PEAR_Error

Note

This function can not be called statically.

HTTP_Client::post()

HTTP_Client::post() -- Sends a 'POST' HTTP request

Description

This package is not documented yet.

Parameter

string $url

URL

mixed $data

Data to send

boolean $preEncoded

Whether the data is already urlencoded

array $files

Files to upload. Elements of the array should have the form: array(name, filename(s)[, content type]), see HTTP_Request::addFile()

Return value

returns HTTP response code

Throws

throws PEAR_Error

Note

This function can not be called statically.

HTTP_Client::reset()

HTTP_Client::reset() -- Clears object's internal properties

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client::setDefaultHeader()

HTTP_Client::setDefaultHeader() -- Sets default header(s) for HTTP requests

Description

These are standard HTTP headers that will be sent by all created HTTP_Request objects.

Parameter

mixed $name

header name or array ('header name' => 'header value')

string $value

header value if $name is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client::setMaxRedirects()

HTTP_Client::setMaxRedirects() -- Sets the maximum number of redirects that will be processed.

Description

Setting this value to 0 disables redirect processing. If it is not 0 and the number of redirects after a request is bigger than this number, then an error will be raised.

Parameter

integer $value

Max number of redirects to process

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client::setRequestParameter()

HTTP_Client::setRequestParameter() -- Sets parameter(s) for HTTP requests

Description

These parameters will be passed to constructors of created HTTP_Request instances.

Parameter

mixed $name

parameter name or array ('parameter name' => 'parameter value')

string $value

parameter value if $name is not an array

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary HTTP_Client_CookieManager

Class Summary HTTP_Client_CookieManager -- Stores cookies and passes them between HTTP requests.

HTTP_Client_CookieManager

Stores cookies and passes them between HTTP requests. While this class is a part of HTTP_Client package, it can be used separately.

Class Trees for HTTP_Client_CookieManager

  • HTTP_Client_CookieManager

constructor HTTP_Client_CookieManager::HTTP_Client_CookieManager()

constructor HTTP_Client_CookieManager::HTTP_Client_CookieManager() -- Constructor

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client_CookieManager::addCookie()

HTTP_Client_CookieManager::addCookie() -- Explicitly adds cookie to the list

Description

This package is not documented yet.

Parameter

array $cookie

An array representing cookie, this function expects all of the array's fields ('name', 'value', 'domain', 'path', 'expires', 'secure') to be set.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client_CookieManager::passCookies()

HTTP_Client_CookieManager::passCookies() -- Adds cookies to the request

Description

The method sends only the cookies that should be sent with the request and it adds them in right order.

Parameter

object HTTP_Request &$request

HTTP_Request object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client_CookieManager::reset()

HTTP_Client_CookieManager::reset() -- Clears the cookies list

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

HTTP_Client_CookieManager::updateCookies()

HTTP_Client_CookieManager::updateCookies() -- Updates cookie list from HTTP server response

Description

This method gets the cookies from HTTP response received by HTTP_Request instance and adds them to the object's internal list.

Parameter

object HTTP_Request &$request

HTTP_Request object containing the HTTP response, i.e. its sendRequest() should already be called.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


HTTP_Download

Table of Contents
Intro --  Introduction in usage of HTTP_Download
HTTP_Download::HTTP_Download() -- Constructor
HTTP_Download::setParams() -- Set various parameters
HTTP_Download::setFile() --  Set file path
HTTP_Download::setData() -- Set raw data
HTTP_Download::setResource() -- Set resource for download
HTTP_Download::setGzip() --  Whether to gzip the download on the fly or not. (requires ext/zlib)
HTTP_Download::setCache() --  Whether to allow caching of the download on the clients side.
HTTP_Download::setCacheControl() --  Control cache privacy and validity.
HTTP_Download::setBufferSize() --  Set size of buffer in bytes.
HTTP_Download::setThrottleDelay() --  Set throttle delay in seconds
HTTP_Download::setContentType() --  Set content type
HTTP_Download::setLastModified() --  Set "Last-Modified"
HTTP_Download::setContentDisposition() --  Set content disposition
HTTP_Download::guessContentType() -- Guess content type of file
HTTP_Download::send() -- Send file
HTTP_Download::staticSend() --  Static send
HTTP_Download::sendArchive() --  Send an archive created on the fly

Send HTTP Downloads

Intro

Intro --  Introduction in usage of HTTP_Download

Introduction

HTTP_Download provides an interface to easily send any arbitrary data to HTTP clients. HTTP_Download can gain its data from variables, files or stream resources.

With this package you can easily handle (hidden) downloads. Hidden means not accessible by the public - for instance if you want to restrict access to particular downloads.

It supports HTTP compression, caching and partial downloads, resuming and sending raw data, for example from database BLOBs.

ATTENTION: You shouldn't use this package together with ob_gzhandler or zlib.output_compression enabled in your php.ini, especially if you want to send already gzipped data!

HTTP_Download::HTTP_Download()

HTTP_Download::HTTP_Download() -- Constructor

Description

Creates an instance of an HTTP_Download object and sets supplied parameters.

Parameter

  • array $params - An associative array of parameters:

    • one of:

      • $params['file'] - filepath

      • $params['data'] - raw data

      • $params['resource'] - resource handle

    • and any of:

      • $params['gzip'] - whether to gzip the download

      • $params['cache'] - whether to allow client side caching of the download

      • $params['lastmodified'] - unix timestamp of last modification

      • $params['contenttype'] - content type

      • $params['contentdisposition'] - content disposition

      • $params['buffersize'] - amount of bytes read at once from files or resources

      • $params['throttledelay'] - amount of seconds to sleep after each chunk that has been sent

      • $params['cachecontrol'] - cache privacy and validity

HTTP_Download::setParams()

HTTP_Download::setParams() -- Set various parameters

Description

Set the parameters for the download.

You can use this method as an alternative to passing the parameters in the constructor or calling the setter of each parameter.

Parameter

  • array $params - An associative array of parameters:

    • one of:

      • $params['file'] - filepath

      • $params['data'] - raw data

      • $params['resource'] - resource handle

    • and any of:

      • $params['gzip'] - whether to gzip the download

      • $params['cache'] - whether to allow client side caching of the download

      • $params['lastmodified'] - unix timestamp of last modification

      • $params['contenttype'] - content type

      • $params['contentdisposition'] - content disposition

      • $params['buffersize'] - amount of bytes read at once from files or resources

      • $params['throttledelay'] - amount of seconds to sleep after each chunk that has been sent

      • $params['cachecontrol'] - cache privacy and validity

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::setFile()

HTTP_Download::setFile() --  Set file path

Description

Set the path to the file for the download.

Parameter

  • string $file - file path

  • bool [$send_404 = true] - whether to send "HTTP 404 File Not Found", if file couldn't be found

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::setData()

HTTP_Download::setData() -- Set raw data

Description

Set $data to null if you want to unset.

Otherwise you can send any arbitrary data ie. from a database BLOB.

Parameter

  • mixed [$data = null] - any arbietrary data as string to send or null to unset

Note

This function can not be called statically.

HTTP_Download::setResource()

HTTP_Download::setResource() -- Set resource for download

Description

Set the resource handle to retrieve the data for the download.

The resource handle supplied will be closed after sending the download.

Set $handle to null if you want to unset.

Note: This cannot be used with resources of databases that populate their BLOBs as resource handles like PostgreSQL. A possible solution would be to write a stream wrapper.

Returns a PEAR_Error if $handle is no valid resource or not null.

Parameter

  • mixed [$handle = null] - (int) resource handle or null

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::setGzip()

HTTP_Download::setGzip() --  Whether to gzip the download on the fly or not. (requires ext/zlib)

Description

Define whether you want to send the download gzipped or not.

Returns a PEAR_Error if ext/zlib is not available.

Parameter

  • bool [$gzip = false] - whether to gzip the download on the fly

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::setCache()

HTTP_Download::setCache() --  Whether to allow caching of the download on the clients side.

Description

Define whether you want to allow caching of the download on the clients side.

If set to true (default), HTTP_Download will emit some caching headers like Cache-Control, Last-Modified and ETag.

Parameter

  • bool [$cache = true] - whether to allow caching of the download

Note

This function can not be called statically.

HTTP_Download::setCacheControl()

HTTP_Download::setCacheControl() --  Control cache privacy and validity.

Description

Define the contents of the Cache-Control header.

If set to set to "public", proxies are adviced to cache the response, if set to "private", proxies are adviced to do not.

The maxage paramter controls the amount of seconds an entity is suggested to be cached. Many user agents won't even send a request for subsequent requests to the same resource within the specified time frame.

Parameter

  • string [$cache = "public"] - whether to allow proxy caching

  • int [$maxage = 0] - maximum age of the cached entity

Note

This function can not be called statically.

HTTP_Download::setBufferSize()

HTTP_Download::setBufferSize() --  Set size of buffer in bytes.

Description

The amount of bytes specified as buffer size is the maximum amount of data read at once from resources or files. The default size is 2M (2097152 bytes).

Be aware that if you enable gzip compression and you set a very low buffer size that the actual file size may grow due to added gzip headers for each sent chunk of the specified size.

Returns PEAR_Error (HTTP_DOWNLOAD_E_INVALID_PARAM) if $size is not greater than 0 bytes.

Parameter

  • int [$size = 2097152] - amount of bytes to buffer

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::setThrottleDelay()

HTTP_Download::setThrottleDelay() --  Set throttle delay in seconds

Description

Set the amount of seconds to sleep after each chunck that has been sent. One can implement some sort of throttle through adjusting the buffer size and the throttle delay. With a setting of buffersize=25600 and throttledelay=1 HTTP_Download will sleep a second after each 25 K of data sent.

Just be aware that if gzip'ing is enabled, decreasing the chunk size too much leads to proportionally increased network traffic due to added gzip header and bottom bytes around each chunk.

Parameter

  • float [$seconds = 0] - amount of seconds to sleep

Return value

Returns void.

Note

This function can not be called statically.

HTTP_Download::setContentType()

HTTP_Download::setContentType() --  Set content type

Description

Set a reasonable content type for the download.

Examples:

  • application/pdf

  • application/zip

  • text/css

Returns PEAR_Error if $content_type doesn't seem to be valid.

Parameter

  • string [$content_type = 'application/x-octetstream'] - a reasonable content type

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::setLastModified()

HTTP_Download::setLastModified() --  Set "Last-Modified"

Description

Set the time (unix timestamp) of last modification of the download.

This is usually determined by filemtime($file) in setFile().

Parameter

  • int $last_modified - unix timestamp of last modification time

Note

This function can not be called statically.

HTTP_Download::setContentDisposition()

HTTP_Download::setContentDisposition() --  Set content disposition

Description

Set content disposition of the download.

"Content-Disposition" is not HTTP compliant, but most browsers follow this header, so it was borrowed from MIME standard. It looks like this: "Content-Disposition: attachment; filename=example.tgz".

Parameter

  • string [$disposition = HTTP_DOWNLOAD_ATTACHMENT] - the disposition of the download (either 'attachment' or 'inline')

  • string [$file_name = null] - the file name the browser's download window should show

Note

This function can not be called statically.

HTTP_Download::guessContentType()

HTTP_Download::guessContentType() -- Guess content type of file

Description

Use only if you send a file.

First we try to use MIME_Type, if installed, to detect the content type, else we check if ext/mime_magic is loaded and properly configured.

Returns PEAR_Error if:

MIME_Type failed to detect a proper content type (HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE)
ext/magic.mime is not installed, or not properly configured (HTTP_DOWNLOAD_E_NO_EXT_MMAGIC)
mime_content_type() couldn't guess content type or returned a content type considered to be bogus by setContentType() (HTTP_DOWNLOAD_E_INVALID_CONTENT_TYPE)

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::send()

HTTP_Download::send() -- Send file

Description

Send the download.

Returns PEAR_Error if:

  • HTTP headers were already sent

  • HTTP Range was invalid

Parameter

  • bool [$autoSetContentDisposition = true] - automatically sets the Content-Disposition to HTTP_DOWNLOAD_ATTACHMENT header if not already set

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

HTTP_Download::staticSend()

HTTP_Download::staticSend() --  Static send

Description

Send a download statically without instantiating an HTTP_Download object.

Parameter

  • array $params - An associative array of parameters:

    • one of:

      • $params['file'] - filepath

      • $params['data'] - raw data

      • $params['resource'] - resource handle

    • and any of:

      • $params['gzip'] - whether to gzip the download

      • $params['cache'] - whether to allow client side caching of the download

      • $params['lastmodified'] - unix timestamp of last modification

      • $params['contenttype'] - content type

      • $params['contentdisposition'] - content disposition

      • $params['buffersize'] - amount of bytes read at once from files or resources

      • $params['throttledelay'] - amount of seconds to sleep after each chunk that has been sent

  • bool [$guess = false] - whether to call guessContentType()

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function should be called statically.

HTTP_Download::sendArchive()

HTTP_Download::sendArchive() --  Send an archive created on the fly

Description

Send an archive created on the fly by Archive_Tar or Archive_Zip.

The parameter $files can be an array of files/directories or a space separated string of files/directories which should be packed to an archive.

The parameter $type can be one of HTTP_DOWNLOAD_TAR, HTTP_DOWNLOAD_TGZ, HTTP_DOWNLOAD_BZ2 and HTTP_DOWNLOAD_ZIP.

Note: The usage of this method is deprecated. Use HTTP_Download_Archive::send() instead.

Parameter

  • string $name - the name the archive should have

  • mixed $files - list of files/directories

  • string [$type = HTTP_DOWNLOAD_TGZ] - the format of the archive (TAR, TGZ, BZ2 or ZIP)

  • string [$add_path = ''] - path that should be prepended to the files

  • string [$strip_path = ''] - path that should be stripped from the files

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function should be called statically.


HTTP_Request

Table of Contents
Introduction --  Introduction to HTTP_Request
Basic Authentication --  Authentication for protected websites
Cookies --  Making use of Cookies within HTTP_Request.
File uploads --  Uploading files via HTTP
Request headers --  Adding additional headers to the HTTP request.
Proxy Authorization --  Making use of a HTTP proxy
Response Evaluation --  Evaluating the information from a HTTP response
HTTP_Request_Listener --  attaching listeners to HTTP_Request operations

The package provides an easy way to perform HTTP requests. It supports GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc.

Introduction

Introduction --  Introduction to HTTP_Request

Overview

With this package, one can easily perform HTTP request from within PHP scripts. It support GET/POST/HEAD/TRACE/PUT/DELETE, Basic authentication, Proxy, Proxy Authentication, SSL, file uploads etc.

Because of the above mentioned features HTTP_Request makes it possible to mimic big parts of web browsers such as the widely-known Mozilla browser in PHP applications. Possible application areas are:

  • Checking the validity of WWW links with the help of getResponseCode().

  • Grabbing remote web pages and parsing the result.

  • etc.

Basic Authentication

Basic Authentication --  Authentication for protected websites

Introduction to Basic Authentication

Basic Authentication is a challenge-response mechanism described in RFC 2617.

Cookies

Cookies --  Making use of Cookies within HTTP_Request.

File uploads

File uploads --  Uploading files via HTTP

Request headers

Request headers --  Adding additional headers to the HTTP request.

Proxy Authorization

Proxy Authorization --  Making use of a HTTP proxy

Response Evaluation

Response Evaluation --  Evaluating the information from a HTTP response

Introduction

Because HTTP is a protocol based on the Request - Response scheme, every HTTP request is followed by a HTTP response. HTTP_Request offers several methods to evaluate the information from these responses.

Response Codes

A important part of the HTTP response is the response code. The most well-known response code probably is 404, which you may have seen in your browser at several occasions. The meaning of 404 is that the requested ressource could not be found. A complete list of status codes can be found in RFC 2616.

Response Cookies

Fetching the cookies that are part of the HTTP response is described in the Cookies section.

HTTP_Request_Listener

HTTP_Request_Listener --  attaching listeners to HTTP_Request operations

Introduction to HTTP_Request_Listener

HTTP_Request_Listener is an abstract class that can be extended to capture events and respond to them as they occur. Included with HTTP_Request is an example of a console-based progress bar. To implement this, the HTTP_Request_DownloadListener class is used, which uses the Console_ProgressBar package to display a download progress meter.

Example usage of HTTP_Request_Listener

In order to use a listener, it must attach to the specific HTTP_Request or HTTP_Response object that you want to monitor. The attach code is shown at the bottom of the example. As you can see, the event listener is propagated from the HTTP_Request object to any child HTTP_Response objects, and attaching only need happen to the first HTTP_Request object.

Example 46-1. Download progress bar with HTTP_Request_Listener

<?php
/**
 * An example of Listener usage with HTTP_Request. This downloads and saves 
 * the file displaying the progress bar in the process.
 * 
 * Note two things:
 * 1) The file should be run in console, not in browser;
 * 2) You should turn output buffering OFF for this to work properly.
 */

require_once 'HTTP/Request.php';
require_once 'HTTP/Request/Listener.php';
require_once 'Console/ProgressBar.php';

PEAR::setErrorHandling(PEAR_ERROR_DIE);

set_time_limit(0);

class HTTP_Request_DownloadListener extends HTTP_Request_Listener
{
   /**
    * Handle for the target file
    * @var int
    */
    var $_fp;

   /**
    * Console_ProgressBar intance used to display the indicator
    * @var object
    */
    var $_bar;

   /**
    * Name of the target file
    * @var string
    */
    var $_target;

   /**
    * Number of bytes received so far
    * @var int
    */
    var $_size = 0;

    function HTTP_Request_DownloadListener()
    {
        $this->HTTP_Request_Listener();
    }

   /**
    * Opens the target file
    * @param string Target file name
    * @throws PEAR_Error
    */
    function setTarget($target)
    {
        $this->_target = $target;
        $this->_fp = @fopen($target, 'wb');
        if (!$this->_fp) {
            PEAR::raiseError("Cannot open '{$target}'");
        }
    }

    function update(&$subject, $event, $data = null)
    {
        switch ($event) {
            case 'sentRequest': 
                $this->_target = basename($subject->_url->path);
                break;

            case 'gotHeaders':
                if (isset($data['content-disposition']) &&
                    preg_match('/filename="([^"]+)"/', $data['content-disposition'], $matches)) {

                    $this->setTarget(basename($matches[1]));
                } else {
                    $this->setTarget($this->_target);
                }
                $this->_bar =& new Console_ProgressBar(
                    '* ' . $this->_target . ' %fraction% KB [%bar%] %percent%', '=>', '-', 
                    79, (isset($data['content-length'])? round($data['content-length'] / 1024): 100)
                );
                $this->_size = 0;
                break;

            case 'tick':
                $this->_size += strlen($data);
                $this->_bar->update(round($this->_size / 1024));
                fwrite($this->_fp, $data);
                break;

            case 'gotBody':
                fclose($this->_fp);
                break;

            default:
                PEAR::raiseError("Unhandled event '{$event}'");
        } // switch
    }
}

// Try using any other package if you like, but choose the bigger ones
// to be able to see the progress bar
$url = 'http://pear.php.net/get/HTML_QuickForm-stable';

$req =& new HTTP_Request($url);

$download =& new HTTP_Request_DownloadListener();
$req->attach($download);
$req->sendRequest(false);
?>

Events that can be caught

The HTTP_Request class sends these events:

  • connect - upon server connection, this event is sent

  • sentRequest - after the request was sent, this event is sent

  • disconnect - after server disconnect, this event is sent

The HTTP_Response class sends these events:

  • gotHeaders - this event is sent after receiving response headers (headers are passed in $data as an associative array)

  • tick - this event is sent on receiving a part of response body (the part is passed in $data as a string)

  • gzTick - this event is sent on receiving a part of response body that is gzip-compressed (the part is passed in $data as a string)

  • gotBody - this event is sent on after receiving the complete response body (the decoded body is passed as a string in $data if it was gzipped)


HTTP_Session

Table of Contents
Introduction --  Introduction to HTTP_Session
Database container --  Store session data in a database with HTTP_Session

The package provides an Object-oriented interface to the session_* family functions. It provides extra features such as database storage for session data using the DB, MDB and MDB2 package. It introduces new methods like isNew(), useCookies(), setExpire(), setIdle(), isExpired(), isIdled() and others.

Introduction

Introduction --  Introduction to HTTP_Session

Overview

This package provides access to session-state values as well as session-level settings and lifetime management methods. Based on the standart PHP session handling mechanism it provides more advanced features such as database containers, idle and expire timeouts, etc.

Database container

Database container --  Store session data in a database with HTTP_Session

Overview

HTTP_Session lets you store the session data in a database making use of the DB, MDB and MDB2 packages.


HTTP_Session2

Table of Contents
Introduction --  An introduction to HTTP_Session2
Using a database container --  How to store session data in a database with HTTP_Session2
Making a session persistent --  This example illustrates how to make a session persist over multiple browser sessions using a so called "session cookie".

The HTTP_Session2 package provides an Object-oriented interface to the session_* family functions. It's a PHP5 port of the HTTP_Session package.

HTTP_Session2 provides extra features such as database storage for session data using the DB and MDB2 package. It also introduces new methods, such as isNew(), useCookies(), setExpire(), setIdle(), isExpired(), isIdled() and others.

Introduction

Introduction --  An introduction to HTTP_Session2

Overview

This package provides access to session-state values as well as session-level settings and lifetime management methods.

Based on the standart PHP session handling mechanism HTTP_Session2 provides more advanced features such as database containers, idle and expire timeouts and more.

Using a database container

Using a database container --  How to store session data in a database with HTTP_Session2

Overview

HTTP_Session lets you store the session data in a database making use of the DB and MDB2 packages.

Making a session persistent

Making a session persistent --  This example illustrates how to make a session persist over multiple browser sessions using a so called "session cookie".

Explanation

When you create a session it needs to be referenced using a sessionID. This sessionID is generally saved either into a cookie or passed along in the URI.

To remember the sessionID across browser sessions, the cookie method is favoured.

To extend the lifetime of this cookie (the standard is that it's only valid until the browser is closed) we use PHP's session_set_cookie_params().


HTTP_Upload

Easy and secure managment of files submitted via HTML forms.


Examples

In the following examples it is assumed that you are using an HTML form field <input type="file" name="f" /> in order to upload files. For example:


Chapter 47. Images

Provides Packages for working with images



Image_Canvas

Table of Contents
Example --  Usage example for Image_Canvas

This package provides a common interface to image drawing, making image source code independent on the library used. It includes output drivers for JPEG and PNG (using the GD library) as well as for PDF and SVG.

A list of the supported drawing functions is available on an external site.

Example

Example --  Usage example for Image_Canvas

Example

Example 47-1. Generation of a sample image in PNG format

require_once 'Image/Canvas.php';

// change the output format with the first parameter of factory()
$Canvas =& Image_Canvas::factory('png', array('width' => 400, 'height' => 300));

$Canvas->setLineColor('black');
$Canvas->rectangle(array('x0' => 0, 'y0' => 0, 'x1' => 399, 'y1' => 299));

$Canvas->setGradientFill(array('direction' => 'horizontal', 'start' => 'red', 'end' => 'blue'));
$Canvas->setLineColor('black');
$Canvas->ellipse(array('x' => 199, 'y' => 149, 'rx' => 50, 'ry' => 50));

$Canvas->setFont(array('name' => 'Arial', 'size' => 12));
$Canvas->addText(array('x' => 0, 'y' => 0, 'text' => 'Demonstration of what Image_Canvas do!'));

$Canvas->setFont(array('name' => 'Times New Roman', 'size' => 12));
$Canvas->addText(array('x' => 399, 'y' => 20, 'text' => 'This does not demonstrate what is does!', 'alignment' => array('horizontal' => 'right')));

$Canvas->setFont(array('name' => 'Courier New', 'size' => 7, 'angle' => 270));
$Canvas->addText(array('x' => 350, 'y' => 50, 'text' => 'True, but it\'s all independent of the format!', 'alignment' => array('horizontal' => 'right')));

$Canvas->setFont(array('name' => 'Garamond', 'size' => 10));
$Canvas->addText(array('x' => 199, 'y' => 295, 'text' => '[Changing format is done by changing 3 letters in the source]', 'alignment' => array('horizontal' => 'center', 'vertical' => 'bottom')));

$Canvas->addVertex(array('x' => 50, 'y' => 200));
$Canvas->addVertex(array('x' => 100, 'y' => 200));
$Canvas->addVertex(array('x' => 100, 'y' => 250));
$Canvas->setFillColor('red@0.2');
$Canvas->polygon(array('connect' => true));

$Canvas->image(array('x' => 398, 'y' => 298, 'filename' => './pear-icon.png', 'alignment' => array('horizontal' => 'right', 'vertical' => 'bottom')));

$Canvas->show();

Image_Text

Table of Contents
Class Summary Image_Text --  Image_Text - Advanced text manipulations in images
constructor Image_Text::Image_Text() -- Constructor
Image_Text::autoMeasurize() -- Auto measurize text
Image_Text::display() -- Display the image (send it to the browser).
Image_Text::getImg() -- Return the image ressource.
Image_Text::init() -- Initialiaze the Image_Text object.
Image_Text::measurize() -- Measurize text into the text box
Image_Text::render() --  Render the text in the canvas using the given options.
Image_Text::save() -- Save image canvas.
Image_Text::set() -- Set options
Image_Text::setColor() -- Set a color
Image_Text::setColors() -- Set the color-set
Package Image_Text Constants -- Constants defined in and used by Image_Text

Class Summary Image_Text

Class Summary Image_Text --  Image_Text - Advanced text manipulations in images

Image_Text - Advanced text manipulations in images

Image_Text provides advanced text manipulation facilities for GD2 image generation with PHP. Simply add text clippings to your images, let the class automatically determine lines, rotate text boxes around their center or top left corner. These are only a couple of features Image_Text provides.

Class Trees for Image_Text

  • Image_Text

constructor Image_Text::Image_Text()

constructor Image_Text::Image_Text() -- Constructor

Description

Set the text and options. This initializes a new Image_Text object. You must set your text here. Optinally you can set all options here using the $options parameter. If you finished switching all options you have to call the init() method first befor doing anything further! See Image_Text::set() for further information.

Parameter

string $text

Text to print.

array $options

Options.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::autoMeasurize()

Image_Text::autoMeasurize() -- Auto measurize text

Description

Automatically determines the greatest possible font size to fit the text into the text box. This method may be very resource intensive on your webserver. A good tweaking point are the $start and $end parameters, which specify the range of font sizes to search through. Anyway, the results should be cached if possible. You can optionally set $start and $end here as a parameter or the settings of the options array are used.

Parameter

integer $start

Fontsize to start testing with.

integer $end

Fontsize to end testing with.

Return value

returns Fontsize measured or PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::display()

Image_Text::display() -- Display the image (send it to the browser).

Description

This will output the image to the users browser. You can use the standard IMAGETYPE_* constants to determine which image type will be generated. Optionally you can save your image to a destination you set in the options.

Parameter

boolean $save

Save or not the image on printout.

boolean $free

Free the image on exit.

Return value

returns True on success, otherwise PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::getImg()

Image_Text::getImg() -- Return the image ressource.

Description

Get the image canvas.

Return value

returns Used image resource

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::init()

Image_Text::init() -- Initialiaze the Image_Text object.

Description

This method has to be called after setting the options for your Image_Text object. It initializes the canvas, normalizes some data and checks important options. Be shure to check the initialization after you switched some options. The set() method may force you to reinitialize the object.

Return value

returns True on success, otherwise PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::measurize()

Image_Text::measurize() -- Measurize text into the text box

Description

This method makes your text fit into the defined textbox by measurizing the lines for your given font-size. You can do this manually before rendering (or use even Image_Text::autoMeasurize()) or the renderer will do measurizing automatically.

Parameter

boolean $force

Optionally, default is FALSE, set TRUE to force measurizing.

Return value

returns Array of measured lines or PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::render()

Image_Text::render() --  Render the text in the canvas using the given options.

Description

This renders the measurized text or automatically measures it first. The $force parameter can be used to switch of measurizing problems (this may cause your text being rendered outside a given text box or destroy your image completely).

Parameter

boolean $force

Optional, initially FALSE, set TRUE to silence measurize errors.

Return value

returns True on success, otherwise PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::save()

Image_Text::save() -- Save image canvas.

Description

Saves the image to a given destination. You can leave out the destination file path, if you have the option for that set correctly. Saving is possible with the save() method, too.

Parameter

string $destFile

The destination to save to (optional, uses options value else).

Return value

returns True on success, otherwise PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::set()

Image_Text::set() -- Set options

Description

Set a single or multiple options. It may happen that you have to reinitialize the Image_Text object after changing options.

Table 47-1. Possible options to set

OptionDescription
x

This sets the top left coordinates (using x/y) or the center point coordinates (using cx/cy) for your text box. The values from cx/cy will overwrite x/y.

y
cx
cy
canvas

You can set different values as a canvas:

  • A gd image resource.

  • An array with 'width' and 'height'.

  • Nothing (the canvas will be measured after the real text size).

antialias

This is usually true. Set it to false to switch antialiasing off.

width

The width and height for your text box.

height
halign

Alignment of your text inside the textbox. Use alignment constants to define vertical and horizontal alignment.

valign
angle

The angle to rotate your text box.

color

An array of color values. Colors will be rotated in the mode you choose (linewise or paragraphwise). Can be in the following formats:

  • String representing HTML style hex couples (+ unusual alpha couple in the first place, optional).

  • Array of int values using 'r', 'g', 'b' and optionally 'a' as keys.

color_mode

The color rotation mode for your color sets. Does only apply if you defined multiple colors. Use 'line' or 'paragraph'.

font_path

Location of the font to use.

font_file
font_size

The font size to render text in (will be overwriten if you use automeasurize).

line_spacing

Measure for the line spacing to use. Default is 0.5.

min_font_size

Automeasurize settings. Try to keep this area as small as possible to get better performance.

max_font_size
image_type

The type of image (use image type constants). Is default set to PNG.

dest_file

The destination to (optionally) save your file.

Parameter

mixed $option

A single option name or the options array.

mixed $value

Option value if $option is string.

Return value

returns True on success, otherwise PEAR_Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::setColor()

Image_Text::setColor() -- Set a color

Description

This method is used to set a color at a specific color ID inside the color cycle.

The following colors syntaxes are understood by this method:

  • "#ffff00" hexadecimal format (HTML style), with and without #.

  • "#08ffff00" hexadecimal format (HTML style) with alpha channel (08), with and without #.

  • array with 'r','g','b' and (optionally) 'a' keys, using int values.

Parameter

mixed $color

Color value.

mixed $id

ID (in the color array) to set color to.

Return value

returns True on success, otherwise PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Image_Text::setColors()

Image_Text::setColors() -- Set the color-set

Description

Using this method you can set multiple colors for your text. Use a simple numeric array to determine their order and give it to this function. Multiple colors will be cycled by the options specified 'color_mode' option. The given array will overwrite the existing color settings!

The following colors syntaxes are understood by this method:

  • "#ffff00" hexadecimal format (HTML style), with and without #.

  • "#08ffff00" hexadecimal format (HTML style) with alpha channel (08), with and without #.

  • array with 'r','g','b' and (optionally) 'a' keys, using int values.

  • a GD color special color (tiled,...).

A single color or an array of colors are allowed here.

Parameter

mixed $colors

Single color or array of colors.

Return value

returns True on success, otherwise PEAR::Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package Image_Text Constants

Package Image_Text Constants -- Constants defined in and used by Image_Text

Chapter 48. Internationalization

Provides packages for internationalization and localization.



I18Nv2

Table of Contents
Class Summary I18Nv2 -- I18Nv2 - Internationalization v2
Intro -- Introduction to I18Nv2
Examples -- Usage example for I18Nv2
I18Nv2 Constants -- Constants defined in and used by I18Nv2
I18Nv2::setLocale() -- Set locale
I18Nv2::lastLocale() -- Get current/prior locale
I18Nv2::getInfo() -- Get several locale specific information
I18Nv2::autoConv() -- Automatically transform output between character sets
I18Nv2::createLocale() -- Create an I18Nv2_Locale object
I18Nv2::createNegotiator() -- Create an I18Nv2_Negotiator object
I18Nv2::langs2locales() -- Transform languages to locales
I18Nv2::locales2langs() -- Transform locales to languages
Class Summary I18Nv2_Locale -- I18Nv2_Locale
I18Nv2_Locale::I18Nv2_Locale() -- Constructor
I18Nv2_Locale::initialize() -- Initialize
I18Nv2_Locale::loadExtension() -- Loads corresponding locale extension
I18Nv2_Locale::setLocale() -- Set locale
I18Nv2_Locale::setDefaults() -- Set defaults
I18Nv2_Locale::setCustomFormat() -- Set custom format
I18Nv2_Locale::setCurrencyFormat() -- Set currency format
I18Nv2_Locale::setDateFormat() -- Set date format
I18Nv2_Locale::setNumberFormat() -- Set number format
I18Nv2_Locale::setTimeFormat() -- Set time format
I18Nv2_Locale::formatDate() -- Format a date
I18Nv2_Locale::formatTime() -- Format a time
I18Nv2_Locale::formatNumber() -- Format a number
I18Nv2_Locale::formatCurrency() -- Format currency
I18Nv2_Locale::date() -- Get local date
I18Nv2_Locale::time() -- Get local time
I18Nv2_Locale::dayName() -- Get local day name
I18Nv2_Locale::monthName() -- Get local month name
Class Summary I18Nv2_Negotiator -- I18Nv2_Negotiator
I18Nv2_Negotiator::I18Nv2_Negotiator() -- Constructor
I18Nv2_Negotiator::getCharsetMatch() -- Get character set match
I18Nv2_Negotiator::getCountryMatch() -- Get country match
I18Nv2_Negotiator::getLanguageMatch() -- Get language match
I18Nv2_Negotiator::getLocaleMatch() -- Get locale match
I18Nv2_Negotiator::getVariantInfo() -- Return variant info for passed parameter.
I18Nv2_Negotiator::singleI18NCountry() -- Create the Country helper object
I18Nv2_Negotiator::singleI18NLanguage() -- Create the Language helper object
Class Summary I18Nv2_Country -- I18Nv2_Country
I18Nv2_Country::I18Nv2_Country() -- Constructor
I18Nv2_Country::getAllCodes() -- Get all codes
I18Nv2_Country::getName() -- Get country name
I18Nv2_Country::isValidCode() -- Check if country code is valid
Class Summary I18Nv2_Language -- I18Nv2_Language
I18Nv2_Language::I18Nv2_Language() -- Constructor
I18Nv2_Language::getAllCodes() -- Get all codes
I18Nv2_Language::getName() -- Return name of the language for language code
I18Nv2_Language::isValidCode() -- Check if language code is valid

Class Summary I18Nv2

Class Summary I18Nv2 -- I18Nv2 - Internationalization v2

I18Nv2 - Internationalization v2

The static I18Nv2 class currently provides routines for unified (ment as OS independent) locale setting, retrieving locale specific information like the "thousands separator" and automatic characterset conversion for output.

Warning

This documentation is outdated and needs an overhaul.

Intro

Intro -- Introduction to I18Nv2

Preface

The work on I18Nv2 has actually started as a refactoring of I18N, but after some time I figured out that too many BC breaking changes were applied, so the release of a new major version was suggested.

Differences to I18N

I18N was modeled after Java OO practice and it provides a bunch of classes for each formatting action (numbers, currencies, dates).

I18Nv2 takes another approach and provides all formatting functionality within one class, which is I18Nv2_Locale.

I18Nv2_Locale is based upon PHPs builtin functionality of setlocale() , localeconv () and iconv related functions, while I18N completely depends on user contributed formatting rules.

I wouldn't say I18Nv2's approach is the better one, because it depends on the internationalization capabilities of the underlying operating system, but it's simpler and faster - though it is in need of user contributed date and time formatting rules.

I18N's translation functionality was dropped in favour of the new and shiny Translation2.

I18Nv2 still provides an HTTP negotiator to reveal the users preferred language/locale and charset.

I18Nv2 has translated lists of ISO country and language names for about 50 different languages. See I18Nv2_Country and I18Nv2_Language.

Examples

Examples -- Usage example for I18Nv2

API Documentation

Please see PEARs API Documentation for details on the API provided by I18Nv2.

Setting a locale

Because Un*x and Windows use different locale codes, PHPs setLocale() is not easily portable - I18Nv2::setLocale() attempts to provide this portability.

With I18Nv2 you can use standard locale codes like 'en_US' on both, Linux and Windows, though the list is far not complete yet, so if you stumble over a not covered locale (I18Nv2::$locales in I18Nv2::_main()), just drop a mail to the maintainer with the missing locale and its corresponding Win32 code.

I18Nv2 Constants

I18Nv2 Constants -- Constants defined in and used by I18Nv2

I18Nv2::setLocale()

I18Nv2::setLocale()  -- Set locale

Parameter

string $locale

a valid locale like en_US or de_DE

integer $cat

the locale category - usually LC_ALL

Return value

Returns string used system locale or false on failure.

Note

This function should be called statically.

I18Nv2::lastLocale()

I18Nv2::lastLocale()  -- Get current/prior locale

Description

Retrieve kinda history of locales that have been already set.

This only works, if I18Nv2::setLocale() has already been called.

Parameter

integer $prior

if 0, the current otherwise n prior to the current locale

boolean $full

whether to return the array with locale, language and actually used system locale

Return value

Returns mixed prior locale.

Note

This function should be called statically.

See

See also I18Nv2::setLocale().

I18Nv2::getInfo()

I18Nv2::getInfo()  -- Get several locale specific information

Description

Get several locale specific information like thousands separator. The provided information debends on the local libc implementation and thus is not always reliable - especially on Microsoft Windows.

Parameter

string$part

specific part of locale information

Return value

Returns mixed locale specific information or array all available locale specific information if called without parameter.

Note

This function should be called statically.

See

See also I18Nv2::setLocale(), PHPs localeconv().

I18Nv2::autoConv()

I18Nv2::autoConv()  -- Automatically transform output between character sets

Description

This method utilizes ob_iconv_handler(), so you should call it at the beginning of your script (prior to any output).

1   require_once 'I18Nv2.php';
2   I18Nv2::autoConv('iso-8859-1', 'utf-8');
3   // ...

Parameter

string $ocs

desired output character set

string $ics

current intput character set

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns PEAR_Error if output buffering couldn't be started.

Note

This function should be called statically.

See

See also PHPs ob_iconv_handler().

I18Nv2::createLocale()

I18Nv2::createLocale()  -- Create an I18Nv2_Locale object

Synopsis

require_once 'I18Nv2.php';

object I18Nv2_Locale &I18Nv2::createLocale ([string $locale = NULL])

Description

Create a new I18Nv2_Locale object with the specified locale.

Parameter

string $locale

a locale like en_US or de_DE

Return value

Returns new object I18Nv2_Locale.

Note

This function should be called statically.

See

See also I18Nv2_Locale.

I18Nv2::createNegotiator()

I18Nv2::createNegotiator()  -- Create an I18Nv2_Negotiator object

Synopsis

require_once 'I18Nv2.php';

object I18Nv2_Negotiator &I18Nv2::createNegotiator ([string $defLang = 'en' [, string $defCharset = 'iso-8859-1']])

Description

Create a new I18Nv2_Negotiator object with the specified default language and default character set.

Parameter

string $defLang

default language

string $defCharset

default character set

Return value

Returns new object I18Nv2_Negotiator.

Note

This function should be called statically.

See

See also I18Nv2_Negotiator.

I18Nv2::langs2locales()

I18Nv2::langs2locales()  -- Transform languages to locales

Description

Transforms language codes like en-US and de-DE to locale codes like en_US and de_DE.

Parameter

array $languages

array of language codes

Return value

Returns array transformed language codes as locale codes.

Note

This function should be called statically.

I18Nv2::locales2langs()

I18Nv2::locales2langs()  -- Transform locales to languages

Description

Transforms locale codes like en_US and de_DE to language codes like en-US and de-DE.

Parameter

array $locales

array of locale codes

Return value

Returns array transformed loclae codes as language codes.

Note

This function should be called statically.

Class Summary I18Nv2_Locale

Class Summary I18Nv2_Locale -- I18Nv2_Locale

I18Nv2_Locale

Represents a specific locale and provides routines for formatting date and time, numbers and currency.

I18Nv2_Locale::I18Nv2_Locale()

I18Nv2_Locale::I18Nv2_Locale() -- Constructor

Description

Instantiate a new I18Nv2_Locale object with the specified locale.

Parameter

string $locale

the desired locale like en_US or de_DE

Return value

Returns new object I18Nv2_Locale.

I18Nv2_Locale::initialize()

I18Nv2_Locale::initialize()  -- Initialize

Description

Initializes the I18Nv2_Locale object.

This method gets aumatically called by the constructor.

Note

This function can not be called statically.

I18Nv2_Locale::loadExtension()

I18Nv2_Locale::loadExtension()  -- Loads corresponding locale extension

Description

Load available locale extensions.

This method gets called autmatically by the constructor.

Note

This function can not be called statically.

I18Nv2_Locale::setLocale()

I18Nv2_Locale::setLocale()  -- Set locale

Description

Transforms the I18Nv2_Locale object to the specified locale.

Parameter

string $locale

the locale like en_US or de_DE

Return value

Returns TRUE on success, PEAR_Error on failure.

Returns a PEAR_Error if the supplied locale was invalid.

Note

This function can not be called statically.

I18Nv2_Locale::setDefaults()

I18Nv2_Locale::setDefaults()  -- Set defaults

Description

Reset used formats to the default values.

Note

This function can not be called statically.

I18Nv2_Locale::setCustomFormat()

I18Nv2_Locale::setCustomFormat()  -- Set custom format

Description

Set a custom format.

If $format is omitted, the custom format for $type will be discarded - if both vars are omitted all custom formats will be discarded.

Parameter

mixed $type

the I18Nv2 format category for which to set the custom format

mixed $format

the custom format

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

I18Nv2_Locale::setCurrencyFormat()

I18Nv2_Locale::setCurrencyFormat()  -- Set currency format

Description

Set the currency format to use.

Either I18Nv2_CURRENCY_LOCAL, I18Nv2_CURRENCY_INTERNATIONAL or a custom currency format.

Parameter

integer $format

a I18Nv2_CURRENCY constant

boolean $custom

whether to use a defined custom format

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

I18Nv2_Locale::setDateFormat()

I18Nv2_Locale::setDateFormat()  -- Set date format

Description

Set the date format to use.

Either a I18Nv2_DATETIME constant or a custom date format.

Parameter

integer $format

a I18Nv2_DATETIME constant

boolean $custom

whether to use a defined custom format

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

I18Nv2_Locale::setNumberFormat()

I18Nv2_Locale::setNumberFormat()  -- Set number format

Description

Set the number format to use.

Either a I18Nv2_NUMBER constant or a custom number format.

Parameter

integer $format

a I18Nv2_NUMBER constant

boolean $custom

whether to use a defined custom format

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

I18Nv2_Locale::setTimeFormat()

I18Nv2_Locale::setTimeFormat()  -- Set time format

Description

Set a time format to use.

Either a I18Nv2_DATETIME constant or a custom time format.

Parameter

integer $format

a I18Nv2_DATETIME constant

boolean $custom

whether to use a defined custom format

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

I18Nv2_Locale::formatDate()

I18Nv2_Locale::formatDate()  -- Format a date

Description

Format a date corresponding to the current locale.

Parameter

integer $timestamp

timestamp which should be formatted

Return value

Returns string formatted date.

Note

This function can not be called statically.

I18Nv2_Locale::formatTime()

I18Nv2_Locale::formatTime()  -- Format a time

Description

Format a time corresponding to the current locale.

Parameter

integer $timestamp

timestamp which should be formatted

Return value

Returns string formatted time.

Note

This function can not be called statically.

I18Nv2_Locale::formatNumber()

I18Nv2_Locale::formatNumber()  -- Format a number

Description

Format a number corresponding to the current locale.

Parameter

numeric $value

numeric value which should be formatted

Return value

Returns string formatted number.

Note

This function can not be called statically.

I18Nv2_Locale::formatCurrency()

I18Nv2_Locale::formatCurrency()  -- Format currency

Description

Format a currecy value corresponding to the current locale.

Parameter

numeric $value

numeric value which should be formatted

Return value

Returns string formatted currency value.

Note

This function can not be called statically.

I18Nv2_Locale::date()

I18Nv2_Locale::date()  -- Get local date

Description

Get the local date as returned by strftime('%x').

Parameter

integer $timestamp

timestamp which should be formatted

Return value

Returns string local date.

Note

This function can not be called statically.

I18Nv2_Locale::time()

I18Nv2_Locale::time()  -- Get local time

Description

Get the local textual representation of a time as returned by strftime('%X').

Parameter

integer $timestamp

timestamp which should be formatted

Return value

Returns string formatted time.

Note

This function can not be called statically.

I18Nv2_Locale::dayName()

I18Nv2_Locale::dayName()  -- Get local day name

Description

Get the local textual representation of a weekday.

Parameter

integer $weekday

numerical representation of weekday (0 = Sunday, 1 = Monday, ...)

boolean $short

whether to return the abbreviation

Return value

Returns string name of weekday on success or PEAR_Error on failure.

Note

This function can not be called statically.

I18Nv2_Locale::monthName()

I18Nv2_Locale::monthName()  -- Get local month name

Description

Get the local textual representation of a month.

Parameter

integer $month

numerical representation of month (0 = January, 1 = February, ...)

boolean $short

whether to return the abbreviation

Return value

Returns string name of month on success or PEAR_Error on failure.

Note

This function can not be called statically.

Class Summary I18Nv2_Negotiator

Class Summary I18Nv2_Negotiator -- I18Nv2_Negotiator

I18Nv2_Negotiator

Provides basic negotiation of user preferred locale, language and characterset.

I18Nv2_Negotiator::I18Nv2_Negotiator()

I18Nv2_Negotiator::I18Nv2_Negotiator() -- Constructor

Synopsis

require_once 'I18N/Negotiator.php';

object I18Nv2_Negotiator I18Nv2_Negotiator::I18Nv2_Negotiator ([string $defaultLanguage = 'en' [, string $defaultCharset = 'iso-8859-1' [, string $defaultCountry = '']]])

Description

Find language code, country code, charset code, and dialect or variant of locale setting in HTTP request headers.

Parameter

string $defaultLanguage

default language

string $defaultCharset

default character set

string $defaultCountry

default country

Return value

Returns object I18Nv2_Negotiator.

I18Nv2_Negotiator::getCharsetMatch()

I18Nv2_Negotiator::getCharsetMatch() -- Get character set match

Description

Get a matching character set.

Parameter

array $charsets

array of character sets

Return value

Returns string matched character set.

Note

This function can not be called statically.

I18Nv2_Negotiator::getCountryMatch()

I18Nv2_Negotiator::getCountryMatch()  -- Get country match

Description

Get a matching country code.

Parameter

string $lang

language code

array $countries

array of country codes

Return value

Returns string matching country.

Note

This function can not be called statically.

I18Nv2_Negotiator::getLanguageMatch()

I18Nv2_Negotiator::getLanguageMatch()  -- Get language match

Description

Get a matching language code.

Parameter

array $langs

array of language codes

Return value

Returns string matching language code.

Note

This function can not be called statically.

I18Nv2_Negotiator::getLocaleMatch()

I18Nv2_Negotiator::getLocaleMatch()  -- Get locale match

Description

Get a matching locale code.

This method is a combination of I18Nv2::getLanguageMatch() and I18Nv2::getCountryMatch()

Parameter

array $langs

array of language codes

array $countries

array of country codes

Return value

Returns string matching locale code.

Note

This function can not be called statically.

I18Nv2_Negotiator::getVariantInfo()

I18Nv2_Negotiator::getVariantInfo() -- Return variant info for passed parameter.

Description

This package is not documented yet.

Parameter

string $lang

Throws

throws no exceptions thrown

Note

This function can not be called statically.

I18Nv2_Negotiator::singleI18NCountry()

I18Nv2_Negotiator::singleI18NCountry()  -- Create the Country helper object

Description

Singleton for I18Nv2_Country.

Return value

Returns object I18Nv2_Country.

Note

This function can not be called statically.

I18Nv2_Negotiator::singleI18NLanguage()

I18Nv2_Negotiator::singleI18NLanguage()  -- Create the Language helper object

Description

Singleton for I18Nv2_Language.

Return value

Returns object I18Nv2_Language.

Note

This function can not be called statically.

Class Summary I18Nv2_Country

Class Summary I18Nv2_Country -- I18Nv2_Country

I18Nv2_Country

List of two letter country code to country name mapping.

I18Nv2_Country::I18Nv2_Country()

I18Nv2_Country::I18Nv2_Country() -- Constructor

Description

Instantiate a new I18Nv2_Country object.

Return value

Returns object I18Nv2_Country.

I18Nv2_Country::getAllCodes()

I18Nv2_Country::getAllCodes()  -- Get all codes

Description

Get all country codes as associative array indexed by their two letter codes.

Return value

Returns array all country codes.

Note

This function can not be called statically.

I18Nv2_Country::getName()

I18Nv2_Country::getName()  -- Get country name

Description

Get the corresponding country name of the supplied two letter country code.

Parameter

string $code

two letter country code

Return value

Returns string country name.

Note

This function can not be called statically.

I18Nv2_Country::isValidCode()

I18Nv2_Country::isValidCode()  -- Check if country code is valid

Description

Check if the supplied two letter country code is valid.

Parameter

string $code

two letter country code

Return value

Returns boolean whether the two letter country code is valid.

Note

This function can not be called statically.

Class Summary I18Nv2_Language

Class Summary I18Nv2_Language -- I18Nv2_Language

I18Nv2_Language

List of ISO-639-1 two letter resp. ISO-639-2 three letter language code to language name mapping.

I18Nv2_Language::I18Nv2_Language()

I18Nv2_Language::I18Nv2_Language() -- Constructor

Synopsis

require_once 'I18Nv2/Language.php';

object object I18Nv2_Language I18Nv2_Language::I18Nv2_Language ([bool $threeLetters = FALSE])

Description

Instantiate a new I18Nv2_Language object.

Parameter

boolean $threeLetters

whether to use ISO-639-2 three letters or ISO-639-1 two letters language code format.

Return value

Returns new object I18Nv2_Language object.

I18Nv2_Language::getAllCodes()

I18Nv2_Language::getAllCodes()  -- Get all codes

Description

Get all language codes as associative array indexed by their two/three letter codes.

Return value

Returns array all language codes.

Note

This function can not be called statically.

I18Nv2_Language::getName()

I18Nv2_Language::getName()  -- Return name of the language for language code

Description

Get the language name for the two/three letter language code.

Parameter

string $code

two/three letter language code

Return value

Returns string name of the language.

Note

This function can not be called statically.

I18Nv2_Language::isValidCode()

I18Nv2_Language::isValidCode()  -- Check if language code is valid

Description

Check if the supplied two/three letter language code is valid.

Parameter

string $code

two/three letter language code

Return value

Returns boolean whether the two/three letter language code is valid.

Note

This function can not be called statically.


Translation2

Table of Contents
Class Summary Translation2 -- Translation2 class
Introduction -- Usage of Translation2
Admin Introduction -- Usage of Translation2_Admin
Containers Overview -- Overview of the different Translation2 containers
constructor Translation2::Translation2() -- Constructor
Translation2::factory() -- Return an instanciated Translation2 object
Translation2::get() -- Get translated string
Translation2::getDecorator() -- Return an instance of a decorator
Translation2::getLang() -- get lang info
Translation2::getLangs() -- get langs
Translation2::getPage() -- Get an entire group of strings
Translation2::getRaw() -- Get translated string (as-is)
Translation2::getRawPage() -- Get the array of strings in a page
Translation2::getStringID() -- Get the stringID for a given string
Translation2::replaceEmptyStringsWithKeys() -- Replace the array values with their keys when empty
Translation2::setCharset() -- Set the charset used to get/store the translations
Translation2::setLang() -- Set default lang
Translation2::setPageID() -- Set default page
Translation2::setParams() -- Set parameters for next string
Class Summary Translation2_Admin -- Administration utilities for translation string management
Translation2_Admin::addLang() -- Prepare the storage container for a new lang.
Translation2_Admin::updateLang() -- Update the language details.
Translation2_Admin::removeLang() -- Remove the language from the langsAvail table and drop the strings table.
Translation2_Admin::add() -- add a new translation
Translation2_Admin::remove() -- remove a translated string
Translation2_Admin::update() -- Update an existing translation.
Translation2_Admin::removePage() -- remove all the translated strings in a page/group
Translation2_Admin::cleanCache() -- Clear the cache. Use with the CacheLiteFunction decorator only.
Translation2_Admin::getPageNames() -- Get a list of all the pageIDs in any table.
Translation2_Admin::getAdminDecorator() -- Return an instance of an admin decorator
Class Summary Translation2_Decorator -- Decorates a Translation2 class.
Class Summary Translation2_Decorator_CacheLiteFunction -- Decorator to cache fetched data using Cache_Lite_Function class
Class Summary Translation2_Decorator_CacheMemory -- Decorator to cache fetched data in memory
Class Summary Translation2_Decorator_DefaultText -- Decorator to provide a fallback text for empty strings.
Class Summary Translation2_Decorator_ErrorText -- Decorator to provide a fallback error_text message for empty strings.
Class Summary Translation2_Decorator_Lang -- Decorator to provide a fallback language for empty strings.
Class Summary Translation2_Decorator_Iconv -- Decorator to switch from/to different encodings.
Class Summary Translation2_Decorator_SpecialChars -- Decorator to replace special chars with the matching html entities.
Class Summary Translation2_Decorator_UTF8 -- Decorator to convert UTF-8 strings to ISO-8859-1
Package Translation2 Constants -- Constants defined in and used by Translation2

Class Summary Translation2

Class Summary Translation2  -- Translation2 class

Translation2 class

Class for multilingual applications management

Introduction

Introduction -- Usage of Translation2

What is Translation2?

Translation2 is a class for multilingual applications management. It provides an easy way to retrieve all the strings for a multilingual site from a data source (i.e. db). The API is designed to be clean, simple to use, yet powerful and extensible. A Translation2_Admin class is provided to easily manage translations (add/remove a language, add/remove a string).

The following containers (data source drivers) are provided:

  • PEAR::DB

  • PEAR::MDB

  • PEAR::MDB2

  • gettext

  • PEAR::DB_DataObject (experimental, used by PEAR:: HTML_Template_Flexy)

  • XML

Some decorator classes will help in various tasks. They can be layered/stacked one on top of the other, in any number. This approach should suit everyone's needs. Currently, the following decorators are provided:

  • CacheLiteFunction (for fast file-based caching)

  • CacheMemory (for memory-based caching)

  • DefaultText (to replace empty strings with their keys or a default text)

  • ErrorText (to replace empty strings with an "error_text" fallback message)

  • Iconv (to switch from/to different encodings)

  • Lang (resort to fallback languages for empty strings)

  • SpecialChars (replace html entities with their hex codes)

  • UTF-8 (convert UTF-8 strings to ISO-8859-1)

Usage example

This simple example will show how you can instanciate a Translation2 object and use it to retrieve your translated strings from a db, using the MDB2 driver:
// set the parameters to connect to your db
$dbinfo = array(
    'hostspec' => 'host',
    'database' => 'dbname',
    'phptype'  => 'mysql',
    'username' => 'user',
    'password' => 'pwd'
);

define('TABLE_PREFIX', 'mytable_');

// tell Translation2 about your db-tables structure,
// if it's different from the default one.
// NB: the default db structure is:
//
// Table "langs" (available languages and meta info)
// +----+------+------+----------+------------+
// | ID | name | meta | encoding | error_text |
// +----+------+------+----------+------------+
//
// Table "strings" (translations)
// +----+---------+----+----+----+-----+
// | ID | page_id | en | de | it | ... |
// +----+---------+----+----+----+-----+
// You can have one table per translation, instead
// of one table for all the languages
//
$params = array(
    'langs_avail_table' => TABLE_PREFIX.'langs_avail',
    'lang_id_col'     => 'ID',
    'lang_name_col'   => 'name',
    'lang_meta_col'   => 'meta',
    'lang_errmsg_col' => 'error_text',
    'strings_tables'  => array(
                            'en' => TABLE_PREFIX.'i18n',
                            'it' => TABLE_PREFIX.'i18n',
                            'de' => TABLE_PREFIX.'i18n'
                         ),
    'string_id_col'      => 'ID',
    'string_page_id_col' => 'pageID',
    'string_text_col'    => '%s'  //'%s' will be replaced by the lang code
);

$driver = 'MDB2';

require_once 'Translation2.php';
$tr =& Translation2::factory($driver, $dbinfo, $params);

//always check for errors. In this examples, error checking is omitted
//to make the example concise.
if (PEAR::isError($tr)) {
    //deal with it
}

// you can set the charset that the database must use, for instance 'utf8'
$tr->setCharset('iso-8859-1');

// set primary language
$tr->setLang('it');

// set the group of strings you want to fetch from
$tr->setPageID('defaultGroup');

// add a Lang decorator to provide a fallback language
$tr =& $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'en');

// add another Lang decorator to provide another fallback language,
// in case some strings are not translated in Italian or English
$tr =& $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'de');

// fetch the string with the 'test' stringID
echo $tr->get('test');

// fetch a string not translated into Italian (test fallback language)
echo $tr->get('only_english');

// fetch the whole group of strings, without resorting to the fallback lang
// and without any "decoration"
$rawPage = $tr->getRawPage();
print_r($rawPage);

// fetch the whole group of strings, but applying the decorators
$page = $tr->getPage();
print_r($page);

// you can force the lang and the group of the string you're requesting
echo $tr->get('month_01', 'calendar', 'it');

// the same is true for getRawPage() and getPage()
$page = $tr->getPage('calendar', 'de');
print_r($page);

As you can see, the main methods are get(), getPage() and getRawPage(). The full syntax is
get($stringID, $pageID, $langID);
but if you set the pageID and the langID beforehand, you won't need to specify them at each get() invocation.

NB: you have to check for errors at least on the first invocation of one of these methods, since the db connection is only estabilished at this point, so the chances of failures are higher here.

Extracting language info

Now let's see how we can extract some meta info from the db:
$tr->getLang();     // no langID => get current lang
$tr->getLang('it'); // same as above, if the current lang is Italian

// the first parameter is the lang code,
// with the second parameter you can filter the info you need
$tr->getLang('it', 'error_text');
$tr->getLang('en', 'name');
$tr->getLang('de', 'meta');
$tr->getLang('de', 'encoding');

Using decorators

Translation2 uses decorators to filter/change the retrieved strings. You can have a chain of decorators (filters), and you can also add yours.
$tr =& Translation2::factory($driver, $dbinfo, $params);
$tr->setLang('en');
$tr->setPageID('calendar');

// add a memory-based cache decorator, to do some basic prefetching and
// reduce the load on the db
$tr = & $tr->getDecorator('CacheMemory');

// add a file-based cache decorator, to cache the query results through pages
$tr =& $tr->getDecorator('CacheLiteFunction');
$tr->setOption('cacheDir', 'cache/');
$tr->setOption('lifeTime', 3600*24);

// add a fallback lang decorator
$tr = & $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'it');

// add a special chars decorator to replace special characters with the html entity
$tr = & $tr->getDecorator('SpecialChars');
// control the charset to use
$tr->setOption('charset', 'ISO-8859-2');

// add a UTF-8 decorator to automatically decode UTF-8 strings
$tr = & $tr->getDecorator('UTF8');

// add a default text decorator to deal with empty strings
$tr = & $tr->getDecorator('DefaultText');
// replace the empty string with its stringID
echo $tr->get('emptyString');
// use a custom fallback text
echo $tr->get('emptyString', 'stringGroup', 'en', 'show this default text');

Getting the stringID from a string

The getStringID() method is the reverse of get(). If you want to translate a string to another language, but you don't know the associated stringID, you can retrieve it with this method:
$tr->setLang('it');

// translate the Italian string "gennaio" into the English "january"
$stringID = $tr->getStringID('gennaio', 'calendar');
echo $translatedString = $tr->get($stringID, 'calendar', 'en');

Parameter substitution

Translation2 can handle parametric strings, and replace them with parameters passed at runtime (they can be numeric or associative arrays).
// "hello_user" = "hello &&user&&, today is &&weekday&&, &&day&&th &&month&& &&year&&"

$tr->setParams(array(
    0         => '',
    'user'    => 'Joe',
    'day'     => '15',
    'month'   => $tr->get('month_01', 'calendar', 'en'),
    'year'    => '2004',
    'weekday' => $tr->get('day_5', 'calendar', 'en')
));

echo $tr->get('hello_user');
// the above line will print "hello Joe, today is Friday, 15th January 2004"

Getting the translations from multiple "pages"

If your site structure is organized in sections, like a header, a body and a footer, you may use those units as "pages" (or groups of translations), and then fetch them one by one:
$header_trans = $tr->getPage('header');
$body_trans   = $tr->getPage('body');
$footer_trans = $tr->getPage('footer');
If you want them all in a single result, just merge them into a single array:
$translations = array_merge(
    $tr->getPage('header'),
    $tr->getPage('body'),
    $tr->getPage('footer')
);

Admin Introduction

Admin Introduction -- Usage of Translation2_Admin

What is Translation2_Admin?

Translation2_Admin is a class meant to help with translation management (add/remove a language, add/remove a string).

Adding a new language

This simple example will show how you can add a new language [addLang()], using the MDB2 driver:
// set the parameters to connect to your db
$dbinfo = array(
    'hostspec' => 'host',
    'database' => 'dbname',
    'phptype'  => 'mysql',
    'username' => 'user',
    'password' => 'pwd'
);

// tell Translation2 about your db-tables structure,
// if it's different from the default one.
$params = array(
    'langs_avail_table' => 'langs_avail',
    'lang_id_col'       => 'id',
    'lang_name_col'     => 'name',
    'lang_meta_col'     => 'meta',
    'lang_errmsg_col'   => 'error_text',
    'lang_encoding_col' => 'encoding',
    'strings_tables'    => array(
                            'it' => 'i18n',
                            'de' => 'i18n'
                         ),
    //OR, if you use only one table,
    //'strings_default_table' => 'i18n',
    'string_id_col'      => 'id',
    'string_page_id_col' => 'page_id',
    'string_text_col'    => '%s'  //'%s' will be replaced by the lang code
);

$driver = 'MDB2';

require_once 'Translation2/Admin.php';
$tr =& Translation2_Admin::factory($driver, $dbinfo, $params);

// set some info about the new lang
$newLang = array(
    'lang_id'    => 'en',
    'table_name' => 'i18n',
    'name'       => 'english',
    'meta'       => 'some meta info',
    'error_text' => 'not available',
    'encoding'   => 'iso-8859-1',
);

$tr->addLang($newLang);
That's it. If you specified a new table, it will be created, if you used the same table name as the one of your other translations, it will be ALTERed to host the new language too.

Updating a language

This simple example will show how you can update an existing language [updateLang()]:
// set some info about the new lang
$langData = array(
    'lang_id'    => 'en',
    'table_name' => 'i18n',
    'name'       => 'English',
    'meta'       => 'some updated meta info',
    'error_text' => 'this text is not available in English',
    'encoding'   => 'iso-8859-15',
);

$tr->updateLang($langData);

Removing an existing language

If you want to remove all the translated strings and the info for a certain language, all you have to do is
$tr->removeLang('fr');
removeLang() can accept a 2nd parameter ($force): if you want to remove the whole strings table (regardless it being used for other languages as well), you can do it this way:
$tr->removeLang('fr', true);
Be warned it won't do any check, so you're responsible for what you do ;-)

Adding new translations

Now let's see how we can add() a new translation for a new or an existing string.
$stringArray = array(
    'en' => 'sample',
    'it' => 'esempio',
);

// add the English and Italian translations associated to
// the 'smallTest' stringID and to the 'testGroup' pageID

$tr->add('smallTest', 'testGroup', $stringArray);

Remove a translation

You can remove() the translations for a certain stringID:
$tr->remove('smallTest', 'testGroup');

Containers Overview

Containers Overview -- Overview of the different Translation2 containers

Summary

Translation2 supports different storage drivers; this page is meant to highlight the differences among them.

PEAR::DB, PEAR::MDB, PEAR::MDB2

Translation2 can work with any of these database abstraction layers, just pass the appropriate connection options. These three containers are absolutely identical in what they do and in how they work (wrt Translation2, of course).
// connection options
$dbinfo = array(
    'hostspec' => 'host',
    'database' => 'dbname',
    'phptype'  => 'mysql',
    'username' => 'user',
    'password' => 'pwd'
);
//select the preferred driver
$driver = 'MDB2'; //switch to 'DB' or 'MDB' as needed

require_once 'Translation2.php';
$tr =& Translation2::factory($driver, $dbinfo, $params);
If your table definition is different from the default one, you need to specify it in the $params array.

DB_DataObject

The dataobjectsimple container is the natural choice for those using DB_DataObject, as it is tightly tied to the DAO. This storage driver can use all databases supported by the PEAR::DB abstraction layer to fetch data.

For this container, you can't specify a custom table definition, since this feature is not supported yet. You must create a table with the following structure:
// meta data etc. not supported
table: translations
id          // not null primary key autoincrement..
string_id   // translation id
page        // indexed varchar eg. (mytemplate.html)
lang        // index varchar (eg. en|fr|.....)
translation // the translated value in language lang.
Here's the MySQL query that can be used to create the table:
create table translations (
  id int(11) auto_increment not null primary key,
  string_id int(11), page varchar(128),
  lang varchar(10), translation text
);
alter table translations add index page (page);
alter table translations add index lang (lang);
alter table translations add index string_id (string_id);
then just run the dataobjects createtables script.

Gettext

This is a wrapper around the gettext base functions, and thanks to File_Gettext you can retrieve an entire domain or write to an existing/new domain without calling the command line compiler utility.

The gettext container requires PEAR::File_Gettext and PEAR::I18Nv2 0.9.1 or newer, make sure you have them installed.

The construction parameters are a bit different from the db ones. To make things as simple as possible, the domain definitions and the available language list are read from two INI files.

langs.ini example:
; If one does not specify the source encoding, ISO-8859-1 is assumed
; Beware that gettext can choke on bad encodings!

[en]
name = English
encoding = iso-8859-1

[de]
name = Deutsch
encoding = iso-8859-1

[it]
name = italiano
encoding = iso-8859-1
domains.ini example:
messages = /path/to/locale
2nddomain = /path/to/locale
3rddomain = /path/to/locale

Sample code to use Translation2 with the gettext container:
require_once 'Translation2.php';

$params = array(
	'prefetch'          => false,
    'langs_avail_file'  => 'path/to/langs.ini',
    'domains_path_file' => 'path/to/domains.ini',
    'default_domain'    => 'messages',
    //'file_type'       => 'po',
);

// Better set prefetch to FALSE for the gettext container, so we don't need 
// to read in the whole MO file with File_Gettext on every request.
$tr =& Translation2::factory('gettext', $params);

$tr->setLang('en');

// Note that, if there is no translation available for a string, the gettext 
// container will return the string ID!  This behaviour emulates native gettext.
echo $tr->get('mystring');

print_r($tr->getPage('3rddomain'));

XML

The XML container requires PEAR::XML_Serializer 0.13.0 or newer, make sure you have it installed.
$driver = 'XML';
$options = array(
    'filename'         => 'i18n.xml',
    'save_on_shutdown' => true, //set to FALSE to save in real time
);
require_once 'Translation2.php';
$tr =& Translation2::factory($driver, $options);

constructor Translation2::Translation2()

constructor Translation2::Translation2() -- Constructor

Description

This constructor is deprecated in favour of the factory() method.

Note

This function can not be called statically.

Translation2::factory()

Translation2::factory() -- Return an instanciated Translation2 object

Description

This is the Translation2 factory

Parameter

string $storageDriver

Type of the storage driver ('db', 'mdb', 'mdb2', 'gettext', 'dataobjectsimple')

mixed $options

Additional options for the storage driver (example: if you are using DB as the storage driver, you have to pass the dsn string here)

array $params

Array of parameters for the adapter class (i.e. you can set here the mappings between your table/field names and the ones used by this class)

Note

This function can not be called statically.

Translation2::get()

Translation2::get() -- Get translated string

Description

Fetch the string from the container. If the string is empty and the DefaultText decorator is used, then return the $defaultText.

Parameter

string $stringID

string $pageID

string $langID

string $defaultText

Text to display when the string is empty. NB: This parameter is only used in the DefaultText decorator

Note

This function can not be called statically.

Translation2::getDecorator()

Translation2::getDecorator() -- Return an instance of a decorator

Description

This method is used to get a decorator instance. A decorator can be seen as a filter, i.e. something that can change or handle the values of the objects/vars that pass through.

Parameter

string $decorator

Name of the decorator

object $obj [optional]

Object to decorate (the default object being $this)

Return value

returns object Reference of a Translation2_Decorator subclass

Note

This function can not be called statically.

Translation2::getLang()

Translation2::getLang() -- get lang info

Description

Get some extra information about the language (its full name, the localized error text, ...)

Parameter

string $langID

string $format

['name', 'meta', 'error_text', 'array']

Return value

returns [string | array], depending on $format

Note

This function can not be called statically.

Translation2::getLangs()

Translation2::getLangs() -- get langs

Description

Get some extra information about the languages (their full names, the localized error text, their codes...)

Parameter

string $format

['ids', 'names', 'array']

Note

This function can not be called statically.

Translation2::getPage()

Translation2::getPage() -- Get an entire group of strings

Description

Same as getRawPage(), but resort to fallback language and replace parameters when needed.

NB: in Translation2 lingo, a "page" is just a logical "group of strings", it doesn't have to be a "phisical" (HTML or whatever) page.

Parameter

string $pageID

string $langID

Note

This function can not be called statically.

Translation2::getRaw()

Translation2::getRaw() -- Get translated string (as-is)

Description

Fetch the string from the container. If the string is empty return $defaultText.

Parameter

string $stringID

string $pageID

string $langID

string $defaultText

Text to display when the string is empty

Note

This function can not be called statically.

Translation2::getRawPage()

Translation2::getRawPage() -- Get the array of strings in a page

Description

Fetch the page (aka 'group of strings') from the container, without applying any formatting and without replacing the parameters.

Parameter

string $pageID

string $langID

Note

This function can not be called statically.

Translation2::getStringID()

Translation2::getStringID() -- Get the stringID for a given string

Description

Get the stringID of the string passed as parameter

Parameter

string $string

This is NOT the stringID, this is a real string. The method will return its matching stringID.

mixed $pageID

Note

This function can not be called statically.

Translation2::replaceEmptyStringsWithKeys()

Translation2::replaceEmptyStringsWithKeys() -- Replace the array values with their keys when empty

Description

Replace the array values with their keys when empty, just like gettext would do.

Parameter

array $strings array of strings (e.g. as returned by getPage())

Translation2::setCharset()

Translation2::setCharset() -- Set the charset used to get/store the translations

Description

Set the charset that shall be used when retrieving strings. Currently only used by the MDB2 container.

Parameter

string $charset charset name to pass to the container (for instance, 'utf8')

Note

This function can not be called statically.

Translation2::setLang()

Translation2::setLang() -- Set default lang

Description

Set the language that shall be used when retrieving strings.

Parameter

string $langID language code (for instance, 'en' or 'it')

Note

This function can not be called statically.

Translation2::setPageID()

Translation2::setPageID() -- Set default page

Description

Set the page (aka 'group of strings') that shall be used when retrieving strings. If you set it, you don't have to state it in each get() call.

Parameter

string $pageID

Note

This function can not be called statically.

Translation2::setParams()

Translation2::setParams() -- Set parameters for next string

Description

Set the replacement for the parameters in the string(s). Parameter delimiters are customizable.

Parameter

array $params

Note

This function can not be called statically.

Class Summary Translation2_Admin

Class Summary Translation2_Admin  -- Administration utilities for translation string management

Administration utilities for translation string management

This package is not documented yet.

Class Trees for Translation2_Admin

Translation2_Admin Inherited Methods

Table 48-1. Inherited from Translation2

Method NameSummary
Constructor Translation2::Translation2() Constructor (deprecated in favour of factory())
Factory Translation2::factory() Return a Translation2 instanciated object
Translation2::get() Get translated string
Translation2::getDecorator() Return an instance of a decorator
Translation2::getLang() get language info
Translation2::getLangs() get available languages
Translation2::getPage() Same as getRawPage(), but resort to fallback language and replace parameters when needed
Translation2::getRaw() Get translated string (as-is)
Translation2::getRawPage() Get the array of strings in a page
Translation2::setCharset() Set the correct charset in the database
Translation2::setLang() Set default lang
Translation2::setPageID() Set default page
Translation2::setParams() Set parameters for next string
Translation2::getStringID() Get the stringID for a given string

Translation2_Admin::addLang()

Translation2_Admin::addLang() -- Prepare the storage container for a new lang.

Description

If the langsAvail table doesn't exist yet, it is created.

Parameter

array $langData

array(
    'lang_id'    => 'en',
    'table_name' => 'i18n',
    'name'       => 'english',
    'meta'       => 'some meta info',
    'error_text' => 'not available',
    'encoding'   => 'iso-8859-1',
);

array $options

array(
    'charset'   => 'latin1',
    'collation' => 'latin1_bin',
);

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::updateLang()

Translation2_Admin::updateLang() -- Update the language details.

Description

Update the language details.

Parameter

array $langData

array(
    'lang_id'    => 'en',
    'table_name' => 'i18n',
    'name'       => 'english',
    'meta'       => 'some new meta info',
    'error_text' => 'text not available',
    'encoding'   => 'iso-8859-15',
);

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::removeLang()

Translation2_Admin::removeLang() -- Remove the language from the langsAvail table and drop the strings table.

Description

If the strings table holds other languages and $force==FALSE, then only the lang column is dropped. If $force==TRUE, the whole table is dropped without any check

Parameter

string $langID

Code of the language to remove

boolean $force

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::add()

Translation2_Admin::add() -- add a new translation

Description

Add a new translated string (or a set of translated strings) for a given stringID. For instance, to add the English, Spanish and Italian translations for the stringID 'example', use the following code:
$stringArray = array(
    'en' => 'example',
    'es' => 'ejemplo',
    'it' => 'esempio',
);
$tr->add('example', 'mypage', $stringArray);

Parameter

string $stringID

identificator for the string

string $pageID

destination pageID, i.e. the group of strings where this string belongs to.

array $stringArray

Associative array with string translations.

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::remove()

Translation2_Admin::remove() -- remove a translated string

Description

Remove all the translations for the given stringID + pageID pair.

Parameter

string $stringID

string $pageID

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::update()

Translation2_Admin::update() -- Update an existing translation.

Description

Update the language details.

Parameter

string $stringID

ID of the string to translate

string $pageID

ID of the page (or group) the string to translate belongs to

array $stringArray

Associative array with string translations:
array(
    'en' => 'sample',
    'it' => 'esempio',
);

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::removePage()

Translation2_Admin::removePage() -- remove all the translated strings in a page/group

Description

Remove all the translations for the given pageID.

Parameter

string $pageID

page/group ID

Return value

returns true on success, PEAR_Error on failure

Note

This function can not be called statically.

Translation2_Admin::cleanCache()

Translation2_Admin::cleanCache() -- Clear the cache. Use with the CacheLiteFunction decorator only.

Description

If you use the CacheLiteFunction decorator, you may want to invalidate the cache after a change in the data base.

Note

This function can not be called statically.

Translation2_Admin::getPageNames()

Translation2_Admin::getPageNames() -- Get a list of all the pageIDs in any table.

Description

Get a list of all the pageIDs in any table.

Return value

returns array of pageIDs

Note

This function can not be called statically.

Translation2_Admin::getAdminDecorator()

Translation2_Admin::getAdminDecorator() -- Return an instance of an admin decorator

Description

This method is used to get a decorator instance. A decorator can be seen as a filter, i.e. something that can change or handle the values of the objects/vars that pass through.

Parameter

string $decorator

Name of the decorator

object $obj [optional]

Object to decorate (the default object being $this)

Return value

returns object Reference of a Translation2_Admin_Decorator subclass

Note

This function can not be called statically.

Class Summary Translation2_Decorator

Class Summary Translation2_Decorator  -- Decorates a Translation2 class.

Decorates a Translation2 class.

Create a subclass of this class for your own "decoration". The base class acts as a proxy to these methods:

  • get()

  • getDecorator()

  • getLang()

  • getLangs()

  • getPage()

  • getRaw()

  • getRawPage()

  • getStringID()

  • replaceEmptyStringsWithKeys()

  • setCharset()

  • setContainerOptions() [protected]

  • setLang()

  • setOption()

  • setOptions() [protected]

  • setPageID()

  • setParams()

  • translate()

If you want to "decorate" any of these methods, you have to override them in your custom Decorator.

Class Summary Translation2_Decorator_CacheLiteFunction

Class Summary Translation2_Decorator_CacheLiteFunction  -- Decorator to cache fetched data using Cache_Lite_Function class

Cache_Lite_Function Decorator Example

This decorator provides a very efficient cache layer. It requires PEAR::Cache_Lite. It supports all the main options supported by Cache_Lite:

  • lifeTime [integer]

  • cacheDir [string]

  • fileLocking [boolean]

  • caching [boolean]

If you need to pass an option directly to the Cache_Lite object, you can use setCacheOption().
$tr = new Translation2($driver, $dbinfo, $params);
$tr =& $tr->getDecorator('CacheLiteFunction');
$tr->setOption('cacheDir', '/var/tmp/');
$tr->setOption('lifeTime', 3600*24*7); //one week

//change a custom Cache_Lite option
$tr->setCacheOption($name, $value);

Class Summary Translation2_Decorator_CacheMemory

Class Summary Translation2_Decorator_CacheMemory  -- Decorator to cache fetched data in memory

CacheMemory Decorator Example

This decorator provides a memory cache layer. It does NOT persist through requests, only in the current execution of the script. You can turn off prefetch if you want small network load (but it will increase the number of queries to the database)
$tr = new Translation2($driver, $dbinfo, $params);
$tr =& $tr->getDecorator('CacheMemory');
$tr->setOption('prefetch', true); //default value is true

Class Summary Translation2_Decorator_DefaultText

Class Summary Translation2_Decorator_DefaultText  -- Decorator to provide a fallback text for empty strings.

DefaultText Decorator Example

When the fetched string is empty, it replaces it with the 4th parameter of the get() method, i.e. $defaultText. If the defaultText parameter is empty too, then return "$emptyPostfix.$outputString.$emptyPrefix", the three variables being class properties you can set to a custom string.

When getPage() is called, all the empty strings in the page are replaced by their stringID value.

$tr = new Translation2($driver, $dbinfo, $params);
$tr =& $tr->getDecorator('DefaultText');

// %stringID% will be replaced with the stringID
// %pageID_url% will be replaced with the pageID
// %stringID_url% will replaced with a urlencoded stringID
// %url% will be replaced with the targeted url
$tr->outputString = '%stringID%<a href="%url%">(T)</a>'; //default: '%stringID%'
$tr->url = '#';           //same as default
$tr->emptyPrefix  = '[';  //default: empty string
$tr->emptyPostfix = ']';  //default: empty string

Class Summary Translation2_Decorator_ErrorText

Class Summary Translation2_Decorator_ErrorText  -- Decorator to provide a fallback error_text message for empty strings.

ErrorText Decorator Example

When the fetched string is empty, it replaces it with the contents of the "error_text" column of the langs_avail table
$tr = new Translation2($driver, $dbinfo, $params);
$tr =& $tr->getDecorator('ErrorText');

Class Summary Translation2_Decorator_Lang

Class Summary Translation2_Decorator_Lang  -- Decorator to provide a fallback language for empty strings.

Lang Decorator Example

This decorator is very useful when you want to provide a fallback language for empty strings. It is stackable, so you can have more than one default language. Use setOption() with the fallbackLang parameter to specify the fallback language of the current decorator.
$tr = new Translation2($driver, $dbinfo, $params);

//set English as the main language
$tr->setLang('en');

//set Italian as the first fallback language
$tr =& $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'it');

//set Spanish as the second fallback language
$tr =& $tr->getDecorator('Lang');
$tr->setOption('fallbackLang', 'es');

Class Summary Translation2_Decorator_Iconv

Class Summary Translation2_Decorator_Iconv  -- Decorator to switch from/to different encodings.

Iconv Decorator Example

Use setOption() with the encoding parameter to specify the target encoding of the current decorator.
$tr = new Translation2($driver, $dbinfo, $params);

//set Hungarian as the main language
$tr->setLang('hu');

//encode all the strings using the ISO-8859-2 charset
$tr =& $tr->getDecorator('Iconv');
$tr->setOption('encoding', 'ISO-8859-2');

Class Summary Translation2_Decorator_SpecialChars

Class Summary Translation2_Decorator_SpecialChars  -- Decorator to replace special chars with the matching html entities.

SpecialChars Decorator Example

This decorator replaces special chars with the matching html entities. Use setOption() with the charset parameter to specify the target charset of the current decorator (the default is 'ISO-8859-1'):
$tr = new Translation2($driver, $dbinfo, $params);
$tr =& $tr->getDecorator('SpecialChars');
$tr->setOption('charset', 'UTF-8');

Class Summary Translation2_Decorator_UTF8

Class Summary Translation2_Decorator_UTF8  -- Decorator to convert UTF-8 strings to ISO-8859-1

UTF-8 Decorator Example

This decorator calls utf8_decode() on each string
$tr = new Translation2($driver, $dbinfo, $params);
$tr =& $tr->getDecorator('UTF8');

Package Translation2 Constants

Package Translation2 Constants -- Constants defined in and used by Translation2

Chapter 50. Mail

Provides Packages for creating and working with electronic mails



Mail

Table of Contents
Introduction -- How to send a mail and the mailer backends
Mail::factory() -- creates a mailer instance
Mail::send() -- sends a mail
RFC822 - Introduction -- email address validation
Mail_RFC822::parseAddressList() -- extract the parts of a list of email addresses

An interface for sending EMails

Introduction

Introduction -- How to send a mail and the mailer backends

How To send a mail

Mail supports different types of backends to send email. So two steps are necessary to send an email.

  • Step 1

    Create a new instance of a specific Mail-Backend with the factory() method.

  • Step 2

    Send the mail using the send() method.

The mailer backends

Mail supports three types of backends:

  • mail

    Sends a mail using PHP's built-in mail() function.

  • sendmail

    Sends a mail using a sendmail program.

  • smtp

    Sends a mail directly connecting to a smtp server.

Mail::factory()

Mail::factory() -- creates a mailer instance

Description

Creates a instance of a backend-specific mailer class.

Parameter

  • string $backend - the name of the backend "mail","smtp", "sendmail"

  • array $params - a array of backend specific parameters.

    List of parameter for the backends

    • mail

      • If safe mode is disabled, $params will be passed as the fifth argument to the PHP mail() function. If $params is an array, its elements will be joined as a space-delimited string.

    • sendmail

      • $params["sendmail_path"] - The location of the sendmail program on the filesystem. Default is /usr/bin/sendmail.

      • $params["sendmail_args"] - Additional parameters to pass to the sendmail. Default is -i.

    • smtp

      • $params["host"] - The server to connect. Default is localhost.

      • $params["port"] - The port to connect. Default is 25.

      • $params["auth"] - Whether or not to use SMTP authentication. Default is FALSE.

      • $params["username"] - The username to use for SMTP authentication.

      • $params["password"] - The password to use for SMTP authentication.

      • $params["localhost"] - The value to give when sending EHLO or HELO. Default is localhost

      • $params["timeout"] - The SMTP connection timeout. Default is NULL (no timeout).

      • $params["verp"] - Whether to use VERP or not. Default is FALSE.

      • $params["debug"] - Whether to enable SMTP debug mode or not. Default is FALSE.

      • $params["persist"] - Indicates whether or not the SMTP connection should persist over multiple calls to the send() method.

Return value

object - a specific Mail instance or a PEAR_Error object on failure.

Note

This function should be called statically.

Mail::send()

Mail::send() -- sends a mail

Description

Sends a mail. The send() method is provided by the object returned from factory()

Parameter

  • mixed $recipients - an array or a string with comma separated recipients.

  • array $headers - an associative array of headers. The header name is used as key and the header value as value. If you want to override the envelope sender of the email, set the Return-Path header and that value will be used instead of the value of the From: header.

  • string $body - the body of the email.

Return value

boolean - TRUE or a PEAR_Error object on failure.

Throws

Table 50-1. Possible PEAR_Error values

Mailer driverError codeError messageReasonSolution
sendmailNULL "No from address given." The $headers array requires at least a from entry. Add a From header:
$headers['From'] = 'mymail@example.com';
sendmailNULL "From address specified with dangerous characters." The from entry in the $headers array contains one ore more characters which could be non-RFC compliant. Check the given from address for characters like: spaces or ; or & or ` (backtick).
sendmailNULL "sendmail [path to sendmail] not executable" The path to sendmail program is not correct. No sendmail executable found there. Check the $param['sendmail_path'] entry in your Mail::factory() call. If you use another mailer then sendmail, ie. qmail, check installation of the mailer. Normally it should includes a sendmail wrapper.
sendmailNULL "sendmail returned error code code" Sendmail returns a error, which must be handled by use. See the documention of your mailer program.
smtpPEAR_MAIL_SMTP_ERROR_CREATE "Failed to create a Net_SMTP object" Failure in class creation. Reinstall/update the Net_SMTP package.
smtpPEAR_MAIL_SMTP_ERROR_CONNECT "Failed to connect to host:port" Connect to SMTP server failed. Check $param['port'] and $param['host'] entries in your Mail::factory() call.
smtpPEAR_MAIL_SMTP_ERROR_AUTH "method authentication failure" Authentication failed. Check $param['auth'], $param['username'] and $param['password'] entries in your Mail::factory() call. Ensure to use the correct authentication method for the SMTP server.
smtpPEAR_MAIL_SMTP_ERROR_FROM "No From: address has been provided" The $headers array requires at least a from entry. Add a From header:
$headers['From'] = 'mymail@example.com';
smtpPEAR_MAIL_SMTP_ERROR_SENDER "Failed to set sender: from" Setting the sender address failed. Check the RFC-compliances of the sender address and the server connnectivity.
smtpPEAR_MAIL_SMTP_ERROR_RECIPIENT "Failed to add recipient: recipient " Sending of recipient address failed. Check the RFC-compliances of the recipient address and the server connnectivity.
smtpPEAR_MAIL_SMTP_ERROR_DATA "Failed to send data" Body of the mail message could not send Check the RFC-compliances of the message body and the server connnectivity.

Note

This function can not be called statically.

Example

<?php
include('Mail.php');

$recipients = 'joe@example.com';

$headers['From']    = 'richard@example.com';
$headers['To']      = 'joe@example.com';
$headers['Subject'] = 'Test message';

$body = 'Test message';

$params['sendmail_path'] = '/usr/lib/sendmail';

// Create the mail object using the Mail::factory method
$mail_object =& Mail::factory('sendmail', $params);

$mail_object->send($recipients, $headers, $body);
?>

RFC822 - Introduction

RFC822 - Introduction -- email address validation

Description

This class performs email address checking according to the RFC822 specification.

Note that the class only checks for a proper format of the indicated email address. This means it is not guaranteed that the email address itself exists or is owned by the particular user. You may also want to send the user an email, and force them to respond.

Mail_RFC822::parseAddressList()

Mail_RFC822::parseAddressList() -- extract the parts of a list of email addresses

Description

Extracts the given addresses into their parts.

Parameter

  • string $address - the address(es) to validate

  • string $defaultDomain - the default domain to use in case of absence in the given email address.

  • boolean $nestGroups - whether to return the structure with groups nested for easier viewing.

  • boolean $validate - whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.

Return value

array - a nested array of anonymous objects.

If $nestGroups set to FALSE, you can jump over the next paragraph.

Every array entry contains an object per group. This object has two attributes:

groupname - the name of the group
addresses - an array of all addresses of a group

The addresses array consists of an array of anonymous objects for each address. This object comes with the following attributes:

personal - the name of the address owner
comment - an array, an entry for each comment per address
mailbox - the name of the mailbox, the part before the @
host - the name of the server, the part after the @

Note

This function can be called statically.

Warning

This class checks the string only. It does not check for the existence of an email address.


Mail_IMAP

Table of Contents
Introduction --  Mail_IMAP provides a simplified backend for working with the c-client (IMAP) extension.

Mail_IMAP provides a simplified backend for working with the c-client (IMAP) extension. It serves as an OO wrapper for commonly used c-client functions. It provides structure and header parsing as well as body retrieval.

Introduction

Introduction --  Mail_IMAP provides a simplified backend for working with the c-client (IMAP) extension.

Mail_IMAP Description

Mail_IMAP provides an object-oriented backend for working with the PHP c-client (imap) extension. The c-client extension provides functionality for connecting to IMAP, POP3 or NNTP mailboxes. Mail_IMAP acts as a wrapper for the most used c-client functions providing parsing of multipart messages, intelligent message body retrieval as well as header parsing and retrieval. Mail_IMAP is an ideal solution when a customizable webmail template is necessary. Mail_IMAP may also act as a component in an automated mailing list manager, as it can do all the dirty work of retrieving the subject line, message body, attachments or other message components.

The full online documentation is available here


Mail_Mbox

Table of Contents
Class Summary Mail_Mbox -- Class to read mbox mail files.
Tutorial -- How to use Mail_Mbox
constructor Mail_Mbox::Mail_Mbox() -- Create a new Mbox class instance.
Mail_Mbox::close() -- Close a Mbox
Mail_Mbox::get() -- Get a message from the mbox
Mail_Mbox::getDebug() -- Returns the debug flag setting
Mail_Mbox::getTmpDir() -- Returns the temporary directory
Mail_Mbox::hasBeenModified() -- Checks if the file was modified since it has been loaded.
Mail_Mbox::insert() -- Insert a message
Mail_Mbox::open() -- Open the mbox file
Mail_Mbox::remove() -- Remove a message from Mbox and save it.
Mail_Mbox::setDebug() -- Set the debug flag
Mail_Mbox::setTmpDir() -- Set the directory for temporary files.
Mail_Mbox::size() -- Get number of messages in this mbox
Mail_Mbox::update() -- Update a message
Mail_Mbox::_move() -- Copy a file to another
Mail_Mbox::_process() -- Process the Mbox

Class Summary Mail_Mbox

Class Summary Mail_Mbox  -- Class to read mbox mail files.

Reading and writing mbox files.

An mbox mail file is contains plain emails concatenated in one big file. Since each mail starts with "From ", and ends with a newline, they can be separated from each other.

This class takes a mbox filename in the constructor, generates an index where the mails start and end when calling open() and returns single mails with get(), using the positions in the index.

With the help of this class, you also can insert(), remove() and update() messages in the mbox file. When calling one of this methods, the class checks if the file has been modified since the index was created - changing the file with the wrong positions in the index would very likely corrupt it. This check is not done when retrieving single messages via get(), as this would slow down the process if you retrieve thousands of mails. You can, however, call hasBeenModified() before using get() to check for modification yourself. If the method returns true, you should close() and re-open() the file.

If something strange happens and you don't know why, activate debugging with setDebug(true). You also can modify the temporary directory in which changed mboxes are stored when adding/removing/modifying by using setTmpDir('/path/')

Class Tree for Mail_Mbox

  • PEAR

    • Mail_Mbox

Tutorial

Tutorial -- How to use Mail_Mbox

How to use Mail_Mbox

Before you can do anything with the mbox file, you need to create an instance of the Mail_Mbox class and open() it.

<?php
require_once 'Mail/Mbox.php';
$mbox = new Mail_Mbox('/path/to/mbox');
$mbox->open();
//do more here
?>

After opening the file, you can retrieve single messages via get(). The size() method helps you to determine the number of messages:

<?php
//... initialisation
for ($n = 0; $n < $mbox->size(); $n++) {
    $message = $mbox->get($n);
    //do something with the message text
}
?>

If you're done working with the file, close() it.

<?php
//... other code
$mbox->close();
?>

Also have a look at the Mail_Mbox examples directory in /path/to/pear/docs/Mail_Mbox/examples/.

constructor Mail_Mbox::Mail_Mbox()

constructor Mail_Mbox::Mail_Mbox()  -- Create a new Mbox class instance.

Description

After creating a new instance, you should use open() to open an mbox file.

Parameter

string $file

Filename to open.

Mail_Mbox::close()

Mail_Mbox::close()  -- Close a Mbox

Description

Close the Mbox file opened by open().

Return value

returns true on success, else PEAR_Error

Mail_Mbox::get()

Mail_Mbox::get()  -- Get a message from the mbox

Description

Returns the full email message at the given position.

Note: Message number start from 0.

Parameter

integer $message

The number of the message to retrieve.

Return value

returns Return the message, or PEAR_Error on error.

Mail_Mbox::getDebug()

Mail_Mbox::getDebug()  -- Returns the debug flag setting

Description

Returns true if debugging is enabled.

Return value

returns true if debug is enabled.

Mail_Mbox::getTmpDir()

Mail_Mbox::getTmpDir()  -- Returns the temporary directory

Description

Returns the temporary directory.

Return value

returns The temporary directory.

Mail_Mbox::hasBeenModified()

Mail_Mbox::hasBeenModified()  -- Checks if the file was modified since it has been loaded.

Description

Checks if the mbox file has been modified since opening. If this is true, the file needs to be re-opened.

Return value

returns True if it has been modified.

Mail_Mbox::insert()

Mail_Mbox::insert()  -- Insert a message

Description

Mail_Mbox will insert the message according to the specified offset. (Remember: message 3 is the fourth message). The default is to insert the message AFTER the last message (offset = null).

Note: Mail_Mbox automatically adds \n\n at end of the message.

Parameter

string $content

The content of the new message.

mixed $offset

Return value

returns Return true or the PEAR_Error object on failure.

Mail_Mbox::open()

Mail_Mbox::open()  -- Open the mbox file

Description

Also, this function will process the mbox file and create a cache that tells each message start and end bytes.

Mail_Mbox::remove()

Mail_Mbox::remove()  -- Remove a message from Mbox and save it.

Description

Removes the message with the given id.

Note: Note: messages start with 0.

Parameter

integer $message

The number of the message to remove, or array of message ids to remove.

Return value

returns Return true or PEAR_Error object on failure.

Mail_Mbox::setDebug()

Mail_Mbox::setDebug()  -- Set the debug flag

Description

Sets the debug flag. If debugging is enabled, you will get more output.

Parameter

boolean $debug

True if debug is on, otherwise false.

See

see Mail_Mbox::$debug

Mail_Mbox::setTmpDir()

Mail_Mbox::setTmpDir()  -- Set the directory for temporary files.

Description

Sets the temporary directory in which new mbox files are stored.

Parameter

string $tmpdir

The new temporary directory.

See

see Mail_Mbox::$tmpdir

Mail_Mbox::size()

Mail_Mbox::size()  -- Get number of messages in this mbox

Description

Returns the number of messages in the mbox file.

Return value

returns Number of messages on Mbox (starting on 1, 0 if no message exists).

Mail_Mbox::update()

Mail_Mbox::update()  -- Update a message

Description

Replaces a given message with the text passed to this method.

Note: Mail_Mbox auto adds \n\n at end of the message

Note: messages start with 0.

Parameter

integer $message

The number of the Message to update.

string $content

The new content of the Message.

Return value

returns Return true if all is ok, otherwise PEAR_Error

Mail_Mbox::_move()

Mail_Mbox::_move()  -- Copy a file to another

Description

Used internally to copy the content of the temp file to the mbox file.

Parameter

string $ftempname

Source file - will be removed

string $filename

Output file

Mail_Mbox::_process()

Mail_Mbox::_process()  -- Process the Mbox

Description

  • Get start bytes and end bytes of each messages.


Mail_Mime

Table of Contents
Mail_Mime - Example -- generation and sending of a MIME mail
Mail_mimeDecode - Example -- decode an email
Mail_Mime::Mail_Mime() -- creates a new instance
Mail_Mime::addAttachment() -- add attachment
Mail_Mime::addHTMLImage() -- add image to message
Mail_Mime::get() -- build the message
Mail_Mime::headers() -- build the header lines
Mail_Mime::setHTMLBody() -- set HTML part
Mail_Mime::setTxtBody() -- set plain text part
Mail_mimePart::Mail_mimePart() -- constructor
Mail_mimePart::addsubpart() -- add sub part to a MIME part
Mail_mimePart::encode() -- encode a mail
Mail_mimeDecode::Mail_mimeDecode() -- constructor
Mail_mimeDecode::decode() -- perform decoding
Mail_mimeDecode::uudecode() -- decode of UU-coded data
Mail_mimeDecode::getXML() -- create XML representation of MIME parts

A Package to enable easy creation of complex multipart emails. If you look for a simple API for creating such emails, then Mail_Mime class will probably suffice. Else you can use Mail_mimePart, which gives you better control about MIME creation.

Mail_mimeDecode provides a API for decode MIME data.

Mail_Mime - Example

Mail_Mime - Example -- generation and sending of a MIME mail

Example

<?php
include('Mail.php');
include('Mail/mime.php');

$text = 'Text version of email';
$html = '<html><body>HTML version of email</body></html>';
$file = '/home/richard/example.php';
$crlf = "\n";
$hdrs = array(
              'From'    => 'you@yourdomain.com',
              'Subject' => 'Test mime message'
              );

$mime = new Mail_mime($crlf);

$mime->setTXTBody($text);
$mime->setHTMLBody($html);
$mime->addAttachment($file, 'text/plain');

//do not ever try to call these lines in reverse order
$body = $mime->get();
$hdrs = $mime->headers($hdrs);

$mail =& Mail::factory('mail');
$mail->send('postmaster@localhost', $hdrs, $body);
?>

Mail_mimeDecode - Example

Mail_mimeDecode - Example -- decode an email

Example

Example 50-1. Decode an email

<?php
require_once 'Mail/mimeDecode.php';
...
$params['include_bodies'] = true;
$params['decode_bodies']  = true;
$params['decode_headers'] = true;

$decoder = new Mail_mimeDecode($input);
$structure = $decoder->decode($params);
?>

This example calls the decode function statically (ie no object, straight function call) and then passes the structure to the getXML() function.

<?php

...
$params['include_bodies'] = true;
$params['decode_bodies']  = false;
$params['decode_headers'] = true;
$params['input']          = $input;
$params['crlf']           = "\r\n";

$structure = Mail_mimeDecode::decode($params);
$xml = Mail_mimeDecode::getXML($structure);

?>

Mail_Mime::Mail_Mime()

Mail_Mime::Mail_Mime() -- creates a new instance

Description

Creates a new instance of Mail_Mime

Parameter

  • string $crlf - the type of line end to use.

Note

Normally, it is not necessary to set the $crlf parameter. But, if you want to send the generated MIME message using Mail then you have to set $crlf to "\n"

Mail_Mime::addAttachment()

Mail_Mime::addAttachment() -- add attachment

Description

Adds an attachment to a message.

Parameter

  • string $file - The file name or the data itself

  • string $c_type - The content type of the image or file.

  • string $name - The suggested file name for the data. Only used, if $file contains data.

  • boolean $isfile - Whether $file is a file name or not.

  • string $encoding - Type of transfer encoding to use for the file data. Defaults is "base64". For text based files (eg. scripts/html etc.) this could be given as "quoted-printable".

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Mail_Mime::addHTMLImage()

Mail_Mime::addHTMLImage() -- add image to message

Description

If sending an HTML message with embedded images, use this function to add the image.

Parameter

  • string $file - The image file name or the image data itself

  • string $c_type - The content type of the image or file.

  • string $name - The filename of the image. Only used, if $file contains the image data.

  • boolean $isfile - Whether $file is a filename or not.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Mail_Mime::get()

Mail_Mime::get() -- build the message

Description

This function should be called once you have added the text/html/images/attachments. It builds the message and returns it. It does not send it. To send what this function returns (in conjunction with the headers() -function) you would need to use the Mail::send()-function

Parameter

  • array $param - An associative array of parameters. These parameters affect the way the message is built.

    • $param["text_encoding"] - Type of encoding to use for the plain text part of the email. Default is "7bit".

    • $param["html_encoding"] - Type of encoding for the HTML part of the email. Default is "quoted-printable".

    • $param["7bit_wrap"] - Number of characters after which text is wrapped. SMTP stipulates maximum line length of 1000 characters including CRLF. Default is 998 (CRLF is appended to make up to 1000).

    • $param["head_charset"] - The character set to use for the headers. Default is "iso-8859-1".

    • $param["text_charset"] - The character set to use for the plain text part of the email. Default is "iso-8859-1".

    • $param["html_charset"] - The character set to use for the HTML part of the email. Default is "iso-8859-1".

Return value

string - the body of the message

Note

This function can not be called statically.

Mail_Mime::headers()

Mail_Mime::headers() -- build the header lines

Description

Returns an array with the headers needed to prepend to the email (MIME-Version and Content-Type). Please note that the function get() has to be called before calling headers().

Parameter

  • array $headerEx - Additional headers, the format of the argument is $array["header-name"] = "header-value"

  • boolean $overwrite - Overwrite already existing headers. When FALSE, the values already set are kept.

Return value

array - an associative array with the mime headers and the additional headers. The return value can directly passed to the second parameter of Mail::send().

Note

This function can not be called statically.

Warning

Mail_Mime::headers() has to be called after Mail_Mime::get().

Mail_Mime::setHTMLBody()

Mail_Mime::setHTMLBody() -- set HTML part

Description

Sets the HTML part of a message

Parameter

  • string $data - The text to set or, if $isfile is TRUE a valid filename. An URL as argument is not allowed.

  • boolean $isfile - If TRUE, the content of given file $data is used as message text.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Mail_Mime::setTxtBody()

Mail_Mime::setTxtBody() -- set plain text part

Description

Sets the plain text part of a message

Parameter

  • string $data - The text to set or, if $isfile is TRUE a valid filename. An URL as argument is not allowed.

  • boolean $isfile - If TRUE, the content of given file $data is used as message text.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Mail_mimePart::Mail_mimePart()

Mail_mimePart::Mail_mimePart() -- constructor

Description

Create a new Mail_mimePart object.

Parameter

  • string $body - The body of the mime part if any. Default is an empty string.

  • array $params - An associative array of parameters:

    • $params["content_type"] - The content type for this part ie. multipart/mixed

    • $params["encoding"] - The encoding to use ie. 7bit, 8bit, base64 or quoted-printable

    • $params["cid"] - content ID to apply

    • $params["disposition"] - Content disposition inline or attachment

    • $params["dfilename"] - Optional filename parameter for content disposition

    • $params["description"] - Content description

    • $params["charset"] - Character set to use

    Default is an empty array.

Note

This function can be called statically.

Mail_mimePart::addsubpart()

Mail_mimePart::addsubpart() -- add sub part to a MIME part

Description

Adds a sub part to the current MIME part and returns a reference to it

Parameter

  • string - the body of the sub part

  • array - the parameter for the sub part. See constructor for the possible values.

Return value

resource - a reference to the added part

Note

This function can not be called statically.

Mail_mimePart::encode()

Mail_mimePart::encode() -- encode a mail

Description

Encodes and returns the email

Return value

array - an associative array containing two elements, body and headers. The headers element is itself an indexed array.

The key names are

'headers' - an array with the mail headers
'body' - a string with the mail body

Note

This function can not be called statically.

Mail_mimeDecode::Mail_mimeDecode()

Mail_mimeDecode::Mail_mimeDecode() -- constructor

Description

Create a new Mail_mimeDecode object.

Parameter

  • string $input - the input to decode

Note

This function can be called statically.

Mail_mimeDecode::decode()

Mail_mimeDecode::decode() -- perform decoding

Description

This function performs the decoding and returns a structure containing the message data.

Parameter

  • array $args - an array with the function arguments

    • boolean $args['include_bodies'] - whether to include the bodies in the returned structure.

    • boolean $args['decode_bodies'] - whether to decode the returned bodies.

    • boolean $args['decode_headers'] - whether to decode the headers (RFC2047).

    • string $args['input'] - if and only if called statically, this should be used to specify the input to be decoded.

    • string $args['crlf'] - if and only if called statically, this should be used to specify the line ending type.

Return value

object -

  • array $return->headers - an associative array of the headers. The keys of the array are the header names (lowercased) whilst the values are the header values (original case). If there are multiple headers with the same name (eg. Received: ) then the value is a numerically indexed array of each of the header values. If the parameter decode_headers is specified as TRUE, the headers will be decoded according to RFC 2047.

  • string $return->ctype_primary - the first part of the content type (ie. before the forward slash). Eg. if the content type is multipart/mixed, ctype_primary would be "multipart".

  • string $return->ctype_secondary - the second part of the content type. Eg. If the content type is multipart/mixed, ctype_secondary would be "mixed".

  • array $return->ctype_parameters - if the content type header has any parameters (eg. boundary="=_hudfhdsalfhds8fy8329hfj") then they will be in this associative array. Keys are the parameter name (eg. boundary) whilst the values are the parameter values (eg. =_hudfhdsalfhds8fy8329hfj).

  • string $return->disposition - if the Content-Disposition header is present, its value will be given here. This is usually either "inline" or "attachment".

  • array $return->d_parameters - if any parameters are given with the Content-Disposition header, they will be given here in an associative array, keys being the parameter names and values being the parameter values. "name" and "filename" are two common examples here.

  • array $return->body - if the include_bodies parameter is given when instanciating the class, (either statically or via a concrete instance), then this will be present if the part in question has a body. MIME parts with content type multipart/* generally do not not have bodies, instead consisting of subparts. If the parameter decode_bodies is specified as TRUE then the body will be decoded.

  • array $return->parts - if a MIME part consists of subparts, then this array will be present consisting of objects with the same properties as described here.

Note

This function can be called statically.

Mail_mimeDecode::uudecode()

Mail_mimeDecode::uudecode() -- decode of UU-coded data

Description

Decodes UU-coded data. 'Unix-to-Unix'-Encoding is used to send binary files (eg. programs, graphics) over 7bit-ASCII-only media, like email.

Parameter

  • string $input - data to decode

Return value

array - the decoded data

  • string $return[]['filename'] - the name of the UUencoded file.

  • string $return[]['fileperm'] - the file permissions of the UUencoded file, if given. The format is unix-styled, ie. "0666" or "666".

  • string $return[]['filedata'] - the decoded content of the UUencoded file.

Note

This function can be called statically.

Mail_mimeDecode::getXML()

Mail_mimeDecode::getXML() -- create XML representation of MIME parts

Description

getXML() converts the returned array from decode () into a valid XML document.

Parameter

Return value

string - the XML document

Note

This function can be called statically.


Mail_Queue

Table of Contents
Class Summary Mail_Queue -- Mail_Queue - base class for mail queue managment.
Tutorial -- A tutorial for Mail_Queue
constructor Mail_Queue::Mail_Queue() -- Mail_Queue constructor
Mail_Queue::deleteMail() -- Delete a mail from queue.
Mail_Queue::factorySendMail() -- Creates the necessary Mail object.
Mail_Queue::get() -- Get next mail from queue.
Mail_Queue::put() -- Put a new mail into queue.
Mail_Queue::sendMail() -- Sends mail object returned by Mail_Queue::get()
Mail_Queue::sendMailById() -- Send a specific mail.
Mail_Queue::sendMailsInQueue() -- Send mails from queue.

Class Summary Mail_Queue

Class Summary Mail_Queue -- Mail_Queue - base class for mail queue managment.

Mail_Queue - base class for mail queue managment.

This class allows you to queue mails for later delivery.

Class Trees for Mail_Queue

  • Pear

  • Mail_Queue

Tutorial

Tutorial -- A tutorial for Mail_Queue

Mail_Queue usage with a simple example

We are using the db-container for the example and a mysql database. You need to create some tables in the mysql-database to store the messages:

First you need to define some options. As you need them two times (once for adding messages, once for sending the messages) its always good to add them to a config-file. Lets call it config.php

So we are done configuring it, now let's use it. First we need to construct a mail-message and add it to the queue:

Ok, now we've used the simple way to add a message ... there are more advanced options, please check docs of the put-function for these. Now we need to send the messages. This is most often done by using a cron-job which regularly runs a script to send the messages. Here is a simple script to achieve this:

We are done. Now run the last script regularly and add your mails to the queue as needed.

Since Mail_Queue v.1.1, the preload() method doesn't preload ALL the mails in memory, but just a few of them each time. When the buffer is empty, it is filled again automatically. You can set the size of the buffer via the new setBufferSize() method.

You can also send the stored emails one by one. Here is a simple script to achieve this:

constructor Mail_Queue::Mail_Queue()

constructor Mail_Queue::Mail_Queue() -- Mail_Queue constructor

Description

Creates a new mail queue object to store mails in, fetch mails from and send mails with.

Parameter

array $container_options

Array of container (mail storage) options. See tutorial for details.

array $mail_options

Array of mailer options. See tutorial for details.

Example 50-1.

<?php

require_once 'Mail/Queue.php';

$container_options = array(
    'type'        => 'db',
    'database'    => 'dbname',
    'phptype'     => 'mysql',
    'username'    => 'root',
    'password'    => '',
    'mail_table'  => 'mail_queue',
);
//optionally, a 'dns' string can be provided instead of db parameters.
//look at DB::connect() method or at DB or MDB docs for details.
//you could also use mdb container instead db
$mail_options = array(
    'driver'   => 'smtp',
    'host'     => 'your_smtp_server.com',
    'port'     => 25,
    'auth'     => false,
    'username' => '',
    'password' => '',
);

$mail_queue =& new Mail_Queue($container_options, $mail_options);

* *****************************************************************
* // TO ADD AN EMAIL TO THE QUEUE
* *****************************************************************
$from             = 'user@server.com';
$from_name        = 'admin';
$recipient        = 'recipient@other_server.com';
$recipient_name   = 'recipient';
$message          = 'Test message';
$from_params      = empty($from_name) ? '<'.$from.'>' : '"'.$from_name.'" <'.$from.'>';
$recipient_params = empty($recipient_name) ? '<'.$recipient.'>' : '"'.$recipient_name.'" <'.$recipient.'>';
$hdrs = array(
    'From'    => $from_params,
    'To'      => $recipient_params,
    'Subject' => 'test message body',
);
$mime =& new Mail_mime();
$mime->setTXTBody($message);
$body = $mime->get();
$hdrs = $mime->headers($hdrs);

// Put message to queue
$mail_queue->put($from, $recipient, $hdrs, $body);

// Also you could put this msg in more advanced mode
$seconds_to_send = 3600;
$delete_after_send = false;
$id_user = 7;
$mail_queue->put( $from, $recipient, $hdrs, $body, $seconds_to_send, $delete_after_send, $id_user );

// TO SEND EMAILS IN THE QUEUE

// How many mails could we send each time
$max_ammount_mails = 50;
$mail_queue =& new Mail_Queue($container_options, $mail_options);
$mail_queue->sendMailsInQueue($max_ammount_mails);

?>

Return value

returnsTrue on success else pear error class.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::deleteMail()

Mail_Queue::deleteMail() -- Delete a mail from queue.

Description

Deletes a mail from the queue by identifier.

Parameter

integer $id

Mail identifier.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::factorySendMail()

Mail_Queue::factorySendMail() -- Creates the necessary Mail object.

Description

Creates the necessary Mail object.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::get()

Mail_Queue::get() -- Get next mail from queue.

Description

Get next mail from queue. The emails are preloaded into an internal memory buffer to speed up the process. Since Mail_Queue v.1.1, the preload() method doesn't preload ALL the mails in memory, but just a few of them each time. When the buffer is empty, it is filled again automatically. You can set the size of the buffer via the setBufferSize() method.

Return value

returnsMail_Queue_Body object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::put()

Mail_Queue::put() -- Put a new mail into queue.

Description

Injects a new mail into the mail queue.

Parameter

string $from

Sender e-mail address.

string $to

Recipient e-mail address.

array $hdrs

Array of mail headers as returned by Mail_Mime::headers().

array $body

Mail body array as returned by Mail_Mime::get().

mixed $sec_to_send

Optional - Seconds to pass before delivery is attempted.

mixed $delete_after_send

Optional - Whether or not to delete the mail after delivery.

integer $id_user

Optional - user ID. Stored in queue and readable from mail body object with getIdUser() at a later point.

Return value

returns ID of the record where this mail has been put or Mail_Queue_Error on error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::sendMail()

Mail_Queue::sendMail() -- Sends mail object returned by Mail_Queue::get()

Description

Sends mail object returned by Mail_Queue::get().

Parameter

object MailBody $mail

Mail object.

Return value

returns True on success else pear error class

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::sendMailById()

Mail_Queue::sendMailById() -- Send a specific mail.

Description

Sends a single mail from the queue specified by $id. Note: The queue entry will not be deleted automatically after delivery!

Parameter

integer $id

Mail identifier

Return value

returns True on success else false

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Mail_Queue::sendMailsInQueue()

Mail_Queue::sendMailsInQueue() -- Send mails from queue.

Description

Sends mails remaining in queue.

Parameter

integer $limit

Optional - maximum number of mails to send.

integer $offset

Optional - skip $offset mails and start sending from there.

integer $try

Optional - count of tries before mail returns to queue for later delivery.

Return value

returnsTrue on success else Mail_Queue_Error object.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Chapter 51. Math

Provides Packages for mathematical purposes



Math_Complex

Table of Contents
Class Summary Math_Complex --  Math_Complex: class to represent an manipulate complex numbers (z = a + b*i)
constructor Math_Complex::Math_Complex() -- Constructor for Math_Complex
Math_Complex::abs() -- Returns the magnitude (also referred as norm) of the number
Math_Complex::abs2() -- Returns the square of the magnitude of the number
Math_Complex::angle() --  Returns the angle (argument) associated with the complex number Alias of Math_Complex::arg()
Math_Complex::arg() -- Returns the argument of the complex number
Math_Complex::getIm() -- Returns the imaginary part of the complex number
Math_Complex::getReal() -- Returns the real part of the complex number
Math_Complex::norm() -- Returns the norm of the number Alias of Math_Complex::abs()
Math_Complex::toString() -- Simple string representation of the number
Class Summary Math_ComplexOp -- Math_ComplexOp: static class to operate on Math_Complex objects
Math_ComplexOp::acos() -- Calculates the inverse cosine of a complex number: z = acos(c1)
Math_ComplexOp::acosh() -- Calculates the inverse hyperbolic cosine of a complex number: z = acosh(c1)
Math_ComplexOp::acot() -- Calculates the inverse cotangent of a complex number: z = acot(c1)
Math_ComplexOp::acoth() --  Calculates the inverse hyperbolic cotangent of a complex number: z = acoth(c1)
Math_ComplexOp::acsc() -- Calculates the inverse cosecant of a complex number: z = acsc(c1)
Math_ComplexOp::acsch() --  Calculates the inverse hyperbolic cosecant of a complex number: z = acsch(c1)
Math_ComplexOp::add() -- Returns the sum of two complex numbers: z = c1 + c2
Math_ComplexOp::areEqual() -- Determines if is c1 == c2:
Math_ComplexOp::asec() -- Calculates the inverse secant of a complex number: z = asec(c1)
Math_ComplexOp::asech() -- Calculates the inverse hyperbolic secant of a complex number: z = asech(c1)
Math_ComplexOp::asin() -- Calculates the inverse sine of a complex number: z = asin(c1)
Math_ComplexOp::asinAlt() --  Calculates the inverse sine of a complex number: z = asinAlt(c1) Uses an alternative algorithm
Math_ComplexOp::asinh() -- Calculates the inverse hyperbolic sine of a complex number: z = asinh(c1)
Math_ComplexOp::asinReal() -- Calculates the complex inverse sine of a real number: z = asinReal(r):
Math_ComplexOp::atan() -- Calculates the inverse tangent of a complex number: z = atan(c1):
Math_ComplexOp::atanh() --  Calculates the inverse hyperbolic tangent of a complex number: z = atanh(c1)
Math_ComplexOp::conjugate() -- Calculates the conjugate of a complex number: z = conj(c1)
Math_ComplexOp::cos() -- Calculates the cosine of a complex number: z = cos(c1)
Math_ComplexOp::cosh() -- Calculates the hyperbolic cosine of a complex number: z = cosh(c1)
Math_ComplexOp::cot() -- Calculates the cotangent of a complex number: z = cot(c1)
Math_ComplexOp::coth() -- Calculates the hyperbolic cotangent of a complex number: z = coth(c1)
Math_ComplexOp::createFromPolar() -- Converts a polar complex z = r*exp(theta*i) to z = a + b*i
Math_ComplexOp::csc() -- Calculates the cosecant of a complex number: z = csc(c1)
Math_ComplexOp::csch() -- Calculates the hyperbolic cosecant of a complex number: z = csch(c1)
Math_ComplexOp::div() -- Returns the division of two complex numbers: z = c1 * c2
Math_ComplexOp::exp() -- Calculates the exponential of a complex number: z = exp(c1)
Math_ComplexOp::inverse() -- Calculates the inverse of a complex number: z = 1/c1
Math_ComplexOp::isComplex() -- Checks if a given object is an instance of PEAR::Math_Complex
Math_ComplexOp::log() -- Calculates the logarithm (base 2) of a complex number: z = log(c1)
Math_ComplexOp::log10() -- Calculates the logarithm (base 10) of a complex number: z = log10(c1)
Math_ComplexOp::logBase() -- Returns the logarithm of base c2 of the complex number c1
Math_ComplexOp::mult() -- Returns the product of two complex numbers: z = c1 * c2
Math_ComplexOp::multIm() --  Returns the product of a complex number and an imaginary number if: x = b + c*i, y = a*i; then: z = x * y = multIm(x, a)
Math_ComplexOp::multReal() -- Multiplies a complex number by a real number: z = realnumber * c1
Math_ComplexOp::negative() -- Calculates the negative of a complex number: z = -c1
Math_ComplexOp::pow() -- Returns the complex power of two complex numbers: z = c1^c2
Math_ComplexOp::powReal() --  Returns the exponentiation of a complex numbers to a real power: z = c1^(real)
Math_ComplexOp::sec() -- Calculates the secant of a complex number: z = sec(c1)
Math_ComplexOp::sech() -- Calculates the hyperbolic secant of a complex number: z = sech(c1)
Math_ComplexOp::sin() -- Calculates the sine of a complex number: z = sin(c1)
Math_ComplexOp::sinh() -- Calculates the hyperbolic sine of a complex number: z = sinh(c1)
Math_ComplexOp::sqrt() -- Calculates the complex square root of a complex number: z = sqrt(c1)
Math_ComplexOp::sqrtReal() -- Calculates the complex square root of a real number: z = sqrt(realnumber)
Math_ComplexOp::sub() -- Returns the difference of two complex numbers: z = c1 - c2
Math_ComplexOp::tan() -- Calculates the tangent of a complex number: z = tan(c1)
Math_ComplexOp::tanh() -- Calculates the hyperbolic tangent of a complex number: z = tanh(c1)

Class Summary Math_Complex

Class Summary Math_Complex  --  Math_Complex: class to represent an manipulate complex numbers (z = a + b*i)

Math_Complex: class to represent an manipulate complex numbers (z = a + b*i)

Originally this class was part of NumPHP (Numeric PHP package)

Class Trees for Math_Complex

  • Math_Complex

constructor Math_Complex::Math_Complex()

constructor Math_Complex::Math_Complex()  -- Constructor for Math_Complex

Synopsis

require_once '/Complex.php';

object Math_Complex constructor Math_Complex::Math_Complex (float $real, float $im)

Description

This package is not documented yet.

Parameter

float $real

Real part of the number

float $im

Imaginary part of the number

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::abs()

Math_Complex::abs()  -- Returns the magnitude (also referred as norm) of the number

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::abs2()

Math_Complex::abs2()  -- Returns the square of the magnitude of the number

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::angle()

Math_Complex::angle()  --  Returns the angle (argument) associated with the complex number Alias of Math_Complex::arg()

Description

This package is not documented yet.

Return value

returns A float on success, a PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::arg()

Math_Complex::arg()  -- Returns the argument of the complex number

Description

This package is not documented yet.

Return value

returns A floating point number on success, a PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::getIm()

Math_Complex::getIm()  -- Returns the imaginary part of the complex number

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::getReal()

Math_Complex::getReal()  -- Returns the real part of the complex number

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::norm()

Math_Complex::norm()  -- Returns the norm of the number Alias of Math_Complex::abs()

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Math_Complex::toString()

Math_Complex::toString()  -- Simple string representation of the number

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Class Summary Math_ComplexOp

Class Summary Math_ComplexOp  -- Math_ComplexOp: static class to operate on Math_Complex objects

Math_ComplexOp: static class to operate on Math_Complex objects

Originally this class was part of NumPHP (Numeric PHP package)

Class Trees for Math_ComplexOp

  • Math_ComplexOp

Math_ComplexOp::acos()

Math_ComplexOp::acos()  -- Calculates the inverse cosine of a complex number: z = acos(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::acos (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::acosh()

Math_ComplexOp::acosh()  -- Calculates the inverse hyperbolic cosine of a complex number: z = acosh(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::acosh (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::acot()

Math_ComplexOp::acot()  -- Calculates the inverse cotangent of a complex number: z = acot(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::acot (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::acoth()

Math_ComplexOp::acoth()  --  Calculates the inverse hyperbolic cotangent of a complex number: z = acoth(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::acoth (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::acsc()

Math_ComplexOp::acsc()  -- Calculates the inverse cosecant of a complex number: z = acsc(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::acsc (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::acsch()

Math_ComplexOp::acsch()  --  Calculates the inverse hyperbolic cosecant of a complex number: z = acsch(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::acsch (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::add()

Math_ComplexOp::add()  -- Returns the sum of two complex numbers: z = c1 + c2

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::add (Math_Complex &$c1, Math_Complex &$c2)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::areEqual()

Math_ComplexOp::areEqual()  -- Determines if is c1 == c2:

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns True if $c1 == $c2, False if $c1 != $c2, PEAR_Error object on error

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::asec()

Math_ComplexOp::asec()  -- Calculates the inverse secant of a complex number: z = asec(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::asec (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::asech()

Math_ComplexOp::asech()  -- Calculates the inverse hyperbolic secant of a complex number: z = asech(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::asech (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::asin()

Math_ComplexOp::asin()  -- Calculates the inverse sine of a complex number: z = asin(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::asin (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::asinAlt()

Math_ComplexOp::asinAlt()  --  Calculates the inverse sine of a complex number: z = asinAlt(c1) Uses an alternative algorithm

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::asinAlt (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::asinh()

Math_ComplexOp::asinh()  -- Calculates the inverse hyperbolic sine of a complex number: z = asinh(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::asinh (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::asinReal()

Math_ComplexOp::asinReal()  -- Calculates the complex inverse sine of a real number: z = asinReal(r):

Synopsis

require_once '/ComplexOp.php';

Math_Complex & Math_ComplexOp::asinReal (float $r)

Description

This package is not documented yet.

Parameter

float $r

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::atan()

Math_ComplexOp::atan()  -- Calculates the inverse tangent of a complex number: z = atan(c1):

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::atan (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::atanh()

Math_ComplexOp::atanh()  --  Calculates the inverse hyperbolic tangent of a complex number: z = atanh(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::atanh (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::conjugate()

Math_ComplexOp::conjugate()  -- Calculates the conjugate of a complex number: z = conj(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::conjugate (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::cos()

Math_ComplexOp::cos()  -- Calculates the cosine of a complex number: z = cos(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::cos (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::cosh()

Math_ComplexOp::cosh()  -- Calculates the hyperbolic cosine of a complex number: z = cosh(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::cosh (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::cot()

Math_ComplexOp::cot()  -- Calculates the cotangent of a complex number: z = cot(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::cot (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::coth()

Math_ComplexOp::coth()  -- Calculates the hyperbolic cotangent of a complex number: z = coth(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::coth (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::createFromPolar()

Math_ComplexOp::createFromPolar()  -- Converts a polar complex z = r*exp(theta*i) to z = a + b*i

Synopsis

require_once '/ComplexOp.php';

Math_Complex & Math_ComplexOp::createFromPolar (float $r, float $theta)

Description

This package is not documented yet.

Parameter

float $r

float $theta

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::csc()

Math_ComplexOp::csc()  -- Calculates the cosecant of a complex number: z = csc(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::csc (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::csch()

Math_ComplexOp::csch()  -- Calculates the hyperbolic cosecant of a complex number: z = csch(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::csch (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::div()

Math_ComplexOp::div()  -- Returns the division of two complex numbers: z = c1 * c2

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::div (Math_Complex &$c1, Math_Complex &$c2)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::exp()

Math_ComplexOp::exp()  -- Calculates the exponential of a complex number: z = exp(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::exp (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::inverse()

Math_ComplexOp::inverse()  -- Calculates the inverse of a complex number: z = 1/c1

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::inverse (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::isComplex()

Math_ComplexOp::isComplex()  -- Checks if a given object is an instance of PEAR::Math_Complex

Description

This package is not documented yet.

Parameter

mixed &$c1

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::log()

Math_ComplexOp::log()  -- Calculates the logarithm (base 2) of a complex number: z = log(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::log (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::log10()

Math_ComplexOp::log10()  -- Calculates the logarithm (base 10) of a complex number: z = log10(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::log10 (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::logBase()

Math_ComplexOp::logBase()  -- Returns the logarithm of base c2 of the complex number c1

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::logBase (Math_Complex &$c1, Math_Complex &$c2)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::mult()

Math_ComplexOp::mult()  -- Returns the product of two complex numbers: z = c1 * c2

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::mult (Math_Complex &$c1, Math_Complex &$c2)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::multIm()

Math_ComplexOp::multIm()  --  Returns the product of a complex number and an imaginary number if: x = b + c*i, y = a*i; then: z = x * y = multIm(x, a)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::multIm (Math_Complex $c1, float $im)

Description

This package is not documented yet.

Parameter

Math_Complex $c1

float $im

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::multReal()

Math_ComplexOp::multReal()  -- Multiplies a complex number by a real number: z = realnumber * c1

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::multReal (Math_Complex &$c1, float $real)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

float $real

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::negative()

Math_ComplexOp::negative()  -- Calculates the negative of a complex number: z = -c1

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::negative (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::pow()

Math_ComplexOp::pow()  -- Returns the complex power of two complex numbers: z = c1^c2

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::pow (Math_Complex &$c1, Math_Complex &$c2)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::powReal()

Math_ComplexOp::powReal()  --  Returns the exponentiation of a complex numbers to a real power: z = c1^(real)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::powReal (Math_Complex $c1, float $real)

Description

This package is not documented yet.

Parameter

Math_Complex $c1

float $real

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sec()

Math_ComplexOp::sec()  -- Calculates the secant of a complex number: z = sec(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::sec (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sech()

Math_ComplexOp::sech()  -- Calculates the hyperbolic secant of a complex number: z = sech(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::sech (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sin()

Math_ComplexOp::sin()  -- Calculates the sine of a complex number: z = sin(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::sin (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sinh()

Math_ComplexOp::sinh()  -- Calculates the hyperbolic sine of a complex number: z = sinh(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::sinh (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sqrt()

Math_ComplexOp::sqrt()  -- Calculates the complex square root of a complex number: z = sqrt(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::sqrt (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sqrtReal()

Math_ComplexOp::sqrtReal()  -- Calculates the complex square root of a real number: z = sqrt(realnumber)

Synopsis

require_once '/ComplexOp.php';

Math_Complex & Math_ComplexOp::sqrtReal (float $realnum)

Description

This package is not documented yet.

Parameter

float $realnum

A float

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::sub()

Math_ComplexOp::sub()  -- Returns the difference of two complex numbers: z = c1 - c2

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::sub (Math_Complex &$c1, Math_Complex &$c2)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Math_Complex &$c2

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::tan()

Math_ComplexOp::tan()  -- Calculates the tangent of a complex number: z = tan(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::tan (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.

Math_ComplexOp::tanh()

Math_ComplexOp::tanh()  -- Calculates the hyperbolic tangent of a complex number: z = tanh(c1)

Synopsis

require_once '/ComplexOp.php';

Math_Complex |PEAR_Error & Math_ComplexOp::tanh (Math_Complex &$c1)

Description

This package is not documented yet.

Parameter

Math_Complex &$c1

Return value

returns A valid Math_Complex number on success, PEAR_Error otherwise

Throws

No exceptions thrown.

Note

This function can be called statically.


Math_TrigOp

Table of Contents
Math_TrigOp::acoth() -- Calculates the inverse hyperbolic cotangent of the parameter
Math_TrigOp::acsch() -- Calculates the inverse hyperbolic cosecant of the parameter
Math_TrigOp::asech() -- Calculates the inverse hyperbolic secant of the parameter
Math_TrigOp::cot() -- Calculates the cotangent of the parameter
Math_TrigOp::coth() -- Calculates the hyperbolic cotangent of the parameter
Math_TrigOp::csc() -- Calculates the cosecant of the parameter
Math_TrigOp::csch() -- Calculates the hyperbolic cosecant of the parameter
Math_TrigOp::sec() -- Calculates the secant of the parameter
Math_TrigOp::sech() -- Calculates the hyperbolic secant of the parameter
Class Summary Math_TrigOp -- Math_TrigOp: static class implementing supplementary trigonometric functions

Math_TrigOp::acoth()

Math_TrigOp::acoth() -- Calculates the inverse hyperbolic cotangent of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::acsch()

Math_TrigOp::acsch() -- Calculates the inverse hyperbolic cosecant of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::asech()

Math_TrigOp::asech() -- Calculates the inverse hyperbolic secant of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::cot()

Math_TrigOp::cot() -- Calculates the cotangent of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::coth()

Math_TrigOp::coth() -- Calculates the hyperbolic cotangent of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::csc()

Math_TrigOp::csc() -- Calculates the cosecant of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::csch()

Math_TrigOp::csch() -- Calculates the hyperbolic cosecant of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::sec()

Math_TrigOp::sec() -- Calculates the secant of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Math_TrigOp::sech()

Math_TrigOp::sech() -- Calculates the hyperbolic secant of the parameter

Description

This package is not documented yet.

Parameter

float $x

Return value

return A floating point on success, PEAR_Error object otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary Math_TrigOp

Class Summary Math_TrigOp  -- Math_TrigOp: static class implementing supplementary trigonometric functions

Math_TrigOp: static class implementing supplementary trigonometric functions

Static class implementing supplementary trigonometric functions

Class Trees for Math_TrigOp

  • Math_TrigOp


Chapter 52. Networking

Provides Packages for network-related working



Net_CheckIP

Table of Contents
Net_CheckIP::check_ip() -- Validation of IPv4 addresses

Package to check the correct syntax of an IPv4 address.

Net_CheckIP::check_ip()

Net_CheckIP::check_ip() -- Validation of IPv4 addresses

Description

This function can validate if a given string has a valid IPv4 syntax.

Parameter

  • string $ip - the IP address to check

Return value

boolean - TRUE, if syntax is valid

Note

This function can be called statically.


Net_DNS

Table of Contents
Introduction --  General purpose DNS querying and packet parsing
Class Summary Net_DNS -- DNS Packet manipulation class
Class Summary Net_DNS_Resolver --  Provides a resolver implementation to handle DNS queries
Net_DNS_Resolver::query() -- Queries a nameserver and returns a response
Net_DNS_Resolver::rawQuery() -- Queries a nameserver and returns a response
Net_DNS_Resolver::axfr() -- Performs a zone transfer from a nameserver
Class Summary Net_DNS_Packet --  Provides an object abstraction of a DNS packet
Class Summary Net_DNS_RR --  Provides resource record parsing and creation
Examples -- DNS Updates -- RFC 2136 DNS Updates

Provides methods for parsing and manipulating DNS packets as returned from DNS servers and provides communication methods for sending and receiving DNS packets.

Introduction

Introduction --  General purpose DNS querying and packet parsing

Contributors

  • Eric Kilfoil

  • Sara Golemon

  • Thomas V.V. Cox

  • PEAR End-Users - Thanks

Description

The Net_DNS class provides DNS packet manipulation methods and the ability to send and receive packets to/from nameservers. Any type of DNS packet can be created, including RFC 2136 style DNS UPDATE packets.

The current list of supported RR types are:

  • A

  • AAAA

  • A

  • CNAME

  • HINFO

  • MX

  • NAPTR

  • NS

  • PTR

  • SOA

  • SRV

  • TSIG

  • TXT

Class Summary Net_DNS

Class Summary Net_DNS -- DNS Packet manipulation class

DNS Packet manipulation class

This class includes sub-classses that provide methods for creating, parsing, sending, and receving DNS nameserver packets.

This class is only a container class and generally should never be constructed. It contains constants defined in RFC 1035 with methods for converting between the integer and the name values of such constants.

For information on sending a basic query to a nameserver for a specific record, see Net_DNS_Resolver::query().

Class Summary Net_DNS_Resolver

Class Summary Net_DNS_Resolver  --  Provides a resolver implementation to handle DNS queries

Net_DNS_Resolver

The resolver class a high level interface for communicating with DNS servers. It uses the UNIX system stub resolver configuration files (if available) to configure the resolver. The resolver can also be configured manually by overriding the system configuration. This is done by setting the appropriate values in the Net_DNS_Resolver object. See Net_DNS_Resolver::query() for more information on the resolver configuration.

Net_DNS_Resolver::query()

Net_DNS_Resolver::query() -- Queries a nameserver and returns a response

Description

  • hostname - The name to lookup (eg. www.php.net)

  • type - The record type to query

  • class - The zone class to query

Constructs a DNS query packet and forwards the query to a nameserver configured in the system stub resolver (ie. /etc/resolv.conf). When a response is received from the DNS server, a fully populated Net_DNS_Packet object is returned that represents the response.

The resolver object contains many properties that control that behaviour of the resolver. Some of these settings are automatically read from the system resolver configuration if available. On Linux/UNIX based systems, this includes /etc/resolv.conf as well as various environment variables. This configuration is done at the time of object instantiation and can be overridden by setting the appropriate object properties.

This function will only return a Net_DNS_Packet if the ANSWER section contains resource records. Specifically, if the ANCOUNT variable in the DNS packet header is 0, query() will return 0 (note: 0, not FALSE). If you are expecting a packet without resource records in the ANSWER section, use Net_DNS_Resolver::rawQuery(). This is useful when doing manual recursion.

For a description of the returned RR data object, see Net_DNS_RR.

Resolver Configuration Object Properties:

  • array $nameservers

    An array of nameserver IP addresses that should be queried.

  • int $port

    The port on which nameservers should be queried. The default is 53.

  • array $domain

    The domain in which the resolver client host resides.

  • array $searchlist

    An array of strings containingg domains to apply to unqualified hosts passed to the resolver.

  • int $retry

    The number of seconds between retransmission of unaswered queries

  • int $retrans

    The number of times unanswered requests should be retried

  • int $recurse

    Sets the value of the RD (recursion desired) bit in the header. If the RD bit is set to 0, the server will not perform recursion on the request.

  • int $usevc

    Whether or not to use TCP (Virtual Circuits) instead of UDP If set to 0, UDP will be used unless TCP is required. TCP is required for questions or responses greater than 512 bytes.

  • int $debug

    If set to TRUE (non-zero), debugging code will be displayed as the resolver makes the request.

Environment Variables:

  • RES_NAMESERVERS

    Space separated list of nameserver IP addresses to query

  • RES_SEARCHLIST

    Space separated list of domain names to add to unqualified search requests.

  • LOCALDOMAIN

    The name of the domain

  • RES_OPTIONS

    A space separated list of options formatted as:

    optionname:value

    If the value is ommited, the value defaults to 1 (true). [optionname] corresponds to an object property.

Example

The following example shows a DNS query for an MX record. Note that the IP address for the mail exchanger listed within the zone is returned with the response in the additional section. The second exchanger (that is not inside this zone) is not listed. To receive this address, you must perform another query specifically for the A record using the returned hostname.

The next example shows a more complex query with debugging information enabled. Note that the usevc option is set to TRUE. This forces the resolver to use TCP instead of UDP. This can be seen in the debug output on the send_tcp() line.

Example 52-3. Using Net_DNS_Resolver::query() with specific nameservers and options

<?php
require_once 'Net/DNS.php';

$resolver = new Net_DNS_Resolver();
$resolver->debug = 1; // Turn on debugging output to show the query
$resolver->usevc = 1; // Force the use of TCP instead of UDP
$resolver->nameservers = array(              // Set the IP addresses
                           '198.41.0.4',     // of the nameservers
                           '192.228.79.201'  // to query.
                           );
$response = $resolver->query('example.com');
if (! $response) {
  echo "\n";
  echo "ANCOUNT is 0, therefore the query() 'failed'\n";
  echo "See Net_DNS_Resolver::rawQuery() to receive this packet\n";
}
?>

Output:

;; query(example.com, A, IN)
;; send_tcp(198.41.0.4:53)
;; sending 29 bytes
;; received 517 bytes
;; HEADER SECTION
;; id = 58298
;; qr = 1    opcode = QUERY    aa = 0    tc = 0    rd = 1
;; ra = 0    rcode  = NOERROR
;; qdcount = 1  ancount = 0  nscount = 13  arcount = 15

;; QUESTION SECTION (1 record)
;;
;example.com.   IN      A

;; ANSWER SECTION (0 records)

;; AUTHORITY SECTION (13 records)
com.            172800  IN      NS      A.GTLD-SERVERS.NET.
com.            172800  IN      NS      G.GTLD-SERVERS.NET.
com.            172800  IN      NS      H.GTLD-SERVERS.NET.
com.            172800  IN      NS      C.GTLD-SERVERS.NET.
com.            172800  IN      NS      I.GTLD-SERVERS.NET.
com.            172800  IN      NS      B.GTLD-SERVERS.NET.
com.            172800  IN      NS      D.GTLD-SERVERS.NET.
com.            172800  IN      NS      L.GTLD-SERVERS.NET.
com.            172800  IN      NS      F.GTLD-SERVERS.NET.
com.            172800  IN      NS      J.GTLD-SERVERS.NET.
com.            172800  IN      NS      K.GTLD-SERVERS.NET.
com.            172800  IN      NS      E.GTLD-SERVERS.NET.
com.            172800  IN      NS      M.GTLD-SERVERS.NET.

;; ADDITIONAL SECTION (15 records)
A.GTLD-SERVERS.NET.     172800  IN      AAAA    2001:503:a83e::2:30
A.GTLD-SERVERS.NET.     172800  IN      A       192.5.6.30
G.GTLD-SERVERS.NET.     172800  IN      A       192.42.93.30
H.GTLD-SERVERS.NET.     172800  IN      A       192.54.112.30
C.GTLD-SERVERS.NET.     172800  IN      A       192.26.92.30
I.GTLD-SERVERS.NET.     172800  IN      A       192.43.172.30
B.GTLD-SERVERS.NET.     172800  IN      AAAA    2001:503:231d::2:30
B.GTLD-SERVERS.NET.     172800  IN      A       192.33.14.30
D.GTLD-SERVERS.NET.     172800  IN      A       192.31.80.30
L.GTLD-SERVERS.NET.     172800  IN      A       192.41.162.30
F.GTLD-SERVERS.NET.     172800  IN      A       192.35.51.30
J.GTLD-SERVERS.NET.     172800  IN      A       192.48.79.30
K.GTLD-SERVERS.NET.     172800  IN      A       192.52.178.30
E.GTLD-SERVERS.NET.     172800  IN      A       192.12.94.30
M.GTLD-SERVERS.NET.     172800  IN      A       192.55.83.30

ANCOUNT is 0, therefore the query() 'failed'
See Net_DNS_Resolver::rawQuery() to receive this packet

Note

This function can not be called statically.

Net_DNS_Resolver::rawQuery()

Net_DNS_Resolver::rawQuery() -- Queries a nameserver and returns a response

Description

  • hostname - The name to lookup (eg. www.php.net)

  • type - The record type to query

  • class - The zone class to query

The Net_DNS_Resolver::rawQuery() function performs a DNS query similar to the Net_DNS_Resolver::query() function; however, rawQuery() will return any response from the nameserver. This is useful when the response packet may or may not contain any resource records in the "ANSWER" section.

rawQuery() uses the same resolver configuration used by Net_DNS_Resolver::query().

For a description of the returned RR data object, see Net_DNS_RR.

Note

This function can not be called statically.

Net_DNS_Resolver::axfr()

Net_DNS_Resolver::axfr() -- Performs a zone transfer from a nameserver

Description

  • dname - The domain name (zone name) to transfer

  • class - The zone class to transfer

  • old - Only used for backwards compatibility with previous version of Net_DNS

axfr() attempts a zone transfer from the nameservers specified in the Net_DNS_Resolver->nameservers array. Net_DNS_Resolver::axfr() uses the same resolver configuration as the Net_DNS_Resolver::query() method.

Most public nameservers will not allow a zone transfer by default. A zone transfer will provide a full list of DNS resource records inside of a zone file. A zone transfer will always use TCP instead of UDP queries.

For a description of the returned RR data object, see Net_DNS_RR.

Example

In the following example, debugging has been turned on and the nameserver has been configured to allow zone transfers. The most important item of note in this example is the SOA record at the beginning and end of the returned records. When a name server sends a zone transfer, the first record sent is the SOA record. The zone transfer is considered complete when the name server sends the SOA record again. This behaviour can be seen in the debug output. The resulting array returned by axfr() does not return the final SOA record.

Example 52-2. Succesful Net_DNS_Resolver::axfr() query

<?php
require_once 'Net/DNS.php';

$resolver = new Net_DNS_Resolver();
$resolver->debug = 1;
$response = $resolver->axfr('my.example.com');
echo "\n\nThe following resource records were returned from the nameserver:\n";
if (count($response)) {
  foreach ($response as $rr) {
    $rr->display();
  }
}
?>

Output:

;; axfr_start(my.example.com, IN)
;; query(my.example.com, AXFR, IN)
;; axfr_start(192.168.0.254:53)
;; sending 32 bytes
;; read_tcp: expecting 2 bytes
;; read_tcp: received 2 bytes
;; read_tcp: expecting 262 bytes
;; read_tcp: received 262 bytes
;; received 262bytes
;; HEADER SECTION
;; id = 21220
;; qr = 1    opcode = QUERY    aa = 1    tc = 0    rd = 0
;; ra = 1    rcode  = NOERROR
;; qdcount = 1  ancount = 10  nscount = 0  arcount = 0

;; QUESTION SECTION (1 record)
;;
;my.example.com.        IN      AXFR

;; ANSWER SECTION (10 records)
my.example.com.         300     IN      SOA     ns1.my.example.com. hostmaster.my.example.com. 103 3600 1800 2592000 300
my.example.com.         300     IN      NS      ns1.my.example.com.
my.example.com.         300     IN      MX      10 mx1.my.example.com.
my.example.com.         300     IN      MX      20 mx2.my.example.com.
my.example.com.         300     IN      A       192.168.0.1
mx1.my.example.com.     300     IN      A       192.168.0.2
mx2.my.example.com.     300     IN      A       192.168.0.3
server.my.example.com.  300     IN      CNAME   www.my.example.com.
www.my.example.com.     300     IN      A       192.168.0.1
my.example.com.         300     IN      SOA     ns1.my.example.com. hostmaster.my.example.com. 103 3600 1800 2592000 300

;; AUTHORITY SECTION (0 records)

;; ADDITIONAL SECTION (0 records)


The following resource records were returned from the nameserver:
my.example.com.         300     IN      SOA     ns1.my.example.com. hostmaster.my.example.com. 103 3600 1800 2592000 300
my.example.com.         300     IN      NS      ns1.my.example.com.
my.example.com.         300     IN      MX      10 mx1.my.example.com.
my.example.com.         300     IN      MX      20 mx2.my.example.com.
my.example.com.         300     IN      A       192.168.0.1
mx1.my.example.com.     300     IN      A       192.168.0.2
mx2.my.example.com.     300     IN      A       192.168.0.3
server.my.example.com.  300     IN      CNAME   www.my.example.com.
www.my.example.com.     300     IN      A       192.168.0.1

Note

This function can not be called statically.

Class Summary Net_DNS_Packet

Class Summary Net_DNS_Packet  --  Provides an object abstraction of a DNS packet

Net_DNS_Packet

The Net_DNS_Packet class provides methods for creating a DNS packet suitable for sending to a nameserver. It also provides the methods of parsing a response from a nameserver into a Net_DNS_Packet object.

A standard DNS packet is made up of five main pieces:

  • Header

  • Question Section

  • Answer Section

  • Authority Section

  • Additional Section

Net_DNS defines the DNS packet header as a Net_DNS_Header object. Net_DNS_Question defines the question section of a packet object. The remaining three sections should be arrays of Net_DNS_RR objects.

Class Summary Net_DNS_RR

Class Summary Net_DNS_RR  --  Provides resource record parsing and creation

Net_DNS_RR

The Net_DNS_RR class provides methods of parsing resource records returned by a nameserver, creation of resource record objects to be sent to a nameserver, and the ability to access each component of an RR as an object property.

Each resource record object MUST contain the following properties:

  • name - The DNS name of the RR

  • type - The RR type

  • class - The RR class (normally IN)

  • ttl - The RR time to live

  • rdlength - The amount of data (in bytes) of the rdata section

  • rdata - The data (uncompressed) of the right hand side of the RR

If type is a supported RR type, it will automatically be decompressed and/or decoded into its appropriate property values. The values inside of an RR object will vary based on the type of RR.

Supported RR types:

  • A

    • string address - IPv4 style address

  • AAAA

    • string address - IPv6 style address

  • CNAME

    • string cname - The canonical name of the queried host

  • HINFO

    • string cpu - The host CPU type

    • string os - Type host operating system

  • MX

    • integer preference - The MX preference (lower takes priority

    • string exchange - The name of the mail exchange host

  • NAPTR

    • unknown order - unknown

    • unknown preference - unknown

    • unknown flags - unknown

    • unknown services - unknown

    • unknown regex - unknown

    • unknown replacement - unknown

  • NS

    • string nsdname - The name of the NS record nameserver

  • PTR

    • string ptrdname - The name for the queried IP address

  • SOA

    • string mname - Master nameserver hostname as specified in the SOA record - not neccessarily accurate

    • string rname - Email address of the person responsible for the zone - not neccessarily accurate

    • string serial - The serial number (version number) of the retrieved zone

    • string refresh - The length of time before the zone should be refresed

    • string retry - The length of time between retries for slave servers to refresh the zone

    • string expire - The length of time before slave servers should consider the data invalid without refreshing the zone data.

    • string minimum - The default TTL for RRs inside of the zone that are not otherwise specified.

  • SRV

    • unknown preference - unknown

    • unknown weight - unknown

    • unknown port - unknown

    • unknown target - unknown

  • TSIG

    • integer time_signed - The time the signature has was created

    • integer fudge - The time offset that is acceptable between the client and the server

    • integer mac_size - The size of the following signature data

    • string/binary mac - The data containing the has sent by the client/server

    • integer original_id - The ID sent to or received from the server identifying this query.

    • integer error - The value of the error calculating or verifying the signature.

    • integer other_len - The amount of data (in bytes) additional to the signature

    • string other_data - Additional data required by the nameserver for the signature.

    • string key - The key shared by the client and the server to validate authorization.

  • TXT

    • string text - The text defined in the record

Examples -- DNS Updates

Examples -- DNS Updates -- RFC 2136 DNS Updates

RFC 2136 DNS Updates

By constructing a specially formatted DNS packet and sending it to a nameserver, a dynamic DNS update can be performed very easily. RFC 2136 defines some variations of a DNS packet that are used by Net_DNS to request an update. The nameserver must first be configured to accept DNS updates, a key must be established between the client and server, and most importantly, the PHP mhash extension must be included for processing the MD5 digest of the key.

The format of the DNS packet is very specific and requires in-depth knowledge of how DNS updates work. Net_DNS currently does not support any abstraction of these specially formatted packets. Packets must currently be crafted and sent manually. The full formatting of update packets can be found in RFC 2136.

For a complete listing of all of the fields that are available for DNS updates, please review RFC2136 (http://www.ietf.org/rfc/rfc2136.txt). The following examples show the simplest forms of a DNS update.

Example 52-1. Sending a dynamic DNS update packet to a nameserver

<?php
require_once 'Net/DNS.php';

$resolver = new Net_DNS_Resolver();

// We should only send the request to the master server
// accepting DNS updates for the zone.
$resolver->nameservers = array('192.168.0.254');

// We must manually construct the DNS packet for a DNS update
// First we must instantiate the packet object
$packet = new Net_DNS_Packet();

// Create the header for the update packet.  Most of the defaults are
// acceptable, but we must set the header OPCODE to "UPDATE"
$packet->header = new Net_DNS_Header();
$packet->header->id = $resolver->nextid();
$packet->header->qr = 0;
$packet->header->opcode = "UPDATE";

// As specified in RFC2136, the question section becomes the "ZONE" section.
// This specifies the zone for which we are requesting a change.  This
// reflects the zone configuration as specified in the nameserver
// configuration.
$packet->question[0] = new Net_DNS_Question('example.com', "SOA", "IN");

// The "ANSWER" section of the packet becomes the "PREREQUISITE" section of
// the packet. Section 2.4 of RFC2136 defines the possible values for this
// section.  As show below, without any prerequisites the nameserver will
// attempt to perform the update unconditionally.
$packet->answer = array();

// The AUTHORITY section becomes the "UPDATE" section of the DNS packet.  The
// UPDATE section is a collection of resource record updates that should be
// modified in one form or another.  RRs can be deleted or added based on the
// values passed in the RR object.  These values are specified in RFC2136 but
// are summarized here:
//
// Adding an RR
// A complete RR object with a non-zero TTL is considered an addition.
//
// Deleting an RR
// A complete RR object with a zero TTL is considered an deletion. An RR that
// matches (exactly) with all values except for the TTL will be removed.
//
// Deleting an RRset
// A complete RR object with a zero TTL and a type of ANY is considered a
// deletion of all RRs with the specified name and type. An RR that matches
// (exactly) with all values except for the TTL and the TYPE will be removed.
//
// Deleting all RRsets for a name 
// A complete RR object with a zero TTL, a type of ANY, and a class of ANY is
// considered a deletion of all RRs with the specified name. Any RR that
// matches the name section of the query will be removed.
//
// The following specification will delete the RR that has a name of
// "example.com", class of "IN", type of "A", and an address of
// "192.0.34.166".
$rrDelete = new Net_DNS_RR("example.com. 0 IN A 192.0.34.166");
//
// The following specification will add an RR that has a name of example.com,
// a TTL of 1 hour, a class of "IN", type of "A", and an address of
// "192.0.34.155").  Note that the only difference between this RR and the
// previous RR is the value of the TTL.
$rrAdd = new Net_DNS_RR("example.com. 3600 IN A 192.0.34.166");
//
// The RR modifications are added to the authority (UPDATE) section of the DNS
// packet.
$packet->authority[0] = $rrDelete;
$packet->authority[1] = $rrAdd;
//
// The signature must be present in any packet sent to a nameserver that
// requires authentication.  The TSIG RR is added to the additional section of
// the DNS packet.
$tsig = new Net_DNS_RR("keyname.as.specified.in.server. TSIG ThisIsMyKey");
$packet->additional = array($tsig);
// Net_DNS does not automatically calculate the number of records stored in
// each section.  This calculation must be done manually.
$packet->header->qdcount = count($packet->question);
$packet->header->ancount = count($packet->answer);
$packet->header->nscount = count($packet->authority);
$packet->header->arcount = count($packet->additional);
//
// After creating your packet, you must send it to the name server for
// processing.  DNS updates must use the send_tcp() method: 
$response = $resolver->send_tcp($packet, $packet->data());
//
// The response from the server will vary.  If the update was successfuly, the
// server will have a response code of "NOERROR".  Any other error types will
// be reported in the response packet's header "rcode" variable.
if ($response->header->rcode != "NOERROR") {
  return($response->header->rcode);
}

?>

Net_DNSBL

Table of Contents
Introduction -- Introduction to Net_DNSBL

Net_DNSBL checks if a given Host or URL is listed on an DNS-based Blackhole List (DNSBL, Real-time Blackhole List or RBL) or Spam URI Realtime Blocklist (SURBL)

Introduction

Introduction -- Introduction to Net_DNSBL

Description

PEAR::Net_DNSBL provides an easy way to check if a given Host or URL is listed on an DNS-based Blackhole List (DNSBL, Real-time Blackhole List or RBL) or Spam URI Realtime Blocklist (SURBL).

Please not that this currently only works with IPv4 IPs.

Usage

Let's start with a simple example to check if the remote host is listed in two blacklists:
<?php
require_once 'Net/DNSBL.php';
$dnsbl = new Net_DNSBL();
$remoteIP = $_SERVER['REMOTE_ADDR'];
$remoteIP = '81.70.69.193';
$dnsbl->setBlacklists(array('sbl-xbl.spamhaus.org', 'bl.spamcop.net'));
if ($dnsbl->isListed($remoteIP)) {
    // do something
}
?>

This example shows how to check if an URL is listed in a SURBL:
<?php
require_once 'Net/DNSBL/SURBL.php';
$surbl = new Net_DNSBL_SURBL();
if ($surbl->isListed($addData['url'])) {
    // do something
}
?>
An example how to extract URLS from a text can be found on http://www.phpfreaks.com/quickcode/Extract_All_URLs_on_a_Page/15.php and be used this way:
<?php
foreach ($extracted_urls as $surbl_check_url) {
    if ($surbl->isListed($surbl_check_url)) {
        // do something
        break;
    }
}
?>

Let's get some details, if our host is listed:
<?php
require_once 'Net/DNSBL.php';
$dnsbl = new Net_DNSBL();
$dnsbl->setBlacklists(array('sbl-xbl.spamhaus.org', 'bl.spamcop.net'));
if ($dnsbl->isListed($_SERVER['REMOTE_ADDR'])) {
   var_dump($dnsbl->getDetails($_SERVER['REMOTE_ADDR']));
   var_dump($dnsbl->getTxt($_SERVER['REMOTE_ADDR']));
   var_dump($dnsbl->getListingBl($_SERVER['REMOTE_ADDR']));
   var_dump($dnsbl->getListingRecord($_SERVER['REMOTE_ADDR']);
}
?>


Net_Finger

Table of Contents
Net_Finger::query() -- does a finger query

Finger is a service providing information about a user of a server. The finger-protocol is deactivated on the most Internet servers due to security reasons. So it makes especially sense for intranets and local host administration.

The output of the finger command depends on the system and less standarized, because the output should be easy to read for humans and not for machines.

Net_Finger::query()

Net_Finger::query() -- does a finger query

Description

Execute a finger query on a server

Parameter

  • string $server - The name of the server or the IP-adress

  • string $query - The finger object to look up

Return value

string - the data from the finger request.

Throws

The returned PEAR_Error object in case of an error is unspecific, so you can ignore the error code and/or message. The reason for a failure could be a failed connection to the server or the server did not run a finger service.

Note: You will not get a PEAR_Error, if the query fails due to a not existing finger object. This can be only done by checking the data returned by query().

Note

This function can be called statically.


Net_FTP

Table of Contents
Constants -- predefined constants
Net_FTP::Net_FTP() -- constructor
Net_FTP::connect() -- connects to a given FTP server
Net_FTP::disconnect() -- disconnects from the FTP server
Net_FTP::login() -- logs into the FTP server you are connected to
Net_FTP::cd() -- changes the directory on the server.
Net_FTP::pwd() -- returns the directory on the server you are currently in.
Net_FTP::mkdir() -- creates a new directory.
Net_FTP::execute() -- executes a command on the server.
Net_FTP::mdtm() -- returns the last modification date of a file.
Net_FTP::size() -- returns the size in bytes of a file.
Net_FTP::ls() -- returns the listing of a directory in a specified way.
Net_FTP::rm() -- deletes a file or directory.
Net_FTP::get() -- download a file to the computer your script runs on.
Net_FTP::put() -- upload a file to the FTP server.
Net_FTP::getRecursive() -- download a whole directory to the computer your script runs on.
Net_FTP::putRecursive() -- upload a whole directory to the FTP server.
Net_FTP::checkFileExtension() -- check extensions.ini for the transfermode of a specific file.

Net_FTP provides comfortable communication with FTP-Servers. It mainly provides an OO wrapper to PHP's integrated FTP functions, adding some missing features like recursive up- and downloading of complete folders, as well as deleting. The options for generating directory listings were also extended to feature well structured listing of directories and/or files.

Constants

Constants -- predefined constants

NET_FTP_FILES_ONLY

Makes Net_FTP::ls() return a structures array of files (no directories) in a directory.

NET_FTP_DIRS_ONLY

Makes Net_FTP::ls() return a structures array of directories (no files) in a directory.

NET_FTP_DIRS_FILES

Makes Net_FTP::ls() return a structures array of directories and files in a directory.

NET_FTP_RAWLIST

Makes Net_FTP::ls() return an unstructred array as returned by the PHP function ftp_raw_list().

Net_FTP::Net_FTP()

Net_FTP::Net_FTP() -- constructor

Description

Create a new object for communication with FTP servers.

Parameter

  • string $host = null - The host to connect to ( either an IP address or a domain name).

  • int $port = null - The port to connect to on the server.

Return value

object - the new Net_FTP object.

Note

This function can not be called statically.

Net_FTP::connect()

Net_FTP::connect() -- connects to a given FTP server

Description

Create a new object for communication with FTP servers.

Parameter

  • string $host = null - The host to connect to ( either an IP address or a domain name). This parameter can be left out, if it has been set in the constructor or manually!

  • int $port = null - The port to connect to on the server. This parameter can be left out, if it has been set in the constructor or manually!

Return value

mixed - true on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is unspecific. You can ignore the errornumber and errormessage, because only "Connection failed" will be returned if the connection fails.

Note

This function can not be called statically.

Net_FTP::disconnect()

Net_FTP::disconnect() -- disconnects from the FTP server

Description

Disconnect from the FTP server you're connected to.

Return value

void

Note

This function can not be called statically.

Net_FTP::login()

Net_FTP::login() -- logs into the FTP server you are connected to

Description

Does the login on the FTP server you are connected to. for that you first have to connect to a FTP server before logging in. Username and Password can either be set by the parameters or manually before (using the set-methods).

Parameter

  • string $username = null - The username to be used for login to. This parameter can be left out, if it has been set manually!

  • int $password = null - The password to use for login. This parameter can be left out, if it has been set manually!

Return value

mixed - true on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is unspecific. You can ignore the errornumber and errormessage, because only "Login failed" will be returned if the login fails.

Note

This function can not be called statically.

Net_FTP::cd()

Net_FTP::cd() -- changes the directory on the server.

Description

Changes the directory on the FTP server you are logged in. The parameter can either be an absolute path (e.g. '/home/mydir') or a relative one (e.g. 'mydir').

Parameter

  • string $directory - The directory you want to change to. This can either be an absolute path (e.g. '/home/mydir') or a relative one (e.g. 'mydir').

Return value

mixed - true on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is unspecific. You can ignore the errornumber and errormessage, because only "Directory change failed" will be returned if the operation fails.

Note

This function can not be called statically.

Net_FTP::pwd()

Net_FTP::pwd() -- returns the directory on the server you are currently in.

Description

Returns the directory currently selected on the server.

Return value

mixed - path (absolute) as string on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is unspecific. You can ignore the errornumber and errormessage, because only "Could not determine the actual path" will be returned if the operation fails.

Note

This function can not be called statically.

Net_FTP::mkdir()

Net_FTP::mkdir() -- creates a new directory.

Description

Creates a new directory on the FTP server. You can give this function either a relative or an absolute path as the first parameter. The second (optional) parameter lets you create directories recursively (meaning you can create './my/new/dir' even if '/my' doesn't exist. All 3 directories would be created ).

Parameter

  • string $directory - The directory you want to create. This can either be an absolute path (e.g. '/home/mydir') or a relative one (e.g. 'mydir').

Return value

mixed - true on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is specific. There is only one errornumber which may occur. The message given by this error will contain the directory where the error occurred in "Creation of '$dir' failed". operation fails.

Note

This function can not be called statically.

Net_FTP::execute()

Net_FTP::execute() -- executes a command on the server.

Description

Executes a given command on the server (the SITE EXEC command is added by the method).

Parameter

  • string $command - The command to be executed (without SITE EXEC).

Return value

mixed - true on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is specific. There is only one errornumber which may occur. The message given by this error will contain the directory where the error occurred in "Execution of command '$command' failed". operation fails.

Note

This function can not be called statically.

Net_FTP::mdtm()

Net_FTP::mdtm() -- returns the last modification date of a file.

Description

gives you the last modification-date of a file either as a unix timestamp or in a formated date.

Parameter

  • string $file - The file to check.

    string $format - A date()-function styled format-string.

Return value

mixed - the last modification date on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::size()

Net_FTP::size() -- returns the size in bytes of a file.

Description

gives you the size of a file bytes.

Parameter

  • string $file - The file to check.

Return value

mixed - the size of the given file on success, otherwise PEAR::Error.

Throws

The returned PEAR_Error object in case of an error is unspecific. You can ignore the errornumber and errormessage, because only "Connection failed" will be returned if the connection fails.

Note

This function can not be called statically.

Net_FTP::ls()

Net_FTP::ls() -- returns the listing of a directory in a specified way.

Description

this function gives you a listing of either the files / directories / both or an unformated array (like the PHP function ftp_rawlist()).

Parameter

  • string [$dir = null] - The directory to list. You can either use a relative or an absolute path. This optional parameter will be set to the current path.

  • [int $mode = NET_FTP_DIRS_FILES] - A constant representing the nodes list (directories, files, both or a ram directory listing). This parameter is determined by the constants (see: Constants). This parameter is optional and will be set for listing directories and files structured in an array.

Return value

mixed - a directory listing in the form you determine on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::rm()

Net_FTP::rm() -- deletes a file or directory.

Description

This method deletes a file or a directory.

Parameter

  • string $path = null - The file or directory to delete. In case you set the second parameter to true, directories will be deleted even if not empty. All files and directories inside will be deleted.

  • $recursive = false - This parameter determines, whether a directory is deleted only if it's empty (standard) or if all included files and directories will be deleted with it ($recursive = true).

Return value

mixed - true on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::get()

Net_FTP::get() -- download a file to the computer your script runs on.

Description

This downloads a file from the FTP server to the computer your script runs on.

Parameter

  • string $remote_file - The file you'd like to download. This could either be an absolute or relative path to a file (not a directory! see: Net_FTP::getRecursive()).

  • string $local_file - The destination you'd like to download the file to (including filename, not directory!). You can specify this with either an absolute path or a path relative to the scripts directory. (Beware: The script directory is determined by the called script, if you use includes!)

  • bool $overwrite = false - Whether to overwrite the local file if it exists, or not. if not set the file will not be overwritten.

  • int $mode = null - This has to be one of the constants FTP_ASCII or FTP_BINARY. if not specified, the class will try to determine the mode from the file extension (from extensions.ini) or fall back to the standard transfer mode (attribute).

Return value

mixed - true on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::put()

Net_FTP::put() -- upload a file to the FTP server.

Description

This uploads a file to the FTP server from the computer your script runs on.

Parameter

  • string $local_file - The source file you'd like to upload. You can specify this with either an absolute path or a path relative to the scripts directory. (Beware: The script directory is determined by the called script, if you use includes!)

  • string $remote_file - The path (including filename) you'd like to upload to. This could either be an absolute or relative path to a file (not a directory! see: Net_FTP::putRecursive()).

  • bool $overwrite = false - Whether to overwrite the remote file, if it exists or not. If not set the file will not be overwritten.

  • [int $mode = null] - This has to be one of the constants FTP_ASCII or FTP_BINARY. If not specified, the class will try to determine the mode from the file extension (from extensions.ini) or fall back to the standard transfer mode (attribute).

Return value

mixed - true on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::getRecursive()

Net_FTP::getRecursive() -- download a whole directory to the computer your script runs on.

Description

This downloads a whole directory from the FTP server to the computer your script runs on.

Parameter

  • string $remote_path - The directory you'd like to download. This could either be an absolute or relative path to a directory (path has to end with '/').

  • string $local_path - The destination you'd like to download the directory to. You can specify this with either an absolute path or a path relative to the scripts directory. (Beware: The script directory is determined by the called script, if you use includes!)

  • bool $overwrite = false - Whether to overwrite the local files if they exist, or not. if not set the directory will not be overwritten.

  • int $mode = null - This has to be one of the constants FTP_ASCII or FTP_BINARY. if not specified, the class will try to determine the mode from the file extensions (from extensions.ini) or fall back to the standard transfer mode (attribute).

Return value

mixed - true on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::putRecursive()

Net_FTP::putRecursive() -- upload a whole directory to the FTP server.

Description

This uploads a whole directory to the FTP server from the computer your script runs on.

Parameter

  • string $local_path - The source directory you'd like to upload. You can specify this with either an absolute path or a path relative to the scripts directory. (Beware: The script directory is determined by the called script, if you use includes!)

  • string $remote_path - The path you'd like to upload to. This could either be an absolute or relative path to a directory.

  • bool $overwrite = false - Whether to overwrite the remote directory if it exists, or not. If not set the directory will not be overwritten.

  • int $mode = null - This has to be one of the constants FTP_ASCII or FTP_BINARY. If not specified, the class will try to determine the mode from the file extensions (from extensions.ini) or fall back to the standard transfer mode (attribute).

Return value

mixed - true on success, otherwise PEAR::Error.

Note

This function can not be called statically.

Net_FTP::checkFileExtension()

Net_FTP::checkFileExtension() -- check extensions.ini for the transfermode of a specific file.

Description

This method checks a given filename for its proper transfermode (using extensions.ini). If the file extension can not be found, the class falls back to the standard transfer mode (attribute).

Parameter

  • string $filename - The filename to check extension for.

Return value

int - either FTP_ASCII or FTP_BINARY.

Throws

No errors. Always a filetransfermode should be returned.

Note

This function can not be called statically.


Net_GameServerQuery

Table of Contents
Introduction --  Provides a common API to query game servers

An object for querying game servers and returning normalised output

Introduction

Introduction --  Provides a common API to query game servers

Net_GameServerQuery Description

Net_GameServerQuery provides an common API to query game servers.

The full online documentation is available here


Net_Geo

Table of Contents
Net_Geo - Example -- tracking down the remote client IP
Net_Geo::Net_Geo() -- constructor
Net_Geo::getRecord() -- get geographical information about IP

Package for polling Netgeo service retrieving the geographical location of IPs or addresses.

Net_Geo - Example

Net_Geo - Example -- tracking down the remote client IP

Example

<?php

require_once('Net/Geo.php');

// new Net_Geo object
$net_geo = new Net_Geo();

// fetch the client's IP
$ip = $_SERVER['REMOTE_ADDR'];

// fetch information array from net_geo
$results = $net_geo->getRecord($ip);

// output
echo "Single IP results:<br />";
echo "<pre>";
print_r($results);
echo "</pre>";

// example array of multiple IPs
$arr_ips = array
(
  gethostbyname("www.google.com"),
  gethostbyname("www.heise.de"),
  gethostbyname("www.college.ch")
);

// fetch information array from net_geo
$results = $net_geo->getRecord($arr_ips);

// output
echo "Multiple IP results:<br />";
echo "<pre>";
print_r($results);
echo "</pre>";

?>

Net_Geo::Net_Geo()

Net_Geo::Net_Geo() -- constructor

Description

Create a new object for IP-based geographical information retrieval.

Parameter

  • string $applicationName - Optional application name to use in UserAgent when polling Netgeo

  • string $alternateServerUrl - URL to Netgeo service script, will be set to "http://netgeo.caida.org/perl/netgeo.cgi" unless changed

Return value

boolean - Will always return true

Note

This function can not be called statically.

Net_Geo::getRecord()

Net_Geo::getRecord() -- get geographical information about IP

Description

Get geographical information about a list of targets or a single target. Error messages or "OK" are written to element STATUS of the returned array.

Parameter

  • mixed $target - A single IP or an array of IPs.

Return value

array - Informative array about geographical location of target(s)

Note

This function can not be called statically.


Net_GeoIP

Table of Contents
Net_GeoIP::getInstance() --  method to get an instance and avoid re-parsing the database
Net_GeoIP::lookupCountryName() --  returns full country name for specified IP address
Net_GeoIP::lookupCountryCode() --  returns 2-letter country code (e.g. "CA") for specified IP address
Net_GeoIP::lookupRegion() --  returns the region for given IP address.
Net_GeoIP::lookupLocation() --  returns the location record for specified IP address
Net_GeoIP::lookupOrg() --  returns the name of the organization or ISP for the given IP address.

Library to perform geo-location lookups of IP addresses.

This package is built on top of MaxMind's GeoIP databases to accurately determine the geographic location of an IP address. MaxMind offers both free and non-free database. Please refer to their website for specific instructures on obtaining both database types.

Net_GeoIP::getInstance()

Net_GeoIP::getInstance() --  method to get an instance and avoid re-parsing the database

Description

This method is an implementation of the so-called singleton pattern and is the preferred way to create instances of Net_GeoIP.

Multiple Instances

If you want to use multiple databases in one application, you will need to create an instance of Net_GeoIP for each database. Using the singleton getInstance() method will make sure that at any given point exactly one object for each database exists, which saves on overhead of setting up database segments.

Parameter

  • string $filename - Name of (and path to) the database file

  • int $flags - Flags that control the class behaviour. This parameter can be one of the following class constants:

    • Net_GeoIp::SHARED_MEMORY - use SHMOP to share a database among multiple PHP instances.

      Note: Only one Net_GeoIP instance can use shared memory at a time.

      If you are using Net_GeoIP::SHARED_MEMORY (shmop) you can only use Net_GeoIP::SHARED_MEMORY for one (1) instance (i.e. for one database). Any subsequent attempts to instantiate using SHARED_MEMORY will read the same shared memory block already initialized, and therefore will cause problems since the expected database format won't match the database in the shared memory block.

      Note that there is no easy way to flag "nice errors" to prevent attempts to create new instances using Net_GeoIP::SHARED_MEMORY flag and it is also not posible (in a safe way) to allow new instances to overwrite the shared memory block.

      In short, is you are using multiple databases, use the Net_GeoIP::SHARED_MEMORY flag with care.

    • Net_GeoIp::MEMORY_CACHE - store the full contents of the database in memory for current script.

      This is useful if you access the database several times in a script.

    • Net_GeoIp::STANDARD - standard no-cache version. This is also the default value if this parameter is ommitted.

Net_GeoIP::lookupCountryName()

Net_GeoIP::lookupCountryName() --  returns full country name for specified IP address

Throws

This method sthrow an exception if the IP address is invalid or if the database type is incorrect.

Net_GeoIP::lookupCountryCode()

Net_GeoIP::lookupCountryCode() --  returns 2-letter country code (e.g. "CA") for specified IP address

Parameter

  • string $addr - IP address

    Note: Hostnames are not supported. More information.

Throws

This method throws an exception if the IP address is invalid or if the database type is incorrect.

Net_GeoIP::lookupRegion()

Net_GeoIP::lookupRegion() --  returns the region for given IP address.

Parameter

  • string $addr - IP address

    Note: Hostnames are not supported. More information.

Throws

This method throws an exception if the IP address is invalid.

Net_GeoIP::lookupLocation()

Net_GeoIP::lookupLocation() --  returns the location record for specified IP address

Parameter

  • string $addr - IP address

    Note: Hostnames are not supported. More information.

Throws

This method throws an exception if the IP address is invalid.

Net_GeoIP::lookupOrg()

Net_GeoIP::lookupOrg() --  returns the name of the organization or ISP for the given IP address.

Description

This method returns the name of the organization or of the ISP which has registered the IP address range that contains the specified IP address. It works only with a non-free Organization/ISP database.

Parameter

  • string $addr - IP address

    Note: Hostnames are not supported. More information.

Throws

This method throws an exception if the IP address is invalid or the database type is wrong.


Net_IPv4

Table of Contents
Net_IPv4::atoh() -- Converts a dot-quad formatted IP address into a hexadecimal string
Net_IPv4::htoa() -- Converts a hexadecimal string into a dot-quad formatted IP address
Net_IPv4::ip2double() -- Converts an IP address to a PHP double.
Net_IPv4::validateIP() -- Validate the syntax of the given IP adress.
Net_IPv4::validateNetmask() -- Validate the syntax of the given netmask.
Net_IPv4::parseAddress() -- Parse a CIDR address (address/netmask combination).
Net_IPv4::calculate() -- Calculates network information based on an IP address and netmask.
Net_IPv4::ipInNetwork() --  Determines whether or not the supplied IP is within the supplied network.

Provides several methods for working with IP addresses and netmasks.

Net_IPv4::atoh()

Net_IPv4::atoh() -- Converts a dot-quad formatted IP address into a hexadecimal string

Description

Converts a dot-quad formatted IP address into a hexadecimal string - for example "192.168.1.0" to "c0a80100". Returns FALSE if the string given is no valid IP adress.

Note

This function can be called statically.

Net_IPv4::htoa()

Net_IPv4::htoa() -- Converts a hexadecimal string into a dot-quad formatted IP address

Description

Converts hexadecimal string to a dot-quad formatted IP address - for example "c0a80100" to "192.168.1.0". Returns FALSE if the hexadecimal string is no valid IP adress.

Note

This function can be called statically.

Net_IPv4::ip2double()

Net_IPv4::ip2double() -- Converts an IP address to a PHP double.

Description

Converts an IP address to a PHP double - for example "192.168.1.0" to "3232235776". A double is, in contrast to ip2long's integer, not signed and may be more comfortable when presented to the user. It can still be reconverted with PHP's long2ip().

Note

This function can be called statically.

Net_IPv4::validateIP()

Net_IPv4::validateIP() -- Validate the syntax of the given IP adress.

Description

Validates the syntax of an IP address in dot-quad format. Returns true if address is valid, false if not.

Note

This function can be called statically.

Net_IPv4::validateNetmask()

Net_IPv4::validateNetmask() -- Validate the syntax of the given netmask.

Description

Validates the syntax of a dot-quad formatted netmask. Returns true if netmask is valid, false if not.

Note

This function can be called statically.

Net_IPv4::parseAddress()

Net_IPv4::parseAddress() -- Parse a CIDR address (address/netmask combination).

Description

Parses a Classless Inter-Domain Routing address (e.g. 192.168.1.0/24) and stores information in the object variables network, ip, netmask, broadcast, long and bitmask.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_IPv4::calculate()

Net_IPv4::calculate() -- Calculates network information based on an IP address and netmask.

Description

Fully populates the object properties based on the IP address and netmask/bitmask properties. Once these two fields are populated, calculate() will perform calculations to determine the network and broadcast address of the network.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_IPv4::ipInNetwork()

Net_IPv4::ipInNetwork() --  Determines whether or not the supplied IP is within the supplied network.

Description

Determines whether or not the supplied IP address is within the supplied network.

Note

This function can be called statically.


Net_IPv6

Table of Contents
Net_IPv6::checkIPv6() -- Validation of IPv6 addresses
Net_IPv6::compress() -- compress an IPv6 address
Net_IPv6::uncompress() -- Uncompresses an IPv6 address
Net_IPv6::getAddressType() -- Returns the type of an IP address
Net_IPv6::getNetmask() -- Calculates the network prefix
Net_IPv6::isInNetmask() -- Checks if an IP is in a specific address space
Net_IPv6::removeNetmaskSpec() -- Removes the Netmask length specification
Net_IPv6::splitV64() -- splits an IPv6 address in it IPv6 and IPv4 part

Provides function to work with the 'Internet Protocol v6'

Net_IPv6::checkIPv6()

Net_IPv6::checkIPv6() -- Validation of IPv6 addresses

Description

Checks an IP for IPv6 compatibility.

Parameter

  • string $ip - the IP address to check

Return value

boolean - TRUE, if syntax is valid

Note

This function can be called statically.

Net_IPv6::compress()

Net_IPv6::compress() -- compress an IPv6 address

Description

Compresses an IPv6 address. RFC 2373 allows you to compress zeros in an address to '::'. This function expects an valid IPv6 address and compresses successive zeros to '::'
FF01:0:0:0:0:0:0:101 -> FF01::101
      0:0:0:0:0:0:0:1      -> ::1

Parameter

  • string $ip - the IP address to compress

Return value

string - the compressed IP is an IPv6 address

Note

This function can be called statically.

Net_IPv6::uncompress()

Net_IPv6::uncompress() -- Uncompresses an IPv6 address

Description

Uncompresses an IPv6 address. RFC 2373 allows you to compress zeros in an address to '::'. This function expects an valid IPv6 address and expands the '::' to the required zeros.
FF01::101	->  FF01:0:0:0:0:0:0:101
      ::1       ->  0:0:0:0:0:0:0:1

Parameter

  • string $ip - the IP address to uncompress

Return value

string - the uncompressed IP is an IPv6 address

Note

This function can be called statically.

Net_IPv6::getAddressType()

Net_IPv6::getAddressType() -- Returns the type of an IP address

Description

RFC 1883, Section 2.3 describes several types of addresses in the IPv6 addresse space. This methods tries to find the type of address for the given IP.

Warning

Several address types are markers for reserved spaces and as consequence a subject to change.

Parameter

  • string $ip - the IP address in Hex format, compressed IPs are allowed

Return value

int - the addresstype

The type can be one of this constants:

  • NET_IPV6_MULTICAST

  • NET_IPV6_UNICAST_PROVIDER

  • NET_IPV6_LOCAL_LINK

  • NET_IPV6_LOCAL_SITE

  • NET_IPV6_UNKNOWN_TYPE

  • NET_IPV6_RESERVED_UNICAST_GEOGRAPHIC

  • NET_IPV6_RESERVED_IPX

  • NET_IPV6_RESERVED

  • NET_IPV6_RESERVED_NSAP

  • NET_IPV6_UNASSIGNED

Note

This function can be called statically.

Method available since: Release 1.1.0

Net_IPv6::getNetmask()

Net_IPv6::getNetmask() -- Calculates the network prefix

Description

Calculates the network prefix based on the netmask bits.

Parameter

  • string $ip - the IP address in Hex format, compressed IPs are allowed

  • int $bits - if the number of netmask bits is not part of the IP, you must provide the mumber of bits

Return value

string - the network prefix

Note

This function can be called statically.

Method available since: Release 1.1.0

Net_IPv6::isInNetmask()

Net_IPv6::isInNetmask() -- Checks if an IP is in a specific address space

Description

Checks if an (compressed) IP is in a specific address space. If the IP does not contain the number of netmask bits (for example: F8000::FFFF/16), then you have to use the $bits parameter.

Parameter

  • string $ip - the IP address in Hex format, compressed IPs are allowed

  • string $netmask - the netmask (for example: F800::)

  • int $bits - if the number of netmask bits is not part of the IP, you must provide the mumber of bits

Return value

boolean - TRUE, if the IP is in the address space.

Note

This function can be called statically.

Method available since: Release 1.1.0

Net_IPv6::removeNetmaskSpec()

Net_IPv6::removeNetmaskSpec() -- Removes the Netmask length specification

Description

Removes a possible existing netmask length specification in an IP addresse.

Parameter

  • string $ip - the IP address in Hex format, compressed IPs are allowed

Return value

string - the IP without netmask length specification.

Note

This function can be called statically.

Method available since: Release 1.1.0

Net_IPv6::splitV64()

Net_IPv6::splitV64() -- splits an IPv6 address in it IPv6 and IPv4 part

Description

Splits an IPv6 address into the IPv6 and a possible IPv4-formated part. RFC 2373 allows you to note the last two parts of an IPv6 address in the IPv4 address format.
0:0:0:0:0:0:13.1.68.3
     0:0:0:0:0:FFFF:129.144.52.38

Parameter

  • string $ip - the IP address to split

Return value

array - key [0] contains the IPv6 part, key [1] the IPv4 formated part

Note

This function can be called statically.


Net_LDAP

Table of Contents
Introduction -- What Net_LDAP is and general information
Error handling -- How handling errors works in Net_LDAP
Configuration and connecting -- How to configure Net_LDAP and connect to an LDAP server
Search -- Searching entries
Fetching entries -- Retrieving entries directly or from a searchresult
Attributes -- Reading/adding/changing/deleting attributes from entries
Managing entries -- Adding/renaming/moving/deleting entries
LDIF files -- Converting between Net_LDAP_Entries and LDIF files

Net_LDAP allows you to query and manipulate the data stored in directory servers using PHP in an object-oriented way.

Detailed usage examples are available at: /your/pear/path/docs/Net_LDAP/examples/

Introduction

Introduction -- What Net_LDAP is and general information

Welcome to Net_LDAP!

Net_LDAP is a clone of Perls Net::LDAP package. PEAR Net_LDAP for PHP does, besides some own features, provide most of Perl Net::LDAP methods. Net_LDAP allows you to query and manipulate the data stored in directory servers using PHP in an object-oriented way. A directory server is a database server providing a hierarchical database and is usually queried using the LDAP protocol.

Classes of Net_LDAP

The following table gives you a short overview which classes are available in Net_LDAP and what they can be used for. Their relations will be explained too.

Table 52-1. Classes of Net_LDAP

Class nameDescription
Net_LDAP This is the main class. It enables you to connect and bind to a LDAP-server and to run ldap-querys like searching and manipulating entries. Most common, you will run a search using a LDAP-Filter and will get a Net_LDAP_Search-object. You may also fetch an entry directly, which gives you a Net_LDAP_Entry-object.
Net_LDAP_Search Objects of this class are returned from search querys. You can use this object to retrieve informations about a search result, like how much entries you have found for the provided filter. You can retrieve the found entries as Net_LDAP_Entry-objects in various forms: sorted, consecutively starting from the end or beginning or unsorted at once.
Net_LDAP_Entry Objects of this kind are either produced by casting fresh entries manually, by retrieving the result of a LDAP-search or by fetching an entry directly. It gives you the possibility to read and/or manipulate the attributes of an entry which describes the characteristic of the specific object.
Net_LDAP_Util The utility class contains only static methods, so you should not need to make an instance of it. It features some helpful methods, some of them are used internally by Net_LDAP but may be used externally from you as well. The most methods deal with escaping issues, since LDAP has some metacharacters with special meaning so that they usually need to be properly escaped.
Net_LDAP_Filter You are free to give LDAP-Filters on your own to the Net_LDAP->search() method, however this has some drawbacks (including escaping issues). For this reason, you can use the Net_LDAP_Filter class to easily build and combine your filters.
Net_LDAP_Error This is a error class. Most methods of Net_LDAP will return a object of this class if something went wrong. You can use this object to identify errors and to get detailed knowledge on what went wrong. See Errorhandling for more information.
Net_LDAP_LDIF LDIF files are human readable, plain text files containing directory data and/or change commands, much like an SQL file. Unlike SQL files, it is data centric, not action centric. Net_LDAP_LDIF enables you to convert between Net_LDAP_Entry-objects and LDIF files. Please note, that Net_LDAP_LDIF has a little different error handling explained later.

Error handling

Error handling -- How handling errors works in Net_LDAP

Error handling

Nearly all of Net_LDAPs methods return a Net_LDAP_Error object if something went wrong. You always should check for errors after you performed an action to be sure that your application doesn't do things you don't want it to do.

Handling errors is an easy task, you just have to test the return value as shown below. If an error occured, you can halt the script for example. In other cases, you may just log the error, but what exactly happens depends on your specific situation, of course.

You can use the getMessage() method of the error object to retrieve the error message explaining the problem and getCode() to get the error code which is usually the LDAP-Error code (see Table below) and may be used for automated reaction on errors.

Table 52-1. Error codes Net_LDAP

Error codeDescription
0x00LDAP_SUCCESS
0x01LDAP_OPERATIONS_ERROR
0x02LDAP_PROTOCOL_ERROR
0x03LDAP_TIMELIMIT_EXCEEDED
0x04LDAP_SIZELIMIT_EXCEEDED
0x05LDAP_COMPARE_FALSE
0x06LDAP_COMPARE_TRUE
0x07LDAP_AUTH_METHOD_NOT_SUPPORTED
0x08LDAP_STRONG_AUTH_REQUIRED
0x09LDAP_PARTIAL_RESULTS
0x0aLDAP_REFERRAL
0x0bLDAP_ADMINLIMIT_EXCEEDED
0x0cLDAP_UNAVAILABLE_CRITICAL_EXTENSION
0x0dLDAP_CONFIDENTIALITY_REQUIRED
0x0eLDAP_SASL_BIND_INPROGRESS
0x10LDAP_NO_SUCH_ATTRIBUTE
0x11LDAP_UNDEFINED_TYPE
0x12LDAP_INAPPROPRIATE_MATCHING
0x13LDAP_CONSTRAINT_VIOLATION
0x14LDAP_TYPE_OR_VALUE_EXISTS
0x15LDAP_INVALID_SYNTAX
0x20LDAP_NO_SUCH_OBJECT
0x21LDAP_ALIAS_PROBLEM
0x22LDAP_INVALID_DN_SYNTAX
0x23LDAP_IS_LEAF
0x24LDAP_ALIAS_DEREF_PROBLEM
0x30LDAP_INAPPROPRIATE_AUTH
0x31LDAP_INVALID_CREDENTIALS
0x32LDAP_INSUFFICIENT_ACCESS
0x33LDAP_BUSY
0x34LDAP_UNAVAILABLE
0x35LDAP_UNWILLING_TO_PERFORM
0x36LDAP_LOOP_DETECT
0x3CLDAP_SORT_CONTROL_MISSING
0x3DLDAP_INDEX_RANGE_ERROR
0x40LDAP_NAMING_VIOLATION
0x41LDAP_OBJECT_CLASS_VIOLATION
0x42LDAP_NOT_ALLOWED_ON_NONLEAF
0x43LDAP_NOT_ALLOWED_ON_RDN
0x44LDAP_ALREADY_EXISTS
0x45LDAP_NO_OBJECT_CLASS_MODS
0x46LDAP_RESULTS_TOO_LARGE
0x47LDAP_AFFECTS_MULTIPLE_DSAS
0x50LDAP_OTHER
0x51LDAP_SERVER_DOWN
0x52LDAP_LOCAL_ERROR
0x53LDAP_ENCODING_ERROR
0x54LDAP_DECODING_ERROR
0x55LDAP_TIMEOUT
0x56LDAP_AUTH_UNKNOWN
0x57LDAP_FILTER_ERROR
0x58LDAP_USER_CANCELLED
0x59LDAP_PARAM_ERROR
0x5aLDAP_NO_MEMORY
0x5bLDAP_CONNECT_ERROR
0x5cLDAP_NOT_SUPPORTED
0x5dLDAP_CONTROL_NOT_FOUND
0x5eLDAP_NO_RESULTS_RETURNED
0x5fLDAP_MORE_RESULTS_TO_RETURN
0x60LDAP_CLIENT_LOOP
0x61LDAP_REFERRAL_LIMIT_EXCEEDED
1000Unknown Net_LDAP Error

Configuration and connecting

Configuration and connecting -- How to configure Net_LDAP and connect to an LDAP server

Connecting to an LDAP server

To connect to an LDAP server, you should use Net_LDAP's static connect() method. It takes one parameter, an array full of configuration options, and either returns a Net_LDAP object if connecting works, or a Net_LDAP_Error object in case of a failure.

The following table lists all configuration options. If the default value for an option fits your needs, you don't need add it to your configuration array.

Search

Search -- Searching entries

Searching some entries

After connecting to the server, you can use Net_LDAP's search() method to search the directory. The method takes three parameters:

The search() method will return either a Net_LDAP_Search object or a Net_LDAP_Error. You can use the Net_LDAP_Search-object to trigger further actions like counting how many entries where found or to retrieve the found entries.

Fetching entries

Fetching entries -- Retrieving entries directly or from a searchresult

Retrieving entries directly

You can retrieve directory entries in several ways, either directly or from a performed search request. If you want to fetch an entry directly, you need to know its absolute distinguished name (DN). To directly fetch an known entry from the directory server, you use Net_LDAP's getEntry() method. It takes two parameters: The DN of the entry and the attributes you want to read from the entry. It returns a Net_LDAP_Entry object if fetching worked, or a Net_LDAP_Error object in case of a failure.

You may also check if the entry exists in the server before you fetch it. This can be achieved by Net_LDAP's dnExists() which takes the DN to test and returns either true or false.

Retrieving entries from a searchresult

The second way to retrieve entries is from a searchresult. As described in chapter "Search", you access the entries of a search result through the Net_LDAP_Search-object resulting from Net_LDAP's search() method. Each of the following methods return a Net_LDAP_Error-object if something goes wrong, so remember to test for errors! You have several ways to read the entries:

To directly fetch an known entry from the directory server, you use Net_LDAP's getEntry() method. It takes two parameters: The DN of the entry and the attributes you want to read from the entry. It returns a Net_LDAP_Entry object if fetching worked, or a Net_LDAP_Error object in case of a failure.

You may also check if the entry exists in the server before you fetch it. This can be achieved by Net_LDAP's dnExists() which takes the DN to test and returns either true or false.

Retrieving entries via iteration (foreach)

Since Net_LDAP 1.2.0 you are able to use PHPs Standard Library (SPL) to iterate over search results. This is done easily by just using the Net_LDAP_Search search result object inside an foreach loop similar to an array. You may optionally retrieve the DN of each entry by the same mechanism you use to retrieve the key of an associative array.

Attributes

Attributes -- Reading/adding/changing/deleting attributes from entries

Reading attributes

Reading attribute values depends on the selection of those attributes at search time. You can only access attributes that where selected! You can read attribute values using either Net_LDAP_Entry's getValues() or getValue() method. getValue() will return an array where the keys are the attributes names. If you use getValues() you may pass an option:

  • 'single': only the first value is returned as string

  • 'all': all values including the value count are returned in an array

  • 'default': in all other cases an attribute value with a single value is returned as string, if it has multiple values it is returned as an array (without value count)

If you want to read the distinguished name of an Entry (DN), you must use a different method: dn()

Regular expressions on attributes

PEAR::Net_LDAP features the unique feature to apply a regular expression match directly against attributes, so you do not need to manually fetch all values and run the regex against them. Instead, you can use Net_LDAP_Entry's preg_match() function. The behavior of this function is the same as PHPs preg_match(), but the $matches array is slightly different. It features one dimension more, since it may match for several attribute values if the attribute is multivalued. If you pass $matches, be sure to do it via REFERENCE, because otherwise $matches remains empty. preg_match() returns true or false, depending on match.

General information regarding attribute changing

It is important to know how attribute changing works. Modifications to an entry through the Net_LDAP_Entry-object are local only. After you have made all changes and want to transfer them to the directory server, you must call update() of the Net_LDAP_Entry object. This will return either TRUE or an Net_LDAP_Error. Another good information is, that you must select attributes at search time if you want to add/change/delete attribute values. Otherwise Net_LDAP will most likely fail silently giving you the wrong assumtion that everything was okay - Net_LDAP needs knowledge of the attributes it should work with!

Modification of attributes is also possible through Net_LDAP's modify() method. This method will call the methods described here on the Net_LDAP_Entry object given, and directly calls an update() after that, thus performing the changes directly on the server. The parameter is an complex array describing the changes to be performed. It is considered for more advanced users, because it is more compact, so please refer to the latest API documentation for more information.

Adding attributes

Adding attrbiute values to an entry is an easy task. You just need to call add()! The parameter is an array whose keys are the attribute names and values the attributes values. If only one attribute value should be added, the second level may be a string. If the attribute doesn't exist so far, it will be added, if it exists, the attributes values will be added.

Changing attributes

Changing values is with the replace() method as easy as adding values. However, you have to be a little more careful. The expected parameter is an array describing the new absolute state of the named attributes. This means, if you specify a NULL value for an attribute, this attribute will get deleted! You may specify single values as string too. The keys of the array are expected to be the attributes names.

Deleting attributes

Using the delete() method you are able to delete specific attributes values as well as delete a whole attribute. You need to specify the attribute names as array keys, the array values are the values you want to delete. If you want to delete whole attributes, specify them as single level array. Special care must be taken not to delete the whole entry which will be the case if the parameter array is omitted or set to NULL! Also, don't mix syntax modes. If you want to delete whole attributes you can't delete specific values from another attribute in the same function call.

Managing entries

Managing entries -- Adding/renaming/moving/deleting entries

Adding (fresh or old) entries to the directory

Adding new entries is performed in two ways. First, you need to establish a fresh Net_LDAP_Entry object. After that, you can add that entry like you would add already-existent entries using Net_LDAP's add() method.

Renaming or moving entries

Renaming and/or moving an entry is an operation on the DN of an entry. Moving an entry means, to rename a DN in such a way, that the entry becomes a new base-DN. You can rename or move an entry, if you call the dn() method of the entry you want to relocate. Alternatively, you may call Net_LDAP's move() method that also ca handle only DNs. Remember that you must call the entires update() method to carry out the move/rename. Net_LDAP's move() will move the entry immediately. If you use an entryobject togehter with Net_LDAP's move(), you are able to perform cross directory moves.

Deleting entries

Deleting entries is performed using Net_LDAP's delete() method. Just pass the Net_LDAP_Entry object or the DN of the entry you want to delete. In the case that the DN contains subentrys, you need to pass TRUE as second parameter which will make delete() delete recursive.

A second way exist: You may simply call delete() from the Net_LDAP_Entry you want to delete. Don't forget that you must call update() to carry out the delete in this case.

LDIF files

LDIF files -- Converting between Net_LDAP_Entries and LDIF files

Avaible since

LDIF support was added to Net_LDAP in release 1.1.0a1.

What are LDIF files?

LDIF files are in detail described at RFC 2849. Shortly, they contain directory data in an plain text, human readable kind, much like a SQL file does. However, unlike SQL files LDIF files are mostly data based, not action based. There are two different LDIF file contents, which can be mixed freely - content and change files. The first and most often used one is the LDIF content file:

LDIF files could describe not only the data an entry contains, but also various changes to the entry itself. If such an LDIF file would then be given to a LDAP server, he would interpret those changes instead just importing the data. Note in the example below, that even though LDIF content and LDIF change files could be mixed freely, this is not true for individual entries: a specific entry may be either describing content or changes, but not both.

Error handling when using Net_LDAP_LDIF

Before we can start using Net_LDAP_LDIF we must say some short words about how error handling works. Net_LDAP_LDIF was designed to have mostly the same API as the original PERL Net::LDAP::LDIF has. Because of this, the methods of Net_LDAP_LDIF do not return a Net_LDAP_Error object. You must use the error() method that will return a Net_LDAP_Error object in case of failure or true in case everything was ok. In LDIF reading mode, you can additionally use error_lines() to get knowledge about where in the input file the error occured.

Construction and options

Regardless if you want to read or write a LDIF file, you always have to use the constructor of Net_LDAP_LDIF to initialize your access to the LDIF file. You need to pass at least one parameter to Net_LDAP_LDIF(): the path of the file that should be read or written. You may pass the open mode as second parameter. The possible file open modes are "r" (read), "w" (write, clears the file first) and "a" (append to the end). In case you omit the open mode, read mode is assumed. The third optional parameter is an associative array containing one or several of the following options:

For advanced users: instead of passing a file path, you also may pass an already initialized file handle. In this case, the mode parameter will be ignored. You may use this, if you want to mix LDIF content and LDIF change mode by using two Net_LDAP_LDIF instances to write to the same filehandle, but it could be very useful in other cases too. To initialize the second instance of Net_LDAP_LDIF, you can use handle() to get the filehandle from the first instance.

Writing Net_LDAP_Entry objects to a LDIF change file

The process of writing changes is exactly the same like writing entry contents. However there are two differences: Firstly you need to pass the "changes" option and secondly, the entries you want to write need changes. Entries not containing changes will silently be ignored since there is nothing to write.

Fetching LDIF data

Sometimes you are interested in the lines inside the LDIF file. For those cases you can use the current_lines() and next_lines() methods. They work in the current context, which may be confusing: current_lines() will always return the lines that have built up the current Net_LDAP_Entry object when called current_entry() after read_entry() has been called. next_lines() will always return the lines, that will build up the next entry from the current point of view, meaning "relative to the entry that was just been read". However, you can override this by activating the "force" parameter of next_lines() which allows you to loop over all entries. current_entry() behaves exactly like current_lines().

If you think, that the lines you have read would be better in form of an Net_LDAP_Entry object, use the parseLines() method to parse those lines into an entry. This is a good way if you need just a few specific entries of a large LDIF file.

Example 52-7. Reading LDIF lines

// open some LDIF file for reading
// (error checking code is ommitted in this example for
//  better readability - in production, test for errors!)
$ldif = new Net_LDAP_LDIF('somefile.ldif', 'r');

// since nothing has been read until now, this will
// return an empty array
$empty_array = $ldif->current_lines();

// so let's read the first entries data
$first_entry_lines = $ldif->next_lines();

// if we call it again, we will not read ahead to the
// second entry - we again read the first one!
$first_entry_lines_again = $ldif->next_lines();

// If we call current_lines() now, we haven't read ahead
// like we learned from the last statement.
$empty_array_again = $ldif->current_lines();

// If we want to shift, we must use
// the read_entry() method, which will read ahead.
$first_entry = $ldif->read_entry();

// Now, current_lines() returns the lines of the
// first entry and next_lines() the lines of the second:
$first_entry_lines  = $ldif->current_lines();
$second_entry_lines = $ldif->next_lines();

// There is another way to shift the lines which is faster if
// you are just interested in the LDIFs content - you
// need to pass the "force" parameter to next_lines():
$third_entry_lines  = $ldif->next_lines(true);
$fourth_entry_lines = $ldif->next_lines(true);
$fifth_entry_lines  = $ldif->next_lines(true);

// If you want to convert the lines to an Net_LDAP_Entry,
// you may do so anytime by using parseLines()
$fourth_entry = $ldif->parseLines($fourth_entry_lines);

// Since we shifted manually only the lines,
// current_lines() will return the lines that built up the
// last (e.g. the first entry) Net_LDAP_Entry object:
$first_entry_lines  = $ldif->current_lines();

// If we decide to read the next entry, we can do that:
$sixth_entry = $ldif->read_entry();

// current_lines() is shifted now:
$sixth_entry_lines = $ldif->current_lines();

Net_MAC

Table of Contents
Constants -- Predefined Constants
Net_MAC::check() -- Validates Media Access Control (MAC) addresses
Net_MAC::format() -- Cleanly formats Media Access Control (MAC) addresses
Net_MAC::__construct() -- Constructor
setMAC() -- Sets the MAC address in the object
importVendors() -- Import a manufacturers' file to the database or to an array
findVendor() -- Finds the vendor of the MAC address stored in the object
Net_MAC_Exception -- Exception class for Net_MAC package

This package validates and cleanly formats Media Access Control (MAC) addresses. The Net_MAC class can also import a list of MAC address vendors and store them in a database which the class can then use to identify vendors of any MAC address.

Constants

Constants -- Predefined Constants

NET_MAC_LINE_MAXLENGTH

Constant to represent the maximum length of a line in the manufacturers file.

NET_MAC_ERROR_OK

Error constant: signifies no problem (OK)

NET_MAC_ERROR_BADOPT

Error constant: signifies a bad option being passed to a function

NET_MAC_ERROR_BADDATA

Error constant: signifies bad data being passed to a function

NET_MAC_ERROR_BADDB

Error constant: signifies a bad database connection

NET_MAC_ERROR_BADFILE

Error constant: signifies a bad manufacturers file

Net_MAC::check()

Net_MAC::check() -- Validates Media Access Control (MAC) addresses

Description

This function will check a MAC address to make sure it is valid.

Parameter

  • string $input - The string containing the MAC Address

  • string $delimiter - The string representing the delimiter to use when checking the MAC Address

Return value

boolean - TRUE if the MAC address is valid, FALSE otherwise

Note

This function should be called statically.

Net_MAC::format()

Net_MAC::format() -- Cleanly formats Media Access Control (MAC) addresses

Description

This function will format a MAC address into XX:XX:XX:XX:XX:XX format from whatever format is passed to the function. The delimiter (':' in the example above) will be replaced with whatever string is passed to the $delimiter parameter (default ':').

Parameter

  • string $input - The string containing the MAC Address

  • string $delimiter - The string representing the delimiter to use when formatting the MAC Address

  • string $uppercase - If set to TRUE (default), the alpha characters in the hexadecimal values in the MAC Address will be returned in uppercase. If FALSE, the alpha characters in the hexadecimal values will be returned in lowercase.

Return value

string - The formatted MAC Address or FALSE if the syntax of the MAC address is invalid

Note

This function should be called statically.

Net_MAC::__construct()

Net_MAC::__construct() -- Constructor

Description

This is the constructor that will create and populate a valid Net_MAC object.

Return value

void - No return value. A Net_MAC_Exception Exception object will be thrown if there is an error during construction

Note

The constructor can throw exceptions on error, so the constructor should always be called from inside a try/catch block.

Throws

throws Net_MAC_Exception

setMAC()

setMAC() -- Sets the MAC address in the object

Description

This method will set the MAC address in the object given the passed MAC address and the MAC address delimiter. This method also makes use of the check() method to make sure that the MAC address is valid.

Parameter

  • string $macaddr - The string representing the MAC address

  • string $delimiter - The string representing the delimiter to use when verifying the MAC Address

Return value

boolean - Returns TRUE if the MAC address is set correctly, FALSE otherwise (i.e. the MAC address is not valid).

Note

This function can not be called statically.

importVendors()

importVendors() -- Import a manufacturers' file to the database or to an array

Description

This method will parse a manufacturers' file, such as the one from http://anonsvn.wireshark.org/wireshark/trunk/manuf, containing a list of MAC address prefix-to-vendor relationships. If the $doReturn parameter is FALSE, then the data will be imported into the database defined by the factory of this class. However, if $doReturn is TRUE, then the return will be an associative array with the key being the MAC address prefix and the data being an associative array with the keys 'vendor' and 'description'.

Parameter

  • string $file - The filename or URL of the manufacturers' file to parse

  • string $doReturn - If TRUE, an array will be returned, if FALSE, the data will be imported into the database.

Return value

mixed - If $doReturn is TRUE, the method will return an array. Otherwise, the method will return TRUE on success. A Net_MAC_Exception Exception object will be thrown on failure in either case.

Note

This function can not be called statically.

This method can throw exceptions on error, so the method should always be called from inside a try/catch block.

Example

Throws

throws Net_MAC_Exception

findVendor()

findVendor() -- Finds the vendor of the MAC address stored in the object

Description

This method will search through the database to find a vendor that matches the MAC address stored in the class using setMac(). If the $macList parameter is set, the method will use the array stored in $macList as the data source to find the MAC vendor instead of the database. The array would have to be an array with the same characteristics as one returned from the importVendors() method when using the $doReturn parameter.

Parameter

  • string $getDescription - If set to TRUE, the return value will be an array with keys 'vendor' and 'description'. Normally the method will simply return the vendor name.

  • string $macList - An optional list of MAC-to-vendor relationships to search instead of using the database.

Return value

mixed - Returns an associative array if $getDescription is TRUE, returns a string with the vendor name if $getDescription is FALSE. If the MAC vendor cannot be found in the vendor list, FALSE is returned.

Note

This function can not be called statically.

Net_MAC_Exception

Net_MAC_Exception -- Exception class for Net_MAC package

Net_MAC_Exception

This class is a simple derivation of the PEAR_Exception class and simply exists for the use of throwing exceptions for this class.


Net_URL

Table of Contents
Net_URL Instantiate -- Instantiating Net_URL
Net_URL::setOption -- Setting options with Net_URL

Provides an easy parsing of URLs

Net_URL Instantiate

Net_URL Instantiate -- Instantiating Net_URL

Description

Instantiates a new Net_URL object

Parameter

  • string $url - The url to parse. By default this is getting $_SERVER['PHP_SELF']

  • string $useBrackets - Whether to use sqare brackets or not when there is multiple query variable names using the same name.

Net_URL::setOption

Net_URL::setOption -- Setting options with Net_URL

Description

Setting a Net_URL option


Net_NNTP

Implementation of the NNTP protocol


Net_NNTP_Client

Table of Contents
Constants -- predefined constants
Net_NNTP_Client::authenticate() -- Authenticate
Net_NNTP_Client::connect() -- Connects to a NNTP-server
Net_NNTP_Client::connectAuthenticated() -- Connect and authenticate to a NNTP-server
Net_NNTP_Client::count() -- Get the number of articles in the current newsgroup
Net_NNTP_Client::getDescriptions() -- 
Net_NNTP_Client::first() -- Get the number of the first article in the current newsgroup
Net_NNTP_Client::getArticle() -- Fetch an article from the NNTP-server
Net_NNTP_Client::getArticleRaw() -- Fetch an article from the NNTP-server
Net_NNTP_Client::getGroupArticles() -- 
Net_NNTP_Client::getBodyRaw() -- Fetch the body of an article from the NNTP-server
Net_NNTP_Client::getDate() -- Get date from NNTP-server
Net_NNTP_Client::getGroups() -- Fetch list of avaible newsgroups
Net_NNTP_Client::getHeader() -- Fetch the header of an article from the NNTP-server
Net_NNTP_Client::getHeaderRaw() -- fetch message header
Net_NNTP_Client::getNewGroups() -- 
Net_NNTP_Client::getNewNews() -- 
Net_NNTP_Client::getOverview() -- Fetch newsgroup overview
Net_NNTP_Client::getReferencesOverview() -- 
Net_NNTP_Client::group() -- 
Net_NNTP_Client::isConnected() -- Connected?
Net_NNTP_Client::last() -- Get the number of the last article in the current newsgroup
Net_NNTP_Client::post() -- 
Net_NNTP_Client::quit() -- Close the connection to the NNTP-server
Net_NNTP_Client::selectGroup() -- select a newsgroup

NNTP client implementation

Constants

Constants -- predefined constants

NET_NNTP_PROTOCOL_DEFAULT_HOST

default NNTP hostname: localhost

NET_NNTP_PROTOCOL_DEFAULT_PORT

default NNTP port: 119

NET_NNTP_AUTHORIGINAL

authentication provided by the NNTP-server

NET_NNTP_AUTHSIMPLE

authentication provided by the NNTP-server

NET_NNTP_AUTHGENERIC

authentication provided by the NNTP-server

Net_NNTP_Client::authenticate()

Net_NNTP_Client::authenticate() -- Authenticate

Description

Authenticate on an already open connection

Parameter

  • $user - Username to authenticate with

  • $pass - Password to authenticate with

  • $authmode - Type of authentication. Default=NET_NNTP_AUTHORIGINAL

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_NNTP_Client::connect()

Net_NNTP_Client::connect() -- Connects to a NNTP-server

Description

Connect to a specific NNTP-server

Parameter

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_NNTP_Client::connectAuthenticated()

Net_NNTP_Client::connectAuthenticated() -- Connect and authenticate to a NNTP-server

Description

Connect and authenticate to a specific NNTP-server

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Parameter

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::count()

Net_NNTP_Client::count() -- Get the number of articles in the current newsgroup

Description

Retrieves the number of articles in the current newsgroup.

Return value

integer - number of articles in newsgroup

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::getDescriptions()

Net_NNTP_Client::getDescriptions() -- 

Description

Net_NNTP_Client::first()

Net_NNTP_Client::first() -- Get the number of the first article in the current newsgroup

Description

Retrieves the number of the first article in the current newsgroup.

Return value

integer - lowest article number in newsgroup

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::getArticle()

Net_NNTP_Client::getArticle() -- Fetch an article from the NNTP-server

Description

Warning

This function is currently not documented.

Net_NNTP_Client::getArticleRaw()

Net_NNTP_Client::getArticleRaw() -- Fetch an article from the NNTP-server

Description

Returns the whole article from the currently selected newsgroup

Parameter

  • string $article - article number or Message-ID of the article to fetch

    boolean $implode - Determines if the resulting array is to be imploded into a string.

Return value

array/string - If message exists the message or a PEAR_Error, if fail.

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::getGroupArticles()

Net_NNTP_Client::getGroupArticles() -- 

Description

Net_NNTP_Client::getBodyRaw()

Net_NNTP_Client::getBodyRaw() -- Fetch the body of an article from the NNTP-server

Description

Returns the whole body of an article from the currently selected newsgroup

Parameter

  • string $article - article number or Message-ID of the article to fetch

    boolean $implode - Determines if the resulting array is to be imploded into a string.

Return value

string/array - If message exists the body or a PEAR_Error, if fail.

Note

since 0.3

This function can not be called statically.

Note: getBody() makes no converting of the body content to any character set. You get the content 'as is'.

Net_NNTP_Client::getDate()

Net_NNTP_Client::getDate() -- Get date from NNTP-server

Description

Retrieves the date from the NNTP-server.

Parameter

  • $format - Tetermines which format to return.

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::getGroups()

Net_NNTP_Client::getGroups() -- Fetch list of avaible newsgroups

Description

Returns a list of all avaible newsgroups

Return value

array - a two dimensional, nested array indicated by the name of the newsgroup, every entry contains information about the newsgroup:

  • $groups[newsgroup_name]['group'] Name of the newsgroup

  • $groups[newsgroup_name]['last'] Number of the last article

  • $groups[newsgroup_name]['first'] Number of the first article

  • $groups[newsgroup_name]['posting'] values: y - yes, n - no, m - moderated)

Note

This function can not be called statically.

Warning

Especially public news server can provide more then 30.000 newsgroup. So this function may runs longer then the maximum execution time set in the php.ini.

Net_NNTP_Client::getHeader()

Net_NNTP_Client::getHeader() -- Fetch the header of an article from the NNTP-server

Description

Warning

This function is currently not documented.

Net_NNTP_Client::getHeaderRaw()

Net_NNTP_Client::getHeaderRaw() -- fetch message header

Description

Returns the whole header of an article in the currently selected newsgroup

Parameter

  • string $article - article number or Message-ID of the article to fetch

    boolean $implode - Determines if the resulting array is to be imploded into a string.

Return value

array/string - If message exists the header or a PEAR_Error, if fail.

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::getNewGroups()

Net_NNTP_Client::getNewGroups() -- 

Description

Net_NNTP_Client::getNewNews()

Net_NNTP_Client::getNewNews() -- 

Description

Net_NNTP_Client::getOverview()

Net_NNTP_Client::getOverview() -- Fetch newsgroup overview

Description

Returns (a certain range of) the overview of the currently selected newsgroup. selected newsgroup

Parameter

  • $first - first article number, start of the range

  • $last - last article number, end of the range

Return value

array - a nested array indicated by the message id of the article, every entry contains the header as array
$msgs[message_id][headername] = headercontent

Note

This function can not be called statically.

Warning

Be careful with choosing the range. It could requires some time to get a huge number of message headers.

Net_NNTP_Client::getReferencesOverview()

Net_NNTP_Client::getReferencesOverview() -- 

Description

Net_NNTP_Client::group()

Net_NNTP_Client::group() -- 

Synopsis

require_once 'Net/NNTP/Client.php';

publicbooleanNet_NNTP_Client::groupstring$userstring$passinteger$authmode =
NET_NNTP_AUTHORIGINAL

Warning

This method is currently not documented.

Warning

This function is EXPERIMENTAL. That means, that the behaviour of this function, the function name, in concreto ANYTHING documented here can change in a future release of this package WITHOUT NOTICE. Be warned, and use this function at your own risk.

Description

Net_NNTP_Client::isConnected()

Net_NNTP_Client::isConnected() -- Connected?

Description

Net_NNTP_Client::last()

Net_NNTP_Client::last() -- Get the number of the last article in the current newsgroup

Description

Retrieves the number of the last article in the current newsgroup.

Return value

integer - highest article number in newsgroup

Note

since 0.3

This function can not be called statically.

Net_NNTP_Client::post()

Net_NNTP_Client::post() -- 

Description

Net_NNTP_Client::quit()

Net_NNTP_Client::quit() -- Close the connection to the NNTP-server

Description

Close the connection to the NNTP-server

Note

This function can not be called statically.

Net_NNTP_Client::selectGroup()

Net_NNTP_Client::selectGroup() -- select a newsgroup

Description

Selects a specific newsgroup on the NNTP-server

Parameter

  • string $newsgroup - Name of the newsgroup to access

Note

This function can not be called statically.


Net_NNTP

Table of Contents
Constants -- predefined constants
Net_NNTP::command() -- send a command to a newsserver
Net_NNTP::connect() -- Connects to a newsserver
Net_NNTP::connectAuthenticated() -- Connects and authenticates to a newsserver
Net_NNTP::date() -- get date from news server
Net_NNTP::first() -- get lowest message number
Net_NNTP::getArticle() -- fetch an article from a new server
Net_NNTP::getArticleRaw() -- fetch an article from a new server
Net_NNTP::getBody() -- fetch the body of an article
Net_NNTP::getBodyRaw() -- fetch the body of an article
Net_NNTP::getDate() -- get date from news server
Net_NNTP::getGroups() -- fetch list of avaible newsgroups
Net_NNTP::getHeaderRaw() -- fetch message header
Net_NNTP::getHeaders() -- fetch message headers
Net_NNTP::getOverview() -- fetch a number of message headers
Net_NNTP::getOverviewFmt() -- fetch the name of message headers
Net_NNTP::getOverviewFormat() -- fetch the name of message headers
Net_NNTP::isConnected() -- check connection status
Net_NNTP::last() -- get highest message number
Net_NNTP::max() -- get highest message number
Net_NNTP::min() -- get lowest message number
Net_NNTP::post() -- post a message
Net_NNTP::prepareConnection() -- connects to a newsgroup on a newsserver
Net_NNTP::quit() -- disconnect from a newsserver
Net_NNTP::selectGroup() -- select a newsgroup
Net_NNTP::setDebug() -- setting debug mode
Net_NNTP::splitHeaders() -- fetch message headers into in array

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

The historical Net_NNTP class

Constants

Constants -- predefined constants

NET_NNTP_PROTOCOL_DEFAULT_HOST

default NNTP hostname: localhost

NET_NNTP_PROTOCOL_DEFAULT_PORT

default NNTP port: 119

NET_NNTP_AUTHORIGINAL

authentication provided by the NNTP-server

NET_NNTP_AUTHSIMPLE

authentication provided by the NNTP-server

NET_NNTP_AUTHGENERIC

authentication provided by the NNTP-server

PEAR_NNTP_ALL

deprecated (never used)

PEAR_NNTP_LIST

deprecated (never used)

PEAR_NNTP_NAMES

deprecated (never used)

PEAR_NNTP_AUTHORIGINAL

deprecated (use NET_NNTP_AUTHORIGINAL instead)

PEAR_NNTP_AUTHSIMPLE

deprecated (use NET_NNTP_AUTHSIMPLE instead)

PEAR_NNTP_AUTHGENERIC

deprecated (use NET_NNTP_AUTHGENERIC instead)

Net_NNTP::command()

Net_NNTP::command() -- send a command to a newsserver

Description

Command() sends a string command to a newsserver. So you can send customized and/ or non-standard commands to the newsserver.

Parameter

  • string $cmd - the command to send

  • boolean $auth - if TRUE, an auth request is issued before the command

Return value

string - the unprocessed server response

Note

This function can not be called statically.

Warning

Command() does no checks on the given command and/ or proccesses the server response. So you should know what are you doing.

Net_NNTP::connect()

Net_NNTP::connect() -- Connects to a newsserver

Description

Connect to a specific newsserver

Parameter

  • $host - Hostname of the newsserver

  • $port - Port, where the newsserver listens

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_NNTP::connectAuthenticated()

Net_NNTP::connectAuthenticated() -- Connects and authenticates to a newsserver

Description

Connect and authenticate to a specific newsserver

Parameter

  • $user - Username to authenticate

  • $pass - Password to authenticate

  • $host - Hostname of the NNTP-server

  • $port - Port, where the newsserver listens

  • $authmode - Type of authentication, at the moment only NET_NNTP_AUTHORIGINAL

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

since 0.3

This function can not be called statically.

Net_NNTP::date()

Net_NNTP::date() -- get date from news server

Description

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Retrieves the date from the news server

Return value

array - a hash with the date

  • $date['y'] Year

  • $date['m'] Month

  • $date['d'] Day

Note

This function can not be called statically.

Net_NNTP::first()

Net_NNTP::first() -- get lowest message number

Description

Retrieves the lowest message number in the current selected newsgroup

Return value

integer - lowest message number

Note

since 0.3

This function can not be called statically.

Net_NNTP::getArticle()

Net_NNTP::getArticle() -- fetch an article from a new server

Description

Returns the whole article from the current selected newsgroup

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Consider this method deprecated and subject to changes - use Net_NNTP::getArticleRaw() instead.

Parameter

  • string $articleID - Message-ID of the message number to fetch

Return value

string - If message exists the message as string or a PEAR_Error, if fail.

Note

This function can not be called statically.

Net_NNTP::getArticleRaw()

Net_NNTP::getArticleRaw() -- fetch an article from a new server

Description

Returns the whole article from the current selected newsgroup

Parameter

  • string $articleID - Message-ID of the message number to fetch

Return value

string - If message exists the message as string or a PEAR_Error, if fail.

Note

since 0.3

This function can not be called statically.

Net_NNTP::getBody()

Net_NNTP::getBody() -- fetch the body of an article

Description

Returns the whole body of an article in the current selected newsgroup from the webserver

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Consider this method deprecated and subject to changes - use Net_NNTP::getBodyRaw() instead.

Parameter

  • string $articleId - Message-ID or Message number

Return value

string - If message exists the body as string or a PEAR_Error, if fail.

Note

This function can not be called statically.

Note: getBody() makes no converting of the body content to any character set. You get the content 'as is'.

Net_NNTP::getBodyRaw()

Net_NNTP::getBodyRaw() -- fetch the body of an article

Description

Returns the whole body of an article in the current selected newsgroup from the webserver

Parameter

  • string $articleId - Message-ID or Message number

Return value

string - If message exists the body as string or a PEAR_Error, if fail.

Note

since 0.3

This function can not be called statically.

Note: getBody() makes no converting of the body content to any character set. You get the content 'as is'.

Net_NNTP::getDate()

Net_NNTP::getDate() -- get date from news server

Description

Retrieves the date from the news server

Return value

array - a hash with the date

  • $date['y'] Year

  • $date['m'] Month

  • $date['d'] Day

Note

since 0.3

This function can not be called statically.

Net_NNTP::getGroups()

Net_NNTP::getGroups() -- fetch list of avaible newsgroups

Description

Returns a list of all avaible newsgroups from the connected news server

Parameter

  • $fetch - can be irgnored, unused

Return value

array - a two dimensional, nested array indicated by the name of the newsgroup, every entry contains information about the newsgroup:

  • $groups[newsgroup_name]['group'] name of the newsgroup

  • $groups[newsgroup_name]['last'] message number of the last message

  • $groups[newsgroup_name]['first'] message number of the first message

  • $groups[newsgroup_name]['posting_allowed'] values: y - yes, n - no, m - moderated)

  • $groups[newsgroup_name]['desc'] newsgroup description

Note

This function can not be called statically.

Warning

Especially public news server can provide more then 30.000 newsgroup. So this function may runs longer then the maximum execution time set in the php.ini.

Net_NNTP::getHeaderRaw()

Net_NNTP::getHeaderRaw() -- fetch message header

Description

Returns all avaible header lines of a specified message in the current selected newsgroup

Parameter

  • string $articleId - Message-ID or Message number

Return value

string - If message exists the header as string or a PEAR_Error, if fail.

Note

since 0.3

This function can not be called statically.

Net_NNTP::getHeaders()

Net_NNTP::getHeaders() -- fetch message headers

Description

Returns all avaible header lines of a specified message in the current selected newsgroup

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Consider this method deprecated and subject to changes - use Net_NNTP::getHeaderRaw() instead.

Parameter

  • string $articleId - Message-ID or Message number

Return value

string - If message exists the headers as string or a PEAR_Error, if fail.

Note

This function can not be called statically.

Net_NNTP::getOverview()

Net_NNTP::getOverview() -- fetch a number of message headers

Description

Returns all message headers in a certain range of the current selected newsgroup

Parameter

  • $first - start message id, start of the range

  • $last - last message id, end of the range

Return value

array - a nested array indicated by the message id of the article, every entry contains the header as array
$msgs[message_id][headername] = headercontent

Note

This function can not be called statically.

Warning

Be careful with choosing the range. It could requires some time to get a huge number of message headers.

Net_NNTP::getOverviewFmt()

Net_NNTP::getOverviewFmt() -- fetch the name of message headers

Description

Returns the name of message headers, which is provided by every message

Return value

array - list of header names

Note

This function can not be called statically.

Net_NNTP::getOverviewFormat()

Net_NNTP::getOverviewFormat() -- fetch the name of message headers

Description

Returns the name of message headers, which is provided by every message

Return value

array - list of header names

Note

This function can not be called statically.

Net_NNTP::isConnected()

Net_NNTP::isConnected() -- check connection status

Description

Returns the status of the connection

Return value

boolean - TRUE, if connected

Note

This function can not be called statically.

Net_NNTP::last()

Net_NNTP::last() -- get highest message number

Description

Retrieves the highest message number in the current selected newsgroup

Return value

integer - highest message number

Note

since 0.3

This function can not be called statically.

Net_NNTP::max()

Net_NNTP::max() -- get highest message number

Description

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Retrieves the highest message number in the current selected newsgroup

Return value

integer - highest message number

Note

This function can not be called statically.

Net_NNTP::min()

Net_NNTP::min() -- get lowest message number

Description

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Retrieves the lowest message number in the current selected newsgroup

Return value

integer - lowest message number

Note

This function can not be called statically.

Net_NNTP::post()

Net_NNTP::post() -- post a message

Description

Post a message to a news server

Parameter

  • $subject - Subject of the message

  • $newsgroup - Post to this newsgroup

  • $from - EMail adress of sender

  • $body - Body of the message

  • $additional - String of headers to add

Return value

string - Server response

Note

This function can not be called statically.

Warning

post() doesn't care about character encoding of subject and body. Make sure to set correct headers, if you are using non ASCII-127 characters.

Net_NNTP::prepareConnection()

Net_NNTP::prepareConnection() -- connects to a newsgroup on a newsserver

Description

Connect to a specific newsserver and access the given newsgroup

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Consider this method deprecated - use Net_NNTP::connectAuthenticated() instead.

Parameter

  • $nntpserver - Name of the newsserver to connect

  • $port - Port, where the newsserver listens

  • $newsgroup - Newsgroup to access

  • $user - Username to authenticate

  • $user - Username to authenticate

  • $pass - Password to authenticate

  • $authmode - Type of authentication, at the moment only PEAR_NNTP_AUTHORIGINAL

Return value

boolean - TRUE if successful

Note

This function can not be called statically.

Warning

This function is deprecated. That means that future versions of this package may not support it anymore.

Fetching data with a connection created with prepareConnection() is faster then a created connection with connect()

Net_NNTP::quit()

Net_NNTP::quit() -- disconnect from a newsserver

Description

Close connection to a newsserver

Note

This function can not be called statically.

Net_NNTP::selectGroup()

Net_NNTP::selectGroup() -- select a newsgroup

Description

Selects a specific newsgroup on the news server

Parameter

  • string $newsgroup - Name of the newsgroup to access

Return value

array - If the newsgroup exists an array containing the message number of the first (array key: ['first']) and the last message id (array key: ['last']) or a PEAR_Error, if fail.

Note

This function can not be called statically.

Net_NNTP::setDebug()

Net_NNTP::setDebug() -- setting debug mode

Description

Enables or disables debug mode for Net_NNTP

Parameter

  • boolean $on - TRUE = debug on, FALSE = debug off

Note

This function can not be called statically.

Net_NNTP::splitHeaders()

Net_NNTP::splitHeaders() -- fetch message headers into in array

Description

Returns all avaible header lines of a specified message of the current selected newsgroup into an array

Parameter

  • string $articleId - Message-ID or Message number

Return value

array - if message exists the headers as array or a PEAR_Error, if fail. The array is an associative array with the header names as key.

Note

This function can not be called statically.


Net_NNTP_Header

Warning

This module is EXPERIMENTAL. That means that the behaviour of these functions, these function names, in concreto ANYTHING documented here can change in a future release of this package WITHOUT NOTICE. Be warned, and use this module at your own risk.

This package is not documented yet.


Net_NNTP_Message

Warning

This module is EXPERIMENTAL. That means that the behaviour of these functions, these function names, in concreto ANYTHING documented here can change in a future release of this package WITHOUT NOTICE. Be warned, and use this module at your own risk.

This package is not documented yet.


Net_NNTP_Protocol_Client

Table of Contents
Constants -- predefined constants

Low level NNTP client implementation.

This package is not documented yet.

Constants

Constants -- predefined constants

NET_NNTP_PROTOCOL_CLIENT_DEFAULT_HOST

default NNTP hostname: localhost

NET_NNTP_PROTOCOL_CLIENT_DEFAULT_PORT

default NNTP port: 119


Net_Ping

Table of Contents
Net_Ping::Net_Ping() -- constructor
Net_Ping::ping() -- executes a ping command
Net_Ping::setArgs() -- set arguments for a ping command

API for the Ping command

Net_Ping::Net_Ping()

Net_Ping::Net_Ping() -- constructor

Description

Please use Net_Ping::factory() instead of using this constructor directly.

Net_Ping::ping()

Net_Ping::ping() -- executes a ping command

Description

Executes a ping command

Parameter

  • string $host - the name of the server or the IP-adress

Return value

string - the return message of the ping command

Note

This function can not be called statically.

Net_Ping::setArgs()

Net_Ping::setArgs() -- set arguments for a ping command

Description

Set the arguments for a ping command

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.


Net_POP3

Table of Contents
Introduction to Net_POP3 -- 
Net_POP3::Net_POP3() -- Constructor
Net_POP3::connect() -- Connection to POP3 server
Net_POP3::deleteMsg() -- Marks a message for deletion
Net_POP3::disconnect() -- Disconnection to POP3 server
Net_POP3::getBody() -- Returns the body of the message
Net_POP3::getListing() -- Listing message in maildrop
Net_POP3::getMsg() -- Returns the entire message
Net_POP3::getParsedHeaders() -- Returns the parsed headers of the specified message
Net_POP3::getRawHeaders() -- Returns the raw headers of the specified message
Net_POP3::getSize() -- Returns the size of the maildrop
Net_POP3::login() -- Performs the login procedure
Net_POP3::numMsg() -- number of messages in this maildrop

Provides a POP3 class to access POP3 server.

Introduction to Net_POP3

Introduction to Net_POP3  -- 

About Net_POP3

Provides a POP3 class to access POP3 servers. Supports all POP3 commands including UIDL listings and APOP authentication.

Note: Usage of this class compared to native PHP extensions such as IMAP is slow and may be feature deficient. If available you are STRONGLY recommended to use the PHP extensions.

Net_POP3::Net_POP3()

Net_POP3::Net_POP3() -- Constructor

Description

Constructor. Sets up the object variables, and instantiates the socket object.

Note

This function can not be called statically.

Net_POP3::connect()

Net_POP3::connect() -- Connection to POP3 server

Description

Connects to the given host on the given port. Also looks for the timestamp in the greeting needed for APOP authentication.

Parameter

  • string $host - Hostname/IP address to connect to

  • integer $port - Port to use to connect to on host

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Net_POP3::deleteMsg()

Net_POP3::deleteMsg() -- Marks a message for deletion

Description

Marks a message for deletion. Only will be deleted if the disconnect() method is called.

Parameter

  • integer $msg_id - Message to delete

Return value

mixed - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Net_POP3::disconnect()

Net_POP3::disconnect() -- Disconnection to POP3 server

Description

Disconnect function. Sends the QUIT command and closes the socket.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can not be called statically.

Net_POP3::getBody()

Net_POP3::getBody() -- Returns the body of the message

Description

Returns the body of the message with given message number.

Parameter

  • integer $msg_id - Message number

Return value

mixed - Either message body or FALSE on error.

Note

This function can not be called statically.

Net_POP3::getListing()

Net_POP3::getListing() -- Listing message in maildrop

Description

Listing message in maildrop. Combination of LIST/UIDL commands, returns an array of data.

Parameter

  • integer $msg_id - Optional message number

Return value

mixed - Array of data or false on error.

Note

This function can not be called statically.

Net_POP3::getMsg()

Net_POP3::getMsg() -- Returns the entire message

Description

Returns the entire message with given message number.

Parameter

  • integer $msg_id - Message number

Return value

mixed - Either entire message or FALSE on error.

Note

This function can not be called statically.

Net_POP3::getParsedHeaders()

Net_POP3::getParsedHeaders() -- Returns the parsed headers of the specified message

Description

Returns the headers of the specified message in an associative array. Array keys are the header names, array values are the header values. In the case of multiple headers having the same names, eg Received:, the array value will be an indexed array of all the header values.

Parameter

  • integer $msg_id - Message number

Return value

mixed - Either array of headers or FALSE on error.

Note

This function can not be called statically.

Net_POP3::getRawHeaders()

Net_POP3::getRawHeaders() -- Returns the raw headers of the specified message

Description

Returns the raw headers of the specified message.

Parameter

  • integer $msg_id - Message number

Return value

strings - Either raw headers or FALSE on error.

Note

This function can not be called statically.

Net_POP3::getSize()

Net_POP3::getSize() -- Returns the size of the maildrop

Description

Returns the size of the maildrop.

Return value

mixed - Either size of maildrop or FALSE on error.

Note

This function can not be called statically.

Net_POP3::login()

Net_POP3::login() -- Performs the login procedure

Description

Performs the login procedure. If there is a timestamp stored, APOP will be tried first, then basic USER/PASS.

Parameter

  • string $user - Username to use

  • string $pass - Password to use

  • boolean $apop - Whether to try APOP first

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_POP3::numMsg()

Net_POP3::numMsg() -- number of messages in this maildrop

Description

Returns number of messages in this maildrop.

Return value

mixed - Either number of messages or FALSE on error.

Note

This function can not be called statically.


Net_Portscan

Table of Contents
Net_Portscan::checkPort() -- check for available service
Net_Portscan::checkPortRange() -- check for available services
Net_Portscan::getPort() -- port number of a service
Net_Portscan::getService() -- name of the service

Provides an API for scanning ports

Net_Portscan::checkPort()

Net_Portscan::checkPort() -- check for available service

Description

This function checks if there is a service available at the specified port on the specified machine.

Parameter

  • string $host - address of the host to check

  • string $port - port to check

  • string $timeout - time in seconds to wait for response from host

    Important: If you run into timeout problems despite setting this parameter to a reasonably high value, you need to make sure that the configuration directive default_socket_timeout in the php.ini configuration file does not force the maximum timeout down to a lower value.

Return value

boolean - Returns TRUE on success, FALSE on failure.

Note

This function can be called statically.

Net_Portscan::checkPortRange()

Net_Portscan::checkPortRange() -- check for available services

Description

This function checks if there are services available at the specified ports on the specified machine.

Parameter

  • string $host - address of the host to check

  • string $minPort - lowest port to test to check

  • string $maxPort - highest port to test to check

  • string $timeout - time in seconds to wait for every response from host

    Important: If you run into timeout problems despite setting this parameter to a reasonably high value, you need to make sure that the configuration directive default_socket_timeout in the php.ini configuration file does not force the maximum timeout down to a lower value.

Return value

array - An associative array containing the scanning results for each port.

Note

This function can be called statically.

Net_Portscan::getPort()

Net_Portscan::getPort() -- port number of a service

Description

This function returns the port which corresponds to service for the specified protocol as per /etc/services.

Parameter

  • string $service - name of the service to check

  • string $protocol - access protocol

Return value

integer - port number of the service

Note

This function can be called statically.

The port number is retrieved from the machine where Net_Portscan is executed, not from the remote host, which you possibly used in Net_Portscan::checkPort().

Net_Portscan::getService()

Net_Portscan::getService() -- name of the service

Description

This function returns the service associated with port for the specified protocol as per '/etc/services'.

Parameter

  • integer $port - port to check

  • string $protocol - access protocol

Return value

string - name of service running on the port

Note

This function can be called statically.

The name of the service is retrieved from the machine where Net_Portscan is executed, not from the remote host, which you possibly used in Net_Portscan::checkPort().


Net_Server

Table of Contents
Introduction -- Introduction to Net_Server
Example -- using Net_Server
Class Summary Net_Server -- PHP socket server base class
Net_Server::create() -- create a new server
Class Summary Net_Server_Driver -- Base class for all drivers
Net_Server_Driver::getLastSocketError() -- return string for last socket error
Net_Server_Driver::setCallbackObject() -- register a callback object, that is used to handle all events
Net_Server_Driver::setDebugMode() -- set debug mode
Class Summary Net_Server_Driver_Fork -- Forking server class.
Net_Server_Driver_Fork::broadcastData() -- send data to all clients
Net_Server_Driver_Fork::closeConnection() -- close the current connection
Net_Server_Driver_Fork::getClientInfo() -- get current information about a client
Net_Server_Driver_Fork::getClients() -- get current amount of clients
Net_Server_Driver_Fork::isConnected() -- check, whether a client is still connected
Net_Server_Driver_Fork::sendData() -- send data to a client
Net_Server_Driver_Fork::serviceRequest() -- service the current request
Net_Server_Driver_Fork::setMaxClients() -- set maximum amount of simultaneous connections
Net_Server_Driver_Fork::shutDown() -- shutdown server
Net_Server_Driver_Fork::start() -- start the server
Class Summary Net_Server_Driver_Sequential -- Sequential server class.
Net_Server_Driver_Sequential::acceptConnection() -- accept a new connection
Net_Server_Driver_Sequential::broadcastData() -- send data to all clients
Net_Server_Driver_Sequential::closeConnection() -- close connection to a client
Net_Server_Driver_Sequential::getClientInfo() -- get current information about a client
Net_Server_Driver_Sequential::getClients() -- get current amount of clients
Net_Server_Driver_Sequential::isConnected() -- check, whether a client is still connected
Net_Server_Driver_Sequential::sendData() -- send data to a client
Net_Server_Driver_Sequential::setMaxClients() -- set maximum amount of simultaneous connections
Net_Server_Driver_Sequential::shutDown() -- shutdown server
Net_Server_Driver_Sequential::start() -- start the server
Class Summary Net_Server_Handler -- Base class for all handlers
Net_Server_Handler::onClose() -- onClose handler
Net_Server_Handler::onConnect() -- onConnect handler
Net_Server_Handler::onConnectionRefused() -- onConnectionRefused handler
Net_Server_Handler::onIdle() -- onIdle handler
Net_Server_Handler::onReceiveData() -- onReceiveData handler
Net_Server_Handler::onShutdown() -- onShutdown handler
Net_Server_Handler::onStart() -- onStart handler
Net_Server_Handler::setServerReference() -- set a reference to the server object
Package Net_Server Constants -- Constants defined in and used by Net_Server

Generic server package for creating daemons.

Introduction

Introduction -- Introduction to Net_Server

Introduction to Net_Server

Net_Server provides an interface to create daemon application based on the sockets extension of PHP 4. In order to use Net_Server you need a PHP version greater or equal PHP 4.2, it is meant to be used with PHP-CLI.

Net_Server uses a driver based architecture that allows you to switch the drivers for your daemons. Currently a forking and a non-forking driver are available, others will follow.

As Net_Server provides an abstraction layer for the sockets extension, you do not need internal knowledge about the PHP functions. All you have to do is implement callback functions for events in your daemon, like handling new connections or incoming data.

Example

Example -- using Net_Server

Class Summary Net_Server

Class Summary Net_Server -- PHP socket server base class

PHP socket server base class

This class must only be used to create a new server using the static method 'create()'.

To handle the events that happen while the server is running you have to create a new class that handles all events.

1     require_once 'myHandler.php';
2      require_once 'Net/Server.php';
3
4      $server = &Net_Server::create('fork', 'localhost', 9090);
5
6      $handler = &new myHandler;
7
8      $server->setCallbackObject($handler);
9
10     $server->start();

See Server/Handler.php for a baseclass that you can use to implement new handlers.

Class Trees for Net_Server

  • Net_Server

Net_Server::create()

Net_Server::create() -- create a new server

Description

Currently two types of servers are supported:

  • 'sequential', creates a server where one process handles all request from all clients sequentially

  • 'fork', creates a server where a new process is forked for each client that connects to the server. This only works on *NIX

Parameter

string $type

type of the server

string $host

hostname

integer $port

port

Throws

throws no exceptions thrown

static

static

Note

This function can not be called statically.

Class Summary Net_Server_Driver

Class Summary Net_Server_Driver -- Base class for all drivers

Base class for all drivers

This package is not documented yet.

Net_Server_Driver::getLastSocketError()

Net_Server_Driver::getLastSocketError() -- return string for last socket error

Description

This package is not documented yet.

Parameter

mixed &$fd

Return value

returns last error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver::setCallbackObject()

Net_Server_Driver::setCallbackObject() -- register a callback object, that is used to handle all events

Description

This package is not documented yet.

Parameter

object &$object

callback object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver::setDebugMode()

Net_Server_Driver::setDebugMode() -- set debug mode

Description

This package is not documented yet.

Parameter

mixed $debug

[text|htmlFALSE]

string $dest

destination of debug message (stdout to output or filename if log should be written)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary Net_Server_Driver_Fork

Class Summary Net_Server_Driver_Fork -- Forking server class.

Forking server class.

This class will fork a new process for each connection. This allows you to build servers, where communication between the clients is no issue.

Events that can be handled:

  • onStart

  • onConnect

  • onClose

  • onReceiveData

Class Trees for Net_Server_Driver_Fork

Net_Server_Driver_Fork Inherited Methods

Table 52-1. Inherited from Net_Server_Driver

Method NameSummary
Net_Server_Driver::getLastSocketError()return string for last socket error
Net_Server_Driver::setCallbackObject()register a callback object, that is used to handle all events
Net_Server_Driver::setDebugMode()set debug mode

Net_Server_Driver_Fork::broadcastData()

Net_Server_Driver_Fork::broadcastData() -- send data to all clients

Description

This package is not documented yet.

Parameter

string $data

data to send

array $exclude

client ids to exclude

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::closeConnection()

Net_Server_Driver_Fork::closeConnection() -- close the current connection

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::getClientInfo()

Net_Server_Driver_Fork::getClientInfo() -- get current information about a client

Description

This package is not documented yet.

Return value

returns information about the client

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::getClients()

Net_Server_Driver_Fork::getClients() -- get current amount of clients

Description

not possible with forking

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::isConnected()

Net_Server_Driver_Fork::isConnected() -- check, whether a client is still connected

Description

This package is not documented yet.

Parameter

integer $id

client id

Return value

returns true if client is connected, false otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::sendData()

Net_Server_Driver_Fork::sendData() -- send data to a client

Description

This package is not documented yet.

Parameter

string $data

data to send

boolean $debugData

flag to indicate whether data that is written to socket should also be sent as debug message

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::serviceRequest()

Net_Server_Driver_Fork::serviceRequest() -- service the current request

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::setMaxClients()

Net_Server_Driver_Fork::setMaxClients() -- set maximum amount of simultaneous connections

Description

this is not possible as each client gets its own process

Parameter

integer $maxClients

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::shutDown()

Net_Server_Driver_Fork::shutDown() -- shutdown server

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Fork::start()

Net_Server_Driver_Fork::start() -- start the server

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary Net_Server_Driver_Sequential

Class Summary Net_Server_Driver_Sequential -- Sequential server class.

Sequential server class.

This class will handles all connections in one server process. This allows you to build servers, where communication between the clients is easy. The drawback is that clients are served sequentially (hence the name). If you send large blocks of data to a client, the others will have to wait. For servers where communication between clients is not needed, use Net_Server_Fork instead.

Events that can be handled:

  • onStart

  • onConnect

  • onConnectionRefused

  • onClose

  • onIdle

  • onReceiveData

  • onShutdown

Class Trees for Net_Server_Driver_Sequential

Net_Server_Driver_Sequential Inherited Methods

Table 52-1. Inherited from Net_Server_Driver

Method NameSummary
Net_Server_Driver::getLastSocketError()return string for last socket error
Net_Server_Driver::setCallbackObject()register a callback object, that is used to handle all events
Net_Server_Driver::setDebugMode()set debug mode

Net_Server_Driver_Sequential::acceptConnection()

Net_Server_Driver_Sequential::acceptConnection() -- accept a new connection

Description

This package is not documented yet.

Parameter

resource &$socket

socket that received the new connection

Return value

returns internal ID of the client

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::broadcastData()

Net_Server_Driver_Sequential::broadcastData() -- send data to all clients

Description

This package is not documented yet.

Parameter

string $data

data to send

array $exclude

client ids to exclude

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::closeConnection()

Net_Server_Driver_Sequential::closeConnection() -- close connection to a client

Description

This package is not documented yet.

Parameter

mixed $id

integer $clientID

internal ID of the client

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::getClientInfo()

Net_Server_Driver_Sequential::getClientInfo() -- get current information about a client

Description

This package is not documented yet.

Parameter

integer $clientId

ID of the client

Return value

returns information about the client

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::getClients()

Net_Server_Driver_Sequential::getClients() -- get current amount of clients

Description

This package is not documented yet.

Return value

returns amount of clients

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::isConnected()

Net_Server_Driver_Sequential::isConnected() -- check, whether a client is still connected

Description

This package is not documented yet.

Parameter

integer $id

client id

Return value

returns true if client is connected, false otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::sendData()

Net_Server_Driver_Sequential::sendData() -- send data to a client

Description

This package is not documented yet.

Parameter

integer $clientId

ID of the client

string $data

data to send

boolean $debugData

flag to indicate whether data that is written to socket should also be sent as debug message

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::setMaxClients()

Net_Server_Driver_Sequential::setMaxClients() -- set maximum amount of simultaneous connections

Description

This package is not documented yet.

Parameter

integer $maxClients

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::shutDown()

Net_Server_Driver_Sequential::shutDown() -- shutdown server

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Driver_Sequential::start()

Net_Server_Driver_Sequential::start() -- start the server

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary Net_Server_Handler

Class Summary Net_Server_Handler -- Base class for all handlers

Base class for all handlers

This package is not documented yet.

Class Trees for Net_Server_Handler

  • Net_Server_Handler

Net_Server_Handler::onClose()

Net_Server_Handler::onClose() -- onClose handler

Description

This handler is called, when a client disconnects from the server Available in:

  • Net_Server_Sequential

  • Net_Server_Fork

Parameter

integer $clientId

unique id of the client, in Net_Server_Fork, this is always 0

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Handler::onConnect()

Net_Server_Handler::onConnect() -- onConnect handler

Description

This handler is called, when a new client connects Available in:

  • Net_Server_Sequential

  • Net_Server_Fork

Parameter

integer $clientId

unique id of the client, in Net_Server_Fork, this is always 0

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Handler::onConnectionRefused()

Net_Server_Handler::onConnectionRefused() -- onConnectionRefused handler

Description

This handler is called, when a new client tries to connect but is not allowed to Available in:

  • Net_Server_Sequential

Parameter

integer $clientId

unique id of the client

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Handler::onIdle()

Net_Server_Handler::onIdle() -- onIdle handler

Description

This handler is called whenever the server is idle (has nothing to do), and that for a given number of seconds (timeout). Currently, only the sequential driver supports this handler.

The timeout can be specified by passing the desired number of seconds to setIdleTimeout(). By default, the timeout is set to NULL, which means that the handler is deactivated.

Note

This function can not be called statically.

Net_Server_Handler::onReceiveData()

Net_Server_Handler::onReceiveData() -- onReceiveData handler

Description

This handler is called, when a client sends data to the server Available in:

  • Net_Server_Sequential

  • Net_Server_Fork

Parameter

integer $clientId

unique id of the client, in Net_Server_Fork, this is always 0

string $data

data that the client sent

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Handler::onShutdown()

Net_Server_Handler::onShutdown() -- onShutdown handler

Description

This handler is called, when the server is stopped. Available in:

  • Net_Server_Sequential

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Handler::onStart()

Net_Server_Handler::onStart() -- onStart handler

Description

This handler is called, when the server starts. Available in:

  • Net_Server_Sequential

  • Net_Server_Fork

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Server_Handler::setServerReference()

Net_Server_Handler::setServerReference() -- set a reference to the server object

Description

This is done automatically when the handler is passed over to the server

Parameter

object Net_Server_*; &$server

object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package Net_Server Constants

Package Net_Server Constants -- Constants defined in and used by Net_Server

Net_SmartIrc

Table of Contents
Introduction --  Net_SmartIRC is a PHP class for communication with IRC networks, which conforms to the RFC 2812 (IRC protocol).

Net_SmartIRC is a PHP class for communication with IRC networks, which conforms to the RFC 2812 (IRC protocol). It's an API that handles all IRC protocol messages. This class is designed for creating IRC bots, chats and show irc related info on webpages.

Introduction

Introduction --  Net_SmartIRC is a PHP class for communication with IRC networks, which conforms to the RFC 2812 (IRC protocol).

Net_SmartIRC Description

Net_SmartIRC is a PHP class for communication with IRC networks, which conforms to the RFC 2812 (IRC protocol). It's an API that handles all IRC protocol messages. This class is designed for creating IRC bots, chats and show irc related info on webpages.

The full online documentation is available here


Net_SMTP

Table of Contents
Class Summary Net_SMTP -- Provides an implementation of the SMTP protocol using PEAR's Net_Socket:: class.
Introduction and Guide --  Provides an implementation of the SMTP protocol
constructor Net_SMTP::Net_SMTP() -- Instantiates a new Net_SMTP object, overriding any networkings with parameters that are passed in.
Net_SMTP::auth() -- Attempt to do SMTP authentication.
Net_SMTP::connect() -- Attempt to connect to the SMTP server.
Net_SMTP::data() -- Send the DATA command to start message body
Net_SMTP::disconnect() -- Attempt to disconnect from the SMTP server.
Net_SMTP::getResponse() -- Return a 2-tuple containing the last response from the SMTP server.
Net_SMTP::helo() -- Send the HELO command.
Net_SMTP::identifySender() -- Backwards-compatibility method.identifySender()'s functionality is now handled internally.
Net_SMTP::mailFrom() -- Send the MAIL FROM: command.
Net_SMTP::noop() -- Send the NOOP command.
Net_SMTP::quotedata() -- Quote the data so that it meets SMTP standards.
Net_SMTP::rcptTo() -- Send the RCPT TO: command.
Net_SMTP::rset() -- Send the RSET command.
Net_SMTP::saml_from() -- Send the SAML FROM: command.
Net_SMTP::send_from() -- Send the SEND FROM: command.
Net_SMTP::setDebug() -- Set the value of the debugging flag.
Net_SMTP::soml_from() -- Send the SOML FROM: command.
Net_SMTP::vrfy() -- Send the VRFY command.

Class Summary Net_SMTP

Class Summary Net_SMTP -- Provides an implementation of the SMTP protocol using PEAR's Net_Socket:: class.

Provides an implementation of the SMTP protocol using PEAR's Net_Socket:: class.

This package implements the Simple Mail Transfer Protocol (SMTP), Internet's standard host-to-host mail transport protocol, using the Net_Socket:: class for the server connection. The SMTP provides mechanisms for the transmission of mail.

Class Trees for Net_SMTP

  • Net_SMTP

Introduction and Guide

Introduction and Guide --  Provides an implementation of the SMTP protocol

Net_SMTP Introduction and Guide

The Net_SMTP package supports the SMTP authentication standard (as defined by RFC-2554). Net_SMTP supports several authentication methods like DIGEST-MD5,CRAM-MD5, LOGIN and PLAIN.

The full guide is available here

constructor Net_SMTP::Net_SMTP()

constructor Net_SMTP::Net_SMTP() -- Instantiates a new Net_SMTP object, overriding any networkings with parameters that are passed in.

Description

Constructor,Instantiates a new Net_SMTP object.

Parameter

string $host

The server to connect to.

integer $port

The port to connect to.

string $localhost

The value to give when sending EHLO or HELO.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::auth()

Net_SMTP::auth() -- Attempt to do SMTP authentication.

Description

This function initializes an authentication session using the supported methods. These are, in order of preference: Digest-MD5,CRAMMD5,LOGIN, and PLAIN.

Parameter

string $uid

The userid to authenticate as.

string $pwd

The password to authenticate with.

string $method

The requested authentication method.If none is specified, the best supported method will be used.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::connect()

Net_SMTP::connect() -- Attempt to connect to the SMTP server.

Description

Attempt to establish a connection with the SMTP server

Parameter

integer $timeout

The timeout value (in seconds) for thesocket connection.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::data()

Net_SMTP::data() -- Send the DATA command to start message body

Description

This function sends the message body with the DATA command and terminates the message session.

Parameter

string $data

The message body to send.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::disconnect()

Net_SMTP::disconnect() -- Attempt to disconnect from the SMTP server.

Description

Attempt to close the connection with the SMTP server.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::getResponse()

Net_SMTP::getResponse() -- Return a 2-tuple containing the last response from the SMTP server.

Description

Return a two-element array containing the last response from the SMPT server.

Return value

returns A two-element array: the first element contains the response code as an integer and the second element contains the response's arguments as a string.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::helo()

Net_SMTP::helo() -- Send the HELO command.

Description

Send the HELO command which is the first part of a mail-sending SMTP transaction where the Internet extender first tries to send mail.

Parameter

string $domain

The domain name to say we are.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::identifySender()

Net_SMTP::identifySender() -- Backwards-compatibility method.identifySender()'s functionality is now handled internally.

Description

Backwards-compatibility method.identifySender()'s functionality is now handled internally.

Return value

returns This method always return true.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::mailFrom()

Net_SMTP::mailFrom() -- Send the MAIL FROM: command.

Description

Send the MAIL FROM: command

Parameter

string $sender

The sender (reverse path) to set.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::noop()

Net_SMTP::noop() -- Send the NOOP command.

Description

Send the NOOP command.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::quotedata()

Net_SMTP::quotedata() -- Quote the data so that it meets SMTP standards.

Description

This is provided as a separate public function to facilitate easier overloading for the cases where it is desirable to customize the quoting behavior.

Parameter

string &$data

The message text to quote. The string must be passed by reference, and the text will be modified in place.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::rcptTo()

Net_SMTP::rcptTo() -- Send the RCPT TO: command.

Description

sends the RCPT TO SMTP protocol command

Parameter

string $recipient

The recipient (forward path) to add.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::rset()

Net_SMTP::rset() -- Send the RSET command.

Description

Sends the RSET SMTP protocol command.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::saml_from()

Net_SMTP::saml_from() -- Send the SAML FROM: command.

Description

Sends the SAML FROM SMTP protocol command.

Parameter

string $path

The reverse path to send.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::send_from()

Net_SMTP::send_from() -- Send the SEND FROM: command.

Description

Sends the SEND FROM SMTP protocol command.

Parameter

string $path

The reverse path to send.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::setDebug()

Net_SMTP::setDebug() -- Set the value of the debugging flag.

Description

Set the value of the debugging flag.

Parameter

boolean $debug

New value for the debugging flag.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::soml_from()

Net_SMTP::soml_from() -- Send the SOML FROM: command.

Description

Sends the SOML FROM: SMTP protocol command.

Parameter

string $path

The reverse path to send.

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_SMTP::vrfy()

Net_SMTP::vrfy() -- Send the VRFY command.

Description

Sends the VRFY SMTP protocol command.

Parameter

string $string

The string to verify

Return value

returns Returns a PEAR_Error with an error message on any kind of failure, or true on success.

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Net_Socket

Table of Contents
Net_Socket::connect() -- connects to a server
Net_Socket::disconnect() -- disconnects from a server
Net_Socket::eof() -- test for end-of-file
Net_Socket::gets() -- retrieve a string
Net_Socket::getStatus() -- retrieve information about a connection
Net_Socket::isBlocking() -- check for blocking mode
Net_Socket::read() -- retrieve data
Net_Socket::readAll() -- retrieve data until connection closes
Net_Socket::readByte() -- read a byte
Net_Socket::readInt() -- read an integer
Net_Socket::readIPAddress() -- read an IP-address
Net_Socket::readLine() -- retrieve data until line end
Net_Socket::readString() -- read a string
Net_Socket::readWord() -- read a word
Net_Socket::setBlocking() -- sets blocking mode
Net_Socket::setTimeout() -- sets timeout
Net_Socket::write() -- write data
Net_Socket::writeLine() -- write data including EOL
Example -- using Net_Socket

Net_Socket provides a generic API for communication over TCP/IP-sockets.

Net_Socket::connect()

Net_Socket::connect() -- connects to a server

Description

Connect to the specified port. If called when the socket is already connected, it disconnects and connects again.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_Socket::disconnect()

Net_Socket::disconnect() -- disconnects from a server

Description

Disconnects froms server, closes the socket.

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_Socket::eof()

Net_Socket::eof() -- test for end-of-file

Description

Test for the end of data transmission.

Return value

boolean - TRUE, if no more data avaible or connection is closed

Note

This function can not be called statically.

Net_Socket::gets()

Net_Socket::gets() -- retrieve a string

Description

Returns a string containing data from the socket connection

Parameter

  • integer $size - maximum number of chars to recieve

Return value

string - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::getStatus()

Net_Socket::getStatus() -- retrieve information about a connection

Description

Returns information about an existing socket resource.

Return value

array - the data as array or a PEAR_Error

The content of the array is:

  • boolean 'timed_out' - the socket timed out waiting for data

  • boolean 'blocked' - blocking mode

  • boolean 'eof' - indicates EOF event

  • integer 'unread_bytes' - number of bytes left in the socket buffer

Note

This function can not be called statically.

Net_Socket::isBlocking()

Net_Socket::isBlocking() -- check for blocking mode

Description

Find out if the socket is in blocking mode.

Return value

boolean - if TRUE, the connection is in blocking mode

Note

This function can not be called statically.

Net_Socket::read()

Net_Socket::read() -- retrieve data

Description

Read a specified amount of data. This is guaranteed to return, and has the added benefit of getting everything in one fread() chunk; if you know the size of the data you're getting beforehand, this is definitely the way to go.

Parameter

  • integer $size - maximum number of chars to recieve

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readAll()

Net_Socket::readAll() -- retrieve data until connection closes

Description

Read until the socket closes.

Warning

This function will not exit, if the socket is in blocking mode until the socket closes.

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readByte()

Net_Socket::readByte() -- read a byte

Description

Read a byte from the socket

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readInt()

Net_Socket::readInt() -- read an integer

Description

Read an integer from the socket.

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readIPAddress()

Net_Socket::readIPAddress() -- read an IP-address

Description

Reads a IP from the socket. The function expects an integer which will converted to a IP address. This function only works with IPv4 addresses.

Return value

string - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readLine()

Net_Socket::readLine() -- retrieve data until line end

Description

Read until either the end of the socket or a newline, whichever comes first. Strips the trailing newline from the returned data.

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readString()

Net_Socket::readString() -- read a string

Description

Read a zeroterminated string ("\x00") from the socket.

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Net_Socket::readWord()

Net_Socket::readWord() -- read a word

Description

Read a word from the socket.

Return value

mixed - the data or a PEAR_Error

Note

This function can not be called statically.

Note: "Word" means not a word in literary sense. A word is a statement of size for data.

Net_Socket::setBlocking()

Net_Socket::setBlocking() -- sets blocking mode

Description

Sets whether the socket connection should be blocking or not. A read call to a non-blocking socket will return immediately if there is no data available, whereas it will block until there is data for blocking sockets.

Parameter

  • boolean $mode - TRUE for blocking sockets, FALSE for non blocking

Return value

  • boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_Socket::setTimeout()

Net_Socket::setTimeout() -- sets timeout

Description

Sets the timeout value on socket descriptor, expressed in the sum of seconds and microseconds.

Parameter

  • integer $seconds - seconds part

  • integer $microseconds - microseconds part

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_Socket::write()

Net_Socket::write() -- write data

Description

Write data to a socket connection

Parameter

  • string $data - the data to write

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Net_Socket::writeLine()

Net_Socket::writeLine() -- write data including EOL

Description

Write a line of data to a socket connection, followed by a trailing "\r\n".

Parameter

  • string $data - the data to write

Return value

boolean - Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

Example

Example -- using Net_Socket

Net_Traceroute

Table of Contents
Class Summary Net_Traceroute -- Wrapper class for traceroute calls
Net_Traceroute::factory() -- Factory for Net_Traceroute
Net_Traceroute::setArgs() -- Set the arguments array
Net_Traceroute::traceroute() -- Execute traceroute
Class Summary Net_Traceroute_Result -- Container class for Net_Traceroute results
Net_Traceroute_Result::factory() -- Factory for Net_Traceroute_Result
Net_Traceroute_Result::getHops() -- Returns hops from parsed result
Net_Traceroute_Result::getRawData() -- Returns raw data that was returned by traceroute
Net_Traceroute_Result::getSystemName() -- Returns sysname that was "guessed" (OS on which class is running)
Net_Traceroute_Result::getTargetIp() -- Returns the target IP from parsed result
Net_Traceroute_Result::getTTL() -- Returns TTL from parsed result
Net_Traceroute_Result::getValue() -- Returns a Traceroute_Result property
Package Net_Traceroute Constants -- Constants defined in and used by Net_Traceroute

Class Summary Net_Traceroute

Class Summary Net_Traceroute -- Wrapper class for traceroute calls

Wrapper class for traceroute calls

This package is not documented yet.

Class Trees for Net_Traceroute

  • Net_Traceroute

Net_Traceroute::factory()

Net_Traceroute::factory() -- Factory for Net_Traceroute

Description

Call this method to create a new instance of Net_Traceroute

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Traceroute::setArgs()

Net_Traceroute::setArgs() -- Set the arguments array

Description

This package is not documented yet.

Parameter

array $args

Hash with options

Return value

returns true or PEAR_error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Traceroute::traceroute()

Net_Traceroute::traceroute() -- Execute traceroute

Description

This package is not documented yet.

Parameter

string $host

hostname or IP of destination

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary Net_Traceroute_Result

Class Summary Net_Traceroute_Result -- Container class for Net_Traceroute results

Container class for Net_Traceroute results

This package is not documented yet.

Class Trees for Net_Traceroute_Result

  • Net_Traceroute_Result

Net_Traceroute_Result::factory()

Net_Traceroute_Result::factory() -- Factory for Net_Traceroute_Result

Description

This package is not documented yet.

Parameter

array $result

Net_Traceroute result

string $sysname

OS_Guess::sysname

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Net_Traceroute_Result::getHops()

Net_Traceroute_Result::getHops() -- Returns hops from parsed result

Description

This package is not documented yet.

Return value

returns Hops

Throws

throws no exceptions thrown

See

see _hops

Note

This function can not be called statically.

Net_Traceroute_Result::getRawData()

Net_Traceroute_Result::getRawData() -- Returns raw data that was returned by traceroute

Description

This package is not documented yet.

Return value

returns raw data

Throws

throws no exceptions thrown

See

see _raw_data

Note

This function can not be called statically.

Net_Traceroute_Result::getSystemName()

Net_Traceroute_Result::getSystemName() -- Returns sysname that was "guessed" (OS on which class is running)

Description

This package is not documented yet.

Return value

returns OS_Guess::sysname

Throws

throws no exceptions thrown

See

see _sysname

Note

This function can not be called statically.

Net_Traceroute_Result::getTargetIp()

Net_Traceroute_Result::getTargetIp() -- Returns the target IP from parsed result

Description

This package is not documented yet.

Return value

returns IP address

Throws

throws no exceptions thrown

See

see _target_ip

Note

This function can not be called statically.

Net_Traceroute_Result::getTTL()

Net_Traceroute_Result::getTTL() -- Returns TTL from parsed result

Description

This package is not documented yet.

Return value

returns TTL

Throws

throws no exceptions thrown

See

see _ttl

Note

This function can not be called statically.

Net_Traceroute_Result::getValue()

Net_Traceroute_Result::getValue() -- Returns a Traceroute_Result property

Description

This package is not documented yet.

Parameter

string $name

property name

Return value

returns property value

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Package Net_Traceroute Constants

Package Net_Traceroute Constants -- Constants defined in and used by Net_Traceroute

Net_Whois

Table of Contents
Net_Whois::query() -- does a whois query

Provides an API for accessing Whois services

Net_Whois::query()

Net_Whois::query() -- does a whois query

Description

Executes a Whois query on a server

Parameter

  • string $query - the Whois database object to look up

  • string $server - the name of the server or its IP address

Return value

string - the data from the Whois request.


Net_Wifi

Table of Contents
Setup -- Making it work
Local info -- Current interface configuration
Scanning -- Finding wireless networks

Scans for wireless networks

Setup

Setup -- Making it work

Setup - Making it work

Net_Wifi uses the command line tools iwconfig and iwlist to gather information about local wireless network interfaces, and to give information about wireless networks reachable by your computer.

To work with the class, you need to make sure that both programs are found. By default, /sbin/ and /usr/sbin/ are looked up to find them when the class is instantiated. If that fails, the system's which tool is used to determine the location.

You can retrieve and set their locations with getPathIwconfig() and setPathIwconfig(), as well as getPathIwlist() and setPathIwlist().

Local info

Local info -- Current interface configuration

Getting local interface configuration

At first, you can get a list of network interfaces on your computer via getSupportedInterfaces(). It returns an array of strings that are the names of the network interfaces, e.g. "eth1" or "wlan0".

The full information about the state of a network interface can be retrieved with getCurrentConfig(). It returns a Net_Wifi_Config object. To just check if an interface is connected, use the isConnected() method also takes the interface name as only parameter.

A Net_Wifi_Config looks like this:
Net_Wifi_Config {
  activated     => bool(true)
  associated    => bool(true)
  ap            => string(17) "00:03:C9:44:34:2C"
  ssid          => string(4) "free"
  mode          => string(7) "managed"
  nick          => NULL
  rate          => string(2) "54"
  power         => string(2) "20"
  protocol      => string(12) "IEEE 802.11g"
  rssi          => string(3) "-37"
}

Scanning

Scanning -- Finding wireless networks

Finding wireless networks

To scan for available wireless networks in your environment, use the scan() method. It takes the network interface name as only parameter and returns an array of Net_Wifi_Cell objects.

You get an array of local wireless interfaces via the getSupportedInterfaces() method.

A cell object looks like this:
Net_Wifi_Cell {
  cell      => string(2) "01"
  mac       => string(17) "00:03:C9:44:34:2C"
  ssid      => string(8) "<hidden>"
  mode      => string(6) "master"
  channel   => int(1)
  encryption=> bool(false)
  frequency => NULL
  protocol  => string(13) "IEEE 802.11bg"
  rate      => float(54)
  rates     => array(12) {
    0   => float(1)
    1   => float(2)
    2   => float(5.5)
    3   => float(6)
  }
  rssi      => string(3) "-39"
  beacon    => int(336)
  quality   => string(6) "90/100"
}


URI_Template

Table of Contents
Introduction --  Introduction to URI_Template

This package contains a parser for URI Templates as defined in the URI Template draft that is currently being proposed to the IETF.

Warning

Please note that the standardization initiative regarding URI Templates is not yet finished. Thus the API and the inner workings of this package may undergo major revisions in the future.

Introduction

Introduction --  Introduction to URI_Template

Overview

URI Templates are strings that contain embedded variables that are transformed into URIs after embedded variables are substituted.

More information about URI Templates can be found at the following locations:

In a nutshell, URI Templates allow actors to specify a certain structure for URIs in order to make it possible for other actors to fill the structure with concrete information later. Joe Gregorio has posted an example of a possible use case.

Setup

Requirements

URI_Template requires PHP 5.

Installation

The URI_Template package can be installed using the PEAR installer command pear install URI_Template.

Alternative installation methods for situations where one has no access to the pear installer command can be found in the general installation chapter.

Uninstallation

Uninstalling the package can be done with pear uninstall URI_Template.


Chapter 53. Numbers

Provides Packages for working with numbers



Chapter 54. Payment

Provides Packages for payment-related standards and offerer



Chapter 55. PEAR

Provides Packages to work with/get info from the PEAR core



PEAR_Info

Displays Information about your current PEAR install. Akin to PHP's phpinfo().


Summary


System Requirements

Mandatory resources :

  • PHP 4.3.0 or newer.

  • PEAR 1.5.4 or newer.

Optional resources :


About

Table of Contents
FAQ -- Answers to most Frequently Asked Questions
News -- What is New in version ?
Introduction -- Introduction to PEAR_Info

FAQ

FAQ -- Answers to most Frequently Asked Questions

PEAR_Info FAQ

1. General questions
1.1. What does it cost ?
1.2. Do you offer support ?
1.3. I found a bug, what shall I do ?
1.4. What is PEAR ?
2. How to
2.1. I want to display my system configuration, but this one is not detected ?
2.2. I want to change the look an feel (colors) of PEAR_Info output ?
2.3. I want to display packages from all my channels ?
2.4. I want to check if a package is installed or not ?
1. General questions

1.1. What does it cost ?

You can download and use it for free. But don't delete the copyright notice. You can read terms of the PHP license.

1.2. Do you offer support ?

YES if there is no answer in this Guide and if you are ready to share some informations such as : your configuration (platform Win *nix mac, PHP version, PEAR packages installed) and perharps your script.

1.3. I found a bug, what shall I do ?

You can report it with the bug tracker at PEAR.

1.4. What is PEAR ?

PEAR (an acronym for PHP Extension and Application Repository) is a framework and distribution system for reusable PHP components.

Don't forget to read also the PEAR Manual and PEAR FAQ.

2. How to

2.1. I want to display my system configuration, but this one is not detected ?

If your system file (see command pear config-show) does not exists, or is locate in another directory, then you should give this information on PEAR_Info class constructor.

<?php
// @link http://pear.php.net/bugs/bug.php?id=12878
//       Search for pear.conf inside /etc/pear/

require_once 'PEAR/Info.php';

$pear_dir  = '';
$user_file = '';
$syst_file = '/etc/pear/pear.conf';

$info = new PEAR_Info($pear_dir, $user_file, $syst_file);
$info->display();
?>

2.2. I want to change the look an feel (colors) of PEAR_Info output ?

First copy the default stylesheet named pearinfo.css (locate in {data_dir}/PEAR_Info : see command pear config-show) as a pattern. Then second, change colors and whatever you want until you keep all CSS selectors.

See for example the blue layout pattern skin locate in package installation under name {doc_dir}/PEAR_Info/examples/blueskin.css.

Last, as {doc_dir}/PEAR_Info/examples/pear_info2.php script, set the new stylesheet with PEAR_Info::setStyleSheet.
<?php
require_once 'PEAR/Info.php';

$info = new PEAR_Info();
$info->setStyleSheet(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'blueskin.css');
$info->display();
?>

2.3. I want to display packages from all my channels ?

By default PEAR_Info display only informations from pear.php.net channel.

To remove this limit, give as option to the class constructor an empty channels list, as below :
<?php
require_once 'PEAR/Info.php';

$pear_dir  = '';
$user_file = '';
$syst_file = '/opt/lampp/etc/pear.conf';
$options   = array('channels' => array() );

$info = new PEAR_Info($pear_dir, $user_file, $syst_file, $options);
$info->display();
?>

Note: If you want to filter package listing from a channel list, then give the full qualified list; something like :

<?php
$options = array('channels' => array('pear.php.net', 'pear.phpunit.de', '__uri') );
?>

2.4. I want to check if a package is installed or not ?

With static method PEAR_Info::packageInstalled, you can check installation of a package from all channels declared, and also filter by version.

<?php
require_once 'PEAR/Info.php';

$inst = PEAR_Info::packageInstalled('Role_Web', '1.1.0', 'pearified');
if ($inst === false) {
    echo 'sorry it seems that "pearified/Role_Web" package is not installed'
       . ' or version is less than 1.1.0';
}
?>

News

News -- What is New in version ?

Version 1.0.x

  • Initial PEAR public release occured at end of April 2003.

  • Moved output of the PEAR_Info to PEAR_Info::show()

  • Local PEAR logo copy included

  • Added PEAR Configuration section to the output

Version 1.5.x

  • Allows Off-Line viewing

  • Shows *all* installed packages, whether in PEAR or not

  • You can now specify a custom PEAR config file

Version 1.6.x

  • Added static method, PEAR_Info::packageInstalled(). Allows to check if a package is installed or not.

Version 1.7.x

  • Easy change look and feel with a simple CSS file

  • Show packages dependencies list

  • HTML page output is XHTML compliant

  • Introduce a full and flexible configuration system to show only information you want

  • Show channel list

  • Show maintainer inactive status in Credits page

  • Support REST 1.0 protocol

  • Drop support of package xml 1.0

  • Credits page is now customizable with PEAR_INFO_CREDITS_* constant

  • You may have a standalone html page (default behavior) with PEAR_INFO_FULLPAGE, or part of it

  • Removed support of PEAR 1.3.x

  • Upgrade requirement to PHP 4.3.0 and PEAR 1.5.4 (to avoid security vulnerability)

  • Coding Standard fixes (errors/warnings) following recommandation by PHP_CodeSniffer

Introduction

Introduction -- Introduction to PEAR_Info

Introduction to PEAR_Info

PEAR_Info obtains and displays information about your current PEAR Install. The PEAR_Info page features an A-Z index for easy searching, aswell as anchors for each package in the form of pkg_Package_Name (i.e. url.tld/pearinfo.php#pkg_PEAR_Info) PEAR_Info also features a full 'PEAR Credits' page, with information about the authors of the packages you currently have installed. PEAR_Info will also display any later versions that are available from PEAR to help keep you up to date.

PEAR_Info options

The output may be customized by passing one or more of the following constants bitwise values summed together in the optional options hash parameter. One can also combine the respective constants or bitwise values together with the or operator.


Reference guide

Table of Contents
constructor PEAR_Info::PEAR_Info() -- PHP 4 style constructor (ZE1)
PEAR_Info::display() -- Displays PEAR_Info output
PEAR_Info::getMembers() -- Returns a members list depending of its category (group, docs, website)
PEAR_Info::getStyleSheet() -- Returns the custom style sheet to use for presentation
PEAR_Info::packageInstalled() -- Check if a package is installed
PEAR_Info::pearImage() -- Display the PEAR logo
PEAR_Info::setProxy() -- Sets PEAR HTTP Proxy Server Address
PEAR_Info::setStyleSheet() -- Sets the custom style sheet to use your own styles
PEAR_Info::show() -- Shows PEAR_Info output
PEAR_Info::toHtml() -- Returns PEAR_Info output (html code)

constructor PEAR_Info::PEAR_Info()

constructor PEAR_Info::PEAR_Info() -- PHP 4 style constructor (ZE1)

Description

Important: $user_file, $system_file and $options parameters are available since version 1.7.0RC1, allowing to define more easily the PEAR configuration files, and choose what information to display akin to PHP's phpinfo().

Parameter

string $pear_dir

(optional) The PEAR base install directory

string $user_file

(optional) file to read PEAR user-defined options from

string $system_file

(optional) file to read PEAR system-wide defaults from

array $options

(optional) configure PEAR information output

Throws

throws no exceptions thrown

Since

since version 1.0.1 (2003-04-24)

Note

This function can not be called statically.

Example

<?php
require_once 'PEAR/Info.php';

// Display only PEAR version and logo, reference to config file, list of channels
// and quick list of packages (with only version info) installed thru channels
// pear, __uri, pecl.
$options = array('resume' =>  PEAR_INFO_GENERAL | PEAR_INFO_CHANNELS | PEAR_INFO_PACKAGES_VERSION,
    'channels' => array('pear.php.net', '__uri', 'pecl.php_net')
);

// Give PEAR install directory where to find pear.ini or pearsys.ini files
$info = new PEAR_Info('c:\wamp\php', '', '', $options);

$info->display();

?>

PEAR_Info::display()

PEAR_Info::display() -- Displays PEAR_Info output

Description

Displays PEAR_Info output depending of style applied (style sheet).

Throws

throws no exceptions thrown

Since

since version 1.7.0RC1 (2007-07-01)

Note

This function can not be called statically.

PEAR_Info::getMembers()

PEAR_Info::getMembers()  -- Returns a members list depending of its category (group, docs, website)

Description

Retrieve the members list of PEAR group, PEAR doc team, or PEAR website team

Parameter

string $group

(optional) Member list category. Either president, group, docs or website

boolean $sort

(optional) Return a member list sorted in alphabetic order

Throws

throws no exceptions thrown

Since

since version 1.7.0RC3 (2007-07-10)

Note

This function can not be called statically.

PEAR_Info::getStyleSheet()

PEAR_Info::getStyleSheet() -- Returns the custom style sheet to use for presentation

Description

Default behavior is to return css string contents. Sets $content parameter to FALSE will return css filename reference (defined by setStyleSheet function). Easy for a <link rel="stylesheet" type="text/css" href="" /> html tag integration (see example below).

Parameter

boolean $content

(optional) Either return css filename or string contents

Throws

throws no exceptions thrown

Since

since version 1.7.0RC1 (2007-07-01)

Note

This function can not be called statically.

Return value

string - returns css filename or css string contents

Example

<?php
// require the PEAR_Info file
require_once 'PEAR/Info.php';

class PEAR_Info3 extends PEAR_Info
{
    function PEAR_Info3($pear_dir = '', $user_file = '', $system_file = '')
    {
        $this->__construct($pear_dir, $user_file, $system_file);
    }

    function toHtml()
    {
        $styles = basename($this->getStyleSheet(false));

        $body = $this->info;

        $html = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
<meta name="author" content="Laurent Laville" />
<title>My PEAR_Info()</title>
<link rel="stylesheet" type="text/css" href="$styles" />
</head>
<body>

<div id="header">
<h1>Laurent-Laville.org</h1>
</div>

<div id="footer">
</div>

<div id="contents">
$body
</div>

</body>
</html>
HTML;
        return $html;
    }
}

// Create PEAR_Info object
$info = new PEAR_Info3();

// set your own styles, rather than use the default stylesheet
$info->setStyleSheet(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'pearinfo3.css');

// Display PEAR_Info output
$info->display();
?>

PEAR_Info::packageInstalled()

PEAR_Info::packageInstalled() -- Check if a package is installed

Description

Simple function to check if a package is installed under user or system PEAR installation. Minimal version and channel info are supported.

Parameter

string $name

Package name

string $version

(optional) The minimal version that should be installed

string $channel

(optional) The package channel distribution

string $user_file

(optional) file to read PEAR user-defined options from

string $system_file

(optional) file to read PEAR system-wide defaults from

Since

since version 1.6.0 (2005-01-03)

Throws

throws no exceptions thrown

Note

This function should be called statically.

Example

<?php
require_once 'PEAR/Info.php';

$res = PEAR_Info::packageInstalled('Role_Web', '1.1.0', 'pearified');
if ($res) {
    print "Package pearified/Role_Web 1.1.0 or greater is installed \n";
} else {
    print "Package pearified/Role_Web is not yet installed \n";
}

$res = PEAR_Info::packageInstalled('PEAR_PackageFileManager');
if ($res) {
    print "Package pear/PEAR_PackageFileManager is installed \n";
} else {
    print "Package pear/PEAR_PackageFileManager is not yet installed \n";
}
?>

PEAR_Info::pearImage()

PEAR_Info::pearImage()  -- Display the PEAR logo

Description

Display the PEAR logo (gif image) on browser output

Throws

throws no exceptions thrown

Since

since version 1.0.1 (2003-04-24)

Note

This function can not be called statically.

PEAR_Info::setProxy()

PEAR_Info::setProxy() -- Sets PEAR HTTP Proxy Server Address

Description

Sets http_proxy config setting at runtime.

Note: Since version 1.7.0RC1, it become unnecessary, unless you don't want to use the http_proxy config setting of your PEAR config file.

Parameter

string $proxy

PEAR HTTP Proxy Server Address

Since

since version 1.0.6 (2003-05-11)

Throws

throws no exceptions thrown

Note

This function should be called statically.

Return value

boolean - TRUE if the http proxy server address was set successfully, FALSE otherwise.

PEAR_Info::setStyleSheet()

PEAR_Info::setStyleSheet() -- Sets the custom style sheet to use your own styles

Description

Sets the custom style sheet (colors, sizes) to applied to PEAR_Info output. If you don't give any parameter, you'll then apply again the default style.

Parameter

string $css

(optional) File to read user-defined styles from

Throws

throws no exceptions thrown

Since

since version 1.7.0RC1 (2007-07-01)

Note

This function can not be called statically.

Tip: If you don't want to have any style applied, then build an empty style sheet (css file) and give it as function parameter (See example below).

Return value

boolean - TRUE if custom styles, FALSE if default styles applied.

Example

<?php
// require the PEAR_Info file
require_once 'PEAR/Info.php';

// Create PEAR_Info object
$info = new PEAR_Info();

// set your own styles, rather than use the default stylesheet
$info->setStyleSheet(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'blueskin.css');

// don't use any style (empty.css is an empty file)
//$info->setStyleSheet(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'empty.css');

// Display PEAR_Info output
$info->display();
?>

PEAR_Info::show()

PEAR_Info::show() -- Shows PEAR_Info output

Description

Displays PEAR_Info output depending of style applied (style sheet).

Deprecated

deprecated use display() instead

Throws

throws no exceptions thrown

Since

since version 1.0.1 (2003-04-24)

Note

This function can not be called statically.

PEAR_Info::toHtml()

PEAR_Info::toHtml() -- Returns PEAR_Info output (html code)

Description

Returns html code. This code is XHTML 1.1 compliant since version 1.7.0

Throws

throws no exceptions thrown

Since

since version 1.7.0RC1 (2007-07-01)

Note

This function can not be called statically.


PEAR_PackageFileManager

Table of Contents
Class Summary PEAR_PackageFileManager -- PEAR :: PackageFileManager updates the <filelist></filelist> section of a PEAR package.xml file to reflect the current files in preparation for a release.
constructor PEAR_PackageFileManager::PEAR_PackageFileManager() -- Does nothing, use setOptions
PEAR_PackageFileManager::addConfigureOption() -- Add an install-time configuration option for building of source
PEAR_PackageFileManager::addDependency() -- Add a dependency on another package, or an extension/php
PEAR_PackageFileManager::addMaintainer() -- Add a maintainer to the list of maintainers.
PEAR_PackageFileManager::addPlatformException() -- Add an install-time platform conditional install for a file
PEAR_PackageFileManager::addGlobalReplacement() -- Add a replacement option for all files
PEAR_PackageFileManager::addReplacement() -- Add a replacement option for a file
PEAR_PackageFileManager::addRole() -- Add an extension/role mapping to the role mapping option
PEAR_PackageFileManager::detectDependencies() -- use PHP_CompatInfo to auto-detect PHP and extension dependencies.
PEAR_PackageFileManager::debugPackageFile() -- ALWAYS use this to test output before overwriting your package.xml!!
PEAR_PackageFileManager::getWarnings() -- Retrieve the list of warnings
PEAR_PackageFileManager::isIncludeable() -- calls http://www.php.net/file_exists for each value in include_path,
PEAR_PackageFileManager::pushWarning() -- Store a warning on the warning stack
PEAR_PackageFileManager::raiseError() -- Utility function to shorten error generation code
PEAR_PackageFileManager::setOptions() -- Set package.xml generation options
PEAR_PackageFileManager::writePackageFile() -- Writes the package.xml file out with the newly created <release></release> tag
Class Summary PEAR_PackageFileManager_CVS -- Generate a file list from a CVS checkout
PEAR_PackageFileManager_CVS::dirList() -- Return a list of all files in the CVS repository
Class Summary PEAR_PackageFileManager_File -- Retrieve the files from a directory listing
constructor PEAR_PackageFileManager_File::PEAR_PackageFileManager_File() -- Set up the File filelist generator
PEAR_PackageFileManager_File::dirList() -- Retrieve a listing of every file in $directory and all subdirectories.
PEAR_PackageFileManager_File::getFileList() -- Generate the <filelist></filelist> section of the package file.
Class Summary PEAR_PackageFileManager_XMLOutput -- Class for XML output
Package PEAR_PackageFileManager Constants -- Constants defined in and used by PEAR_PackageFileManager
Package PEAR_PackageFileManager Global Variables -- Global Variables defined in and used by PEAR_PackageFileManager

Class Summary PEAR_PackageFileManager

Class Summary PEAR_PackageFileManager -- PEAR :: PackageFileManager updates the <filelist></filelist> section of a PEAR package.xml file to reflect the current files in preparation for a release.

PEAR :: PackageFileManager updates the <filelist></filelist> section of a PEAR package.xml file to reflect the current files in preparation for a release.

The PEAR_PackageFileManager class uses a plugin system to generate the list of files in a package. This allows both standard recursive directory parsing (plugin type file) and more intelligent options such as the CVS browser PEAR_PackageFileManager_Cvs, which grabs all files in a local CVS checkout to create the list, ignoring any other local files.

Other options include specifying roles for file extensions (all .php files are role="php", for example), roles for directories (all directories named "tests" are given role="tests" by default), and exceptions. Exceptions are specific pathnames with * and ? wildcards that match a default role, but should have another. For example, perhaps a debug.tpl template would normally be data, but should be included in the docs role. Along these lines, to exclude files entirely, use the ignore option.

Required options for a release include version, baseinstalldir, state, and packagedirectory (the full path to the local location of the package to create a package.xml file for)

Example usage:
1      <?php
2      require_once('PEAR/PackageFileManager.php');
3      $packagexml = new PEAR_PackageFileManager;
4      $e = $packagexml->setOptions(
5      array('baseinstalldir' => 'PhpDocumentor',
6       'version' => '1.2.1',
7       'packagedirectory' => 'C:/Web Pages/chiara/phpdoc2/',
8       'state' => 'stable',
9       'filelistgenerator' => 'cvs', // generate from cvs, use file for directory
10      'notes' => 'We\'ve implemented many new and exciting features',
11      'ignore' => array('TODO', 'tests/'), // ignore TODO, all files in tests/
12      'installexceptions' => array('phpdoc' => '/*'), // baseinstalldir ="/" for phpdoc
13      'dir_roles' => array('tutorials' => 'doc'),
14      'exceptions' => array('README' => 'doc', // README would be data, now is doc
15                            'PHPLICENSE.txt' => 'doc'))); // same for the license
16     if (PEAR::isError($e)) {
17         echo $e->getMessage();
18         die();
19     }
20     $e = $test->addPlatformException('pear-phpdoc.bat', 'windows');
21     if (PEAR::isError($e)) {
22         echo $e->getMessage();
23         exit;
24     }
25     $packagexml->addRole('pkg', 'doc'); // add a new role mapping
26     if (PEAR::isError($e)) {
27         echo $e->getMessage();
28         exit;
29     }
30     // replace @PHP-BIN@ in this file with the path to php executable!  pretty neat
31     $e = $test->addReplacement('pear-phpdoc', 'pear-config', '@PHP-BIN@', 'php_bin');
32     if (PEAR::isError($e)) {
33         echo $e->getMessage();
34         exit;
35     }
36     $e = $test->addReplacement('pear-phpdoc.bat', 'pear-config', '@PHP-BIN@', 'php_bin');
37     if (PEAR::isError($e)) {
38         echo $e->getMessage();
39         exit;
40     }
41     // note use of debugPackageFile() - this is VERY important
42     if (isset($_GET['make']) || $_SERVER['argv'][1] == 'make') {
43         $e = $packagexml->writePackageFile();
44     } else {
45         $e = $packagexml->debugPackageFile();
46     }
47     if (PEAR::isError($e)) {
48         echo $e->getMessage();
49         die();
50     }
51     ?>

In addition, a package.xml file can now be generated from scratch, with the usage of new options package, summary, description, and the use of the addMaintainer() method

Class Trees for PEAR_PackageFileManager

  • PEAR_PackageFileManager

constructor PEAR_PackageFileManager::PEAR_PackageFileManager()

constructor PEAR_PackageFileManager::PEAR_PackageFileManager() -- Does nothing, use setOptions

Description

The constructor is not used in order to be able to return a PEAR_Error from setOptions

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFileManager::addConfigureOption()

PEAR_PackageFileManager::addConfigureOption() -- Add an install-time configuration option for building of source

Description

This option is only useful to PECL projects that are built upon installation

Parameter

string $name

name of the option

string $prompt

prompt to display to the user

string $default

default value

Throws

throws PEAR_PACKAGEFILEMANAGER_RUN_SETOPTIONS

Note

This function can not be called statically.

PEAR_PackageFileManager::addDependency()

PEAR_PackageFileManager::addDependency() -- Add a dependency on another package, or an extension/php

Description

This will overwrite an existing dependency if it is found. In other words, if a dependency on PHP 4.1.0 exists, and addDependency('php', '4.3.0', 'ge', 'php') is called, the existing dependency on PHP 4.1.0 will be overwritten with the new one on PHP 4.3.0

Parameter

string $name

Dependency element name

string $version

Dependency version

string $operator

A specific operator for the version, this can be one of: 'has', 'not', 'lt', 'le', 'eq', 'ne', 'ge', or 'gt'

string $type

Dependency type. This can be one of: 'pkg', 'ext', 'php', 'prog', 'os', 'sapi', or 'zend'

boolean $optional

TRUE if dependency is optional

Throws

throws PEAR_PACKAGEFILEMANAGER_RUN_SETOPTIONS

throws PEAR_PACKAGEFILEMANAGER_PHP_NOT_PACKAGE

Note

This function can not be called statically.

PEAR_PackageFileManager::addMaintainer()

PEAR_PackageFileManager::addMaintainer() -- Add a maintainer to the list of maintainers.

Description

Every maintainer must have a valid account at pear.php.net. The first parameter is the account name (for instance, cellog is the handle for Greg Beaver at pear.php.net). Every maintainer has one of four possible roles:

  • lead: the primary maintainer

  • developer: an important developer on the project

  • contributor: self-explanatory

  • helper: ditto

Finally, specify the name and email of the maintainer

Parameter

string $handle

username on pear.php.net of maintainer

lead|developer|contributor|helper $role

role of maintainer

string $name

full name of maintainer

string $email

email address of maintainer

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFileManager::addPlatformException()

PEAR_PackageFileManager::addPlatformException() -- Add an install-time platform conditional install for a file

Description

The format of the platform string must be OS-version-cpu-extra if any more specific information is needed, and the OS must be in lower case as in "windows." The match is performed using a regular expression, but uses * and ? wildcards instead of .* and .?. Note that hpux/aix/irix/linux are all exclusive. To select non-windows, use an expression like (*ix|*ux|darwin). If using PEAR 1.3.2 and newer, use !windows.

This information is based on eyeing the source for OS/Guess.php, so if you are unsure of what to do, read that file.

Parameter

string $path

relative path of file (relative to packagedirectory option)

string $platform

platform descriptor string

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFileManager::addGlobalReplacement()

PEAR_PackageFileManager::addGlobalReplacement() -- Add a replacement option for all files

Description

This sets an install-time complex search-and-replace function allowing the setting of platform-specific variables in all installed files.

if $type is php-const, then $to must be the name of a PHP Constant. If $type is pear-config, then $to must be the name of a PEAR config variable accessible through a PEAR_Config::get() method. If type is package-info, then $to must be the name of a section from the package.xml file used to install this file.

Parameter

string $type

variable type, either php-const, pear-config or package-info

string $from

text to replace in the source file

string $to

variable name to use for replacement

Throws

throws PEAR_PACKAGEFILEMANAGER_INVALID_REPLACETYPE

Note

This function can not be called statically.

PEAR_PackageFileManager::addReplacement()

PEAR_PackageFileManager::addReplacement() -- Add a replacement option for a file

Description

This sets an install-time complex search-and-replace function allowing the setting of platform-specific variables in an installed file.

if $type is php-const, then $to must be the name of a PHP Constant. If $type is pear-config, then $to must be the name of a PEAR config variable accessible through a PEAR_Config::get() method. If type is package-info, then $to must be the name of a section from the package.xml file used to install this file.

Parameter

string $path

relative path of file (relative to packagedirectory option)

string $type

variable type, either php-const, pear-config or package-info

string $from

text to replace in the source file

string $to

variable name to use for replacement

Throws

throws PEAR_PACKAGEFILEMANAGER_INVALID_REPLACETYPE

Note

This function can not be called statically.

PEAR_PackageFileManager::addRole()

PEAR_PackageFileManager::addRole() -- Add an extension/role mapping to the role mapping option

Description

Roles influence both where a file is installed and how it is installed. Files with role="data" are in a completely different directory hierarchy from the program files of role="php"

In PEAR 1.3b2, these roles are

  • php (most common)

  • data

  • doc

  • test

  • script (gives the file an executable attribute)

  • src

Parameter

string $extension

file extension

string $role

role

Throws

throws PEAR_PACKAGEFILEMANAGER_INVALID_ROLE

Note

This function can not be called statically.

PEAR_PackageFileManager::detectDependencies()

PEAR_PackageFileManager::detectDependencies() -- use PHP_CompatInfo to auto-detect PHP and extension dependencies.

Description

Use addDependency() to add package dependencies

Throws

throws PEAR_PACKAGEFILEMANAGER_RUN_SETOPTIONS

throws PEAR_PACKAGEFILEMANAGER_PHP_COMPAT_NOT_INSTALLED

throws PEAR_PACKAGEFILEMANAGER_NO_PHPCOMPATINFO

Note

This function can not be called statically.

PEAR_PackageFileManager::debugPackageFile()

PEAR_PackageFileManager::debugPackageFile() -- ALWAYS use this to test output before overwriting your package.xml!!

Description

This method instructs writePackageFile() to simply print the package.xml to output, either command-line or web-friendly (this is automatic based on the existence of $_SERVER['PATH_TRANSLATED']

Throws

throws no exceptions thrown

See

see PEAR_PackageFileManager::writePackageFile() - calls with the debug parameter set based on whether it is called from the command-line or web interface

Note

This function can not be called statically.

PEAR_PackageFileManager::getWarnings()

PEAR_PackageFileManager::getWarnings() -- Retrieve the list of warnings

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFileManager::isIncludeable()

PEAR_PackageFileManager::isIncludeable() -- calls http://www.php.net/file_exists for each value in include_path,

Description

then calls http://www.php.net/is_readable when it finds the file

Parameter

string $filename

Throws

throws no exceptions thrown

static

static

Note

This function can not be called statically.

PEAR_PackageFileManager::pushWarning()

PEAR_PackageFileManager::pushWarning() -- Store a warning on the warning stack

Description

This package is not documented yet.

Parameter

mixed $code

mixed $info

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFileManager::raiseError()

PEAR_PackageFileManager::raiseError() -- Utility function to shorten error generation code

Description

1     function raiseError($code, $i1 = '', $i2 = '')
2         {
3             return PEAR::raiseError('PEAR_PackageFileManager Error: ' .
4                         sprintf($GLOBALS['_PEAR_PACKAGEFILEMANAGER_ERRORS'][$this->_options['lang']][$code],
5                         $i1, $i2), $code);
6         }

Parameter

mixed $code

mixed $i1

mixed $i2

Throws

throws no exceptions thrown

static

static

Note

This function can not be called statically.

PEAR_PackageFileManager::setOptions()

PEAR_PackageFileManager::setOptions() -- Set package.xml generation options

Description

The options array is indexed as follows:
1      $options = array('option_name' => <optionvalue>);

The documentation below simplifies this description through the use of option_name without quotes

Configuration options:

  • lang: lang controls the language in which error messages are displayed. There are currently only English error messages, but any contributed will be added over time. Possible values: en (default)

  • packagefile: the name of the packagefile, defaults to package.xml

  • pathtopackagefile: the path to an existing package file to read in, if different from the packagedirectory

  • packagedirectory: the path to the base directory of the package. For package PEAR_PackageFileManager, this path is /path/to/pearcvs/pear/PEAR_PackageFileManager where /path/to/pearcvs is a local path on your hard drive

  • outputdirectory: the path in which to place the generated package.xml by default, this is ignored, and the package.xml is created in the packagedirectory

  • filelistgenerator: the <filelist> section plugin which will be used. In this release, there are two generator plugins, file and cvs. For details, see the docs for these plugins

  • usergeneratordir: For advanced users. If you write your own filelist generator plugin, use this option to tell PEAR_PackageFileManager where to find the file that contains it. If the plugin is named foo, the class must be named PEAR_PackageFileManager_Foo no matter where it is located. By default, the Foo plugin is located in PEAR/PackageFileManager/Foo.php. If you pass /path/to/foo in this option, setOptions will look for PEAR_PackageFileManager_Foo in /path/to/foo/Foo.php

  • doctype: Specifies the DTD of the package.xml file. Default is http://pear.php.net/dtd/package-1.0

  • pearcommonclass: Specifies the name of the class to instantiate, default is PEAR_Common, but users can override this with a custom class that implements PEAR_Common's method interface

  • changelogoldtonew: True if the ChangeLog should list from oldest entry to newest. Set to false if you would like new entries first

  • simpleoutput: True if the package.xml should not contain md5sum or <provides /> for readability

  • addhiddenfiles: True if you wish to add hidden files/directories that begin with . like .bashrc. This is only used by the File generator. The CVS generator will use all files in CVS regardless of format

package.xml simple options:

  • baseinstalldir: The base directory to install this package in. For package PEAR_PackageFileManager, this is "PEAR", for package PEAR, this is "/"

  • license: The license this release is released under. Default is PHP License if left unspecified

  • notes: Release notes, any text describing what makes this release unique

  • changelognotes: notes for the changelog, this should be more detailed than the release notes. By default, PEAR_PackageFileManager uses the notes option for the changelog as well

  • version: The version number for this release. Remember the convention for numbering: initial alpha is between 0 and 1, add b<beta number> for beta as in 1.0b1, the integer portion of the version should specify backwards compatibility, as in 1.1 is backwards compatible with 1.0, but 2.0 is not backwards compatible with 1.10. Also note that 1.10 is a greater release version than 1.1 (think of it as "one point ten" and "one point one"). Bugfix releases should be a third decimal as in 1.0.1, 1.0.2

  • package: [optional] Package name. Use this to create a new package.xml, or overwrite an existing one from another package used as a template

  • summary: [optional] Summary of package purpose

  • description: [optional] Description of package purpose. Note that the above three options are not optional when creating a new package.xml from scratch

WARNING: all complex options that require a file path are case-sensitive

package.xml complex options:

  • cleardependencies: since version 1.3.0, this option will erase any existing dependencies in the package.xml if set to true

  • ignore: an array of filenames, directory names, or wildcard expressions specifying files to exclude entirely from the package.xml. Wildcards are operating system wildcards * and ?. file*foo.php will exclude filefoo.php, fileabrfoo.php and filewho_is_thisfoo.php. file?foo.php will exclude fileafoo.php and will not exclude fileaafoo.php. test/ will exclude all directories and subdirectories of ANY directory named test encountered in directory parsing. *test* will exclude all files and directories that contain test in their name

  • include: an array of filenames, directory names, or wildcard expressions specifying files to include in the listing. All other files will be ignored. Wildcards are in the same format as ignore

  • roles: this is an array mapping file extension to install role. This specifies default behavior that can be overridden by the exceptions option and dir_roles option. use addRole() to add a new role to the pre-existing array

  • dir_roles: this is an array mapping directory name to install role. All files in a directory whose name matches the directory will be given the install role specified. Single files can be excluded from this using the exceptions option. The directory should be a relative path from the baseinstalldir, or "/" for the baseinstalldir

  • exceptions: specify file role for specific files. This array maps all files matching the exact name of a file to a role as in "file.ext" => "role"

  • deps: dependency array. Pass in an empty array to clear all dependencies, and use addDependency() to add new ones/replace existing ones

  • maintainers: maintainers array. Pass in an empty array to clear all maintainers, and use addMaintainer() to add a new maintainer/replace existing maintainer

  • installexceptions: array mapping of specific filenames to baseinstalldir values. Use this to force the installation of a file into another directory, such as forcing a script to be in the root scripts directory so that it will be in the path. The filename must be a relative path to the packagedirectory

  • platformexceptions: array mapping of specific filenames to the platform they should be installed on. Use this to specify unix-only files or windows-only files. The format of the platform string must be OS-version-cpu-extra if any more specific information is needed, and the OS must be in lower case as in "windows." The match is performed using a regular expression, but uses * and ? wildcards instead of .* and .?. Note that hpux/aix/irix/linux are all exclusive. To select non-windows, use (*ix|*ux)

  • scriptphaseexceptions: array mapping of scripts to their install phase. This can be one of: pre-install, post-install, pre-uninstall, post-uninstall, pre-build, post-build, pre-setup, or post-setup

  • installas: array mapping of specific filenames to the filename they should be installed as. Use this to specify new filenames for files that should be installed. This will often be used in conjunction with platformexceptions if there are two files for different OSes that must have the same name when installed.

  • replacements: array mapping of specific filenames to complex text search-and-replace that should be performed upon install. The format is: filename => array('type' => php-const|pear-config|package-info 'from' => text in file 'to' => name of variable) if type is php-const, then 'to' must be the name of a PHP Constant. If type is pear-config, then 'to' must be the name of a PEAR config variable accessible through a PEAR_Config class->get() method. If type is package-info, then 'to' must be the name of a section from the package.xml file used to install this file.

  • globalreplacements: a list of replacements that should be performed on every single file. The format is the same as replacements (since 1.4.0)

  • configure_options: array specifies build options for PECL packages (you should probably use PECL_Gen instead, but it's here for completeness)

Parameter

array $options

Throws

throws PEAR_PACKAGEFILEMANAGER_NOPKGDIR

throws PEAR_PACKAGEFILEMANAGER_NOVERSION

throws PEAR_PACKAGEFILEMANAGER_NOSTATE

throws PEAR_PACKAGEFILEMANAGER_NOBASEDIR

throws PEAR_PACKAGEFILEMANAGER_GENERATOR_NOTFOUND_ANYWHERE

throws PEAR_PACKAGEFILEMANAGER_GENERATOR_NOTFOUND

Note

This function can not be called statically.

PEAR_PackageFileManager::writePackageFile()

PEAR_PackageFileManager::writePackageFile() -- Writes the package.xml file out with the newly created <release></release> tag

Description

ALWAYS use debugPackageFile() to verify that output is correct before overwriting your package.xml

Parameter

boolean $debuginterface

NULL if no debugging, TRUE if web interface, FALSE if command-line

Throws

throws PEAR_PACKAGEFILEMANAGER_RUN_SETOPTIONS

throws PEAR_PACKAGEFILEMANAGER_ADD_MAINTAINERS

throws PEAR_PACKAGEFILEMANAGER_CANTWRITE_PKGFILE

throws PEAR_PACKAGEFILEMANAGER_CANTOPEN_TMPPKGFILE

throws PEAR_PACKAGEFILEMANAGER_CANTCOPY_PKGFILE

throws PEAR_PACKAGEFILEMANAGER_DEST_UNWRITABLE

See

see PEAR_PackageFileManager::debugPackageFile() - calls with the debug parameter set based on whether it is called from the command-line or web interface

Note

This function can not be called statically.

Class Summary PEAR_PackageFileManager_CVS

Class Summary PEAR_PackageFileManager_CVS -- Generate a file list from a CVS checkout

Generate a file list from a CVS checkout

Note that this will NOT work on a repository, only on a checked out CVS module

Class Trees for PEAR_PackageFileManager_CVS

PEAR_PackageFileManager_CVS Inherited Methods

Table 55-1. Inherited from PEAR_PackageFileManager_File

Method NameSummary
Constructor PEAR_PackageFileManager_File::PEAR_PackageFileManager_File()Set up the File filelist generator
PEAR_PackageFileManager_File::dirList()Retrieve a listing of every file in $directory and all subdirectories.
PEAR_PackageFileManager_File::getFileList()Generate the <filelist></filelist> section of the package file.

PEAR_PackageFileManager_CVS::dirList()

PEAR_PackageFileManager_CVS::dirList() -- Return a list of all files in the CVS repository

Description

This function is like parent::dirList() except that instead of retrieving a regular filelist, it first retrieves a listing of all the CVS/Entries files in $directory and all of the subdirectories. Then, it reads the Entries file, and creates a listing of files that are a part of the CVS repository. No check is made to see if they have been modified, but newly added or removed files are ignored.

Parameter

string $directory

full path to the directory you want the list of

Return value

returns list of files in a directory

Throws

throws no exceptions thrown

See

see _readCVSEntries()

see _recurDirList()

Note

This function can not be called statically.

Class Summary PEAR_PackageFileManager_File

Class Summary PEAR_PackageFileManager_File -- Retrieve the files from a directory listing

Retrieve the files from a directory listing

This class is used to retrieve a raw directory listing. Use the PEAR_PackageFileManager_CVS class to only retrieve the contents of a cvs repository when generating the package.xml

constructor PEAR_PackageFileManager_File::PEAR_PackageFileManager_File()

constructor PEAR_PackageFileManager_File::PEAR_PackageFileManager_File() -- Set up the File filelist generator

Description

'ignore' and 'include' are the only options that this class uses. See PEAR_PackageFileManager::setOptions() for more information and formatting of this option

Parameter

PEAR_PackageFileManager &$parent

array $options

Throws

throws no exceptions thrown

Note

This function can not be called statically.

PEAR_PackageFileManager_File::dirList()

PEAR_PackageFileManager_File::dirList() -- Retrieve a listing of every file in $directory and all subdirectories.

Description

The return format is an array of full paths to files

Parameter

string $directory

full path to the directory you want the list of

Return value

returns list of files in a directory

Throws

throws PEAR_PACKAGEFILEMANAGER_DIR_DOESNT_EXIST

Note

This function can not be called statically.

PEAR_PackageFileManager_File::getFileList()

PEAR_PackageFileManager_File::getFileList() -- Generate the <filelist></filelist> section of the package file.

Description

This function performs the backend generation of the array containing all files in this package

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Class Summary PEAR_PackageFileManager_XMLOutput

Class Summary PEAR_PackageFileManager_XMLOutput -- Class for XML output

Class for XML output

This package is not documented yet.

Class Trees for PEAR_PackageFileManager_XMLOutput

  • PEAR_Common

    • PEAR_PackageFileManager_XMLOutput

Package PEAR_PackageFileManager Constants

Package PEAR_PackageFileManager Constants -- Constants defined in and used by PEAR_PackageFileManager

Package PEAR_PackageFileManager Global Variables

Package PEAR_PackageFileManager Global Variables -- Global Variables defined in and used by PEAR_PackageFileManager

All Global Variables

Global Variables defined in PackageFileManager.php

Table 55-1. Global Variables defined in PackageFileManager.php

NameValueLine Number
$GLOBALS['_PEAR_PACKAGEFILEMANAGER_ERRORS']
1     array(
2         'en' =>
3         array(
4             PEAR_PACKAGEFILEMANAGER_NOSTATE =>
5                 'Release State (option \'state\') must by specified in PEAR_PackageFileManager setOptions (alpha|beta|stable)',
6             PEAR_PACKAGEFILEMANAGER_NOVERSION =>
7                 'Release Version (option \'version\') must be specified in PEAR_PackageFileManager setOptions',
8             PEAR_PACKAGEFILEMANAGER_NOPKGDIR =>
9                 'Package source base directory (option \'packagedirectory\') must be ' .
10                'specified in PEAR_PackageFileManager setOptions',
11            PEAR_PACKAGEFILEMANAGER_NOBASEDIR =>
12                'Package install base directory (option \'baseinstalldir\') must be ' .
13                'specified in PEAR_PackageFileManager setOptions',
14            PEAR_PACKAGEFILEMANAGER_GENERATOR_NOTFOUND =>
15                'Base class "%s" can\'t be located',
16            PEAR_PACKAGEFILEMANAGER_GENERATOR_NOTFOUND_ANYWHERE =>
17                'Base class "%s" can\'t be located in default or user-specified directories',
18            PEAR_PACKAGEFILEMANAGER_CANTWRITE_PKGFILE =>
19                'Failed to write package.xml file to destination directory',
20            PEAR_PACKAGEFILEMANAGER_DEST_UNWRITABLE =>
21                'Destination directory "%s" is unwritable',
22            PEAR_PACKAGEFILEMANAGER_CANTCOPY_PKGFILE =>
23                'Failed to copy package.xml.tmp file to package.xml',
24            PEAR_PACKAGEFILEMANAGER_CANTOPEN_TMPPKGFILE =>
25                'Failed to open temporary file "%s" for writing',
26            PEAR_PACKAGEFILEMANAGER_PATH_DOESNT_EXIST =>
27                'package.xml file path "%s" doesn\'t exist or isn\'t a directory',
28            PEAR_PACKAGEFILEMANAGER_NOCVSENTRIES =>
29                'Directory "%s" is not a CVS directory (it must have the CVS/Entries file)',
30            PEAR_PACKAGEFILEMANAGER_DIR_DOESNT_EXIST =>
31                'Package source base directory "%s" doesn\'t exist or isn\'t a directory',
32            PEAR_PACKAGEFILEMANAGER_RUN_SETOPTIONS =>
33                'Run $managerclass->setOptions() before any other methods',
34            PEAR_PACKAGEFILEMANAGER_NOPACKAGE =>
35                'Package Name (option \'package\') must by specified in PEAR_PackageFileManager '.
36                'setOptions to create a new package.xml',
37            PEAR_PACKAGEFILEMANAGER_NOSUMMARY =>
38                'Package Summary (option \'summary\') must by specified in PEAR_PackageFileManager' .
39                ' setOptions to create a new package.xml',
40            PEAR_PACKAGEFILEMANAGER_NODESC =>
41                'Detailed Package Description (option \'description\') must be' .
42                ' specified in PEAR_PackageFileManager setOptions to create a new package.xml',
43            PEAR_PACKAGEFILEMANAGER_WRONG_MROLE =>
44                'Maintainer role must be one of "%s", was "%s"',
45            PEAR_PACKAGEFILEMANAGER_ADD_MAINTAINERS =>
46                'Add maintainers to a package before generating the package.xml',
47            PEAR_PACKAGEFILEMANAGER_NO_FILES =>
48                'No files found, check the path "%s"',
49            PEAR_PACKAGEFILEMANAGER_IGNORED_EVERYTHING =>
50                'No files left, check the path "%s" and ignore option "%s"',
51            PEAR_PACKAGEFILEMANAGER_INVALID_PACKAGE =>
52                'Package validation failed:%s%s',
53            PEAR_PACKAGEFILEMANAGER_INVALID_REPLACETYPE =>
54                'Replacement Type must be one of "%s", was passed "%s"',
55            PEAR_PACKAGEFILEMANAGER_INVALID_ROLE =>
56                'Invalid file role passed to addRole, must be one of "%s", was passed "%s"',
57            PEAR_PACKAGEFILEMANAGER_PHP_NOT_PACKAGE =>
58                'addDependency had PHP as a package, use type="php"',
59            PEAR_PACKAGEFILEMANAGER_CVS_PACKAGED =>
60                'path "%path%" contains CVS directory',
61            ),)
63


PEAR_PackageUpdate

Table of Contents
Introduction to PEAR_PackageUpdate --  A package to make adding self updating functionality to other packages or applications easy.
PEAR_PackageUpdate::factory --  Factory method for creating PEAR_PackageUpdate frontend instances.
PEAR_PackageUpdate::isIncludable --  Determines whether or not a file is includable.
PEAR_PackageUpdate::loadPreferences --  Loads the user's preferences from the preference file.
PEAR_PackageUpdate::determinePrefFile --  Returns the path to the preferences file.
PEAR_PackageUpdate::checkUpdate --  Checks to see if an update is available and the user has asked not to be notified about the update.
PEAR_PackageUpdate::getPackageInfo --  Loads the latest package information from the channel server.
PEAR_PackageUpdate::getPackagePreferences --  Returns the update preferences for the current package.
PEAR_PackageUpdate::savePreferences --  Saves the user preferences to the preference file.
PEAR_PackageUpdate::preferencesAllowUpdate --  Checks whether or not the user's preferences allow an update to the latest version of the package.
PEAR_PackageUpdate::releaseType --  Returns the release type of the most recent version of the package compared to the installed version.
PEAR_PackageUpdate::getInstalledRelease --  Loads the latest package information from the current installation.
PEAR_PackageUpdate::getLatestRelease --  Loads the latest package information from the channel server.
PEAR_PackageUpdate::setDontAskAgain --  Sets the user's "Don't Ask Again" preference for the package.
PEAR_PackageUpdate::setDontAskUntilNextRelease --  Sets the user's "Don't Ask Again Until Next Release" preference for the package.
PEAR_PackageUpdate::setMinimumReleaseType --  Sets the user's preference for asking about release types.
PEAR_PackageUpdate::setMinimumState --  Sets the user's preference for asking about release states.
PEAR_PackageUpdate::setPreference --  Sets the given preference to the given value.
PEAR_PackageUpdate::setPreferences --  Sets all preferences at once.
PEAR_PackageUpdate::update --  Updates the source for the package.
PEAR_PackageUpdate::popError --  Pops an error off the error stack.
PEAR_PackageUpdate::hasErrors --  Returns whether or not errors have occurred (and been captured).

Introduction to PEAR_PackageUpdate

Introduction to PEAR_PackageUpdate --  A package to make adding self updating functionality to other packages or applications easy.

About PEAR::PackageUpdate

PEAR::PackageUpdate gives other packages or applications the ability to automatically keep themselves up-to-date by checking their channel server for the latest release and self-updating with the user's permission. Auto-update features help developers by reducing the number of different versions of a package which are currently used. This reduces the likely hood of bugs related to outdated versions being reported.

This package automates the update process but still allows the user to remain in control of their computer. PEAR::PackageUpdate respects a user's preferences and allows the user to decide not only if the package should be updated but also when to be alerted to new updates. The user can decide to only be notified when a new release has a certain state or release type (bug fix, feature enhancement, or major version). The user can even turn off the updating features. All of these settings are on a package-by-package basis.

PEAR::PackageUpdate is designed to be a backend for other packages which provide different interface types. For example, this package can be used to drive a PHP-GTK 2, CLI or HTML frontend.

Usage Example

<?php
class Foo {
    function __construct()
    {
        // Try to update the package if needed.
        require_once 'PEAR/PackageUpdate.php';
        // Load the PHP-GTK 2 driver to check for updates for pear://Foo
        $ppu = PEAR_PackageUpdate::factory('Gtk2', 'Foo', 'pear');

        // Check for trouble loading the driver.
        if ($ppu !== false) {

            // See if a new version is available (respects user prefs).
            if ($ppu->checkUpdate()) {

                // Ask for permission to update.
                if ($ppu->presentUpdate()) {

                    if ($ppu->update()) {

                        // The update was a success. The app must be
                        // restarted.
                        $ppu->forceRestart();
                    }
                }
            }
        }
        // ...
    }
    // ...
}
?>

How to check warnings and/or errors

Rather than stop on first error/warning encountered, as it's done by other PHP4 PEAR packages, PEAR::PackageUpdate used the PEAR_ErrorStack for advanced error handling.

PEAR_ErrorStack implements error raising and handling using a stack pattern. So, to determine whether there are any errors on the stack, you should use the PEAR_PackageUpdate::hasErrors(). And to retrieve each error/warning, one by one, from the stack, you have to use the PEAR_PackageUpdate::popError().

See example below:

Warning

Usage of error levels with PEAR_PackageUpdate::hasErrors() is only available since version 0.7.0

<?php
class Foo {
    function __construct()
    {
        // Try to update the package if needed.
        require_once 'PEAR/PackageUpdate.php';
        // Load the Cli driver to check for updates for pear://Foo
        $ppu = PEAR_PackageUpdate::factory('Cli', 'Foo', 'pear');

        // Check for trouble loading the driver.
        if ($ppu !== false) {

            // See if a new version is available (respects user prefs).
            if ($ppu->checkUpdate()) {

                // Ask for permission to update.
                if ($ppu->presentUpdate()) {

                    if ($ppu->update()) {

                        // The update was a success. The app must be
                        // restarted.
                        $ppu->forceRestart();
                    } else {
                        // Error handling
                        if ($ppu->hasErrors('warning')) {
                            // Warning: specifying error levels is only allowed since version 0.7.0
                            // Retrieve only first warning, not all
                            $error = $ppu->popError();
                            echo "Warning occured when trying to update: pear/Foo package\n";
                            echo "Message: " . $error['message'] ."\n";
                        }
                        if ($ppu->hasErrors()) {
                            // Retrieve only first error, not all
                            $error = $ppu->popError();
                            echo "Error occured when trying to update: pear/Foo package\n";
                            echo "Message: " . $error['message'] ."\n";
                            if (isset($error['context']) {
                                // context is available
                                echo "*** Context: ***\n";
                                echo "File: " . $error['context']['file'] ."\n";
                                echo "Line: " . $error['context']['line'] ."\n";
                                echo "Function: " . $error['context']['function'] ."\n";
                                echo "Class: " . $error['context']['class'] ."\n";
                            }
                            exit();
                        }
                    }
                }
            }
        }
        // ...
    }
    // ...
}
?>

PEAR_PackageUpdate::factory

PEAR_PackageUpdate::factory --  Factory method for creating PEAR_PackageUpdate frontend instances.

Description

Factory method for creating PEAR_PackageUpdate frontend instances.

Parameter

string $driver

The name of a frontend driver class. Must be one of Gtk2, Cli, or Web.

string $packageName

The name of the package to be updated. Example: PEAR_PackageFileManager_Web.

string $channel

The name of the channel $packageName is hosted on. This may be a fully qualified channel name such as pear.php.net or a short channel name like pear.

string $user_file

The path to the file to read PEAR user-defined options from.

string $system_file

The path to the file to read PEAR system-wide defaults from.

string $pref_file

The path to the file to read user's preferences from.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_NONEXISTENTDRIVER, when invalid driver name is used (i.e. Gtk2, Cli, Web).

Note

since 0.4.0a1

This function should be called statically.

Return value

mixed - reference to a new object or FALSE if the object could not be created (i.e. invalid driver name).

PEAR_PackageUpdate::isIncludable

PEAR_PackageUpdate::isIncludable --  Determines whether or not a file is includable.

Description

Determines whether or not a file is includable. This method is used to ensure that the driver class file can be found and included.

Parameter

string $path

The path to the file to check. The path should be a subdirectory of one of the directories in the include path.

Note

since 0.4.2

This function can be called statically.

Return value

boolean - TRUE if the file is includable, FALSE otherwise.

PEAR_PackageUpdate::loadPreferences

PEAR_PackageUpdate::loadPreferences --  Loads the user's preferences from the preference file.

Description

Loads the user's preferences from the preference file.

If the user is on a Windows machine, the file will be in the PEAR_CONFIG_SYSCONFIG directory and named ppurc.ini. If the user is on any other operating system, the preferences file will be stored in the user's home directory as the file .ppurc. The file contains a serialized array of preferences for each package that has been checked for updates so far.

Note: Since version 0.7.0, you could also choose another directory and name for your preference file. Use then the optional parameter $pref_file.

Parameter

string $pref_file

The path to the file to read user's preferences from.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_PREFFILE_READACCESS, when user's preference file has no READ access right.

throws PEAR_PACKAGEUPDATE_ERROR_PREFFILE_CORRUPTED, when user's preference file has invalid contents.

throws PEAR_PACKAGEUPDATE_ERROR_INVALIDINIFILE, when user's preference file given by parameter $pref_file does not exist.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the preferences were loaded successfully, FALSE otherwise.

PEAR_PackageUpdate::determinePrefFile

PEAR_PackageUpdate::determinePrefFile --  Returns the path to the preferences file.

Description

Returns the path to the preferences file.

The preferences file holds information about whether or not the user would like to be notified about updates for individual packages. If the user is on a Windows machine, the file will be in the PEAR_CONFIG_SYSCONFIG directory and named ppurc.ini. If the user is on any operating system, the preferences file will be stored in the user's home directory as the file .ppurc.

Note

since 0.4.0a1

This function can be called statically.

Return value

string - The full path to the preferences file.

PEAR_PackageUpdate::checkUpdate

PEAR_PackageUpdate::checkUpdate --  Checks to see if an update is available and the user has asked not to be notified about the update.

Description

Checks to see if an update is available and the user has asked not to be notified about the update.

This method takes the user's preferences in consideration when determining if an update is available. If a new bug fix release is available but the user has asked not to be notified until the next major release of the package, this method will return FALSE.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if an update is available and the user has asked to be notified about the update, FALSE otherwise.

PEAR_PackageUpdate::getPackageInfo

PEAR_PackageUpdate::getPackageInfo --  Loads the latest package information from the channel server.

Description

Loads the latest package information from the channel server.

This method contacts the packages channel server using a PEAR_Remote instance. If any errors are encountered (channel server does not host the package, bad package name, etc.) they will be pushed onto the error stack.

Note: Since version 0.5.2, protocol REST 1.0 is also supported. So we try to contact the packages channel server using a PEAR_REST instance, if this channel support the protocol, rather than default protocol XMLRPC.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_NOPACKAGE, if package name was set to empty.

throws PEAR_PACKAGEUPDATE_ERROR_NOCHANNEL, if channel was set to empty.

throws PEAR_PACKAGEUPDATE_ERROR_NOINFO, when there are no information available about the package name hosted on the channel server.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the information was retrieved successfully, FALSE otherwise. Errors will be pushed onto the error stack.

PEAR_PackageUpdate::getPackagePreferences

PEAR_PackageUpdate::getPackagePreferences --  Returns the update preferences for the current package.

Description

Returns an array of update preferences for the current package. This method is used to ensure that users are not asked about updates they do not want to be asked about.

The array returned may have up to four elements:

PEAR_PACKAGEUPDATE_PREF_NOUPDATES

if TRUE the user does not want to know about any new updates.

PEAR_PACKAGEUPDATE_PREF_NEXTRELEASE

if set, the user does not want to be asked until a version greater than the value of this element has been released.

PEAR_PACKAGEUPDATE_PREF_TYPE

if set, the user does not want to be notified unless the release is at least the given type (one of PEAR_PACKAGEUPDATE_TYPE_BUG, PEAR_PACKAGEUPDATE_TYPE_MINOR, PEAR_PACKAGEUPDATE_TYPE_MAJOR).

PEAR_PACKAGEUPDATE_PREF_STATE

if set, the user does not want to be notified unless the release has at least the given state (one of PEAR_PACKAGEUPDATE_PREF_STATE_DEVEL, PEAR_PACKAGEUPDATE_PREF_STATE_ALPHA, PEAR_PACKAGEUPDATE_PREF_STATE_BETA, PEAR_PACKAGEUPDATE_PREF_STATE_STABLE).

Note

since 0.4.0a1

This function can not be called statically.

Return value

array - an array of user preferences.

PEAR_PackageUpdate::savePreferences

PEAR_PackageUpdate::savePreferences --  Saves the user preferences to the preference file.

Description

Saves the user's preferences to the preference file.

Parameter

string $pref_file

The path to the file to save user's preferences to.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_PREFFILE_WRITEACCESS, when user's preference file has no WRITE access right.

throws PEAR_PACKAGEUPDATE_ERROR_PREFFILE_WRITEERROR, when an I/O error occured while writing user's preference file contents.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the user's preferences were saved successfully, FALSE othewise.

PEAR_PackageUpdate::preferencesAllowUpdate

PEAR_PackageUpdate::preferencesAllowUpdate --  Checks whether or not the user's preferences allow an update to the latest version of the package.

Description

Checks whether or not the user's preferences allow an update to the latest version of the package. The user's preferences may define restrictions such as: don't update at all, don't update until a new version has been released (remembers the last version asked), only ask for certain states such as beta or stable, only ask for minor or higher version updates (no bug fixes), or only ask for major version updates.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the user's preferences allow an update for the latest version of the package, FALSE otherwise.

PEAR_PackageUpdate::releaseType

PEAR_PackageUpdate::releaseType --  Returns the release type of the most recent version of the package compared to the installed version.

Description

Returns the release type of the most recent version of the package compared to the installed version. The result will be one of PEAR_PACKAGEUPDATE_TYPE_MAJOR, PEAR_PACKAGEUPDATE_TYPE_MINOR, or PEAR_PACKAGEUPDATE_TYPE_BUG.

This value is used to determine if the user's preferences allow an update for the current release.

Note

since 0.4.0a1

This function can not be called statically.

Return value

string - The release type (bug|minor|major).

PEAR_PackageUpdate::getInstalledRelease

PEAR_PackageUpdate::getInstalledRelease --  Loads the latest package information from the current installation.

Description

Loads the informations about current installed version of the package.

string version

The version of installed package name.

string license

The license this package is released under.

string summary

A short description about the package.

string description

A long description about the package.

string releasedate

The date of the release of the version installed.

string releasenotes

Description about changes on the package from previous release.

string state

The state of the package release installed (snapshot|devel|alpha|beta|stable).

array deps

The list of dependencies for this release of the package.

string xsdversion

The version of the XML package used to install this release (1.0 or 2.0).

string packagerversion

The version of the PEAR packager that was used to build this release.

Note

since 0.6.0

This function can not be called statically.

Return value

boolean - FALSE if the information was not available.

array - informations about the current installed version of the package (version, license, summary, description, releasedate, releasenotes, state, deps, xsdversion, packagerversion).

PEAR_PackageUpdate::getLatestRelease

PEAR_PackageUpdate::getLatestRelease --  Loads the latest package information from the channel server.

Description

Loads the informations from the channel server.

string license

The license the latest package version is released under.

string summary

A short description about the package.

string description

A long description about the package.

string releasedate

The date of the latest release available from the channel server.

string releasenotes

Description about changes on the package from previous release.

string state

The state of the package release installed (snapshot|devel|alpha|beta|stable).

array deps

The list of dependencies for this release of the package.

string version

The version of the latest release available from the channel server.

Note

since 0.6.0

This function can not be called statically.

Return value

boolean - FALSE if the information was not available.

array - informations about the current installed version of the package (license, summary, description, releasedate, releasenotes, state, deps, version).

PEAR_PackageUpdate::setDontAskAgain

PEAR_PackageUpdate::setDontAskAgain --  Sets the user's "Don't Ask Again" preference for the package.

Description

Sets the user's "Don't Ask Again" preference to $dontAsk. If $dontAsk is TRUE the user will not be asked to update the package again.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the preference was set properly, FALSE otherwise.

PEAR_PackageUpdate::setDontAskUntilNextRelease

PEAR_PackageUpdate::setDontAskUntilNextRelease --  Sets the user's "Don't Ask Again Until Next Release" preference for the package.

Description

Sets the user's "Don't Ask Again Until Next Release" preference to $dontAsk. If $dontAsk is TRUE the user will not be asked to update the package again until a new version is released.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_NOINFO, when there are no information available about the package name hosted on the channel server.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the preference was set properly, FALSE otherwise.

PEAR_PackageUpdate::setMinimumReleaseType

PEAR_PackageUpdate::setMinimumReleaseType --  Sets the user's preference for asking about release types.

Description

Sets the user's preference for asking about minimum release types.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_INVALIDTYPE, when invalid type of release is used (bug|minor|major).

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the preference was set properly, FALSE otherwise.

PEAR_PackageUpdate::setMinimumState

PEAR_PackageUpdate::setMinimumState --  Sets the user's preference for asking about release states.

Description

Sets the user's preference for asking about minimum release state.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_INVALIDSTATE, when invalid state of release is used (snapshot|devel|alpha|beta|stable).

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the preference was set properly, FALSE otherwise.

PEAR_PackageUpdate::setPreference

PEAR_PackageUpdate::setPreference --  Sets the given preference to the given value.

Description

Sets one of the given preference to the given value. Both preference and value, should have valid values.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_INVALIDPREF, when invalid preference is used (PEAR_PACKAGEUPDATE_PREF_NOUPDATES, PEAR_PACKAGEUPDATE_PREF_NEXTRELEASE, PEAR_PACKAGEUPDATE_PREF_TYPE, PEAR_PACKAGEUPDATE_PREF_STATE).

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the preference was set properly, FALSE otherwise.

PEAR_PackageUpdate::setPreferences

PEAR_PackageUpdate::setPreferences --  Sets all preferences at once.

Description

Sets a group of preference with associated values, all at once. Invalid preference is ignored (no error raised).

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if all the preferences were set properly, FALSE otherwise.

PEAR_PackageUpdate::update

PEAR_PackageUpdate::update --  Updates the source for the package.

Description

Updates your current installation with the new source for the package.

Throws

throws PEAR_PACKAGEUPDATE_ERROR_NOTINSTALLED, if the package is not already installed.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if the update was successful, FALSE otherwise.

PEAR_PackageUpdate::popError

PEAR_PackageUpdate::popError --  Pops an error off the error stack.

Description

Pops an error off the error stack.

This method is just for collecting errors that occur while checking for updates and updating a package. The child class is responsible for displaying all errors and handling them properly. This is because the way errors are handled varies greatly depending on the driver used.

Note

since 0.4.0a1

This function can not be called statically.

Return value

array - details of an error or warning (with debug context if available).

PEAR_PackageUpdate::hasErrors

PEAR_PackageUpdate::hasErrors --  Returns whether or not errors have occurred (and been captured).

Description

Returns whether or not errors , and or, warnings (version 0.7.0 or better) have occurred.

Parameter

mixed $level

The level of errors to pop off of the stack (warning|error). Use FALSE if you want all errors and warnings at once.

Note

since 0.4.0a1

This function can not be called statically.

Return value

boolean - TRUE if errors(/warnings) have been captured, FALSE othewise.


Chapter 56. PHP

Tools to help your development process.



PHP_Archive

Table of Contents
Introduction --  The PHP_Archive package allows creation of self-contained cross-platform PHP libraries or applications, similar to Java jar files.

The PHP_Archive package allows creation of self-contained cross-platform PHP libraries or applications, similar to Java jar files. PHP_Archive

Introduction

Introduction --  The PHP_Archive package allows creation of self-contained cross-platform PHP libraries or applications, similar to Java jar files.

Description

PHP_Archive provides the PHP_Archive class, and the phar:// stream wrapper. Using PHP_Archive, it is possible to create self-contained cross-platform PHP libraries and applications. The file format and principles are identical to the Phar extension, which is documented in the PHP manual. PHP_Archive is used to create go-pear.phar and install-pear-nozlib.phar, distributed with PHP since PHP version 5.1.0, and used to install the PEAR Installer itself.

The PHP_Archive class differs in approach from the Phar class in that it does not support the ArrayAccess interface for accessing internal files, and does not support iteration over contents using foreach(). However, full support for the phar:// stream wrapper, support of Phar-specific metadata setting and retrieval using PHP_Archive::getPharMetaData() and file-specific metadata using PHP_Archive::getFileMetaData(), zlib and bzip2 compression of individual files, and archive-wide SHA1/MD5 signature makes PHP_Archive just as powerful as the Phar extension for distributing phars.

The advanced Phar creation features of PHP_Archive are not yet documented, but information is available at the API documentation, and an example usage is in cvs at make-gopear-phar.php.

External Documentation

Phar extension documentation


phpDocumentor

Table of Contents
Introduction --  The phpDocumentor package provides automatic documenting of PHP code API directly from the source.

The phpDocumentor package provides automatic documenting of php api directly from the source.

Introduction

Introduction --  The phpDocumentor package provides automatic documenting of PHP code API directly from the source.

Description

The phpDocumentor tool is a standalone auto-documentor similar to JavaDoc written in PHP. It differs from PHPDoc in that it is MUCH faster, parses a much wider range of PHP files, and comes with many customizations including 11 HTML templates, Windows help file CHM output, PDF output, and XML DocBook output that is compatible with the markup used in this manual. In addition, it can do PHPXref source code highlighting and linking.


PHP_CodeSniffer

Table of Contents
Introduction -- Description and simple usage example
Usage -- Standard usage information
Advanced Usage -- Advanced usage information
Configuration Options -- A list of configuration options
Coding Standard Tutorial -- A guide to writing your own code sniffs
Coding Standard Class Methods -- Information about overriding coding standard class methods
FAQ -- Frequently asked questions

PHP_CodeSniffer is a PHP5 script that tokenises and "sniffs" PHP code to detect violations of a defined set of coding standards. It is an essential development tool that ensures that your code remains clean and consistent. It can even help prevent some common semantic errors made by developers.

Introduction

Introduction -- Description and simple usage example

Description

PHP_CodeSniffer is a PHP5 script that tokenises and "sniffs" PHP code to detect violations of a defined set of coding standards. It is an essential development tool that ensures that your code remains clean and consistent. It can even help prevent some common semantic errors made by developers.

A coding standard, in PHP_CodeSniffer, is a collection of sniff files. Each sniff file checks one part of the coding standard only. Multiple coding standards can be used within PHP_CodeSniffer, so that the one installation can be used across multiple projects. The default coding standard used by PHP_CodeSniffer is the PEAR coding standard.

Example

To check a file against the PEAR coding standard, simply specify the file's location.

Or, if you wish to check an entire directory, you can specify the directory location instead of a file.

Usage

Usage -- Standard usage information

Getting Help from the Command Line

Running PHP_CodeSniffer with the -h or --help command line arguments will print a list of commands that PHP_CodeSniffer will respond to. The output of phpcs -h is shown below.

Usage: phpcs [-nwlvi] [--report=<report>] [--standard=<standard>]
    [--config-set key value] [--config-delete key] [--config-show]
    [--generator=<generator>] [--extensions=<extensions>]
    [--ignore=<patterns>] [--tab-width=<width>] <file> ...
        -n           Do not print warnings
        -w           Print both warnings and errors (on by default)
        -l           Local directory only, no recursion
        -v[v][v]     Print verbose output
        -i           Show a list of installed coding standards
        --help       Print this help message
        --version    Print version information
        <file>       One or more files and/or directories to check
        <extensions> A comma separated list of file extensions to check
                     (only valid if checking a directory)
        <patterns>   A comma separated list of patterns that are used
                     to ignore directories and files
        <standard>   The name of the coding standard to use
        <width>      The number of spaces each tab represents
        <generator>  The name of a doc generator to use
                     (forces doc generation instead of checking)
        <report>     Print either the "full", "xml", "checkstyle",
                     "csv" or "summary" report
                     (the "full" report is printed by default)

Note: The --standard command line argument is optional, even if you have more than one coding standard installed. If no coding standard is specified, PHP_CodeSniffer will default to checking against the PEAR coding standard, or the standard you have set as the default. View instructions for setting the default coding standard.

Checking Files and Folders

The simplest way of using PHP_CodeSniffer is to provide the location of a file or folder for PHP_CodeSniffer to check. If a folder is provided, PHP_CodeSniffer will check all files it finds in that folder and all its sub-folders.

Note: If you do not want sub-folders checked, use the -l command line argument to force PHP_CodeSniffer to run locally in the folders specified.

In the example below, the first command tells PHP_CodeSniffer to check the myfile.inc file for coding standard errors while the second command tells PHP_CodeSniffer to check all PHP files in the my_dir directory.

You can also specify multiple files and folders to check. The command below tells PHP_CodeSniffer to check the myfile.inc file and all files in the my_dir directory.

After PHP_CodeSniffer has finished processing your files, you will get an error report. The report lists both errors and warnings for all files that violated the coding standard. The output looks like this:

If you don't want warnings included in the output, specify the -n command line argument.

Printing a Summary Report

By default, PHP_CodeSniffer will print a complete list of all errors and warnings it finds. This list can become quite long, especially when checking a large number of files at once. To print a summary report that only shows the number of errors and warnings for each file, use the --report=summary command line argument. The output will look like this:

As with the full report, you can suppress the printing of warnings with the -n command line argument.

Specifying a Coding Standard

PHP_CodeSniffer can have multiple coding standards installed to allow a single installation to be used with multiple projects. When checking PHP code, PHP_CodeSniffer can be told which coding standard to use. This is done using the --standard command line argument.

The example below checks the myfile.inc file for violations of the PEAR coding standard (installed by default).

Printing a List of Installed Coding Standards

PHP_CodeSniffer can print you a list of the coding standards that are installed so that you can correctly specify a coding standard to use for testing. You can print this list by specifying the -i command line argument.

Advanced Usage

Advanced Usage -- Advanced usage information

Specifying Valid File Extensions

By default, PHP_CodeSniffer will check any file it finds with a .inc or .php extension. Sometimes, this means that PHP_CodeSniffer is not checking enough of your files. Sometimes, the opposite is true. PHP_CodeSniffer allows you to specify a list of valid file extensions using the --extensions command line argument. Extensions are separated by commas.

Note: If you have asked PHP_CodeSniffer to check a specific file rather than an entire directory, the extension of the specified file will be ignored. The file will be checked even if it has an invalid extension or no extension at all.

In the following example, the main.inc file will be checked by PHP_CodeSniffer even though the --extensions command line argument specifies that only .php files should be checked.

Note: The ignoring of file extensions for specific files is a feature of PHP_CodeSniffer and is the only way to check files without an extension. If you check an entire directory of files, all files without extensions will be ignored, so you must check each of these file separately.

Ignoring Files and Folders

Sometimes you want PHP_CodeSniffer to run over a very large number of files, but you want some files and folders to be skipped. The --ignore command line argument can be used to tell PHP_CodeSniffer to skip files and folders that match one or more patterns.

In the following example, PHP_CodeSniffer will skip all files inside the package's tests and data directories. This is useful if you are checking a PEAR package but don't want your test or data files to conform to your coding standard.

Replacing Tabs with Spaces

Most of the sniffs written for PHP_CodeSniffer do not support the usage of tabs for indentation and alignment. You can write your own sniffs that check for tabs instead of spaces, but you can also get PHP_CodeSniffer to convert your tabs into spaces before a file is checked. This allows you to use the existing space-based sniffs on your tab-based files.

In the following example, PHP_CodeSniffer will replace all tabs in the files being checked with between 1 and 4 spaces, depending on the column the tab indents to.

Printing an XML Report

PHP_CodeSniffer can output an XML report to allow you to parse the output easily and use the results in your own scripts. To print an XML report, use the --report=xml command line argument. The output will look like this:

As with the full report, you can suppress the printing of warnings with the -n command line argument.

Printing a Checkstyle Report

PHP_CodeSniffer can output an XML report similar to the one produced by Checkstyle, allowing you to use the output in scripts and applications that already support Checkstyle. To print a Checkstyle report, use the --report=checkstyle command line argument. The output will look like this:

As with the full report, you can suppress the printing of warnings with the -n command line argument.

Printing a CSV Report

PHP_CodeSniffer can output a CSV report to allow you to parse the output easily and use the results in your own scripts. To print a CSV report, use the --report=csv command line argument. The output will look like this:

As with the full report, you can suppress the printing of warnings with the -n command line argument.

Note: The first row of the CSV output defines the order of information. When using the CSV output, please parse this header row to determine the order correctly as the format may change over time or new information may be added.

Setting Configuration Options

PHP_CodeSniffer has some configuration options that can be set. Individual coding standards may also require configuration options to be set before functionality can be used. View a full list of configuration options.

To set a configuration option, use the --config-set command line argument.

Deleting Configuration Options

PHP_CodeSniffer allows you to delete any configuration option, reverting it to its default value. View a full list of configuration options.

To delete a configuration option, use the --config-delete command line argument.

Viewing Configuration Options

To view the currently set configuration options, use the --config-show command line argument.

Printing Verbose Tokeniser Output

Note: This feature is provided for debugging purposes only. Using this feature will dramatically increase screen output and script running time.

PHP_CodeSniffer contains multiple verbosity levels. Level 2 (indicated by the command line argument -vv) will print all verbosity information for level 1 (file specific token and line counts with running times) as well as verbose tokeniser output.

The output of the PHP_CodeSniffer tokeniser shows the step-by-step creation of the scope map and the level map.

The Scope Map

The scope map is best explained with an example. For the following file:

<?php
if ($condition) {
    echo 'Condition was true';
}
?>

The scope map output is:

The scope map output above shows the following pieces of information about the file:

  • A scope token, if, was found at token 1 (note that token 0 is the open PHP tag).

  • The opener for the if statement, the open curly brace, was found at token 7.

  • The closer for the if statement, the close curly brace, was found at token 15.

  • Tokens 8 - 15 are all included in the scope set by the scope opener at token 7, the open curly brace. This indicates that these tokens are all within the if statement.

The scope map output is most useful when debugging PHP_CodeSniffer's scope map, which is critically important to the successful checking of a file, but is also useful for checking the type of a particular token. For example, if you are unsure of the token type for an opening curly brace, the scope map output shows you that the type is T_OPEN_CURLY_BRACKET and not, for example, T_OPEN_CURLY_BRACE.

The Level Map

The level map is best explained with an example. For the following file:

<?php
if ($condition) {
    echo 'Condition was true';
}
?>

The level map output is:

The level map output above shows the following pieces of information about the file:

  • A scope opener, an open curly brace, was found at token 7 and opened the scope for an if statement, defined at token 1.

  • Tokens 8 - 15 are all included in the scope set by the scope opener at token 7, the open curly brace. All these tokens are at level 1, indicating that they are enclosed in 1 scope condition, and all these tokens are enclosed in a single condition; an if statement.

The level map is most commonly used to determine indentation rules (eg. a token 4 levels deep requires 16 spaces of indentation) or to determine if a particular token is within a particular scope (eg. a function keyword is within a class scope, making it a method).

Printing Verbose Token Processing Output

Note: This feature is provided for debugging purposes only. Using this feature will dramatically increase screen output and script running time.

PHP_CodeSniffer contains multiple verbosity levels. Level 3 (indicated by the command line argument -vvv) will print all verbosity information for level 1 (file specific token and line counts with running times), level 2 (tokeniser output) as well as token processing output with sniff running times.

The token processing output is best explained with an example. For the following file:

<?php
if ($condition) {
    echo 'Condition was true';
}
?>

The token processing output is:

Every token processed is shown, along with its ID, type and contents. For each token, all sniffs that were executed on the token are displayed, along with the running time.

For example, the output above shows us that token 1, an if keyword, had 3 sniffs executed on it; the ControlSignature sniff, the ScopeClosingBrace sniff and the ScopeIndent sniff. Each was executed fairly quickly, but the slowest was the ScopeClosingBrace sniff, taking 0.0248 seconds to process that token.

The other interesting piece of information we get from the output above is that only 2 tokens in the whole file had sniffs executed on them; tokens 0 and 1. This is normal behavior for PHP_CodeSniffer as most sniffs listen for a very specific and rarely used token and then execute on it and a number of tokens following it.

For example, the ScopeIndentSniff executes on the if statement's token only, but actually checks the indentation of every line within the if statement. The sniff uses the scope map to find all tokens within the if statement.

Configuration Options

Configuration Options -- A list of configuration options

PHP_CodeSniffer Configuration Options

Setting the Default Coding Standard

By default, PHP_CodeSniffer will use the PEAR coding standard if no standard is supplied on the command line. You can change the default standard by setting the default_standard configuration option.

Setting the Default Report Format

By default, PHP_CodeSniffer will use the full report format if no format is supplied on the command line. You can change the default report format by setting the report_format configuration option.

Hiding Warnings by Default

By default, PHP_CodeSniffer will show both errors and warnings for your code. You can hide warnings for a single script run by using the -n command line argument, but you can also enable this by default if you prefer. To hide warnings by default, set the show_warnings configuration option to 0.

Note: When warnings are hidden by default, you can use the -w command line argument to show them for a single script run.

Setting the Default Tab Width

By default, PHP_CodeSniffer will not convert tabs to spaces in checked files. Specifying a tab width will make PHP_CodeSniffer replace tabs with spaces. You can force PHP_CodeSniffer to replace tabs with spaces by default by setting the tab_width configuration option.

Note: When the tab width is set by default, the replacement of tabs with spaces can be disabled for a single script run by setting the tab width to zero.

Zend Coding Standard Configuration Options

Setting the Path to the Zend Code Analyzer

The Zend coding standard includes a sniff that will check each file using the Zend Code Analyzer, a tool that comes with Zend Studio. Use the zend_ca_path configuration option to tell the Zend Code Analyzer sniff where to find the tool.

Coding Standard Tutorial

Coding Standard Tutorial -- A guide to writing your own code sniffs

Introduction

In this tutorial, we will create a new coding standard with a single sniff. Our sniff will prohibit the use of Perl style hash comments.

Creating the Coding Standard Directory

All sniffs in PHP_CodeSniffer must belong to a coding standard. A coding standard is a directory inside PHP_CodeSniffer and a single class, so we can create one very easily. Let's call our coding standard MyStandard. Run the following commands to create the coding standard directory structure:


$ cd /path/to/PHP_CodeSniffer/CodeSniffer/Standards
$ mkdir MyStandard
$ mkdir MyStandard/Sniffs

    

The MyStandard directory represents our coding standard and is the name we will use on the command line to specify the new coding standard to use for checking. The Sniffs sub-directory is used to store all the sniff files for this coding standard.

Now that our directory structure is created, we need to add our class file. This file will allow PHP_CodeSniffer to ask our coding standard for information about itself, and also identify this directory as one that contains code sniffs.


$ cd /path/to/PHP_CodeSniffer/CodeSniffer/Standards/MyStandard
$ touch MyStandardCodingStandard.php

    

The content of the MyStandardCodingStandard.php file should be the following:

<?php
/**
 * MyStandard Coding Standard.
 *
 * PHP version 5
 *
 * @category  PHP
 * @package   PHP_CodeSniffer
 * @author    Your Name <you@domain.net>
 * @license   http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
 * @version   CVS: $Id: coding-standard-tutorial.xml,v 1.6 2007/10/15 03:28:17 squiz Exp $
 * @link      http://pear.php.net/package/PHP_CodeSniffer
 */

require_once 'PHP/CodeSniffer/Standards/CodingStandard.php';

/**
 * MyStandard Coding Standard.
 *
 * @category  PHP
 * @package   PHP_CodeSniffer
 * @author    Your Name <you@domain.net>
 * @license   http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/PHP_CodeSniffer
 */
class PHP_CodeSniffer_Standards_MyStandard_MyStandardCodingStandard extends PHP_CodeSniffer_Standards_CodingStandard
{

}//end class
?>

Note: The coding standard class can be left empty, as it is in this example coding standard. For information about the methods that can be overridden, see the coding standard class documentation.

Creating the Sniff

A sniff requires a single PHP file. It's name should clearly describe the standard that we are enforcing, and must end with Sniff.php. For our sniff, we will name the PHP file DisallowHashCommentsSniff.php, and place it into a Commenting sub-directory, to categorise this sniff as relating to commenting. Run the following commands to create the category and the sniff:


$ cd /path/to/PHP_CodeSniffer/CodeSniffer/Standards/MyStandard/Sniffs
$ mkdir Commenting
$ touch Commenting/DisallowHashCommentsSniff.php

    

Note: It does not matter what sub-directories you use for categorising your sniffs. Just make them descriptive enough so you can find your sniffs again later when you want to modify them.

Each sniff must implement the PHP_CodeSniffer_Sniff interface so that the PHP_CodeSniffer knows that it should instantiate the sniff once it's invoked. The PHP_CodeSniffer_Sniff interface defines two methods that must be implemented; register() and process().

The register() and process() Methods

The register() method allows a sniff to subscribe to one or more token types that it may wish to process. Once PHP_CodeSniffer encounters one of those tokens, it calls the process() method with the PHP_CodeSniffer_File object (a representation of the current file being checked) and the position in the stack where the token was found.

For our sniff, we are interested in single line comments. The token_get_all() method that PHP_CodeSniffer uses to acquire the tokens within a file distinguishes doc comments and normal comments as two separate token types. Therefore, we don't have to worry about doc comments interfering with our test. The register() method only needs to return one token type, T_COMMENT.

The Token Stack

A sniff can gather more information about a token by acquiring the token stack with a call to the getTokens() method on the PHP_CodeSniffer_File object. This method returns an array, and is indexed by the position where the token occurs in the token stack. Each element in the array represents a token. All tokens have a code, type and a content index in their array. The code value is a unique integer for the type of token. The type value is a string representation of the token (eg. 'T_COMMENT' for comment tokens). The type has a corresponding globally defined integer with the same name. Finally, the content value contains the content of the token as it appears in the code.

Note: Some tokens have more indexes than those described above. Have a look in the PHP/CodeSniffer/File.php class comment for a list of tokens and their axillary indicies.

Reporting Errors

Once an error is detected, a sniff should indicate that an error has occurred by calling the addError() method on the PHP_CodeSniffer_File object, passing in an appropriate error message as the first argument and the position in the stack where the error was detected as the second. Alternatively, if the violation is considered not as critical as an error, the addWarning() method can be used.

DisallowHashCommentsSniff.php

We now have to write the content of our sniff. The content of the DisallowHashCommentsSniff.php file should be the following:

<?php
/**
 * PHP_CodeSniffer tokenises PHP code and detects violations of a
 * defined set of coding standards.
 *
 * PHP version 5
 *
 * @category  PHP
 * @package   PHP_CodeSniffer
 * @author    Your Name <you@domain.net>
 * @license   http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
 * @version   CVS: $Id: coding-standard-tutorial.xml,v 1.6 2007/10/15 03:28:17 squiz Exp $
 * @link      http://pear.php.net/package/PHP_CodeSniffer
 */

require_once 'PHP/CodeSniffer/Sniff.php';

/**
 * This sniff prohibits the use of Perl style hash comments.
 *
 * An example of a hash comment is:
 *
 * <code>
 *  # This is a hash comment, which is prohibited.
 *  $hello = 'hello';
 * </code>
 * 
 * @category  PHP
 * @package   PHP_CodeSniffer
 * @author    Your Name <you@domain.net>
 * @license   http://matrix.squiz.net/developer/tools/php_cs/licence BSD Licence
 * @version   Release: @package_version@
 * @link      http://pear.php.net/package/PHP_CodeSniffer
 */
class MyStandard_Sniffs_Commenting_DisallowHashCommentsSniff implements PHP_CodeSniffer_Sniff
{


    /**
     * Returns the token types that this sniff is interested in.
     *
     * @return array(int)
     */
    public function register()
    {
        return array(T_COMMENT);

    }//end register()


    /**
     * Processes the tokens that this sniff is interested in.
     *
     * @param PHP_CodeSniffer_File $phpcsFile The file where the token was found.
     * @param int                  $stackPtr  The position in the stack where
     *                                        the token was found.
     *
     * @return void
     */
    public function process(PHP_CodeSniffer_File $phpcsFile, $stackPtr)
    {
        $tokens = $phpcsFile->getTokens();
        if ($tokens[$stackPtr]['content']{0} === '#') {
            $error = 'Hash comments are prohibited';
            $phpcsFile->addError($error, $stackPtr);
        }

    }//end process()


}//end class

?>

Results

Now that we have defined a coding standard, let's validate a file that contains hash comments.

The test file we are using has the following contents:

<?php

# Check for valid contents.
if ($obj->contentsAreValid($array)) {
    $value = $obj->getValue();

    # Value needs to be an array.
    if (is_array($value) === false) {
        # Error.
        $obj->throwError();
        exit();
    }
}

?>

When PHP_CodeSniffer is run on the file using our new coding standard, 3 errors will be reported:

$ phpcs --standard=MyStandard Test.php

FILE: Test.php
--------------------------------------------------------------------------------
FOUND 3 ERROR(S) AND 1 WARNING(S) AFFECTING 3 LINE(S)
--------------------------------------------------------------------------------
 3 | ERROR | Hash comments are prohibited
 7 | ERROR | Hash comments are prohibited
 9 | ERROR | Hash comments are prohibited
--------------------------------------------------------------------------------

Coding Standard Class Methods

Coding Standard Class Methods -- Information about overriding coding standard class methods

Introduction

Every coding standard contains a class file. This file allows PHP_CodeSniffer to ask a coding standard for information about itself, and also identify a directory as one that contains code sniffs. This guide describes each of the coding standard class methods that can be overridden to provide additional information about your coding standard to PHP_CodeSniffer.

The getIncludedSniffs() Method

This method allows you to tell PHP_CodeSniffer that, besides the code sniffs you have defined in your Sniffs directory, you want to include code sniffs from other coding standards. You can include single code sniffs, whole directories of code sniffs, or an entire coding standard.

The example below includes the MultipleStatementAlignment sniff from the Generic coding standard, all code sniffs in the Functions category of the Generic coding standard, and all code sniffs defined in the PEAR coding standard.

<?php
/**
 * Return a list of external sniffs to include with this standard.
 *
 * The MyStandard coding standard uses some generic sniffs, and
 * the entire PEAR coding standard.
 *
 * @return array
 */
public function getIncludedSniffs()
{
    return array(
            'PEAR',
            'Generic/Sniffs/Formatting/MultipleStatementAlignmentSniff.php',
            'Generic/Sniffs/Functions',
           );

}//end getIncludedSniffs()
?>

Note: When including an entire coding standard, you will also include any code sniffs that the standard includes from other coding standards. For example, the PEAR coding standard includes some code sniffs from the Generic coding standard, so including the entire PEAR coding standard will also include those code sniffs. This is a quick and easy way to create your own coding standard based on an existing one.

The getExcludedSniffs() Method

This method allows you to tell PHP_CodeSniffer to exclude code sniffs from your own standard or any other standard you are including using the getIncludedSniffs() method. You can exclude single code sniffs, whole directories of code sniffs, or an entire coding standard.

The example below includes the whole PEAR coding standard, except for the ControlSignature sniff.

<?php
/**
 * Return a list of external sniffs to include with this standard.
 *
 * The MyStandard coding standard uses all PEAR sniffs except one.
 *
 * @return array
 */
public function getIncludedSniffs()
{
    return array(
            'PEAR',
           );

}//end getIncludedSniffs()


/**
 * Return a list of external sniffs to exclude from this standard.
 *
 * The MyStandard coding standard uses all PEAR sniffs except one.
 *
 * @return array
 */
public function getExcludedSniffs()
{
    return array(
            'PEAR/Sniffs/ControlStructures/ControlSignatureSniff.php',
           );

}//end getExcludedSniffs()
?>

FAQ

FAQ -- Frequently asked questions

Does PHP_CodeSniffer perform any code coverage or unit testing?

No. PHP_CodeSniffer is not a tool for testing that your PHP application works correctly. All PHP_CodeSniffer will do is ensure your PHP code meets the standards that you are following.

My code is fine! Why do I need PHP_CodeSniffer?

Maybe you don't, but if you want to ensure you adhere to a set of coding standards, PHP_CodeSniffer is a quick and easy way to do that. PHP_CodeSniffer is a replacement for the more manual task of checking coding standards in code reviews. With PHP_CodeSniffer, you can reserve code reviews for the checking of code correctness.

Note: Coding standards are a good thing. They will make your code easier to read and maintain, especially when multiple developers are working on the same application. Consider using coding standards if you don't already.

Does PHP_CodeSniffer parse my code to ensure it will execute?

No. PHP_CodeSniffer does not actually parse your code, and so cannot tell if your code contains parse errors. PHP_CodeSniffer may return an incorrect number of errors if checking code that does contain parse errors.

Tip: You can easily check for parse errors in a file using the PHP command line interface and the -l (lowercase L) option.

$ php -l /path/to/code/myfile.inc
No syntax errors detected in /path/to/code/myfile.inc

I don't agree with your coding standards! Can I make PHP_CodeSniffer enforce my own?

Yes. At its core, PHP_CodeSniffer is just a framework for enforcing coding standards. We release PHP_CodeSniffer with a couple of sample coding standards to help developers get started on projects where they do not have a standard. If you want to write your own standards, read the tutorial on creating coding standards.

How come PHP_CodeSniffer reported errors, I fixed them, now I get even more?

Sometimes, errors mask the existence of other errors, or new errors are created as you fix others. For example, PHP_CodeSniffer might tell you that an inline IF statement needs to be defined with braces. Once you make this change, PHP_CodeSniffer may report that the braces you added are not correctly aligned.

Always run PHP_CodeSniffer until you get a passing result. Once you've made the changes PHP_CodeSniffer recommends, run PHP_CodeSniffer again to ensure no new errors have been added.

Why doesn't PHP_CodeSniffer just make the changes it suggests for me?

As much as we trust PHP_CodeSniffer to check your code for coding standard errors, we don't trust any application to ever change code for us without reviewing it first. Considering we would have to check each change PHP_CodeSniffer made before releasing the source code, why not make the changes manually?

Making the changes manually ensures a couple of positive things happen:

  • Developers learn the coding standards and make less mistakes in the future.

  • Developers can ensure that PHP_CodeSniffer is working correctly.

  • Developers can decide if a coding standard doesn't fit a particular piece of code.

So if you find yourself wishing PHP_CodeSniffer would just go ahead and make those changes for you, maybe you just need to read the coding standards and adhere to them a bit better.

Note: No matter how small of a change you make, always test your code before committing it to your code repository or releasing it. Even changes suggested by PHP_CodeSniffer need to be tested, as small and insignificant as they may seem.

What does PHP_CodeSniffer use to tokenize my PHP code?

PHP_CodeSniffer uses PHP's inbuilt tokenizer functions to parse your PHP code.


PHP_Compat

Table of Contents
Introduction -- Purpose and simple usage example
Components -- List of replicated components
Advanced usage -- Describe techniques for advanced usage
PHP_Compat::loadFunction() -- Load a function, or an array of functions
PHP_Compat::loadConstant() -- Load a constant, or an array of constants
PHP_Compat::loadVersion() -- Load all components, or all components until a given version of PHP

Provides missing functionality for older versions of PHP.

Introduction

Introduction -- Purpose and simple usage example

Description

PHP_Compat provides missing functionality in the form of functions and constants for older versions of PHP.

The replicated functions are designed to be interchangable with their native equivilants. They have the same signature, same return values and throw the same errors. Each function is unit tested to ensure accuracy.

Example

Or, if you don't wish to use the class, you can load it manually.

The function is then ready to use like you would normally.

PHP_Compat is designed for ease of use. It has no dependencies and can be used completely outside the PEAR infrastructure.

Components

Components -- List of replicated components

Functions

The following functions have been replicated:

Table 56-1. Functions

FunctionSince
array_change_key_case()PHP 4.2.0
array_chunk()PHP 4.2.0
array_combine()PHP 5.0.0
array_diff_assoc()PHP 4.3.0
array_diff_key()PHP 5.0.2
array_diff_ukey()PHP 5.0.2
array_intersect_assoc()PHP 5.0.0
array_intersect_key()PHP 5.0.2
array_intersect_uassoc()PHP 5.0.0
array_intersect_ukey()PHP 5.0.2
array_key_exists()PHP 4.1.0
array_product()PHP 5.1.0
array_search()PHP 4.0.5
array_udiff()PHP 5.0.0
array_udiff_assoc()PHP 5.0.0
array_udiff_uassoc()PHP 5.0.0
array_uintersect()PHP 5.0.0
array_uintersect_assoc()PHP 5.0.0
array_uintersect_uassoc()PHP 5.0.0
array_walk_recursive()PHP 5.0.0
call_user_func_array()PHP 4.0.4
bcinvert()PHP 5.2.0
bcpowmod()PHP 5.0.0
clone()PHP 5.0.0
constant()PHP 4.0.4
convert_uudecode()PHP 5.0.0
convert_uuencode()PHP 5.0.0
debug_print_backtrace()PHP 5.0.0
file_get_contents()PHP 4.3.0
file_put_contents()PHP 5.0.0
floatval()PHP 4.2.0
fprintf()PHP 5.0.0
fputcsv()PHP 5.0.0
get_headers()PHP 5.0.0
get_include_path()PHP 4.3.0
html_entity_decode()PHP 4.3.0
htmlspecialchars_decode()PHP 5.1.0
http_build_query()PHP 5.0.0
ibase_timefmt()PHP 5.0.0
idate()PHP 5.1.0
image_type_to_mime_type()PHP 4.3.0
inet_ntop()PHP 5.1.0
inet_pton()PHP 5.1.0
ini_get_all()PHP 4.2.0
is_a()PHP 4.2.0
is_scalar()PHP 4.0.5
md5_file()PHP 4.2.0
mhash()PHP 4.1.0
mime_content_type()PHP 4.3.0
ob_clean()PHP 4.2.0
ob_flush()PHP 4.2.0
ob_get_clean()PHP 4.3.0
ob_get_flush()PHP 4.3.0
php_strip_whitespace()PHP 5.0.0
property_exists()PHP 5.1.0
pg_affected_rows()PHP 4.2.0
pg_escape_bytea()PHP 4.2.0
pg_unescape_bytea()PHP 4.2.0
restore_include_path()PHP 4.3.0
scandir()PHP 5.0.0
set_include_path()PHP 4.3.0
str_ireplace()PHP 5.0.0
str_rot13()PHP 4.2.0
str_shuffle()PHP 4.3.0
str_split()PHP 5.0.0
str_word_count()PHP 4.3.0
stripos()PHP 5.0.0
strpbrk()PHP 5.0.0
strripos()PHP 5.0.0
substr_compare()PHP 5.0.0
time_sleep_until()PHP 5.1.0
var_export()PHP 4.2.0
version_compare()PHP 4.1.0
vprintf()PHP 4.1.0
vsprintf()PHP 4.1.0

Advanced usage

Advanced usage -- Describe techniques for advanced usage

Advanced usage

In order to create portable code, it's best to assume all the native functions already exist. Littering a script with calls to PHP_Compat can become messy, and increase the work required to port the code.

To solve this there are a number of approaches. The first would be adding the load statements to a file which is included at the top of every document. The second, and preferred method is to make use of php_auto_append php.ini value. This can be set in a .htaccess file, and no modifications to the actual code are required.

If phpcompat.php was the name of the file, an example entry in a .htaccess could be php_value php_auto_append phpcompat.php. The phpcompat.php file would make use of either the loadVersion or loadFunction/loadConstant methods discussed in the next page.

PHP_Compat::loadFunction()

PHP_Compat::loadFunction() -- Load a function, or an array of functions

Description

Loads a function, or an array of functions.

Parameter

mixed $function

The name, or an array of names, of functions to load

Return value

mixed

TRUE if the function was loaded.
FALSE if the function was not loaded. Either unable to be included or already defined.
If you specified an array of functions to load, an array of TRUE/FALSE values is returned.

Note

This function should be called statically.

PHP_Compat::loadConstant()

PHP_Compat::loadConstant() -- Load a constant, or an array of constants

Description

Loads a constant, or an array of constants.

Parameter

mixed $constant

The name, or an array of names, of constants to load

Return value

mixed

TRUE if the constant was loaded.
FALSE if the constant was not loaded. Either unable to be included or already defined.
If you specified an array of constants to load, an array of TRUE/FALSE values is returned.

Note

This function should be called statically.

PHP_Compat::loadVersion()

PHP_Compat::loadVersion() -- Load all components, or all components until a given version of PHP

Description

Load all components, or all components until a given version of PHP.

Parameter

string $version

The version of PHP to load components until.

Return value

array

An associative array of boolean values. The key is the name of the component loaded. The value for whether or not the component was loaded correctly.

Note

This function should be called statically.


PHP_CompatInfo

Find out the minimum version and the extensions required for a piece of code to run


Summary


System Requirements

Mandatory resources :

Optional resources :


About

Table of Contents
FAQ -- Answers to most Frequently Asked Questions
News -- What is New in version ?

FAQ

FAQ -- Answers to most Frequently Asked Questions

PHP_CompatInfo FAQ

1. General questions
1.1. What does it cost ?
1.2. Do you offer support ?
1.3. I found a bug, what shall i do ?
1.4. What is PEAR ?
2. How to do
2.1. I have a compatible PHP4/5 application with optional PHP5 code. How to ignore only PHP 5 code ?
1. General questions

1.1. What does it cost ?

You can download and use it for free. But don't delete the copyright notice. You can read terms of the PHP license.

1.2. Do you offer support ?

YES if there is no answer in this Guide and if you are ready to share some informations such as : your configuration (platform Win *nix mac, PHP version, PEAR packages installed) and perharps your script.

1.3. I found a bug, what shall i do ?

You can report it with the bug tracker at PEAR.

1.4. What is PEAR ?

PEAR (an acronym for PHP Extension and Application Repository) is a framework and distribution system for reusable PHP components.

Don't forget to read also the PEAR Manual and PEAR FAQ.

2. How to do

2.1. I have a compatible PHP4/5 application with optional PHP5 code. How to ignore only PHP 5 code ?

If you want to ignore all PHP5 code (functions, constants, extensions), you only need to add a line on your parsing (file, directory, string) options: "ignore_versions". In this example all PHP 5.0.0 to 5.2.0 code will be ignored when parsing current directory.
<?php
require_once 'PHP/CompatInfo.php';

$dir = dirname(__FILE__);
$options = array('ignore_versions' => array('5.0.0', '5.2.0'));

$pci = new PHP_CompatInfo();
$res = $pci->parseDir($dir, $options);
var_dump($res);
?>

News

News -- What is New in version ?

Choose the right version

If you need PHP3 detection, DO NOT use version 1.5.0 or greater, but the latest release of 1.4 branch (1.4.3)

Version 0.7.x

  • Initial PEAR public release: occured in March 2003, one month later after package proposal was launched under name PHP_Compatibility

  • Added the ability to ignore files: in PHP_CompatInfo::parseFolder() and PHP_CompatInfo::parseArray()

  • Added the ability to ignore folders: in PHP_CompatInfo::parseFolder()

  • Added the ability to ignore functions: in all public methods.

Version 0.8.x

  • Added a command line interface: with new class PHP_CompatInfo_CLI

  • Added a clone function: to PHP_CompatInfo::parseFolder() named PHP_CompatInfo::parseDir(). parseFolder() became now an alias of parseDir().

  • Added new option file_ext for parseArray: This option contains an array of file extensions to parse for PHP code. Default: php, php4, inc, phtml

  • Fixed integration with PEAR_PackageFileManager: PackageFileManager::detectDependencies() implement call to PHP_CompatInfo and allow to detect easily minimum PHP version needed.

Version 1.0.x

  • Improved PHP5 detection: one year after first PEAR public release, stable version 1.0.0 fixed some bugs and also allow PHP3 script/function detection.

Version 1.1.x

  • Added support for reporting max PHP version: came with user request 6056

  • Improved PECL detection: especially with SAPI extension.

Version 1.2.x

  • Added new option ignore_constants: to PHP_CompatInfo::parseArray(), PHP_CompatInfo::parseDir(), PHP_CompatInfo::parseFolder(), PHP_CompatInfo::parseFile(), PHP_CompatInfo::parseString(),

  • Load components list for a PHP version or subset: added new function PHP_CompatInfo::loadVersion() to API

Version 1.3.x

  • Improved command line interface: output is limited to 80 columns for a better render. There is also now a windows launcher (named compatinfo.bat).

  • package xml 1.0: was stopped to be generated on version 1.3.2 (september 2006)

Version 1.4.x

  • Inactive leader: Davey Shafik, initial author of this package, became inactive, and I (Laurent Laville) follow his steps as new active package leader.

  • PHP 4.3.0: is now required as a minimum to use both web and cli interfaces.

  • License upgrade: from PHP 3.0 to PHP 3.01

  • Improved PHP5 detection: with some bug fixes

Version 1.5.x

  • Improved PHP5 detection: with new data source version.xml (revision 1.8) and funclist.txt (revision 1.39).

  • Dropped support of PHP3 detection: due to content of new data source version.xml (1.8) and funclist.txt (1.39)

  • Command line interface: under windows (pci.bat) and unix (pci.php) have now unified name. Idea came from PHP_CodeSniffer package that allow to fix lot of errors/warnings of coding standard.

    Debug output of CLI gave now origin of extension (from PECL or not) and minimum extension version (rather than PHP). See example docs/examples/checkExtensions.php

Version 1.6.x

  • Improved PHP5 detection: with data source version.xml (revision 1.9) and funclist.txt (revision 1.39).

    More PHP constant are detected natively:

  • Command line interface: allow now to detect version of a simple string (code without using script tags <?php ... ?>. Uses new parameter -s or --string.

  • Command line interface: allow now to print either an "xml" or "cli" (default) report. Uses new parameter -r or --report.

  • loadVersion() may return both function or function+constant list.

  • PHP method chaining is implemented on "Davey Shafik" request #13094.

Version 1.7.x

  • Fix CLI output render to 80 columns, on main table :

    • 29 characters for File/Path column

    • 9 characters for Version column

    • 13 characters for Extensions column

    • 23 characters for Constants/Tokens column

  • Fix CLI output render to 80 columns, on additionnal tables :

    • 25 characters for Option column

    • 51 characters for Value column

  • Improved detection on conditionnal code: with new options : ignore_functions_match, ignore_extensions_match, ignore_constants_match.

    That allow to implement request 12857 : add the option to locally mask exceptions.

  • Implement request 13138 : separate constants and tokens in results.

  • Implement request 13147 : add filter file extension option on parsing directory (CLI)

  • On CLI, the XML report generation is now xml compliant with a root tag (pci)


Reference guide

Table of Contents
CLI -- The console command
API -- Application Programming Interface
PHP_CompatInfo::loadVersion() -- Load components list
PHP_CompatInfo::parseArray() -- Parse an Array of Files
PHP_CompatInfo::parseDir() -- Parse a directory
PHP_CompatInfo::parseFolder() -- Alias of parseDir
PHP_CompatInfo::parseFile() -- Parse a single file
PHP_CompatInfo::parseString() -- Parse a string

CLI

CLI -- The console command

Switchs

The PHP_CompatInfo_Cli class, also known under it's wrapper name "pci", get the compatibility info from PHP Command Line Interpreter, on existing script or folder.

Overview

pci [options]  -f FILE | -d DIR | -s STRING
Usage is to run pci with at least the -s (--string), -f (--file) or -d (--dir) switch and perharps some additional and optional options.

Reference

-d | --dir

Identify the directory to parse to get compatibility info of its files contents.

-f | --file

Identify the file name (path) to parse to get compatibility info.

-s | --string

Content of a simple php code string without script tags <?php ... ?>

-n | --no-recurse

Do not recursively parse files into subdirectories when using --dir.

-v | --verbose

Set the verbose level. From 0 (no extra information) to 7 (full extra details).

In level 0, pci give only results related to -d or -f. See first line of the console table. If there are more than one line, next ones are details for each file of a directory/branch.
+-----------------------------+---------+-------------+-----------------------+
| Path                        | Version | Extensions  | Constants/Tokens      |
+-----------------------------+---------+-------------+-----------------------+
| *                           | 4.3.0   | bcmath      | __FILE__              |
|                             |         | pcre        |                       |
+-----------------------------+---------+-------------+-----------------------+
| math.php                    | 3.0.9   | bcmath      |                       |
|                             |         | pcre        |                       |
+-----------------------------+---------+-------------+-----------------------+
| errorHandler.php            | 4.3.0   |             |                       |
+-----------------------------+---------+-------------+-----------------------+

In level 1, pci give results of level 0 plus a resume of command line arguments. For example
pci -v 1 -d \wamp\www\pci
give table of level 0 (see previous), plus :
Command Line resume :

+-------------------------+---------------------------------------------------+
| Option                  | Value                                             |
+-------------------------+---------------------------------------------------+
| dir                     | \wamp\www\pci                                     |
| verbose                 | 1                                                 |
+-------------------------+---------------------------------------------------+

In level 2, pci give results of level 0 plus the list of options used to parse file or directory. For example
pci -d \wamp\www\pci -v 2
give table of level 0 (see previous), plus :
Parser options :

+--------+-------+
| Option | Value |
+--------+-------+
|        |       |
+--------+-------+

Note: Even when none option are used, the resume table is displayed.

In level 3, pci give results of level 0, 1 and 2. For example
pci -d \wamp\www\pci -n -v 3
give table of level 0 (see previous), plus :
Command Line resume :

+-------------------------+---------------------------------------------------+
| Option                  | Value                                             |
+-------------------------+---------------------------------------------------+
| dir                     | \wamp\www\pci                                     |
| no-recurse              | 1                                                 |
| verbose                 | 3                                                 |
+-------------------------+---------------------------------------------------+

Parser options :

+-------------------------+---------------------------------------------------+
| Option                  | Value                                             |
+-------------------------+---------------------------------------------------+
| recurse_dir             | FALSE                                             |
+-------------------------+---------------------------------------------------+

In level 4, useless when using --dir, pci give results of level 0 plus a list of functions implemented with their versions. For example
pci -f \wamp\www\pci\math.php -v4
give :
+-----------------------------+---------+-------------+-----------------------+
| File                        | Version | Extensions  | Constants/Tokens      |
+-----------------------------+---------+-------------+-----------------------+
| \wamp\www\pci\math.php      | 3.0.9   | bcmath      |                       |
|                             |         | pcre        |                       |
+-----------------------------+---------+-------------+-----------------------+

Debug:

+---------+------------+------------+
| Version | Function   | Extension  |
+---------+------------+------------+
| 3.0.9   | preg_match | ext_pcre   |
| 3.0.0   | bcsub      | ext_bcmath |
+---------+------------+------------+

Level 5 is equivalent to level 4 + level 1.

Level 6 is equivalent to level 4 + level 2.

And finally, level 7 is equivalent to level 4 + level 2 + level 1.

-if | --ignore-files

Identify the file name (path) to a text file that contains on each line the name of each file to ignore when parsing a directory/branch.

-id | --ignore-dirs

Identify the file name (path) to a text file that contains on each line the name of each sub-directory to ignore when parsing a directory/branch.

-in | --ignore-functions

Identify the file name (path) to a text file that contains on each line the name of each PHP function to ignore when parsing a directory or a single file.

-ic | --ignore-constants

Identify the file name (path) to a text file that contains on each line the name of each PHP constant to ignore when parsing a directory or a single file.

-ie | --ignore-extensions

Identify the file name (path) to a text file that contains on each line the name of each PHP extension to ignore (all extension.functions) when parsing a directory or a single file.

-iv | --ignore-versions

Expect one or two values that identify which PHP version (and all its related functions) to ignore.

Tip: For example: ignore all PHP 5 functions (minor releases 0 thru 2), or only PHP 5.0.0 functions.
pci -f FILE | -d DIR  -iv 5.0.0 5.2.0
pci -f FILE | -d DIR  -iv 5.0.0

-inm | --ignore-functions-match

Identify the file name (path) to a text file that contains on each line a pattern (match a regular expression) of PHP function to ignore when parsing a directory, a single file, or a string.

Comments start with ";", as in php.ini, and blank lines are allowed.

If you want to use the preg_match compare function, put a "=", to start the line, follow by a regular expression.

-iem | --ignore-extensions-match

Identify the file name (path) to a text file that contains on each line a pattern (match a regular expression) of PHP extension to ignore when parsing a directory, a single file, or a string.

Comments start with ";", as in php.ini, and blank lines are allowed.

If you want to use the preg_match compare function, put a "=", to start the line, follow by a regular expression.

-icm | --ignore-constants-match

Identify the file name (path) to a text file that contains on each line a pattern (match a regular expression) of PHP constant to ignore when parsing a directory, a single file, or a string.

Comments start with ";", as in php.ini, and blank lines are allowed.

If you want to use the preg_match compare function, put a "=", to start the line, follow by a regular expression.

-h | --help

Show full help usage with all switchs explained.

-r | --report

Print either an xml or cli (default) report

For example:
pci -r xml -f C:\wamp\php\PEAR\PHP\CodeSniffer.php
give these results
<?xml version="1.0" encoding="UTF-8"?>
<file name="C:\wamp\php\PEAR\PHP\CodeSniffer.php">
<version>5.1.2</version>
<extension count="5">spl, pcre, date, xml, tokenizer</extension>
<token count="3">throw, protected, public</token>
<constant count="3">__FILE__, PHP_EOL, DIRECTORY_SEPARATOR</constant>
</file>
And with little debug option ( -v4 )
pci -r xml -v4 -f C:\wamp\php\PEAR\PHP\CodeSniffer.php
results became
<?xml version="1.0" encoding="UTF-8"?>
<file name="C:\wamp\php\PEAR\PHP\CodeSniffer.php">
<version>5.1.2</version>
<extension count="5">spl, pcre, date, xml, tokenizer</extension>
<token count="3">throw, protected, public</token>
<constant count="3">__FILE__, PHP_EOL, DIRECTORY_SEPARATOR</constant>
<function extension="spl" pecl="false" version="5.1.2">spl_autoload_register</function>
<function version="5.0.2">interface_exists</function>
<function version="5.0.0">file_put_contents</function>
<function extension="tokenizer" pecl="false" version="4.2.0">token_name</function>
<function version="4.2.0">var_export</function>
<function version="4.0.4">constant</function>
<function version="4.0.2">wordwrap</function>
<function version="4.0.0">class_exists</function>
<function version="4.0.0">define</function>
<function version="4.0.0">chdir</function>
<function version="4.0.0">dirname</function>
<function version="4.0.0">substr</function>
<function version="4.0.0">str_replace</function>
<function version="4.0.0">is_file</function>
<function version="4.0.0">is_array</function>
<function version="4.0.0">is_string</function>
<function version="4.0.0">is_dir</function>
<function version="4.0.0">basename</function>
<function version="4.0.0">realpath</function>
<function version="4.0.0">count</function>
<function version="4.0.0">strtolower</function>
<function version="4.0.0">strrpos</function>
<function version="4.0.0">in_array</function>
<function version="4.0.0">explode</function>
<function version="4.0.0">array_pop</function>
<function version="4.0.0">array_merge</function>
<function version="4.0.0">file_exists</function>
<function version="4.0.0">strtr</function>
<function extension="pcre" pecl="false" version="4.0.0">preg_match</function>
<function extension="date" pecl="false" version="4.0.0">time</function>
<function version="4.0.0">ksort</function>
<function version="4.0.0">htmlspecialchars</function>
<function extension="xml" pecl="false" version="4.0.0">utf8_encode</function>
<function version="4.0.0">strlen</function>
<function version="4.0.0">str_repeat</function>
<function version="4.0.0">ord</function>
<function version="4.0.0">strtoupper</function>
<function version="4.0.0">strpos</function>
<function version="4.0.0">rtrim</function>
<function version="4.0.0">is_writable</function>
</file>

-fe | --file-ext

A comma separated list of file extensions to parse (only valid if parsing a directory). Default is: php, php4, inc, phtml

API

API -- Application Programming Interface

Parsing data sources

You can parse multiple data sources :

Call one of these five functions, with or without options, and you will retrieve a hash of information that contains:

  • ignored_functions, PHP functions list that were ignored during source code parsing.

  • ignored_extensions, PHP extensions list that were ignored during source code parsing.

  • ignored_constants, PHP constants list that were ignored during source code parsing.

  • max_version, maximum PHP version to run source code.

  • version, minimum PHP version to run source code.

  • extensions, PHP modules/extensions functions found in source code.

  • constants, PHP constants found in source code.

  • tokens, PHP5 tokens (public, final, abstract, etc ...)

Parser options

Each of five parsing functions support common and specifics options :

Common options

debug

Contains a boolean to control whether extra ouput is shown.

ignore_functions

Contains an array of functions to ignore when calculating the version needed.

ignore_constants

Contains an array of constants to ignore when calculating the version needed.

ignore_extensions

Contains an array of php extensions to ignore when calculating the version needed.

ignore_versions

Contains an array of php versions to ignore when calculating the version needed.

ignore_functions_match

Excludes from scope all functions that match (full or partially) the pattern(s).

ignore_extensions_match

Excludes from scope all extensions that match (full or partially) the pattern(s).

ignore_constants_match

Excludes from scope all constants that match (full or partially) the pattern(s).

parseArray, parseDir|parseFolder, specific options

file_ext

Contains an array of file extensions to parse for PHP code. Default: php, php4, inc, phtml

ignore_files

Contains an array of files to ignore. File names are case insensitive.

parseArray specific options

is_string

Contains a boolean which says if the array values are strings or file names.

parseDir|parseFolder specific options

recurse_dir

Boolean on whether to recursively find files.

ignore_dirs

Contains an array of directories to ignore. Directory names are case insensitive.

PHP_CompatInfo::loadVersion()

PHP_CompatInfo::loadVersion() -- Load components list

Description

Load components list for a PHP version or subset

Parameter

string $min

PHP minimal version

string|boolean $max

(optional) PHP maximal version

boolean $include_const

(optional) include constants list in final result

Return value

returns An array of php function available in version(s) given

returns A mixed array of php function + php constants available in version(s) given. Available with parameter #3 ($include_const) since API 1.6.0

Throws

throws no exceptions thrown

Since

since version 1.2.0 (2006-08-23)

Note

This function can not be called statically.

Example

What's new with PHP version 4.3.10 ?
<?php
require_once 'PHP/CompatInfo.php';

$pci = new PHP_CompatInfo();
$res = $pci->loadVersion('4.3.10', '4.3.10', true);
var_export($res);
?>
Result give: 0 function and 2 constants
array (
  'functions' =>
  array (
  ),
  'constants' =>
  array (
    0 => 'PHP_EOL',
    1 => 'UPLOAD_ERR_NO_TMP_DIR',
  ),
)

What's new since PHP version 5.2.1 ?
<?php
require_once 'PHP/CompatInfo.php';

$pci = new PHP_CompatInfo();
$res = $pci->loadVersion('5.2.1');
var_export($res);
?>
Result give 24 functions
array (
  0 => 'cachingiterator::count',
  1 => 'directoryiterator::getbasename',
  2 => 'imagegrabscreen',
  3 => 'imagegrabwindow',
  4 => 'ming_setswfcompression',
  5 => 'mysql_set_charset',
  6 => 'openssl_pkcs12_export',
  7 => 'openssl_pkcs12_export_to_file',
  8 => 'openssl_pkcs12_read',
  9 => 'php_ini_loaded_file',
  10 => 'reflectionextension::info',
  11 => 'regexiterator::setpregflags',
  12 => 'splfileinfo::getbasename',
  13 => 'splfileinfo::getlinktarget',
  14 => 'splfileinfo::getrealpath',
  15 => 'splobjectstorage::serialize',
  16 => 'splobjectstorage::unserialize',
  17 => 'stream_is_local',
  18 => 'stream_socket_shutdown',
  19 => 'swfmovie::namedanchor',
  20 => 'swfmovie::protect',
  21 => 'swfmovie::remove',
  22 => 'sys_get_temp_dir',
  23 => 'tidynode::getparent',
)

PHP_CompatInfo::parseArray()

PHP_CompatInfo::parseArray() -- Parse an Array of Files

Description

You can parse an array of Files or Strings. To parse strings, $options['is_string'] must be set to true

Parameter

array $files

Array of file names or code strings

array $options

An array of options where:

  • file_ext Contains an array of file extensions to parse for PHP code. Default: php, php4, inc, phtml

  • debug Contains a boolean to control whether extra ouput is shown.

  • ignore_functions Contains an array of functions to ignore when calculating the version needed.

  • ignore_constants Contains an array of constants to ignore when calculating the version needed.

  • ignore_files Contains an array of files to ignore. File names are case insensitive.

  • is_string Contains a boolean which says if the array values are strings or file names.

  • ignore_extensions Contains an array of php extensions to ignore when calculating the version needed.

  • ignore_versions Contains an array of php versions to ignore when calculating the version needed.

Throws

throws no exceptions thrown

Since

since version 0.7.0 (2004-03-09)

Note

This function can not be called statically.

PHP_CompatInfo::parseDir()

PHP_CompatInfo::parseDir() -- Parse a directory

Description

Parse a directory recursively for its compatibility info

Parameter

string $dir

Path of folder to parse

array $options

An array of options where:

  • file_ext Contains an array of file extensions to parse for PHP code. Default: php, php4, inc, phtml

  • recurse_dir Boolean on whether to recursively find files

  • debug Contains a boolean to control whether extra ouput is shown.

  • ignore_functions Contains an array of functions to ignore when calculating the version needed.

  • ignore_constants Contains an array of constants to ignore when calculating the version needed.

  • ignore_files Contains an array of files to ignore. File names are case insensitive.

  • ignore_dirs Contains an array of directories to ignore. Directory names are case insensitive.

  • ignore_extensions Contains an array of php extensions to ignore when calculating the version needed.

  • ignore_versions Contains an array of php versions to ignore when calculating the version needed.

Throws

throws no exceptions thrown

See

see PHP_CompatInfo::parseFolder()

see PHP_CompatInfo::_fileList()

Since

since version 0.8.0 (2004-04-22)

Note

This function can not be called statically.

PHP_CompatInfo::parseFolder()

PHP_CompatInfo::parseFolder() -- Alias of parseDir

Description

Alias of parseDir function

Parameter

string $folder

Path of folder to parse

array $options

An array of options

Throws

throws no exceptions thrown

Since

since version 0.7.0 (2004-03-09)

Note

This function can not be called statically.

PHP_CompatInfo::parseFile()

PHP_CompatInfo::parseFile() -- Parse a single file

Description

Parse a file for its compatibility info

Parameter

string $file

Path of File to parse

array $options

An array of options where:

  • debug Contains a boolean to control whether extra ouput is shown.

  • ignore_functions Contains an array of functions to ignore when calculating the version needed.

  • ignore_constants Contains an array of constants to ignore when calculating the version needed.

  • ignore_extensions Contains an array of php extensions to ignore when calculating the version needed.

  • ignore_versions Contains an array of php versions to ignore when calculating the version needed.

Throws

throws no exceptions thrown

Since

since version 0.7.0 (2004-03-09)

Note

This function can not be called statically.

PHP_CompatInfo::parseString()

PHP_CompatInfo::parseString() -- Parse a string

Description

Parse a string for its compatibility info

Parameter

string $string

PHP Code to parses

array $options

An array of options where:

  • debug Contains a boolean to control whether extra ouput is shown.

  • ignore_functions Contains an array of functions to ignore when calculating the version needed.

  • ignore_constants Contains an array of constants to ignore when calculating the version needed.

  • ignore_extensions Contains an array of php extensions to ignore when calculating the version needed.

  • ignore_versions Contains an array of php versions to ignore when calculating the version needed.

Throws

throws no exceptions thrown

Since

since version 0.7.0 (2004-03-09)

Note

This function can not be called statically.


PHP_FunctionCallTracer

Table of Contents
Introduction --  PHP_FunctionCallTracer creates function calls debug trace.
Basic Use --  Simple trace of function arguments and returned variables.

Creates a function calls debug trace. Functions arguments, returned parameters and watched variables are reported in the same section for each function call. The trace is available as an array, or can be displayed or written in a file. Traced variables can be processed by provided user functions for displaying purposes.

Introduction

Introduction --  PHP_FunctionCallTracer creates function calls debug trace.

Overview

Functions arguments, returned parameters and watched variables are reported in the same section for each function call. The trace is available as an array, or can be displayed or written in a file. Traced variables can be processed by provided user functions for displaying purposes.

This package is not a replacement for full fledged PHP debuggers. It is useful for (1) remote debugging, (2) to debug a complex sequence of function calls, (3) to display non text variables in a user readable format.

  1. Remote debugging is sometimes the only option to debug a package that works fine on your system, e.g. a 32-bit OS, but breaks on a different system, e.g. a 64-bit OS, which you have no access to. A remote user who has the latter OS could run the package, then send you the trace for analysis.

  2. It is sometimes difficult not to loose track of functions calls in some live debugging sessions even with top notch PHP editor/debuggers. The trace produced by this package may come handy and is easy to use in combination with the source code to track calls and variables.

  3. Some variables native format does not always display well, typically: packed data and UTF-8 strings. They can be converted as they are being traced to a readable format by provided user functions. For example: converting binary strings to hexadecimal, or UTF-8 string to Unicode.

Basic Use

Basic Use --  Simple trace of function arguments and returned variables.

Overview

traceArguments() is used to trace the function arguments. There is no need to pass the function arguments to traceArguments() to trace them. Note that traceArguments() may not be used, if the function does not call any other function or if the function calls functions that are not being traced.

traceVariables() is used to trace variables within the function. The variables to trace must be passed as arguments to traceVariables(). traceVariables() may be called as many times as required to watch variables value change.

traceReturn() is used to trace the variables returned by the function. The variables to trace must be passed as arguments to traceReturn().

putTrace() is used to display the trace to the standard output or to write it into a file.

How to use PHP_FunctionCallTracer

In this example, package.php contains two classes whose methods are traced. The package is used by an application trace.php. The trace is stored into trace.txt. To generate the trace, run: #php trace.php.

Example 56-1. The package package.php

Note that testing if PHP_FunctionCallTracer is loaded: class_exists('PHP_FunctionCallTracer', false), is optional. It is useful only if the tracing methods are meant to be left in the code. They will be called only if PHP_FunctionCallTracer is loaded.

class math {
    /**
     * tracing the arguments and the returned parameter
     *
     * note that traceReturn() calls traceArguments() by default which is fine here
     * since this method does call other methods to trace
     */
    public static function prod($x, $y)
    {
        // class_exists('PHP_FunctionCallTracer', false)
        // and PHP_FunctionCallTracer::traceArguments();
        $p = $x * $y;

        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceReturn($p);
        return $p;
    }

    /**
     * tracing the arguments and the returned parameter
     *
     * traceArguments() must be called here since this method calls other methods
     * that may be traced, so that traced calls are displayed in the right order
     */
    public static function square($x)
    {
        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceArguments();

        $x2 = self::prod($x, $x);

        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceReturn($x2);
        return $x2;
    }
}

class geometry {
    private $pi = 3.14;

    /**
     * tracing the arguments and the returned parameter
     * another variable is traced along with the returned parameter
     */
    public function circle($r)
    {
        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceArguments();

        $pi2 = 2 * $this->pi;
        $c = math::prod($r, $pi2);

        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceReturn($c, $pi2);
        return $c;
    }

    /**
     * tracing the arguments, some variables and the returned parameter
     */
    public function disk($r)
    {
        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceArguments();

        $r2 = math::square($r);
        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceVariables($r2, $this->pi);

        $d = math::prod($r2, $this->pi);

        class_exists('PHP_FunctionCallTracer', false) and
        PHP_FunctionCallTracer::traceReturn($d);
        return $d;
    }
}

Example 56-3. The trace trace.txt

Array
(
    [php_uname] => Windows NT mybox 5.1 build 2600
    [date] => Friday, 03-Aug-07 09:17:30 UTC
    [calls] => Array
        (
            [0] => Array
                (
                    [call] => Array
                        (
                            [file] => trace.php
                            [line] => 20
                            [function] => geometry->circle
                        )
                    [in] => Array
                        (
                            [file] => package.php
                            [line] => 55
                            [args] => Array
                                (
                                    [0] => 2
                                )
                        )

                    [out] => Array
                        (
                            [file] => package.php
                            [line] => 61
                            [args] => Array
                                (
                                    [0] => 12.56
                                    [1] => 6.28
                                )
                        )

                )

            [1] => Array
                (
                    [call] => Array
                        (
                            [file] => package.php
                            [line] => 58
                            [function] => math::prod
                        )

                    [in] => Array
                        (
                            [file] => package.php
                            [line] => 22
                            [args] => Array
                                (
                                    [0] => 2
                                    [1] => 6.28
                                )
                        )

                    [out] => Array
                        (
                            [file] => package.php
                            [line] => 22
                            [args] => Array
                                (
                                    [0] => 12.56
                                )
                        )

                )

            [2] => Array
                (
                    [call] => Array
                        (
                            [file] => trace.php
                            [line] => 21
                            [function] => geometry->disk
                        )

                    [in] => Array
                        (
                            [file] => package.php
                            [line] => 71
                            [args] => Array
                                (
                                    [0] => 3
                                )
                        )

                    [watches] => Array
                        (
                            [0] => Array
                                (
                                    [file] => package.php
                                    [line] => 75
                                    [args] => Array
                                        (
                                            [0] => 9
                                            [1] => 3.14
                                        )
                                )

                        )

                    [out] => Array
                        (
                            [file] => package.php
                            [line] => 80
                            [args] => Array
                                (
                                    [0] => 28.26
                                )
                        )

                )

            [3] => Array
                (
                    [call] => Array
                        (
                            [file] => package.php
                            [line] => 73
                            [function] => math::square
                        )

                    [in] => Array
                        (
                            [file] => package.php
                            [line] => 35
                            [args] => Array
                                (
                                    [0] => 3
                                )
                        )

                    [out] => Array
                        (
                            [file] => package.php
                            [line] => 40
                            [args] => Array
                                (
                                    [0] => 9
                                )
                        )

                )

            [4] => Array
                (
                    [call] => Array
                        (
                            [file] => package.php
                            [line] => 37
                            [function] => math::prod
                        )

                    [in] => Array
                        (
                            [file] => package.php
                            [line] => 22
                            [args] => Array
                                (
                                    [0] => 3
                                    [1] => 3
                                )
                        )

                    [out] => Array
                        (
                            [file] => package.php
                            [line] => 22
                            [args] => Array
                                (
                                    [0] => 9
                                )

                        )

                )

            [5] => Array
                (
                    [call] => Array
                        (
                            [file] => package.php
                            [line] => 77
                            [function] => math::prod
                        )

                    [in] => Array
                        (
                            [file] => package.php
                            [line] => 22
                            [args] => Array
                                (
                                    [0] => 9
                                    [1] => 3.14
                                )
                        )

                    [out] => Array
                        (
                            [file] => package.php
                            [line] => 22
                            [args] => Array
                                (
                                    [0] => 28.26
                                )
                        )
                )
        )

    [objects] => Array
        (
            [0] => geometry Object
                (
                    [pi:private] => 3.14
                )
            [2] => same as #0
        )

)

PHPUnit

Table of Contents
Tutorial --  A short tutorial about PHPUnit
PHPUnit::run() -- runs a TestSuite and returns a TestResult object.
PHPUnit::TestCase --  A TestCase defines the fixture to run multiple tests.

Provides a simple framework for creating a test application to automate testing of functions and classes.

Tutorial

Tutorial --  A short tutorial about PHPUnit

A short introduction to the test framework

PHPUnit provides a simple framework for creating a test suite to automate testing of functions and classes. PHPUnit is inspired by JUnit which was created by Kent Beck and Erich Gamma as a tool for eXtreme Programming. One of the rules of XP is to test small software components as often and early as possible, this way you will not have to fix bugs and errors in the API while setting up and testing larger applications which depend on the class. While unit testing is one of the fundimental rules in XP, you don't have to switch to XP to benefit from PHPUnit. PHPUnit stands alone as a good tool for testing classes or a set of functions and will ease your development cycle and help you to avoid endless debug sessions.

Work routine

Normally, you would write a class, do some unsystematic tests using echo() or var_dump(). After this, you use the class in your application and hope everything is ok. To benefit from PHPUnit you should rethink the flow. The best way is to do this:

  • 1. design your class/API

  • 2. create a test suite

  • 3. implement the class/API

  • 4. run the test suite

  • 5. fix failures or errors and go to #4 again

It may seem that this will require a lot of time, but this impression is wrong. Creating the test suite using PHPUnit needs only a few minutes and running the test suite only seconds.

Design a class

Let's start with a small example: a string class. First we create a bunch of functions declarations to work on a string:
---- string.php ----

<?php
class String
{
    //contains the internal data
    var $data;

    // constructor
    function String($data) {
        $this->data = $data;
    }

    // creates a deep copy of the string object
    function copy() {
    }

    // adds another string object to this class
    function add($string) {
    }

    // returns the formated string
    function toString($format) {
    }
}
?>

Creating test suite

Now we can create a test suite, which checks every function of your string class. A test suite is normal PHP class inherited from PHPUnit_TestCase containing test functions, identified by a leading 'test' in the function name. In the test function an expected value has to be compared with the result of the function to test. The result of this compare must delegate to a function of the assert*()-family, which decides if a function passes or fails the test.
---- testcase.php ----

<?php

require_once 'string.php';
require_once 'PHPUnit.php';

class StringTest extends PHPUnit_TestCase
{
    // contains the object handle of the string class
    var $abc;

    // constructor of the test suite
    function StringTest($name) {
       $this->PHPUnit_TestCase($name);
    }

    // called before the test functions will be executed
    // this function is defined in PHPUnit_TestCase and overwritten
    // here
    function setUp() {
        // create a new instance of String with the
        // string 'abc'
        $this->abc = new String("abc");
    }

    // called after the test functions are executed
    // this function is defined in PHPUnit_TestCase and overwritten
    // here
    function tearDown() {
        // delete your instance
        unset($this->abc);
    }

    // test the toString function
    function testToString() {
        $result = $this->abc->toString('contains %s');
        $expected = 'contains abc';
        $this->assertTrue($result == $expected);
    }

    // test the copy function
    function testCopy() {
      $abc2 = $this->abc->copy();
      $this->assertEquals($abc2, $this->abc);
    }

    // test the add function
    function testAdd() {
        $abc2 = new String('123');
        $this->abc->add($abc2);
        $result = $this->abc->toString("%s");
        $expected = "abc123";
        $this->assertTrue($result == $expected);
    }
  }
?>

The first test run

Now, we can run a first test. Make sure that all the paths are correct and then execute this PHP program.
---- stringtest.php ----

<?php

require_once 'testcase.php';
require_once 'PHPUnit.php';

$suite  = new PHPUnit_TestSuite("StringTest");
$result = PHPUnit::run($suite);

echo $result -> toString();
?>

If you call this script from the commandline, you will get the following output:
TestCase stringtest->testtostring() failed: expected true, actual false
TestCase stringtest->testcopy() failed: expected , actual Object
TestCase stringtest->testadd() failed: expected true, actual false
Every function fails the test, because your string functions didn't returned what we defined as the expected value.

If you want to call the script through your browser, you have to put the script in a correct html page and call $result->toHTML () instead of $result->toString().

Implementation

Ok, let's start with implementation of the our string class.
---- string.php ----

<?php
class String
{
    //contains the internal data
    var $data;

    // constructor
    function String($data) {
        $this->data = $data;
    }

    // creates a deep copy of the string object
    function copy() {
        $ret = new String($this->data);
        return $ret;
    }

    // adds another string object to this class
    function add($string) {
        $this->data = $this->data.$string->toString("%ss");
    }

    // returns the formated string
    function toString($format) {
        $ret = sprintf($format, $this->data);
        return $ret;
    }
}
?>

The implementation is complete and we can run the test again:
~> php -f stringtest.php
TestCase stringtest->testtostring() passed
TestCase stringtest->testcopy() passed
TestCase stringtest->testadd() failed: expected true, actual false
D'oh! the last test failed! We made a typing mistake. Change line 16 in string.php to
$this->data = $this->data.$string->toString("%s");
and run the test again:
~> php -f stringtest.php
TestCase stringtest->testtostring() passed
TestCase stringtest->testcopy() passed
TestCase stringtest->testadd() passed
Everything is now OK!

Conclusion

Does it seem like a lot of work for testing three simple functions? Don't forget, this is a small example. Think about bigger, more complex API's like database abstraction or basket classes in a shop application. PHPUnit is an excellent tool to detect errors in the implementation of your class.

Often you will want to reimplement or refactor a large class which is used in several different applications. Without a test suite the likeliness of you breaking something in one of the applications that depends on your class is very high. Thanks to unit tests, you can create a test suite for your class, and then reimplement your class with the security of knowing that as long as the new class passes the tests, applications that depend on the class will work.

PHPUnit::run()

PHPUnit::run() -- runs a TestSuite and returns a TestResult object.

Description

Executes the given test suite

Parameter

  • object $suite - an object of PHPUnit_TestSuite

Return value

&PHPUnit_Result - A reference to a PHPUnit_Result.

PHPUnit::TestCase

PHPUnit::TestCase --  A TestCase defines the fixture to run multiple tests.

To define a TestCase

  • 1) Implement a subclass of PHPUnit_TestCase.

  • 2) Define instance variables that store the state of the fixture.

  • 3) Initialize the fixture state by overriding setUp().

  • 4) Clean-up after a test by overriding tearDown().

Each test runs in its own fixture so there can be no side effects among test runs.

PHPUnit::TestCase

<?php
    class MathTest extends PHPUnit_TestCase {
      var $fValue1;
      var $fValue2;

      function MathTest($name) {
        $this->PHPUnit_TestCase($name);
      }

      function setUp() {
        $this->fValue1 = 2;
        $this->fValue2 = 3;
      }
    }
    ?>

For each test implement a method which interacts with the fixture. Verify the expected results with assertions specified by calling assert with a boolean.

function testPass() {
      $this->assertTrue($this->fValue1 + $this->fValue2 == 5);
    }


PHPUnit2

PHPUnit is a family of PEAR packages (PHPUnit2 for PHP 5, PHPUnit for PHP 4) that supports the development of object-oriented PHP applications using the concepts and methods of Agile Software Development, Extreme Programming, Test-Driven Development and Design-by-Contract Development by providing an elegant and robust framework for the creation, execution and analysis of Unit Tests.

Summary

Summary --  Summary

Where to find more information

You can find more information about this package at the following url PHPUnit wiki


Chapter 57. QA Tools

Tools to ensure the quality of something.



QA_Peardoc_Coverage

Table of Contents
Introduction -- What QA_Peardoc_Coverage is good for
How it works -- The global picture
Generating coverage analysis -- Step by step

Documentation coverage analysis for the PEAR packages documentation.

Daily updated pear documentation stats can be found at pear.cweiske.de/coverage/.

Introduction

Introduction -- What QA_Peardoc_Coverage is good for

About QA_Peardoc_Coverage

A great library is almost useless without documentation. PEAR has over 300 packages, automatically generated API documentation and a manual. The PEAR manual (the one you are reading) shall provide an overview on the packages and instructions about how to use them, and give an understanding about the classes in a package, and their methods. Further information about them can looked up in the API docs.

With the amount of packages PEAR provides, it's hard to keep track of the state of documentation of the packages - a tool to track this was needed. QA_Peardoc_Coverage is its incarnation.

QA_Peardoc_Coverage uses a CVS checkout of PEAR and PEARDOC to find out which packages are documented, which classes and method are mentioned in the docs, and which developers do a good job in documenting their code.

How it works

How it works -- The global picture

How it works

The documentation analysis report generation is split into two processes:

  1. Collect data and save it

  2. Generate different reports from saved data

This was chosen because the data collection step takes a long time (~ 1 minute), but it's needed for every single report. So if you want to generate the simple doc coverage, and the extended one, you need the same base data - you just display it in a different way.

generateCoverage() in QA_Peardoc_Coverage generates and returns the array with the computed coverage data. It can be serialized and saved, since all the Renderer classes use it as input.

Classes implementing the QA_Peardoc_Coverage_Renderer interface provide a render() method that takes the data returned by generateCoverage() and return the analysis, most times a string containing HTML code.

Generating coverage analysis

Generating coverage analysis -- Step by step

Generating coverage analysis data

  1. Make sure you have a fresh checkout of pear and peardoc directories from cvs.php.net.

  2. Configure peardoc to generate the manual.xml in there ( autoconf, ./configure).

  3. Call genData.php with the path to peardoc's manual.xml as first, and path to the pear cvs directory as second parameter.

  4. A file called doc.dat will be generated in the current working directory.

Generating HTML reports

Once the coverage data is generated and serialized, you can generate some HTML reports. For this, the packages provides four Renderer classes that all implement the QA_Peardoc_Coverage_Renderer interface:

  • QA_Peardoc_Coverage_Renderer_DeveloperList lists all developers with the number of packages they have, the number of undocumented packages and lists the undocumented ones. The list is sorted by percentage of documented packages.

  • QA_Peardoc_Coverage_Renderer_SimplePackageList lists all categories in PEAR, the packages in them and shows which of them have docs and which not. A final summary with the total number of existing and documented packages, and a percentage number is also given.

  • QA_Peardoc_Coverage_Renderer_ExtendetPackageList is similar to the simple list, but also shows the package's classes, their documentation state and their methods and their doc state. This list can be used to check which methods aren't yet covered by your documentation.

  • QA_Peardoc_Coverage_Renderer_MissingDocsPerDeveloper generates an array of developer email => array(package names) assignments that can be used as base data to send reminder emails.

All the renderers have a examples/gen*.php file that uses the doc.dat file written by examples/genData.php. They echo the html to the console, so you should redirect it into a file.


Chapter 58. Science

provides Packages for scientific purposes



Chapter 59. Streams

Provides Packages for streams API. For more information on stream wrappers see the PHP Manual.



Stream_Var

Table of Contents
Introduction -- Introduction to Stream_Var
Example -- Example for the usage of Stream_Var

Allows stream based access to variables.

Introduction

Introduction -- Introduction to Stream_Var

Introduction to Stream_Var

Stream_Var supplies a class that can be used as a wrapper for PHP's stream functions. This allows you to access variables with fopen(), fclose(), fwrite(), fread(), opendir() and all other filesystem functions.

You may use stream_wrapper_register() to register Stream_Var as a wrapper.

Scalar variables (strings, integers, floats) are treated as files, while arrays represent directories.

Please see the PHP Manual or the example for more information on how to register streams.

Usage scenario

Stream_Var could be used in various scenarios. Imagine you are using a class that reads data from a file but you are creating the data on-the-fly and do not want to save the data before it can be processed by the class.

This is where Stream_Var can be used. Just register it as a wrapper for fopen() and pass var://GLOBAL/yourVar as a parameter to the class.

It will read from the variable as if it was a file.

Example

Example -- Example for the usage of Stream_Var

Registering the wrapper

The following example shows you how to register Stream_Var as a wrapper for the stream functions.

More examples

If you want to take a look at some more examples, just install the package and they will be installed in the docs directory.


Chapter 60. Structures

Provides structures-related Packages



Structures_BibTex

Table of Contents
Introduction --  Introduction to Structures_BibTex
Warnings --  Usage of warnings when using Structures_BibTex
Exporting --  Possibility to export the data using Structures_BibTex
Miscellaneous -- Miscellaneous methods in the class Structures_BibTex

Parsing BibTex Data to an array and exporting to BibTex and RTF.

Introduction

Introduction --  Introduction to Structures_BibTex

Overview

This package provides methods to access information stored in a BibTex file. During parsing it is possible to let the data be validated. In addition. the creation of BibTex Strings as well as RTF Strings is also supported.

Options

Options can be set either in the constructor or with the method setOption(). When setting in the constructor the options are given in an associative array. The options are:

  • stripDelimiter (default: true) Stripping the delimiter surrounding the entries.

  • validate (default: true) Validation while parsing.

  • unwrap (default: false) Unwrapping entries while parsing.

  • wordWrapWidth (default: false) If set to a number higher one that the entries are wrapped after that amount of characters.

  • wordWrapBreak (default: \n) String used to break the line (attached to the line).

  • wordWrapCut (default: 0) If set to zero the line will we wrapped at the next possible space, if set to one the line will be wrapped exactly after the given amount of characters.

  • removeCurlyBraces (default: false) If set to true Curly Braces will be removed.

Example of setting options in the constructor:
Example of setting options using the method setOption():

Stored Data

The data is stored in the class variable data. This is a a list where each entry is a hash table representing one bibtex-entry. The keys of the hash table correspond to the keys used in bibtex and the values are the corresponding values. Some of these keys are:

  • cite - The key used in a LaTeX source to do the citing.

  • entryType - The type of the entry, like techreport, book and so on.

  • author - One or more authors of the entry. This entry is also a list with hash tables representing the authors as entries. The author has table is explained later.

  • title - Title of the entry.

Author

As described before the authors are stored in a list. Every entry representing one author as a has table. The hash table consits of four keys: first, von, last and jr. The keys are explained in the following list:

  • first - The first name of the author.

  • von - Some names have a 'von' part in their name. This is usually a sign of nobleness.

  • last - The last name of the author.

  • jr - Sometimes a author is the son of his father and has the same name, then the value would be jr. The same is true for the value sen but vice versa.

Warnings

Warnings --  Usage of warnings when using Structures_BibTex

Overview

The class Structures_BibTex introduces a system to collect warnings that may happen during parsing. Warnings are things in the BibTex source which are not correct but do not cause the parser to fail. One example would be a double cite entry. These warnings should help to improve the quality of your BibTex code. Whether warnings are generated or not is controlled by the option validate. Per default warnings are generated. If you want to not generate warnings you should use the setOption() method like this.

Usage

The warnings are stored in an array called warnings which is public accessible. To check is a warning exists you can use the method hasWarning(). This method returns true if there are warnings and false otherwise.
Every warning itself is hash table with the following keys:

  • warning - Type of the warning

  • entry - The line that caused the warning

  • wholeentry - The whole entry in which the warning occurred

To print every warning with type and line that caused the warning you could do something like this:
Finally if you want to clear all warnings you can use the method clearWarnings().

Types of Warnings

The following Warnings are known:

  • WARNING_MISSING_END_BRACE - This warning is generated when the end brace in an entry is missing. Take this warning seriously!

  • WARNING_AT_IN_BRACES - A Value is delimited by Braces. Then inside a @ is not allowed.

  • WARNING_ESCAPED_DOUBLE_QUOTE_INSIDE_DOUBLE_QUOTES - A Value is delimited by double quotes. Then inside no escaped double quote is allowed.

  • WARNING_UNBALANCED_AMOUNT_OF_BRACES - The amount of braces inside a value is not equal (opening and closing). The parses fails if in the complete entry this amount is not correct. But if only on an entry it is not correct then this is only a warning. As a matter of fact of the parser does not fail but there is an unbalanced amount of braces in an entry this warning has to be generated something times two.

  • WARNING_MULTIPLE_ENTRIES - Every entry is identified by a unique string. This warning is created if there are at least two entries with the same identification.

  • WARNING_LINE_WAS_NOT_CONVERTED - This warning is created if during exporting (for example in RTF or HTML) one entry was ignored because of no matching data in the entry. At least one of the following entries have to exist in the entry to get converted: title, journal, year or authors.

  • STRING_ENTRY_NOT_YET_SUPPORTED - BibTex defines some special entry types, String is one of them and is used to define abbreviations. This is not yet supported by Structres_BibTex.

  • PREAMBLE_ENTRY_NOT_YET_SUPPORTED - BibTex defines some special entry types, Preamble is one of them and is used to define formatted code. This is not yet supported by Structres_BibTex.

  • WARNING_NOT_ALLOWED_ENTRY_TYPE - BibTex allows to define own types. This warning is genereated when a type was detected which is not part of the standard types. The allowed or standard type are defined in the class variable allowedTypes as array.

Exporting

Exporting --  Possibility to export the data using Structures_BibTex

Overview

The class Structures_BibTex provides some methods to export the data stored in the class. Currently the class exports the data in the following formats:

  • BibTeX - The whole data in BibTeX

  • RTF - The data with enough matching data as a short list in RTF format

  • HTML - The data with enough matching data as a short list in HTML format

Author

The default is to export the name of the author in this format: "VON LAST, JR, FIRST". The corresponding placeholder will be substituted. The placeholders have to be uppercase. The format string is defined in the class variable authorstring. Changing the ouput of the author in the entries to this format "FIRST LAST" can be done like this:

RTF

This feature was introduced to enable some kind of import into Word. Word (of course also Open Office or kword) understands the RTF format. It is simply possible to save the output as 'somefile.rtf' and be opened in Word. This will satisfy the Windows users. To use it simply call the method rtf().

The default format for every entry is first the authors, then the title bold and in double quotes, then the journal italic and finally the year. To change the default format you should override the class variable rtfstring. The default rtfstring looks like this: 'AUTHORS, "{\b TITLE}", {\i JOURNAL}, YEAR'. The string AUTHORS, TITLE, JOURNAL and YEAR are substituted with the corresponding values.

Miscellaneous

Miscellaneous -- Miscellaneous methods in the class Structures_BibTex

Overview

On this page miscellaneous methods of the class Structures_BibTex are described. These methods include:

  • amount - The amount of BibTex entries

  • getStatistic - Statistics about BibTex entries

amount

This method simply returns the amount of BibTex entries which are currently stored in the class. The value is returned as Integer value.

getStatistic

This methods returns an array with a statistic about all error types together with the amount. The keys are the types and the values the amount in integer.


Structures_DataGrid

Structures_DataGrid is a class for building, manipulating and rendering a tabular structure of data. It has the ability to allow you to render a datagrid in HTML format as well as many other formats such as an XML Document, an Excel Spreadsheet, an XUL Document and more.

It also offers paging and sorting functionality to limit the data that is presented. This concept is based on the .NET Framework DataGrid control and works very well with database and XML result sets.


Introduction and Features

Table of Contents
Introduction -- What can I do with Structures_DataGrid?
FAQ -- Answers to most Frequently Asked Questions
Installation -- How to install the core and drivers packages
DataSources -- What is a DataSource driver?
Rendering the output -- What formats can I render the output?
Streaming -- How to stream large recordsets
Column Formatter -- What can I do with the column formatter?
Example - Quick -- Quickly retrieve data from a database table
Example - Complex -- How to build a datagrid using many of the features
Custom DataSources --  How to write your own DataSource driver.
Custom Renderers --  How to write your own Rendering driver.

Introduction

Introduction -- What can I do with Structures_DataGrid?

Description

Structures_DataGrid is a package with the purpose of rendering a data set into a tabular structure in a specific output format. Possible output formats are (X)HTML, XML, XUL, Excel .xls spreadsheets, CSV, or console tables.

The input data format is independent of the underlying data storage layer: It does not matter if the data has been selected from a database, has been harvested from plain text files or converted from a web service call. The data can be sorted and paged, and each cell of the table can have a custom look by using CSS for the HTML output.

Where to start

So to begin, you will want to find a datasource, commonly you might use a Database like MySQL or an XML document. You can then easily bind this datasource to the datagrid, to do so you have 3 options. The first, is to fetch your data into a 2 dimension array and pass it into the bind method. The second way is to bind a record set that is not already an array, such as a DB_DataObject or a DB_Result object. To do so, you can use the bindDataSource method by creating a DataSource object. The third way is to loop through your record set and add each record individually, this practice is the least efficient.

Note: If you bind the datagrid to a datasource that is an object such as a DB_DataObject, you do not need to fetch the data as the DataGrid will handle that for you.

Render the output

Once your datagrid has been populated with your records, you have many options on how to manipulate what is to be shown. You can sort the data, choose to show only a certain amount of data per page and also choose what format the data should be rendered into. You can render the datagrid in many formats including HTML.

FAQ

FAQ -- Answers to most Frequently Asked Questions

Description

This document is based on questions asked on PEAR general mailing list and other mailing lists and forums.

Structures_DataGrid FAQ

1. I'm using the HTML_Table Renderer. How can I use multiple grids on the same page?
2. Which DataSource drivers are recommended?
3. I'd like to add row numbers to my DataGrid. How can I do this?
4. I'm using the Excel Renderer and would like to have the € sign in the resulting Excel file, but I always get only a box or some funny characters. How can I get the right € sign?
5. Streaming is a nice feature. Why isn't streaming the default behaviour?
6. I have used $renderer->toHtml(); with older versions of Structures_DataGrid, but this does not work anymore. How can I fix my code?
7. All the rows are displayed on one page. Why isn't it paging the data?
8. Sorting doesn't work with MDB2 DataSource driver if I have column names in uppercase letters. Why?

1. I'm using the HTML_Table Renderer. How can I use multiple grids on the same page?

The setRequestPrefix() method is the solution for this problem. Each DataGrid for the page needs such a prefix that is internally used before the GET parameters for sorting and paging. An example of the usage:
require_once 'Structures/DataGrid.php';

$datagrid1 = new Structures_DataGrid();
$datagrid2 = new Structures_DataGrid();

$datagrid1->setRequestPrefix('trade_');
$datagrid2->setRequestPrefix('stock_');

$datagrid1->bind('SELECT * FROM trade', array('dsn' => DSN));
$datagrid2->bind('SELECT * FROM stock', array('dsn' => DSN));

$datagrid1->render();
$datagrid2->render();

Note: You need to call setRequestPrefix() before calling bind().

2. Which DataSource drivers are recommended?

Currently there are five DataSource drivers that are recommended in the sense of efficiency:

  • DB_DataObject

  • DB_Table

  • DBQuery

  • MDB2

  • PDO

These four drivers will only fetch the needed records from the database. For example, if you have a row limit of 15 records per page, they will only fetch (up to) 15 records.

All other DataSource drivers can, of course, also be used. But there is no logic implemented (better said: implementable) to avoid fetching (or keeping in memory) unneeded records.

3. I'd like to add row numbers to my DataGrid. How can I do this?

You need a formatter for the new column that should hold the row number. The first parameter that is passed to such a formatter function contains a currRow value with the row number per page. For calculating the row number relative to the whole table, you need to take also the getCurrentRecordNumberStart() method into account.

The following code snippet shows you how to define the formatter function and how to add the column (with # as the column label and right aligned values):
function formatRowNumber($params, $recordNumberStart)
{
    return $params['currRow'] + $recordNumberStart;
}

$datagrid->addColumn(
    new Structures_DataGrid_Column(
        '#',
        null,
        null,
        array('style' => 'text-align: right;'),
        null,
        'formatRowNumber',
        $datagrid->getCurrentRecordNumberStart()
    ));

4. I'm using the Excel Renderer and would like to have the € sign in the resulting Excel file, but I always get only a box or some funny characters. How can I get the right € sign?

Instead of using an encoding like ISO-8859-15, you need to use Windows-1252.

5. Streaming is a nice feature. Why isn't streaming the default behaviour?

Streaming support in Structures_DataGrid is intended to be used with large datasets. But it can also be used with very small datasets without loss of performance.

As always, there is an exception to this rule: When you're using one of the DataSource drivers that fetch data from a database and you have queries that need a lot of time for computation of the results, you should not use streaming, as running such a complex query multiple times will need even more time, of course.

6. I have used $renderer->toHtml(); with older versions of Structures_DataGrid, but this does not work anymore. How can I fix my code?

If you just want to output the HTML code, use the following line of code:
$datagrid->render()
If you want to get the generated HTML code, e.g. for using it within a template, use the following line of code:
$html = $datagrid->getOutput();

7. All the rows are displayed on one page. Why isn't it paging the data?

Don't forget to pass the number of rows per page to the constructor:
$datagrid =& new Structures_DataGrid(10); // 10 rows per page

8. Sorting doesn't work with MDB2 DataSource driver if I have column names in uppercase letters. Why?

This is caused by MDB2's portability settings that are enabled by default. The MDB2_PORTABILITY_FIX_CASE setting is set to CASE_LOWER, resulting in lowercased letters for all column names. Disable this or all portability settings of MDB2 to avoid sorting problem with Structures_DataGrid.

Installation

Installation -- How to install the core and drivers packages

Introduction

If you are not familiar with PEAR, we recommend that you first read the PEAR general installation instructions

Structures_DataGrid use drivers that are provided separately. It means that installing the core package named Structures_DataGrid is not enough to get something working.

Installation steps

You will at least need one DataSource driver, for handling the input, and one Rendering driver (or Renderer), for the output.

The following commands will install the core package, as well as the MDB2 DataSource (for binding SQL queries), HTML_Table Renderer and the Pager renderer (for paging links). That should cover your most common needs.

$ pear install -o Structures_DataGrid
$ pear install -o Structures_DataGrid_DataSource_MDB2
$ pear install -o Structures_DataGrid_Renderer_HTMLTable
$ pear install -o Structures_DataGrid_Renderer_Pager

Note: If you get an error message like Failed to download pear/Structures_DataGrid within preferred state "stable", latest release is [...], you can simply append -beta to the package name, for example:

$ pear install -o Structures_DataGrid-beta

Of course, you may want to use other input/output formats, such as XML, MS Excel, DB_DataObject, XUL, etc... Just install the corresponding drivers.

Advanced installation

It is possible to install DataSource drivers or all Renderer drivers at once. The following two commands will install Structures_DataGrid and either all DataSource or all Renderer drivers at once.

$ pear install Structures_DataGrid#datasources
$ pear install Structures_DataGrid#renderers

Please note that the individual drivers will be installed only if the requirements are fulfilled. That means that the MDB2 DataSource won't be installed if you don't have MDB2 installed. The same holds for the Excel Renderer if you don't have Spreadsheet_Excel_Writer installed.

Of course, the same holds for the uninstallation. For example:

$ pear uninstall Structures_DataGrid#datasources
$ pear uninstall Structures_DataGrid#renderers

DataSources

DataSources -- What is a DataSource driver?

Description

A DataSource has a rather self-explanatory name; however, a DataSource driver in context to the DataGrid can become a very essential key to your software. A DataSource driver will interact with your data source directly, such as a DB_DataObject or a MDB2 query and handle all of the paging and sorting code for you, resulting in very few lines of code that you will need to write.

How to use the drivers

There are two methods intended to be used for binding a DataSource driver: bind() and bindDataSource().

The bind() method is able to autodetect the right driver in many cases. For example, you can pass DB_Table or DB_DataObject instances to it. Strings can't be autodetected because they could contain CSV or XML data, for example. In such cases, you can specify the type as the third parameter in the bind() method call (e.g. 'CSV' or 'XML').

If you are building your own custom DataSource driver, using bindDataSource() is the method of choice. Just instantiate your DataSource class and pass this instance to the bindDataSource() method.

Currently available DataSource drivers

A list with the currently available DataSources can be found on the overview page.

Please also note the following FAQ entry: Which DataSource drivers are recommended?

Rendering the output

Rendering the output -- What formats can I render the output?

Description

The DataGrid offers the ability to build out your data in a grid format in an HTML table, which is the most common method due to the nature of PHP. However, the DataGrid offers many other ways of outputting the tabular data structure such as an Excel spreadsheet or an XML document.

How do I change the renderer?

To use a different renderer other than the HTML_Table renderer, you can specify the name of the renderer (e.g. 'CSV', 'Pager' or 'XML') as the first parameter of the fill(), getOutput(), and render() methods. Another possibility is to use setRenderer() method. The old way of using the third parameter of the constructor to define the renderer is deprecated since version 0.7.0.

Currently available renderers

A list with the currently available renderers can be found on the overview page.

Streaming

Streaming -- How to stream large recordsets

Description

Large recordsets can exceed PHP's memory limit. Structures_DataGrid offers streaming support with many DataSource drivers and some Renderer drivers to avoid problems with the memory limit.

How do I use streaming?

Streaming can be enabled by calling the enableStreaming() method of the Structures_DataGrid object. An optimal parameter allows to set the number of records that should be read and written on each stream iteration. The default buffer size is 500 records.

Once streaming is enabled, only up to the number of records specified in the buffer size records will be fetched and rendered. This will be repeated until this was done for all records.

Driver support for streaming

Although streaming can be used with every DataSource driver, only the following drivers support streaming in a meaningful way: DataObject, DBQuery, DB_Table and MDB2. Streaming support is planned to be added also to the CSV and XML DataSources.

Streaming support is also compatible with every Renderer driver but can currently be used only with CSV and XML Renderers in a meaningful way. Other Renderers might be rewritten in the future for streaming support.

Column Formatter

Column Formatter -- What can I do with the column formatter?

Description

The column formatter method can be a very powerful solution to a very common need. The need is to customize the output for a cell in the grid such as a link for a form element. This can be easily done by specifying a "callback" function. This function will then return the string that is needed to be printed.

Each callback function needs to accept at least one parameter ($params in the example above). This parameter will contain various information:

  • 'record': An array containing the complete current record

  • 'fieldName': The field name of the current column

  • 'columnName': The column name of the current column

  • 'orderBy': The 'orderBy' argument of the current column

  • 'attribs': The attributes of the current column

  • 'currRow': The number of the current row

  • 'currCol': The number of the current column

An optional second parameter ($args in the example) allows you to pass additional information to the callback functions. In the example above, an array with length information is passed when the callback function printDesc() is called for the description column. Please note that this second parameter is only passed when you specify something in the column constructor. Therefore, it is a good practice to use $args = array() in the parameter list of your callback functions.

Example - Quick

Example - Quick -- Quickly retrieve data from a database table

Description

Binding an SQL query

To retrieve the data that the datagrid will display you can begin by passing a simple SQL statement to the bind() method.

If you are familiar with the SQL language you'll certainly find many ways to adapt the above example to your needs, using more complex queries.

You can also page through your dataset with the automatic paging feature as shown below. This feature transparently adds LIMIT clauses to your SQL statement, providing optimized database access.

Example - Complex

Example - Complex -- How to build a datagrid using many of the features

Description

An interface to a User Management System

This example will show you how to create an interface to a User Management System using the DB_DataObject package to handle the database aspects of this example.

Example 60-1. User Management System Example

<?php
require_once 'Structures/DataGrid.php';
require_once 'HTML/Table.php';
require_once 'myclasses/User.php';

// Instantiate the DataObject; that's our DataSource container
$user = new User_DataObject();

// Create the DataGrid, and bind the DataSource container 
$datagrid =& new Structures_DataGrid(20); // Display 20 records per page
$test = $datagrid->bind($user);
if (PEAR::isError($test)) {
    echo $test->getMessage(); 
}

// Specify how the DataGrid should be sorted by default
$datagrid->setDefaultSort(array('lname' => 'ASC'));

// Define columns
$datagrid->addColumn(new Structures_DataGrid_Column(null, null, null, array('width' => '10'), null, 'printCheckbox()'));
$datagrid->addColumn(new Structures_DataGrid_Column('Name', null, 'lname', array('width' => '40%'), null, 'printFullName()'));
$datagrid->addColumn(new Structures_DataGrid_Column('Username', 'username', 'username', array('width' => '20%')));
$datagrid->addColumn(new Structures_DataGrid_Column('Role', null, null, array('width' => '20%'), null, 'printRoleSelector()'));
$datagrid->addColumn(new Structures_DataGrid_Column('Edit', null, null, array('width' => '20%'), null, 'printEditLink()'));

// Define the Look and Feel
$tableAttribs = array(
    'width' => '100%',
    'cellspacing' => '0',
    'cellpadding' => '4',
    'class' => 'datagrid'
);
$headerAttribs = array(
    'bgcolor' => '#CCCCCC'
);
$evenRowAttribs = array(
    'bgcolor' => '#FFFFFF'
);
$oddRowAttribs = array(
    'bgcolor' => '#EEEEEE'
);
$rendererOptions = array(
    'sortIconASC' => '&uArr;',
    'sortIconDESC' => '&dArr;'
);

// Create a HTML_Table
$table = new HTML_Table($tableAttribs);
$tableHeader =& $table->getHeader();
$tableBody =& $table->getBody();

// Ask the DataGrid to fill the HTML_Table with data, using rendering options
$test = $datagrid->fill($table, $rendererOptions);
if (PEAR::isError($test)) {
    echo $test->getMessage(); 
}


// Set attributes for the header row
$tableHeader->setRowAttributes(0, $headerAttribs);

// Set alternating row attributes
$tableBody->altRowAttributes(0, $evenRowAttribs, $oddRowAttribs, true);

// Output table and paging links
echo $table->toHtml();

// Display paging links
$test = $datagrid->render(DATAGRID_RENDER_PAGER);
if (PEAR::isError($test)) {
    echo $test->getMessage(); 
}


function printCheckbox($params)
{
    extract($params);
    return '<input type="checkbox" name="idList[]" value="' . $record['id'] . '">';
}
function printFullName($params)
{
    extract($params);
    return $record['fname'] . ' ' . $record['lname'];
}
function printRoleSelector($params)
{
    global $roleList;

    extract($params);
    
    $html = '<select name="role_id">';
    foreach ($roleList as $roleId => $roleName) {
        $html .= "<option value=\"$roleId\">$roleName</option>\n";
    }
    $html .= '</select>';
    
    return $html;
}
function printEditLink($params)
{
    extract($params);
    return '<a href="edit.php?id=' . $record['id'] . '">Edit</a>';
}
?>

Custom DataSources

Custom DataSources --  How to write your own DataSource driver.

Introduction

Writing your own DataSource driver is the way to go when none of the existing driver suit your needs. It is actually pretty easy, and allows for great flexibility.

Of course, if you're trying to fetch data from an exotic source, writing your own driver is required. But, sometimes it's also the best way to achieve the best optimization, especially (but not only) with databases.

This document will present you the DataSource interface, and how to implement it.

Definitions

A DataSource driver is a descendent of the Structures_DataGrid_DataSource class, which implements the DataSource interface.

DataSource is a synomym for DataSource driver.

The DataSource interface consists in a set of methods that drivers must or may overload and protected properties that drivers can use, as well as recommended practices.

A DataSource container is a constant or a variable of any type (string, array, object, etc...) that either contains data or describes how to retrieve data.

Every DataSource driver is specific to, and knows how to handle, a given DataSource container type.

The DataSource interface

Properties available to drivers

array $_options - Data binding options as an associative array. You can read the content of this property but you shouldn't change it directly.

Testing your driver

Before going live, it is very recommended to test your driver with the dump() method.

That should output a nicely formated ascii table like:

There are 23 cats in the farm.

Here are the 5 lightest ones:
+---------+---------+-----------+--------+
| name    | species | birthDate | weight |
+---------+---------+-----------+--------+
| sarge   | cat     | 20021220  | 1.8    |
| etch    | cat     | 20000509  | 2.5    |
| potato  | cat     | 19980128  | 3.8    |
| sid     | cat     | 20011101  | 4.1    |
| woody   | cat     | 19970712  | 6.0    |
+---------+---------+-----------+--------+

Using your new driver

Okay, so you have written a driver that's tailored to your needs, and tested it. It is now time to connect it to Structures_DataGrid.

For this purpose we're going to use the bindDataSource() method.

That should output a sortable HTML table.

Of course, the usual features of Structures_DataGrid are now available to you: paging, other output formats as XML, MS-Excel, etc...

Custom Renderers

Custom Renderers --  How to write your own Rendering driver.

Introduction

Writing your own Renderer allows you to fine tune every aspect of Structures_DataGrid output.

You may need to output the datagrid in a completely unsupported format. Then writing your own Renderer is the only option

But you may also need a unsupported variant of an existing renderer, say, for example, a very specific HTML output. In this case, you generally have two options : either writing a Rendering driver from scratch, or customizing (subclassing) an existing one.

This document will present you the Rendering driver interface, and how to implement it. You will certainly see how flexible Structures_DataGrid can become with custom Renderers, but also how easy we have to tried to make this process.

Definitions

A Rendering driver is a descendent of the Structures_DataGrid_Renderer class, which implements the Renderer interface.

Renderer is a synomym for Rendering driver.

The Renderer interface consists in a set of methods that drivers must or may overload and protected properties that drivers can use, as well as recommended practices.

A Rendering container is either an object that contain a sort of rendering engine, or a variable of any type (string, array, object, etc...) that can contain the output of a Renderer.

A Renderer with Container Support driver is specific to, and knows how to handle, a given type of Rendering container.

A driver is said to provide Container Support when it is able to handle a given type of Rendering container. Drivers with Container Support must implement the setContainer() and getContainer() public methods. They must be able to use a Rendering container provided by the user with setContainer(). They must also be able to create and intialize a Rendering container if the user does not provide any.

A driver is said to provide Output Buffering when it buffers the output that it generates, implements the flatten() method and is able to return the generated output from flatten().

A Direct Rendering driver is the simplest form of Renderer. It directs all of its output to standard output. By definition, a such driver neither provide Container support nor Output Buffering

The Renderer interface

Protected properties available to drivers

All of the following properties are read-only : drivers can access their content but must not change it directly.

array $_options -Common and driver-specific options

array $_columns - Columns fields names and labels

int $_columnsNum - Number of columns

array $_records - Records content

int $_recordsNum - Number of records in the current page

int $_totalRecordsNum - Total number of records as reported by the datasource

int $_firstRecord - First record number (starting from 1), in the current page

int $_lastRecord - Last record number (starting from 1), in the current page

int $_page - Current page number (starting from 1)

int $_pageLimit - Number of records per page

int $_pagesNum - Number of pages

string $_requestPrefix - GET/POST/Cookie parameters prefix

array $_currentSort - Fields/directions the data is currently sorted by

array $_sortableFields - Which fields the datagrid may be sorted by

A simple driver

Soon

Testing your driver

Soon

Using your new driver

Soon


Class Structures_DataGrid

Table of Contents
constructor Structures_DataGrid::Structures_DataGrid() -- Constructor
Structures_DataGrid::addColumn() -- Add a column, with optional position
Structures_DataGrid::attachRenderer() -- Attach an already instantiated Rendering driver
Structures_DataGrid::bind() -- A simple way to add a record set to the datagrid
Structures_DataGrid::bindDataSource() -- Bind an already instantiated DataSource driver
Structures_DataGrid::build() -- Build the datagrid
Structures_DataGrid::dataSourceFactory() -- Datasource driver Factory
Structures_DataGrid::dump() --  Method used for debugging purposes only. Displays a dump of the DataGrid object.
Structures_DataGrid::enableStreaming() --  Enable streaming support for reading from DataSources and writing with Renderers and set the buffer size (number of records)
Structures_DataGrid::fill() -- Fill a rendering container with data
Structures_DataGrid::generateColumns() -- Generate columns from a fields list
Structures_DataGrid::getColumnByField() -- Find a column by field name
Structures_DataGrid::getColumnByName() -- Find a column by name (label)
Structures_DataGrid::getColumnCount() -- Returns the number of columns
Structures_DataGrid::getColumns() -- Return the current columns
Structures_DataGrid::getCurrentPage() -- Retrieves the current page number when paging is implemented
Structures_DataGrid::getCurrentRecordNumberEnd() -- Returns the number of the last record of the current page
Structures_DataGrid::getCurrentRecordNumberStart() -- Returns the number of the first record of the current page
Structures_DataGrid::getDataSource() -- Get the currently loaded DataSource driver
Structures_DataGrid::getOutput() -- Return the datagrid output
Structures_DataGrid::getPageCount() -- Returns the total number of pages
Structures_DataGrid::getRecordCount() -- Returns the total number of records
Structures_DataGrid::getRenderer() -- Get the current or default Rendering driver
Structures_DataGrid::removeColumn() -- Remove a column
Structures_DataGrid::render() -- Render the datagrid
Structures_DataGrid::setCurrentPage() -- Define the current page number.
Structures_DataGrid::setDataSourceOption() -- Set a single datasource option
Structures_DataGrid::setDataSourceOptions() -- Set multiple datasource options
Structures_DataGrid::setDefaultSort() -- Set default sorting specification
Structures_DataGrid::setRenderer() -- Set Renderer
Structures_DataGrid::setRendererOption() -- Set a single renderer option
Structures_DataGrid::setRendererOptions() -- Set multiple renderer options
Structures_DataGrid::setRequestPrefix() -- Set the global GET/POST variables prefix
Structures_DataGrid::setUrlFormat() -- Enable and configure URL mapping
Structures_DataGrid::sortRecordSet() -- Sorts the records by the defined field.

constructor Structures_DataGrid::Structures_DataGrid()

constructor Structures_DataGrid::Structures_DataGrid()  -- Constructor

Description

Builds the DataGrid class. The Core functionality and Renderer are seperated for maintainability and to keep cohesion high.

Parameter

string $limit

The number of records to display per page.

integer $page

The current page viewed. In most cases, this is useless. Note: if you specify this, the "page" GET variable will be ignored.

string $rendererType

The type of renderer to use. You may prefer to use the $type argument of render() , fill() or getOutput()

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::addColumn()

Structures_DataGrid::addColumn()  -- Add a column, with optional position

Description

This package is not documented yet.

Parameter

&$column

string $position

One of: "last", "first", "after" or "before" (default: "last")

string $relativeTo

The name (label) or field name of the relative column, if $position is "after" or "before"

object $column

The Structures_DataGrid_Column object (reference to)

Return value

returns PEAR_Error on failure, void otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::attachRenderer()

Structures_DataGrid::attachRenderer()  -- Attach an already instantiated Rendering driver

Description

This package is not documented yet.

Parameter

&$renderer

object $renderer

Driver object, subclassing Structures_DataGrid_Renderer

Return value

returns Renderer instance or a PEAR_Error object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::bind()

Structures_DataGrid::bind()  -- A simple way to add a record set to the datagrid

Description

This package is not documented yet.

Parameter

mixed $container

The record set in any of the supported data source types

array $options

Optional. The options to be used for the data source

string $type

Optional. The data source type

Return value

returns True if successful, otherwise PEAR_Error.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::bindDataSource()

Structures_DataGrid::bindDataSource()  -- Bind an already instantiated DataSource driver

Description

This package is not documented yet.

Parameter

mixed &$source

The data source driver object

Return value

returns True if successful, otherwise PEAR_Error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::build()

Structures_DataGrid::build()  -- Build the datagrid

Description

This package is not documented yet.

Return value

returns Either true or a PEAR_Error object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::dataSourceFactory()

Structures_DataGrid::dataSourceFactory()  -- Datasource driver Factory

Description

A clever method which loads and instantiate data source drivers.

Can be called in various ways:

Detect the source type and load the appropriate driver with default options:
$driver =& Structures_DataGrid::dataSourceFactory($source);

Detect the source type and load the appropriate driver with custom options:
$driver =& Structures_DataGrid::dataSourceFactory($source, $options);

Load a driver for an explicit type (faster, bypasses detection routine):
$driver =& Structures_DataGrid::dataSourceFactory($source, $options, $type);

Parameter

mixed $source

The data source respective to the driver

array $options

An associative array of the form: array(optionName => optionValue, ...)

string $type

The data source type constant (of the form DATAGRID_SOURCE_*)

Return value

returns driver object or PEAR_Error on failure

Throws

throws no exceptions thrown

See

see Structures_DataGrid::_detectSourceType()

Note

This function can not be called statically.

Structures_DataGrid::dump()

Structures_DataGrid::dump()  --  Method used for debugging purposes only. Displays a dump of the DataGrid object.

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::enableStreaming()

Structures_DataGrid::enableStreaming()  --  Enable streaming support for reading from DataSources and writing with Renderers and set the buffer size (number of records)

Description

This package is not documented yet.

Parameter

integer $bufferSize

Number of records that should be buffered

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::fill()

Structures_DataGrid::fill()  -- Fill a rendering container with data

Description

This package is not documented yet.

Parameter

object &$container

A rendering container of any of the supported types (example: an HTML_Table object, a Spreadsheet_Excel_Writer object, etc...)

array $options

Options for the corresponding rendering driver

string $type

Explicit type in case the container type can't be detected

Return value

returns Either true or a PEAR_Error object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::generateColumns()

Structures_DataGrid::generateColumns()  -- Generate columns from a fields list

Description

This is a shortcut for adding simple columns easily, instead of creating them manually and calling addColumn() for each.

The generated columns are appended to the current column set.

Parameter

array $fields

Fields and labels. Array of the form: array(field => label, ...) The default is an empty array, which means: all fields fetched from the datasource

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getColumnByField()

Structures_DataGrid::getColumnByField()  -- Find a column by field name

Description

This package is not documented yet.

Parameter

string $fieldName

The field name of the column to look for

Return value

returns the column object (reference to) or false if there is no such column

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getColumnByName()

Structures_DataGrid::getColumnByName()  -- Find a column by name (label)

Description

This package is not documented yet.

Parameter

string $name

The name (label) of the column to look for

Return value

returns the column object (reference to) or false if there is no such column

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getColumnCount()

Structures_DataGrid::getColumnCount()  -- Returns the number of columns

Description

This package is not documented yet.

Return value

returns the number of columns

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getColumns()

Structures_DataGrid::getColumns()  -- Return the current columns

Description

This package is not documented yet.

Return value

returns Structures_DataGrid_Column objects (references to). This is a numerically indexed array (starting from 0).

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getCurrentPage()

Structures_DataGrid::getCurrentPage()  -- Retrieves the current page number when paging is implemented

Description

This package is not documented yet.

Return value

returns the current page number

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getCurrentRecordNumberEnd()

Structures_DataGrid::getCurrentRecordNumberEnd()  -- Returns the number of the last record of the current page

Description

This package is not documented yet.

Return value

returns the number of the last record currently shown

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getCurrentRecordNumberStart()

Structures_DataGrid::getCurrentRecordNumberStart()  -- Returns the number of the first record of the current page

Description

This package is not documented yet.

Return value

returns the number of the first record currently shown, or: 0 if there are no records, 1 if there is no row limit

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getDataSource()

Structures_DataGrid::getDataSource()  -- Get the currently loaded DataSource driver

Description

Retrieves the DataSource object as a reference

Return value

returns object reference or null if no driver is loaded

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getOutput()

Structures_DataGrid::getOutput()  -- Return the datagrid output

Description

This package is not documented yet.

Parameter

integer $type

Renderer type (optional)

array $options

An associative array of the form: array(optionName => optionValue, ...)

Return value

returns The datagrid output (Usually a string: HTML, CSV, etc...) or a PEAR_Error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getPageCount()

Structures_DataGrid::getPageCount()  -- Returns the total number of pages

Description

This package is not documented yet.

Return value

returns the total number of pages or 1 if there are no records or if there is no row limit

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getRecordCount()

Structures_DataGrid::getRecordCount()  -- Returns the total number of records

Description

This package is not documented yet.

Return value

returns the total number of records

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::getRenderer()

Structures_DataGrid::getRenderer()  -- Get the current or default Rendering driver

Description

Retrieves the renderer object as a reference

Return value

returns object reference

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::removeColumn()

Structures_DataGrid::removeColumn()  -- Remove a column

Description

This package is not documented yet.

Parameter

&$column

object $column

The Structures_DataGrid_Column object (reference to)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::render()

Structures_DataGrid::render()  -- Render the datagrid

Description

You can call this method several times with different renderers.

Parameter

mixed $renderer

Renderer type or instance (optional)

array $options

An associative array of the form: array(optionName => optionValue, ...)

Return value

returns True or PEAR_Error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setCurrentPage()

Structures_DataGrid::setCurrentPage()  -- Define the current page number.

Description

This method is used when paging is implemented

Parameter

mixed $page

The current page number (as string or int).

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setDataSourceOption()

Structures_DataGrid::setDataSourceOption()  -- Set a single datasource option

Description

This package is not documented yet.

Parameter

string $name

Option name

mixed $value

Option value

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setDataSourceOptions()

Structures_DataGrid::setDataSourceOptions()  -- Set multiple datasource options

Description

This package is not documented yet.

Parameter

array $options

An associative array of the form: array("option_name" => "option_value",...)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setDefaultSort()

Structures_DataGrid::setDefaultSort()  -- Set default sorting specification

Description

If there is no sorting query in the HTTP request, and if the sortRecordSet() method is not called, then the specification passed to setDefaultSort() will be used.

This is especially useful if you want the data to already be sorted when a user first see the datagrid.

This method needs to be called before bind().

Parameter

array $sortSpec

Sorting specification Structure: array(fieldName => direction, ...)

Return value

returns Either true or a PEAR_Error object

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setRenderer()

Structures_DataGrid::setRenderer()  -- Set Renderer

Description

Defines which renderer to be used by the DataGrid based on given $type and $options. To attach an existing renderer instance, use attachRenderer() instead.

Parameter

string $type

The defined renderer string

array $options

Rendering options

Return value

returns Renderer instance or PEAR_Error

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setRendererOption()

Structures_DataGrid::setRendererOption()  -- Set a single renderer option

Description

This package is not documented yet.

Parameter

string $name

Option name

mixed $value

Option value

boolean $common

Whether to use this option for all renderers (TRUE) or only for the current one (FALSE)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setRendererOptions()

Structures_DataGrid::setRendererOptions()  -- Set multiple renderer options

Description

This package is not documented yet.

Parameter

array $options

An associative array of the form: array("option_name" => "option_value",...)

boolean $common

Whether to use these options for all renderers (TRUE) or only for the current one (FALSE)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setRequestPrefix()

Structures_DataGrid::setRequestPrefix()  -- Set the global GET/POST variables prefix

Description

If you need to change the request variables, you can define a prefix. This is extra useful when using multiple datagrids.

This methods need to be called before bind().

Parameter

string $prefix

The prefix to use on request variables;

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid::setUrlFormat()

Structures_DataGrid::setUrlFormat()  -- Enable and configure URL mapping

Description

If this is set, it will be parsed instead of GET/POST. This is only supported on PHP5, as it depends on Net_URL_Mapper.

There are three possible placeholders, :pager, :orderBy and :direction. :page or (:orderBy and :direction) can be used alone.

It is possible to use multipe DataGrid instances on one page with different prefixes.

Instead of a format string you might also pass a Net_URL_Mapper instance to this method, in which case $prefix and $scriptname will be ignored. This instance must be properly set up, connected to url patterns, etc... This is especially useful when you've already configured URL mapping globally for your application and want Structures_DataGrid to integrate.

Parameter

mixed $format

The URL format string or a Net_URL_Mapper instance

string $prefix

Sets the url prefix

string $scriptname

Set the scriptname if mod_rewrite not available

Throws

throws Net_URL_Mapper_InvalidException

Note

This function can not be called statically.

Structures_DataGrid::sortRecordSet()

Structures_DataGrid::sortRecordSet()  -- Sorts the records by the defined field.

Description

Do not use this method if data is coming from a database as sorting is much faster coming directly from the database itself.

Parameter

array $sortSpec

Sorting specification Structure: array(fieldName => direction, ...)

string $direction

Deprecated. Put the direction(s) into $sortSpec

Throws

throws no exceptions thrown

Note

This function can not be called statically.


Class Structures_DataGrid_Column

Table of Contents
Class Summary Structures_DataGrid_Column -- Structures_DataGrid_Column Class
constructor Structures_DataGrid_Column::Structures_DataGrid_Column() -- Constructor
Structures_DataGrid_Column::format() -- Choose a format preset
Structures_DataGrid_Column::formatter() -- Formatter
Structures_DataGrid_Column::getAttributes() -- Get the column XML/HTML attributes
Structures_DataGrid_Column::getAutoFillValue() -- Get auto fill value
Structures_DataGrid_Column::getDefaultDirection() -- Return the default direction to order this column by
Structures_DataGrid_Column::getField() -- Get name of the field for the column to be mapped to
Structures_DataGrid_Column::getLabel() -- Get column label
Structures_DataGrid_Column::getOrderBy() -- Get the field name to order the data by
Structures_DataGrid_Column::setAttributes() -- Set the column XML/HTML attributes
Structures_DataGrid_Column::setAutoFillValue() -- Set auto fill value
Structures_DataGrid_Column::setDefaultDirection() -- Set the default direction to order this column by
Structures_DataGrid_Column::setField() -- Set name of the field for the column to be mapped to
Structures_DataGrid_Column::setFormatter() -- Set Formatter Callback
Structures_DataGrid_Column::setLabel() -- Set column label
Structures_DataGrid_Column::setOrderBy() -- Set the field name to order the data by

Class Summary Structures_DataGrid_Column

Class Summary Structures_DataGrid_Column -- Structures_DataGrid_Column Class

Structures_DataGrid_Column Class

This class represents a single column for the DataGrid.

Class Trees for Structures_DataGrid_Column

  • Structures_DataGrid_Column

constructor Structures_DataGrid_Column::Structures_DataGrid_Column()

constructor Structures_DataGrid_Column::Structures_DataGrid_Column()  -- Constructor

Description

Creates default table style settings

Parameter

string $label

The label of the column to be printed

string $field

The name of the field for the column to be mapped to

string $orderBy

The field or expression to order the data by

array $attributes

The attributes for the XML or HTML TD tag; form: array(name => value, ...)

string $autoFillValue

The value to use for the autoFill

mixed $formatter

Formatter callback. See setFormatter()

array $formatterArgs

Associative array of arguments passed as second argument to the formatter callback

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::format()

Structures_DataGrid_Column::format()  -- Choose a format preset

Description

EXPERIMENTAL: the behaviour of this method may change in future releases.

This method allows to associate an "automatic" predefined formatter to the column, for common needs as formatting dates, numbers, ...

The currently supported predefined formatters are :

  • dateFromTimestamp: format a UNIX timestamp according to the date()-like format string passed as second argument

  • dateFromMysql : format a MySQL DATE, DATETIME, or TIMESTAMP MySQL according to the date() like format string passed as second argument

  • number: format a number, according to the same optional 2nd, 3rd and 4th arguments that the number_format() PHP function accepts.

  • printf: format using the printf expression passed as 2nd argument.

  • printfURL: url-encode and format using the printf expression passed as 2nd argument

Parameter

$type

mixed $type,...

Predefined formatter name, followed by formatter-specific parameters

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::formatter()

Structures_DataGrid_Column::formatter()  -- Formatter

Description

This method is not meant to be called by user-space code.

Calls a predefined function to develop custom output for the column. The defined function can accept parameters so that each cell in the column can be unique based on the record. The function will also automatically receive the record array as a parameter. All parameters passed into the function will be in one array.

Parameter

$record

$row

$col

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::getAttributes()

Structures_DataGrid_Column::getAttributes()  -- Get the column XML/HTML attributes

Description

Return the attributes applied to all cells in this column. This only makes sense for HTML or XML rendering

Return value

returns Attributes; form: array(name => value, ...)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::getAutoFillValue()

Structures_DataGrid_Column::getAutoFillValue()  -- Get auto fill value

Description

Returns the value to be printed if a cell in the column is null.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::getDefaultDirection()

Structures_DataGrid_Column::getDefaultDirection()  -- Return the default direction to order this column by

Description

This package is not documented yet.

Parameter

$str

Return value

returns "ASC" or "DESC"

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::getField()

Structures_DataGrid_Column::getField()  -- Get name of the field for the column to be mapped to

Description

Returns the name of the field for the column to be mapped to

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::getLabel()

Structures_DataGrid_Column::getLabel()  -- Get column label

Description

The label is the text rendered into the column header.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::getOrderBy()

Structures_DataGrid_Column::getOrderBy()  -- Get the field name to order the data by

Description

This package is not documented yet.

Return value

returns field name

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setAttributes()

Structures_DataGrid_Column::setAttributes()  -- Set the column XML/HTML attributes

Description

Set the attributes to be applied to all cells in this column. This only makes sense for HTML or XML rendering

Parameter

array $attributes

form: array(name => value, ...)

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setAutoFillValue()

Structures_DataGrid_Column::setAutoFillValue()  -- Set auto fill value

Description

Defines a value to be printed if a cell in the column is null.

Parameter

string $str

The value to use for the autoFill

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setDefaultDirection()

Structures_DataGrid_Column::setDefaultDirection()  -- Set the default direction to order this column by

Description

This package is not documented yet.

Parameter

string $str

"ASC" or "DESC"

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setField()

Structures_DataGrid_Column::setField()  -- Set name of the field for the column to be mapped to

Description

Defines the name of the field for the column to be mapped to

Parameter

string $str

The name of the field for the column to be mapped to

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setFormatter()

Structures_DataGrid_Column::setFormatter()  -- Set Formatter Callback

Description

Define a formatting callback function with optional arguments for this column.

The callback function receives the following array as its first argument:
array(
   'record' => associative array of all fields values for this record,
   'fieldName' => the field name of this column,
   'columnName' => the label (header) of this column,
   'orderBy' => the field name to sort this column by,
   'attribs' => this column's attributes,
   'currRow' => zero-based row index,
   'currCol' => zero-based column index,
 );

If you pass the optional $arguments parameter to setFormatter(), the callback function will receive it as its second argument.

Parameter

mixed $formatter

Callback PHP pseudo-type (Array or String)

array $arguments

Associative array of parameters passed to as second argument to the callback function

Return value

returns PEAR_Error on failure

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setLabel()

Structures_DataGrid_Column::setLabel()  -- Set column label

Description

The label is the text rendered into the column header.

Parameter

string $str

Column label

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Structures_DataGrid_Column::setOrderBy()

Structures_DataGrid_Column::setOrderBy()  -- Set the field name to order the data by

Description

This package is not documented yet.

Parameter

string $str

field name

Throws

throws no exceptions thrown

Note

This function can not be called statically.


DataSource drivers

Table of Contents
Structures_DataGrid_DataSource_Array -- Array Data Source Driver
Structures_DataGrid_DataSource_CSV -- Comma Seperated Value (CSV) Data Source Driver
Structures_DataGrid_DataSource_DataObject -- PEAR::DB_DataObject Data Source Driver
Structures_DataGrid_DataSource_DB -- PEAR::DB Data Source Driver
Structures_DataGrid_DataSource_DBQuery -- PEAR::DB SQL Query Data Source Driver
Structures_DataGrid_DataSource_DBTable -- PEAR::DB_Table Data Source Driver
Structures_DataGrid_DataSource_Excel -- Excel Spreadsheet Data Source Driver
Structures_DataGrid_DataSource_MDB2 -- PEAR::MDB2 SQL Query Data Source Driver
Structures_DataGrid_DataSource_PDO -- PDO SQL Query Data Source Driver
Structures_DataGrid_DataSource_RSS -- RSS data source driver
Structures_DataGrid_DataSource_XML -- XML DataSource driver

Structures_DataGrid_DataSource_Array

Structures_DataGrid_DataSource_Array -- Array Data Source Driver

Description

This class is a data source driver for a 2D array

General notes

This driver expects an array of the following form:
$data = array(0 => array('col0' => 'val00', 'col1' => 'val01', ...),
              1 => array('col0' => 'val10', 'col1' => 'val11', ...),
              ...
             );

The first level of this array contains one entry for each row. For every row entry an array with the data for this row is expected. Such an array contains the field names as the keys. For example, 'val01' is the value of the column with the field name 'col1' in the first row. Row numbers start with 0, not with 1.

Structures_DataGrid_DataSource_CSV

Structures_DataGrid_DataSource_CSV -- Comma Seperated Value (CSV) Data Source Driver

Description

This class is a data source driver for a CSV File. It will also support any other delimiter.

Structures_DataGrid_DataSource_DataObject

Structures_DataGrid_DataSource_DataObject -- PEAR::DB_DataObject Data Source Driver

Description

This class is a data source driver for a PEAR::DB::DB_DataObject object

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
fieldsarrayWhich data fields to fetch from the datasource. An empty array means: all fields. Form: array(field1, field2, ...)array()
fields_order_propertystringThe name of a property that you can set within your DataObject. It will be used to set the order in which fields are displayed, as long as you're not configuring this by adding/generating columns. Also requires the fields_property to be set.null
fields_propertystringThe name of a property that you can set within your DataObject. This property is expected to contain the same kind of information as the 'fields' option. If the 'fields' option is set, this one will not be used.'fb_fieldsToRender'
formbuilder_integrationboolDEPRECATED: use link_level and fields_order_property instead. For BC, Setting this to true is equivalent to setting link_level to 3 and fields_order_property to 'fb_preDefOrder'.false
generate_columnsboolGenerate Structures_DataGrid_Column objects with labels. See the 'labels' option. DEPRECATED: use Structures_DataGrid::generateColumns() insteadfalse
labelsarrayData field to column label mapping. Only used when 'generate_columns' is true. Form: array(field => label, ...) DEPRECATED: use Structures_DataGrid::generateColumns() insteadarray()
labels_propertystringThe name of a property that you can set within your DataObject. This property should contain the same kind of information as the 'labels' option. If the 'labels' option is set, this one will not be used.'fb_fieldLabels'
link_keep_keyboolSet this to true when you want to keep the original values (usually foreign keys) of fields which are being replaced by their linked values. The record will then contain additional keys with "__key" prepended. This option only makes sense with link_level higher than 0. Example: if the country_code original value is 'FR' and this is replaced by "France" from the linked country table, then setting link_keep_key to true will keep the "FR" value in country_code__key.false
link_levelintThe maximum link display level. If equal to 0 the links will not be followed.0
link_propertystringThe name of a property you can set within a linked DataObject. This property should contain a array of field names that will be used to display a string out of this linked DataObject. Has no effect when link_level is 0.'fb_linkDisplayFields'
primaryKeyarrayName(s), or numerical index(es) of the field(s) which contain a unique record identifier (only use several fields in case of a multiple-fields primary key)null
raw_countboolIf true: query all the records in order to count them. This is needed when records are grouped (GROUP BY, DISTINCT, etc..), but might be heavy. If false: perform a smart count query with DB_DataObject::count().false
return_objectsboolIf true, the returned records will consists of clones of the dataobject instead of associative arrays. This is especially useful when used in conjunction with the smarty renderer for example, to directly access the dataobject properties and methods from your templates.false
sort_propertystringThe name of a property that you can set within your DataObject. This property should contain an array of the form: array("field1", "field1 DESC", ...) If the data is already being sorted then this this property's content will be appended to the current ordering.'fb_linkOrderFields'

Structures_DataGrid_DataSource_DB

Structures_DataGrid_DataSource_DB -- PEAR::DB Data Source Driver

Description

This class is a data source driver for the PEAR::DB::DB_Result object

Structures_DataGrid_DataSource_DBQuery

Structures_DataGrid_DataSource_DBQuery -- PEAR::DB SQL Query Data Source Driver

Description

This class is a data source driver for the PEAR::DB object

General notes

You need to specify either a DB instance or a DB compatible dsn string as an option to use this driver.

If you use complex queries (e.g. with complex joins or with aliases), $datagrid->getRecordCount() might return a wrong result. For the case of GROUP BY, UNION, or DISTINCT in your queries, and for the case of subqueries, this driver already has special handling. However, if you observe wrong record counts, you need to specify a special query that returns only the number of records (e.g. 'SELECT COUNT(*) FROM ...') as an additional option 'count_query' to the bind() call.

You can specify an ORDER BY statement in your query. Please be aware that this sorting statement is then used in *every* query before the sorting options that come from a renderer (e.g. by clicking on the column header when using the HTML_Table renderer which is sent in the HTTP request). If you want to give a default sorting statement that is only used if there is no sorting query in the HTTP request, then use $datagrid->setDefaultSort().

Structures_DataGrid_DataSource_DBTable

Structures_DataGrid_DataSource_DBTable -- PEAR::DB_Table Data Source Driver

Description

This class is a data source driver for the PEAR::DB_Table object

General notes

If you use aliases in the select part of your view, the count() method from DB_Table and, therefore, $datagrid->getRecordCount() might return a wrong result. To avoid this, DB_Table uses a special query for counting if it is given via a view that needs to be named as '__count_' followed by the name of the view that this counting view belongs to. (For example: if you have a view named 'all', the counting view needs to be named as '__count_all'.)

To use update() and delete() methods, it is required that the indexes are properly defined in the $idx array in your DB_Table subclass. If you have, for example, created your database table yourself and did not setup the $idx array, you can use the 'primaryKey' option to define the primary key field.

Structures_DataGrid_DataSource_Excel

Structures_DataGrid_DataSource_Excel -- Excel Spreadsheet Data Source Driver

Description

This class is a data source driver for an Excel spreadsheet.

General notes

Spreadsheet_Excel_Reader ("PHP-ExcelReader") is not available as a PEAR package. It is available on SourceForge.net: http://sourceforge.net/projects/phpexcelreader/

This class expects the file reader.php in the directory Spreadsheet/Excel/.

Please note that the current version (2i) of Spreadsheet_Excel_Reader contains a die() statement in the read() method in reader.php (line 171). This makes a reasonable PEAR error handling for the "file not found" error impossible.

It is therefore recommended that you replace the die() statement by something like this:
return PEAR::raiseError('The filename ' . $sFileName . ' is not readable');
This class is optimized for the changed code (but will work also with the die() in the reader class, of course), and provides then a reasonable error handling.

Structures_DataGrid_DataSource_MDB2

Structures_DataGrid_DataSource_MDB2 -- PEAR::MDB2 SQL Query Data Source Driver

Description

This class is a data source driver for the PEAR::MDB2 object

General notes

You need to specify either a MDB2 instance or a MDB2 compatible dsn string as an option to use this driver.

If you use complex queries (e.g. with complex joins or with aliases), $datagrid->getRecordCount() might return a wrong result. For the case of GROUP BY, UNION, or DISTINCT in your queries, and for the case of subqueries, this driver already has special handling. However, if you observe wrong record counts, you need to specify a special query that returns only the number of records (e.g. 'SELECT COUNT(*) FROM ...') as an additional option 'count_query' to the bind() call.

You can specify an ORDER BY statement in your query. Please be aware that this sorting statement is then used in *every* query before the sorting options that come from a renderer (e.g. by clicking on the column header when using the HTML_Table renderer which is sent in the HTTP request). If you want to give a default sorting statement that is only used if there is no sorting query in the HTTP request, then use $datagrid->setDefaultSort().

Structures_DataGrid_DataSource_PDO

Structures_DataGrid_DataSource_PDO -- PDO SQL Query Data Source Driver

Description

This class is a data source driver for PHP Data Objects

General notes

You need to specify either a PDO instance or a PDO compatible dsn string as an option to use this driver.

If you use complex queries (e.g. with complex joins or with aliases), $datagrid->getRecordCount() might return a wrong result. For the case of GROUP BY, UNION, or DISTINCT in your queries, and for the case of subqueries, this driver already has special handling. However, if you observe wrong record counts, you need to specify a special query that returns only the number of records (e.g. 'SELECT COUNT(*) FROM ...') as an additional option 'count_query' to the bind() call.

You can specify an ORDER BY statement in your query. Please be aware that this sorting statement is then used in *every* query before the sorting options that come from a renderer (e.g. by clicking on the column header when using the HTML_Table renderer which is sent in the HTTP request). If you want to give a default sorting statement that is only used if there is no sorting query in the HTTP request, then use $datagrid->setDefaultSort().

Structures_DataGrid_DataSource_RSS

Structures_DataGrid_DataSource_RSS -- RSS data source driver

Structures_DataGrid_DataSource_XML

Structures_DataGrid_DataSource_XML -- XML DataSource driver

Description

This class is a DataSource driver for XML data. It accepts strings and filenames. An XPath expression can be specified to extract a subset from the given XML data.


Renderer drivers

Table of Contents
Structures_DataGrid_Renderer_CheckableHTMLTable -- HTML table rendering driver with a checkbox for each row of the grid
Structures_DataGrid_Renderer_Console -- Console Table Rendering Driver
Structures_DataGrid_Renderer_CSV -- CSV Rendering Driver
Structures_DataGrid_Renderer_Flexy -- Flexy Rendering Driver
Structures_DataGrid_Renderer_HTMLEditForm -- HTML form to edit a record
Structures_DataGrid_Renderer_HTMLSortForm -- Multiple fields sorting form rendering driver
Structures_DataGrid_Renderer_HTMLTable -- HTML Table Rendering Driver
Structures_DataGrid_Renderer_Pager -- Pager rendering driver
Structures_DataGrid_Renderer_Smarty -- Smarty Rendering Driver
Structures_DataGrid_Renderer_XLS -- Excel Spreadsheet Rendering Driver
Structures_DataGrid_Renderer_XML -- XML Rendering Driver
Structures_DataGrid_Renderer_XUL -- XUL Rendering Driver

Structures_DataGrid_Renderer_CheckableHTMLTable

Structures_DataGrid_Renderer_CheckableHTMLTable -- HTML table rendering driver with a checkbox for each row of the grid

Availability

This driver is experimental and has not been officially released yet. It is only available from CVS.

Description

Driver for rendering the DataGrid as an HTML table with a checkbox for each row

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
classASCstringA CSS class name for TH elements to define that sorting is currently ascending.''
classDESCstringA CSS class name for TH elements to define that sorting is currently descending.''
columnAttributesarrayColumn cells attributes. This is an array of the form: array(fieldName => array(attribute => value, ...) ...) This option is only used by XML/HTML based drivers.array()
convertEntitiesboolWhether or not to convert html entities. This calls htmlspecialchars().true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
emptyRowAttributesarrayAn associative array containing the attributes for empty rows.array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
evenRowAttributesarrayAn associative array containing each attribute of the even rows.array()
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
formobjectInstance of a HTML_QuickForm object.null
formRendererobjectInstance of a HTML_QuickForm_Renderer_QuickHtml object.null
headerAttributesarrayAttributes for the header row. This is an array of the form: array(attribute => value, ...)array()
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
inputNamestringThe HTML_QuickForm element name for the checkboxes.'checkedItems'
numberAlignboolWhether to right-align numeric values.true
oddRowAttributesarrayAn associative array containing each attribute of the odd rows.array()
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
primaryKeystringThe name of the primary key. This value is used for the checkboxes.'id'
selfPathstringThe complete path for sorting and paging links.$_SERVER['PHP_SELF']
sortIconASCstringThe icon to define that sorting is currently ascending. Can be text or HTML to define an image.''
sortIconDESCstringThe icon to define that sorting is currently descending. Can be text or HTML to define an image.''
sortingResetsPagingboolWhether sorting HTTP queries reset paging.true

General notes

This driver puts a checkbox for each row of the table into the first column. By default, a new column with the value of the 'inputName' option is added for the checkboxes. If you want to customize this column, you can add a column yourself as it is shown in the example.

Examples

Example 60-1. Basic usage

<?php
require_once 'HTML/QuickForm.php';
require_once 'HTML/QuickForm/Renderer/QuickHtml.php';
require_once 'Structures/DataGrid.php';

// prepare the form and the QuickHtml renderer
$form =& new HTML_QuickForm();
$renderer =& new HTML_QuickForm_Renderer_QuickHtml();

// add action selectbox and submit button to the form
$form->addElement('select', 'action', 'choose',
                  array('delete' => 'Delete',
                        'move'   => 'Move to archive'));
$form->addElement('submit', 'submit', 'Save');

// prepare the DataGrid
$dg =& new Structures_DataGrid();
if (PEAR::isError($dg)) {
   die($dg->getMessage() . '<br />' . $dg->getDebugInfo());
}

// bind some data (e.g. via a SQL query and MDB2)
$error = $dg->bind('SELECT * FROM news',
                   array('dsn' => 'mysql://user:password@server/database'));
if (PEAR::isError($error)) {
   die($error->getMessage() . '<br />' . $error->getDebugInfo());
}

// the renderer adds an auto-generated column for the checkbox by default;
// it is also possible to add a column yourself, for example like in the
// following four lines:
$column = new Structures_DataGrid_Column('checkboxes', 'idList', null,
                                         array('width' => '10'));
$dg->addColumn($column);
$dg->generateColumns();

$rendererOptions = array('form'         => $form,
                         'formRenderer' => $renderer,
                         'inputName'    => 'idList',
                         'primaryKey'   => 'id'
                        );

// use a template string for the form
$tpl = '';

// generate the HTML table and add it to the template string
$tpl .= $dg->getOutput('CheckableHTMLTable', $rendererOptions);
if (PEAR::isError($tpl)) {
   die($tpl->getMessage() . '<br />' . $tpl->getDebugInfo());
}

// add the HTML code of the action selectbox and the submit button to the
// template string
$tpl .= $renderer->elementToHtml('action');
$tpl .= $renderer->elementToHtml('submit');

// we're now ready to output the form (toHtml() adds the <form> / </form>
// pair to the template)
echo $renderer->toHtml($tpl);

// if the form was submitted and the data is valid, show the submitted data
if ($form->isSubmitted() && $form->validate()) {
    var_dump($form->getSubmitValues());
}
?>

Structures_DataGrid_Renderer_Console

Structures_DataGrid_Renderer_Console -- Console Table Rendering Driver

Description

This renderer generates nicely formatted and padded ASCII tables.

Structures_DataGrid_Renderer_CSV

Structures_DataGrid_Renderer_CSV -- CSV Rendering Driver

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
delimiterstringField delimiter','
enclosurestringField enclosure'"'
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
filenamestringFilename of the generated CSV file; boolean false means that no filename will be sentfalse
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
lineBreakstringThe character(s) to use for line breaks'\n'
numberAlignboolWhether to right-align numeric values.true
saveToFilebooleanWhether the output should be saved on the local filesystem. Please note that the 'filename' option must be given if this option is set to true.false
useQuotesmixedWhether or not to encapsulate the values with the enclosure value. true: always, false: never, 'auto': when needed'auto'
writeModestringThe mode that is used in the internal fopen() calls. Useful e.g. when you want to append to existing file. C.p. the fopen() documentation for the allowed modes.'wb'

Structures_DataGrid_Renderer_Flexy

Structures_DataGrid_Renderer_Flexy -- Flexy Rendering Driver

Availability

This driver is experimental and has not been officially released yet. It is only available from CVS.

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
assocColumnsboolWhether or not to build the column header as an associate array.true
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
columnAttributesarrayColumn cells attributes. This is an array of the form: array(fieldName => array(attribute => value, ...) ...) This option is only used by XML/HTML based drivers.array()
columnNamesarrayThe set of column names to use for the column header.array()
convertEntitiesboolWhether or not to convert html entities. This calls htmlspecialchars().true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
evenRowAttributestringThe css class to be used for the even row listings.'even'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
formatterarrayThe callback array for a column header formatter method.array($this,'defaultHeaderFormatter')
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
oddRowAttributestringThe css class to be used for odd row listings.'odd'
onMovestringName of a Javascript function to call on onClick/onSubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
pagerOptionsarrayThe custom options to be sent to the Pager renderer. 
resultsFormatstringThe format of the results message in sprintf format.'You have %s results in %s pages'
selfPathstringThe complete path for sorting and paging links.$_SERVER['PHP_SELF']
sortingResetsPagingboolWhether sorting HTTP queries reset paging.true

General notes

This driver does not support the render() method, it only is able to be attached setting the container to a current Flexy instance. Options to the renderer must also be passed using the setOptions() method.

Flexy output is buffered using the DataGrid getOutput() method.

This driver assigns the following Flexy template variables: - columnSet: array of columns' labels and sorting links - columnHeader: object of columns' labels and sorting links - recordSet: associate array of records values - numberedSet: numbered array of records values - currentPage: current page (starting from 1) - recordLimit: number of rows per page - pagesNum: number of pages - columnsNum: number of columns - recordsNum: number of records in the current page - totalRecordsNum: total number of records - firstRecord: first record number (starting from 1) - lastRecord: last record number (starting from 1)

This driver also register a Smarty custom function named getPaging that can be called from Smarty templates with {getPaging} in order to print paging links. This function accepts any of the Pager::factory() options as parameters.

Dynamic Template example, featuring sorting and paging:

<!-- Show paging links using the custom getPaging function -->
{getPaging():h}

<p>Showing records {firstRecord} to {lastRecord}
from {totalRecordsNum}, page {currentPage} of {pagesNum}</p>

<table cellspacing="0">
   <!-- Build header -->
   <tr>
       <th>
           {foreach:columnSet,column}
               <td><a href="{column[link]:h}">{column[label]:h}</a></td>
           {end:}
       </th>
   </tr>

   <!-- Build body -->
   <tr class="{getRowCSS()}" flexy:foreach="numberedSet,k,row">
       {foreach:row,field}
           <td>{field}</td>
       {end:}
   </tr>
</table>

Static Template example, featuring sorting and paging:

<table cellspacing="0">
   <!-- Build header -->
   <tr>
       <th>
           <td>
               <a href="{columnHeader.name[link]:h}">{columnHeader.field1[label]:h}</a>
           </td>
           <td>
              <a href="{columnHeader.surname[link]:h}">{columnHeader.field2[label]:h}</a>
           </td>
       </th>
   </tr>

   <!-- Build body -->
   <tr class="{getRowCSS()}" flexy:foreach="recordSet,k,row">
       <td>{row[field1]}</td>
       <td>{row[field2]}</td>
   </tr>
</table>

require_once 'HTML/Template/Flexy.php';
require_once 'Structures/DataGrid.php';
require_once 'Structures/DataGrid/Renderer/Flexy.php';

$tpl = new HTML_Template_Flexy($config['HTML_Template_Flexy']);
$dg =& new Structures_DataGrid($_GET['setPerPage'] ? $_GET['setPerPage']
                                                   : 10,$_GET['page']
                                                   ? $_GET['page'] : 1);
$dg->bind($dataObject);
$renderer = new Structures_DataGrid_Renderer_Flexy();
$renderer->setContainer($tpl);
$renderer->setOptions($config['Structures_DataGrid']);
$dg->attachRenderer($renderer);
$this->tpl->compile($template);
echo $dg->getOutput();

Structures_DataGrid_Renderer_HTMLEditForm

Structures_DataGrid_Renderer_HTMLEditForm -- HTML form to edit a record

Availability

This driver is experimental and has not been officially released yet. It is only available from CVS.

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
textSubmitstringLabel for the submit button'Submit'

Examples

Structures_DataGrid_Renderer_HTMLSortForm

Structures_DataGrid_Renderer_HTMLSortForm -- Multiple fields sorting form rendering driver

Description

This driver renders a form (using HTML_QuickForm) so that the user can select several fields and directions to sort the datagrid by.

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
directionStylestringWhether to render the direction form elements as 'select' or 'radio' elements'select'
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
sortFieldsNumintHow many fields the user will be able to sort by. This has no effect if the backend does not support sorting by multiple fields.3
textAscendingstringLabel for the ASC direction'Ascending'
textChoosestringWhat to display in the select box when no field is selected (first option)'Choose...'
textDescendingstringLabel for the DESC direction'Descending'
textSortBystringLabel for the first field'Sort by:'
textSubmitstringLabel for the submit button'Submit'
textThenBystringLabel for the second and following fields'Then by:'

Structures_DataGrid_Renderer_HTMLTable

Structures_DataGrid_Renderer_HTMLTable -- HTML Table Rendering Driver

Description

Driver for rendering the DataGrid as an HTMLTable

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
classASCstringA CSS class name for TH elements to define that sorting is currently ascending.''
classDESCstringA CSS class name for TH elements to define that sorting is currently descending.''
columnAttributesarrayColumn cells attributes. This is an array of the form: array(fieldName => array(attribute => value, ...) ...) This option is only used by XML/HTML based drivers.array()
convertEntitiesboolWhether or not to convert html entities. This calls htmlspecialchars().true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
emptyRowAttributesarrayAn associative array containing the attributes for empty rows.array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
evenRowAttributesarrayAn associative array containing each attribute of the even rows.array()
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
headerAttributesarrayAttributes for the header row. This is an array of the form: array(attribute => value, ...)array()
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
oddRowAttributesarrayAn associative array containing each attribute of the odd rows.array()
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
selfPathstringThe complete path for sorting and paging links.$_SERVER['PHP_SELF']
sortIconASCstringThe icon to define that sorting is currently ascending. Can be text or HTML to define an image.''
sortIconDESCstringThe icon to define that sorting is currently descending. Can be text or HTML to define an image.''
sortingResetsPagingboolWhether sorting HTTP queries reset paging.true

Structures_DataGrid_Renderer_Pager

Structures_DataGrid_Renderer_Pager -- Pager rendering driver

Description

This driver provides generic paging. This driver has full container support. You can use the Structures_DataGrid::fill() method with it. It buffers output, you can use Structures_DataGrid::getOutput()

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
pagerOptionsarrayOptions passed to Pager::factory(). Basic defaults are: mode: Sliding, delta: 5, separator: "|", prevImg: "&lt;&lt;" (<<), nextImg: "&gt;&gt;" (>>). The extraVars and excludeVars options are populated according to the Renderer common extraVars and excludeVars options. You may also specify some variables to be added or excluded here. The totalItems, perPage, urlVar, and currentPage options are set accordingly to the data statistics reported by the DataGrid and DataSource. You may overload these values here if you know what you are doing. 

Structures_DataGrid_Renderer_Smarty

Structures_DataGrid_Renderer_Smarty -- Smarty Rendering Driver

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
associativeboolBy default the column set and the records are numerically indexed arrays. By setting this option to true the keys will be field names instead.false
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
columnAttributesarrayColumn cells attributes. This is an array of the form: array(fieldName => array(attribute => value, ...) ...) This option is only used by XML/HTML based drivers.array()
convertEntitiesboolWhether or not to convert html entities. This calls htmlspecialchars().true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
selfPathstringThe complete path for sorting and paging links.$_SERVER['PHP_SELF']
sortingResetsPagingboolWhether sorting HTTP queries reset paging.true
varPrefixstringPrefix for smarty variables and functions assigned by this driver. Can be used in conjunction with Structure_DataGrid::setRequestPrefix() for displaying several grids on a single page.''

General notes

To use this driver you need the Smarty template engine from http://smarty.php.net

This driver does not support the render() method, it is only able to:

Either fill() a Smarty object by assigning variables and registering the {getPaging} smarty function. It's up to you to call Smarty::display() after the Smarty object has been filled.

Or return all variables as a PHP array from getOutput(), for maximum flexibility, so that you can assign them the way you like to your Smarty instance.

This driver assigns the following Smarty variables:
- $columnSet:       array of columns specifications
                    structure:
                         array (
                             0 => array (
                                 'name'       => field name,
                                 'label'      => column label,
                                 'link'       => sorting link,
                                 'attributes' => attributes string,
                                 'direction'  => 'ASC', 'DESC' or '',
                                 'onclick'    => onMove call
                             ),
                             ...
                         )
- $recordSet:       array of records values
- $currentPage:     current page (starting from 1)
- $nextPage:        next page
- $previousPage:    previous page
- $recordLimit:     number of rows per page
- $pagesNum:        number of pages
- $columnsNum:      number of columns
- $recordsNum:      number of records in the current page
- $totalRecordsNum: total number of records
- $firstRecord:     first record number (starting from 1)
- $lastRecord:      last record number (starting from 1)
- $currentSort:     array with column names and the directions used for sorting
- $datagrid:        a reference that you can pass to {getPaging}

This driver registers a Smarty custom function named getPaging that can be called from Smarty templates with {getPaging} in order to print paging links. This function accepts the same parameters as the pagerOptions option of Structures_DataGrid_Renderer_Pager.

{getPaging} accepts an optional "datagrid" parameter which you can pass the $datagrid variable, to display paging for an arbitrary datagrid (useful with multiple dynamic datagrids on a single page).

Object Records : this drivers preserves object records if provided. This means that if your datasource provides objects instead of associative arrays as records, you can access their properties and methods in your smarty template, with something like: {$recordSet[col]->getSomeInformation()}.

Structures_DataGrid_Renderer_XLS

Structures_DataGrid_Renderer_XLS -- Excel Spreadsheet Rendering Driver

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
bodyFormatmixedThe format for body cells (either 0 [= "no format"] or a Spreadsheet_Excel_Writer_Format object) Please see the NOTE ABOUT FORMATTING below.0
borderintBorder drawn around the whole datagrid: 0 => none, 1 => thin, 2 => thick (NOT IMPLEMENTED YET)0
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
filenamestringThe filename of the spreadsheet'spreadsheet.xls'
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
headerBorderintBorder between the header and body: 0 => none, 1 => thin, 2 => thick (NOT IMPLEMENTED YET)0
headerFormatmixedThe format for header cells (either 0 [= "no format"] or a Spreadsheet_Excel_Writer_Format object) Please see the NOTE ABOUT FORMATTING below.0
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
sendToBrowserboolShould the spreadsheet be send to the browser? (true = send to browser, false = write to a file)true
startColintThe Worksheet column number to start rendering at0
startRowintThe Worksheet row number to start rendering at0
tempDirstringA temporary directory to be used by Spreadsheet_Excel_Writer (cp. "General Notes" section).null
versionintIf you don't pass a worksheet object to this renderer, you can set the BIFF version with this option. The only accepted value by Spreadsheet_Excel_Writer is 8 (for usage of the BIFF8 format). All other values will lead to the older format (which is needed if you get errors in Excel, e.g. about a broken file).8
worksheetobjectOptional reference to a Spreadsheet_Excel_Writer_Worksheet object. You can leave this to null except if your workbook contains several worksheets and you want to fill a specific one.null

General notes

This driver does not support the flatten() method. You can not retrieve its output with DataGrid::getOutput(). You can either render it directly to the browser or save it to a file. See the "sendToBrowser" and "filename" options.

This driver has container support. You can use Structures_DataGrid::fill() with it; that's even recommended.

If PHP's safe_mode is enabled, Spreadsheet_Excel_Writer sometimes fails to generate the Excel file. You can avoid this problem by setting the 'tempDir' option to a (temporary) directory that is writable by PHP.

NOTE ABOUT FORMATTING:

You can specify some formatting with the 'headerFormat' and 'bodyFormat' options, or with setBodyFormat() and setHeaderFormat().

But beware of the following from the Spreadsheet_Excel_Writer manual: "Formats can't be created directly by a new call. You have to create a format using the addFormat() method from a Workbook, which associates your Format with this Workbook (you can't use the Format with another Workbook)."

What this means is that if you want to pass a format to this driver you have to "derive" the Format object out of the workbook used in the driver.

The easiest way to do this is:

// Create a workbook
$workbook = new Spreadsheet_Excel_Writer();

// Specify that spreadsheet must be sent the browser
$workbook->send('test.xls');

// Create your format
$format_bold =& $workbook->addFormat();
$format_bold->setBold();

// Fill the workbook, passing the format as an option
$options = array('headerFormat' => &$format_bold);
$datagrid->fill($workbook, $options);

Structures_DataGrid_Renderer_XML

Structures_DataGrid_Renderer_XML -- XML Rendering Driver

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
columnAttributesarrayColumn cells attributes. This is an array of the form: array(fieldName => array(attribute => value, ...) ...) This option is only used by XML/HTML based drivers.array()
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fieldAttributestringThe name of the attribute for the field name. null stands for no attributenull
fieldTagstringThe name of the tag for each field inside a row, without brackets. The special value '{field}' is replaced by the field name.'{field}'
filenamestringFilename of the generated XML file; boolean false means that no filename will be sentfalse
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
labelAttributestringThe name of the attribute for the column label. null stands for no attributenull
numberAlignboolWhether to right-align numeric values.true
outerTagstringThe name of the tag for the datagrid, without brackets'DataGrid'
rowTagstringThe name of the tag for each row, without brackets'Row'
saveToFilebooleanWhether the output should be saved on the local filesystem. Please note that the 'filename' option must be given if this option is set to true.false
useXMLDeclboolWhether the XML declaration string should be added to the output. The encoding attribute value will get set from the common "encoding" option. If you need to further customize the XML declaration (version, etc..), then please set "useXMLDecl" to false, and add your own declaration string.true
writeModestringThe mode that is used in the internal fopen() calls. Useful e.g. when you want to append to existing file. C.p. the fopen() documentation for the allowed modes.'wb'

Structures_DataGrid_Renderer_XUL

Structures_DataGrid_Renderer_XUL -- XUL Rendering Driver

Options

This driver accepts the following options:

Table 60-2. Options for this driver

OptionTypeDescriptionDefault Value
buildFooterboolWhether to build the footer.true
buildHeaderboolWhether to build the header.true
defaultCellValuestringWhat value to put by default into empty cells.null
defaultColumnValuesarrayPer-column default cell value. This is an array of the form: array(fieldName => value, ...).array()
encodingstringThe content encoding. If the mbstring extension is present the default value is set from mb_internal_encoding(), otherwise it is ISO-8859-1.'ISO-8859-1'
excludeVarsarrayVariables to be removed from the generated HTTP queries.array()
extraVarsarrayVariables to be added to the generated HTTP queries.array()
fillWithEmptyRowsboolEnsures that all pages have the same number of rows.false
hideColumnLinksarrayBy default sorting links are enabled on all columns. With this option it is possible to disable sorting links on specific columns. This is an array of the form: array(fieldName, ...). This option only affects drivers that support sorting.array()
numberAlignboolWhether to right-align numeric values.true
onMovestringName of a Javascript function to call on onclick/onsubmit events when the user is either paging or sorting the data. This function receives a single object argument of the form: { page: <page>, sort: [{field: <field>, direction: <direction>}, ...], data: <user_data> }. Remark: setting this option doesn't remove the href attribute, you should return false from your handler function to void it (eg: for AJAX, etc..).null
onMoveDatastringUser data passed in the "data" member of the object argument passed to onMove. No JSON serialization is performed, this is assigned as a raw string to the "data" attribute. It's up to you to add quotes, slashes, etc...''
selfPathstringThe complete path for sorting links$_SERVER['PHP_SELF']

General notes

This renderer class will render a XUL listbox. For additional information on the XUL Listbox, refer to this url: http://www.xulplanet.com/references/elemref/ref_listbox.html

You have to setup your XUL document, just as you would with an HTML document. This driver will only generated the <listbox> element and content.


Games_Chess

Table of Contents
Introduction --  Basic usage of Games_Chess

Games_Chess is like a brilliant helper who can tell you anything you need to know about an abstract chess game. The only thing Games_Chess cannot do is play against you - it is not a chess engine. Games_Chess handles the logic a chessboard and parsing standard FEN (Forsyth-Edwards Notation) for describing a position as well as SAN (Standard Algebraic Notation) for describing individual moves. This package can be used as a backend driver for playing chess, or for validating and/or creating PGN files using the File_ChessPGN package (when it is completed)

Introduction

Introduction --  Basic usage of Games_Chess

What is Games_Chess?

Games_Chess provides a basic interface for validating and playing chess. Games_Chess has facilities for calculating all of the important chess rules including check, checkmate, stalemate, basic draws such as bishop+king versus king, 50 move draw, en passant pawn captures, castling, double space first pawn move and basic piece movement. In addition, Games_Chess can set up a board to a position using the Forsyth-Edwards Notation (FEN) and can output a list of moves in Standard Algebraic Notation (SAN) as well as parse any valid SAN move, no matter how obscure (Qa3xf3, for instance), as well as simple "move the piece on a3 to h3" commands.

How do I use Games_Chess?

The Games_Chess package comes with a demonstration file, which has highlighted source at This location.

The Games_Chess package provides three different drivers, one for playing a standard chess game, and two for playing interesting variant games that are popular on the Internet Chess Club (ICC).

  1. Crazyhouse. basic rules in Crazyhouse chess allow you to place pieces you have captured from your opponent on the board as new pieces for your own army. This is a wild and highly tactical game.

  2. Loser's Chess. Loser's chess is similar to checkers in that if a capture is possible, it must be executed. For this reason, most of the moves are forcing moves in this game, and it results in very fast games.

To use Games_Chess on the most basic level is simple. Here is a sample script showing the initialization of the three drivers:

<?php
require_once 'Games/Chess/Standard.php';
require_once 'Games/Chess/Crazyhouse.php';
require_once 'Games/Chess/Losers.php';
$standard = new Games_Chess_Standard;
$crazyhouse = new Games_Chess_Crazyhouse;
$losers = new Games_Chess_Losers;
?>
By default, a Games_Chess driver is created with a blank board. To set up a new starting position, use this code:
<?php
require_once 'Games/Chess/Standard.php';
$standard = new Games_Chess_Standard;
$standard->resetGame();
?>
If you wish to load a particular starting position in FEN notation, pass the FEN string to resetGame() like so:
<?php
require_once 'Games/Chess/Standard.php';
$standard = new Games_Chess_Standard;
$standard->resetGame('rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR w KQkq c6 0 2');
?>

How to move pieces with Games_Chess

There are two basic methods for performing moves with Games_Chess, moveSAN and moveSquare. Both of these methods either return TRUE or a PEAR_Error class upon error, so the proper way to handle for a return value is:
<?php
require_once 'Games/Chess/Standard.php';
$standard = new Games_Chess_Standard;
$err = $standard->moveSAN('Nf9');
if ($standard->isError($err)) {
    echo $err->getMessage();
    die;
}
?>
Note that Games_Chess->isError() should be used as the PEAR_Error class is only loaded when needed, to help with efficiency. If this is not a concern (and it will only be for sites serving thousands of pages per second), it is simpler to set a PEAR_Error callback, which is demonstrated in the next example.

The example below demonstrates the two ways that Games_Chess should be called to make moves on the chess board, including the way to represent a placement move in the Crazyhouse variant:
<?php
require_once 'PEAR.php'; // for the PEAR_Error class
function showerror($err)
{
    echo $err->getMessage();
    exit;
}
require_once 'Games/Chess/Standard.php';
require_once 'Games/Chess/Crazyhouse.php';
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'showerror');
$standard = new Games_Chess_Standard;
$crazyhouse = new Games_Chess_Crazyhouse;
$standard->resetGame();
$crazyhouse->resetGame();

$standard->moveSAN('e4'); // 'e2' to 'e4' if using moveSquare
$standard->moveSquare('d7', 'd5'); // 'd5' if using moveSAN
$standard->moveSAN('exd5');

$crazyhouse->moveSquare('e2', 'e4'); // same as moveSAN() above
$crazyhouse->moveSAN('d5'); // save as moveSquare above
$crazyhouse->moveSAN('exd5');
$crazyhouse->moveSAN('Qxd5');
$crazyhouse->moveSAN('P@d7'); // dumb move, but demonstrates piece placement
?>
Note that if promoting a pawn, moveSquare() requires that the newly promoted piece type be passed in. Options are Q for queen, R for rook, B for bishop and N for knight.
<?php
require_once 'PEAR.php'; // for the PEAR_Error class
function showerror($err)
{
    echo $err->getMessage();
    exit;
}
require_once 'Games/Chess/Crazyhouse.php';
PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'showerror');
$crazyhouse = new Games_Chess_Crazyhouse;
$crazyhouse->resetGame();
$crazyhouse->moveSAN('e4');
$crazyhouse->moveSAN('d5');
$crazyhouse->moveSAN('exd5');
$crazyhouse->moveSAN('Qxd5');
$crazyhouse->moveSAN('d3');
$crazyhouse->moveSAN('Kd7');
$crazyhouse->moveSAN('d4');
$crazyhouse->moveSAN('Ke6');
$crazyhouse->moveSAN('P@d7');
$crazyhouse->moveSAN('Qd6');
// $crazyhouse->moveSAN('d8=Q'); // normal way to do this
$crazyhouse->moveSquare('d7', 'd8', 'Q'); // using moveSquare to do this
// dumb moves, but demonstrates pawn promotion to queen
?>

Retrieving information on the game in progress

To retrieve necessary information such as the current move list, current FEN, list of captured pieces (Crazyhouse only), determine whether the game is over and so on, you'll want to use one of the following methods:

  • gameOver(). This method can be used to determine if the game has concluded, and simply returns an abbreviation of W if the white pieces have won (checkmate), B if the black pieces have won (checkmate), D if there is a draw, or false if the game is still in progress.

  • renderFen().

    This method returns a Forsyth-Edwards Notation (FEN) representation of the current game state. Note that the FEN standard does not contain a way to represent captured pieces, and so cannot be used to exactly replicate a Crazyhouse game in progress, although it can be close.

  • toArray().

    For the Standard and Loser's chess drivers, this returns an associative array of algebraic square name (a1 to h8) mapped to its contents. If the square is unoccupied, it will contain its algebraic square name (a1 will map to a1), otherwise it will contain the piece name, one of P, R, N, B, Q or K. If the piece is a white piece, it will be in upper case, like P, and if the piece is a black piece, it will be in lower case like p.

    For the Crazyhouse driver, this returns an associative array with two indices, board and captured. The board element is identical to the return for Standard/Loser's chess drivers described in the previous paragraph. The captured sub-array contains an array of this format:
    <?php
    $captured =
        array(
            'W' =>
                array(
                    'P' => 6, // 6 black pawns captured by white
                    'R' => 0,
                    'N' => 0,
                    'B' => 0,
                    'Q' => 0,
                ),
            'B' =>
                array(
                    'P' => 4, // 4 white pawns captured by black
                    'R' => 0,
                    'N' => 0,
                    'B' => 0,
                    'Q' => 0,
                ),
        );
    ?>
    Each segment represents white's or black's pieces (W and B), and each sub-element represents the number of captured pieces of that type. In the example above, white can choose to place a pawn for up to the next 6 moves in a row, whereas black can choose to place a pawn for up to the next 4 moves in a row.

  • toMove().

    This methods simply returns the color of the pieces that have the next move. W is returned for white, B is returned for black.


Structures_Graph

Table of Contents
Introduction --  Graph datastructure manipulation library

Graph datastructure manipulation library

Introduction

Introduction --  Graph datastructure manipulation library

Structures_Graph Description

Structures_Graph is a package for creating and manipulating graph datastructures. It allows building of directed and undirected graphs, with data and metadata stored in nodes. The library provides functions for graph traversing as well as for characteristic extraction from the graph topology.

The full online documentation is available here


Structures_Tree

Table of Contents
Introduction --  Generic tree management, currently supports DB and XML as data sources

Generic tree management, currently supports DB and XML as data sources

Introduction

Introduction --  Generic tree management, currently supports DB and XML as data sources

Structures_Tree Description

Provides methods to read and manipulate trees, which are stored in the DB or an XML file. The trees can be stored in the DB either as nested trees. Or as simple trees ('brain dead method'), which use parentId-like structure. Currently XML data can only be read from a file and accessed. The package offers a big number of methods to access and manipulate trees. For example methods like: getRoot, getChild[ren[Ids]], getParent[s[Ids]], getPath[ById] and many more.

Unfortunately, complete documentation is not available at the moment.


Chapter 61. System

System Utilities



System_Folders

Table of Contents
Introduction --  Get system folder locations.
Example --  How to use System_Folders

Returns locations of system folders like home, desktop, documents and others.

Introduction

Introduction --  Get system folder locations.

Contributors

  • Christian Weiske

Description

System_Folders provides methods to get the locations of various system folders like home directory, desktop folder and "My documents". You can use it on nearly every operating system: It works on Linux, Windows and Mac OS; allowing you to write OS independent programs.

The methods return a string of the directory (with trailing slash) if the directory can be determined, and NULL if it fails or isn't available on the system. For example, the "Shared Documents" folder exists on Windows only. If you run getSharedDocuments() on a Mac or Linux, the method will return NULL.

The class does heavy use of environment variables. That means it is very likely that the methods fail when running in a php server module (e.g. apache) because there is user information available. Using them on command line (cli) scripts gives best results, as the class is meant to be used for such ones.

System_Folders_Cached

On every getXXX() call, the whole procedure of looping through environment variables, checking the existence of the folders and trying some common locations is executed. So if you call the same method again and again, it will cost you the same amount of cpu cycles every time and perhaps be a slowdown in your application.

Another problem might be that some methods fail or don't return the correct path, e.g. because the user has an unusual installation or unusual preferences.

Both issues are addressed with System_Folders_Cached. It provides a cached version of the getXXX() methods, meaning that the result of the first method calls are stored locally and returned on every further call, which speeds up consecutive calls to the same method a lot.

Further, the class provides methods to set the folder locations and save this settings into an ini file. Saving them can be done with saveToFile() and they can be loaded with loadFromFile(). This allows customization of the folder locations, and persistency across sessions.

Example

Example --  How to use System_Folders

System_Mount

Table of Contents
Introduction --  Mount and Unmount filesystems

This package allows you to mount and unmount disks and partitions listed in your file systems table (/etc/fstab), which is found on Unix/Linux based systems.

You can install this package by using pear install System_Mount. Once you have the package installed it is very easy to use.

Introduction

Introduction --  Mount and Unmount filesystems

Contributors

  • Brett Bieber

Description

System_Mount provides methods to mount and unmount filesystems and partitions listed in a system's /etc/fstab. The fstab file is common on Unix/Linux based systems and is used to list the available filesystems and partitions which users can mount into the filesystem hierarchy. Common entries include root partitions, boot partitions, as well as cdrom drives and other removable media.

The System_Mount command utilizes File_Fstab to discover entries in the /etc/fstab file, and allow easy mount/unmount operations.


System_ProcWatch

The package provides methods to monitor system process on Unix-like systems.


Introduction and Features

Table of Contents
Intro -- Introduction to System::ProcWatch
Constants -- Constants defined in and used by System_ProcWatch
System_ProcWatch -- System_ProcWatch
System_ProcWatch::System_ProcWatch() -- Constructor
System_ProcWatch::run() -- Run once
System_ProcWatch::daemon() -- Run in daemon mode
System_ProcWatch::setConfig() -- Set configuration

Intro

Intro -- Introduction to System::ProcWatch

What is System::ProcWatch?

System::ProcWatch is a small collection of classes to ease monitoring of system processes based on the Unix program procps (ps).

To use System::ProcWatch you simply have to define a ruleset on which based System::ProcWatch operates. A rule (or job, watch) defines what actions should happen if a condition evaluates to true.

To be continued...

Shell Scripts

You can use System::ProcWatch out of the box, by utilizing the shipped shell scripts procwatch and procwatch-lint.

procwatch

The procwatch command is meant to be used for system diagnosis - run as daemon or by cron.

The usage is best described by the output of procwatch -h:
USAGE:
$ procwatch (-x|-i) <file> [-d [-s <sec>]] [-a <args>] [-p <file>]

OPTIONS:
    -x | --xml=         path to XML configuration file
    -i | --ini=         path to INI configuration file

    -d | --daemon       run procwatch in daemon mode
    -s | --sleep=       seconds to sleep in daemon mode (default=1800)

    -a | --args=        arguments that should be passed to ps (default=aux)
    -p | --php=         php file that should be included

    -h | --help         this help message

EXAMPLE:
    $ procwatch -x /etc/procwatch.xml -d -s 3600

    This command will run procwatch in daemon mode with an interval
    of an hour using the configuration file '/etc/procwatch.xml'

procwatch-lint

The procwatch-lint is meant to validate procwatchs configurtation files written in XML by utilizing XML::DTD::XmlValidator.

Once again synopsis is best described by the output of procwatch-lint -h:
USAGE:
$ procwatch-lint -c <file> [-d <dtd>] [-v]

OPTIONS:
    -c | --conf=        path to XML configuration file
    -d | --dtd=         path to DTD
    
    -v | --verbose      verbose output on errors

    -h | --help         this help message

EXAMPLE:
    procwatch-lint -c /etc/procwatch.xml

    This command will validate the configuration file '/etc/procwatch.xml'
    using the DTD at '/usr/share/pear/data/System_ProcWatch/procwatch-1.0.dtd'

Configuration

There are three methods to configure your System::ProcWatch application:

  • XML string/file

  • INI file

  • PHP array

Xml string/file

Configuring System::ProcWatch by XML is the preferred way. It is as simple as powerful.

Ruleset: The Root Element

The root element of an XML configuration file/string is the procwatch element. It has one implicit attribute, the version attribute, set to "1.0".

The procwatch element symbolizes our ruleset, and the childs of the root are our rules.

Rules: The Childs of the Root

The direct descendants of the root element procwatch, are the watch elements, which can occur 1 time or more often.

The watch element has one required attribute, the name attribute, which gives the watch (or job, rule) a descriptive name like "httpd-count".

Each watch element symbolizes a single rule, containing a regular expression to search for, one or more conditions to evaluate and one or more actions to be taken.

A Rule

A rule consists of three child elements:

  • pattern

  • condition

  • execute

Rule Element: pattern

The pattern element describes the perl compatible regular expression which should be evaluated against a column of the output of ps.

There is one required attribute, the match attribute, defining the column name of the output of ps in lowercase like "command" or "vsz".

This makes System::ProcWatch highliy versatile and should make it usable with any platforms procps program.

The pattern elements content solely consists of the perl compatible regular expression to match against the column defined in the match attribute. The PCRE MUST contain the start and end delimiter and MAY contain any PCRE modifiers.

Example: <pattern match="command">/sbin\/httpd/</pattern>

Rule Element: condition

The condition element defines conditions that MUST evaluate to TRUE at all so that later defined actions will be executed.

The condition element has one required and one optional attribute, the required one being type, which MUST be one of "presence" or "attr", and the optional one being attr. However, if the type attribute equals to "attr" the attr attribute MUST be present.

The attr attribute represents a column of procps' output like "user" or "%mem".

Conditions

Dependent on the content of the type attribute, syntax and behavior of the condition element differ.

A condition with type "presence" MAY be empty, thus always evaluating to true.

Child Elements of condition may be:

  • min

    Found value MUST exceed defined value.

  • max

    Found value MUST NOT exceed defined value.

  • is

    Found value MUST be equal to defined value.

  • isnot

    Found value MUST NOT be equal to defined value.

  • sum

    The sum of found values MUST NOT exceed defined sum.

You may combine them to define for instance a range from min to max.

Rule Element: execute

The execute element defines actions that should be taken if the condition applies.

It has one required attribute, the type attribute, which MUST equal to one of "shell" or "php".

Obviously the content of the execute element is executed either on the shell through shell_exec() or directly in PHP through eval().

The execute element MAY occur any times.

There are some special variables that will automagically be available in execute statements:

  • $msg

    This contains a general message, what has happened. It is quoted in single quotes for save usage and is available in shell and php executes.

  • $pids

    This contains all PIDs of the processes that have been found. They are enclosed by single quotes and parenthesis.

    Example: '(433, 444, 455, 466)'

  • $procs

    This is a serialized php array in string format containing all information gained from ps and looks like: array(array('pid' => 344, 'command' => '/usr/sbin/httpd' ...))

    It is only available in php executes and can easily be used in function callbacks:

    <execute type="php">get_procs($procs);</execute>

Example XML configuration file

Example 61-1. XML configuration file

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE procwatch SYSTEM "/usr/share/pear/data/System_ProcWatch/procwatch-1_0.dtd">
<procwatch>
<!--

    SOME EXAMPLE CONFIGURATIONS
    ===========================

    This job looks for the count of running httpd processes by
    matching the PCRE "/httpd/" against the COMMAND column of ps.

    If there are less than 10 or more than 30 httpd processes found
    the speicified string is executed on the shell.
-->
  <watch name="httpd-count">
    <pattern match="command">/httpd/</pattern>
    <condition type="presence">
      <min>10</min>
      <max>30</max>
    </condition>
    <execute type="shell">echo $msg $pids &gt;&gt; /var/log/procwatch</execute>
  </watch>

<!--
  This job looks for the amount of physical memory all httpd processes use
  together by matching the PCRE "/httpd/" against the COMMAND column of ps.

  It adds all %MEM columns of ps that match the pattern together and compares
  the reslut to the specified sum. If the result exceeds the sum the specified
  string is executet on the shell.
-->
  <watch name="httpd-usage">
    <pattern match="command">/httpd/</pattern>
    <condition type="attr" attr="%mem">
      <sum>5</sum>
    </condition>
    <execute type="shell">echo $msg $pids &gt;&gt; /var/log/procwatch</execute>
  </watch>

<!--
  This job looks for zombie processes.

  It matches the PCRE "/Z/" against the STAT column of ps and executes the
  specified string on the shell if more than 0 zombies have been found.
-->
  <watch name="ZOMBIES">
    <pattern match="stat">/Z/</pattern>
    <condition type="presence">
      <max>0</max>
    </condition>
    <execute type="shell">echo $msg $pids &gt;&gt; /var/log/procwatch</execute>
  </watch>

<!--
  This job looks for running processes.

  It matches the PCRE pattern "/R/" against the STAT column of ps and executes
  the specified string on the shell if any running processes have been found.
-->
  <watch name="running">
    <pattern match="stat">/R/</pattern>
    <condition type="presence" />
    <execute type="shell">echo $msg $pids &gt;&gt; /var/log/procwatch</execute>
  </watch>

</procwatch>

INI file

Configuring by INI file is effectively the same except that only executes of type "shell" can be defined.

PHP array

A valid array to configure System::ProcWatch may look similar to the following example.

Constants

Constants -- Constants defined in and used by System_ProcWatch

System_ProcWatch

System_ProcWatch -- System_ProcWatch

System_ProcWatch

Monitor processes

Usage:
1  require_once 'System/ProcWatch.php';
2  require_once 'System/ProcWatch/Config.php';
3
4  $cf = System_ProcWatch_Config::fromXmlFile('/etc/procwatch.xml');
5  $pw = &new System_ProcWatch($cf);
6  $pw->run();

System_ProcWatch::System_ProcWatch()

System_ProcWatch::System_ProcWatch() -- Constructor

Description

Instantiate a new System_ProcWatch object configured by the supplied configuration array.

Parameter

array $config

config array from System_ProcWatch_Config

System_ProcWatch::run()

System_ProcWatch::run() -- Run once

Description

Run once.

Parameter

string $ps_args

arguments that should be passed to ps

Throws

Throws no exception.

Note

This function can not be called statically.

System_ProcWatch::daemon()

System_ProcWatch::daemon() -- Run in daemon mode

Description

Runs System_ProcWatch in daemon mode with the defined interval of seconds to sleep.

Parameter

integer $interval

seconds to sleep

string $ps_args

ps' arguments

Throws

Throws no exception.

Note

This function can not be called statically.

System_ProcWatch::setConfig()

System_ProcWatch::setConfig() -- Set configuration

Description

Configure System_ProcWatch with an config array from System_ProcWatch_Config.

Parameter

array $config

config array from System_ProcWatch_Config

Throws

Throws no exception.

Note

This function can not be called statically.


Configuration

Table of Contents
System_ProcWatch_Config -- System_ProcWatch_Config
System_ProcWatch_Config::fromXml() -- Get config array from XML string
System_ProcWatch_Config::fromXmlFile() -- Get config array from XML file
System_ProcWatch_Config::fromIniFile() -- Get config array from INI file
System_ProcWatch_Config::fromArray() -- Get config array from an array

System_ProcWatch_Config

System_ProcWatch_Config -- System_ProcWatch_Config

System_ProcWatch_Config

Build a configuration array for System_ProcWatch

Usage:
1  $cf = System_ProcWatch_Config::fromXmlFile('/etc/procwatch.xml');
2  $pw = &new System_ProcWatch($cf);

System_ProcWatch_Config::fromXml()

System_ProcWatch_Config::fromXml() -- Get config array from XML string

Description

Parses an XML string into an config array to configure System_ProcWatch with.

Parameter

string $xml

XML string

Return value

Returns config array on success or PEAR_Error on failure.

Throws

Throws PEAR_Error if XML file does not exist or problems parsing the XML string have occured.

Note

This function should be called statically.

System_ProcWatch_Config::fromXmlFile()

System_ProcWatch_Config::fromXmlFile() -- Get config array from XML file

Description

Parses an XML file into an config array to configure System_ProcWatch with.

Parameter

string $file

path to XML file

Return value

Returns config array on success or PEAR_Error on failure.

Throws

Throws PEAR_Error if XML file does not exist, or problems parsing the XML file have occured.

Note

This function should be called statically.

System_ProcWatch_Config::fromIniFile()

System_ProcWatch_Config::fromIniFile() -- Get config array from INI file

Description

Parses an INI file into an array to configure System_ProcWatch with.

Parameter

string $file

path to INI file

Return value

Returns config array on success or PEAR_Error on failure.

Throws

Throws PEAR_Error if INI file doesn't exist.

Note

This function should be called statically.

System_ProcWatch_Config::fromArray()

System_ProcWatch_Config::fromArray() -- Get config array from an array

Description

This method in fact does a sanity check on the supplied config array and should only be used for testing purposes.

Parameter

array $array

config array to check

Return value

Returns the same array on success or PEAR_Error on failure.

Throws

Throws PEAR_Error if an invalid configuration array was supplied.

Note

This function should be called statically.


Parser Information

System_ProcWatch_Parser

System_ProcWatch_Parser -- System_ProcWatch_Parser

System_ProcWatch_Parser

Fetches output from `ps` and parses it into an associative array

Usage:
1   $ps = &new System_ProcWatch_Parser();
2   $pd = &$ps->getParsedData();

System_ProcWatch_Parser::System_ProcWatch_Parser()

System_ProcWatch_Parser::System_ProcWatch_Parser() -- Constructor

Description

Instantiates a new System_ProcWatch parser object with the supplied arguments to pass to ps.

Parameter

string $ps_args

ps' arguments

Throws

Throws no exception.

System_ProcWatch_Parser::getParsedData()

System_ProcWatch_Parser::getParsedData() -- Get parsed data

Description

This is the main method of this class. It fetches to output of ps, executed on the shell, and returns the parsed data as an 2 dimensional indexed and associatve array.

Parameter

string $ps_args

ps' arguments

boolean $refresh

whether to refresh our data

Return value

Returns array of processes parsed from ps' output.

Throws

Throws no exception.

Note

This function can not be called statically.

System_ProcWatch_Parser::fetch()

System_ProcWatch_Parser::fetch() -- Fetch ps' data

Description

Fetches the output of ps, executed on the shell.

Parameter

string $ps_args

ps' arguments

Return value

Returns string ps' output.

Throws

Throws no exception.

Note

This function can not be called statically.

System_ProcWatch_Parser::parse()

System_ProcWatch_Parser::parse() -- Parse

Description

Parses the output of ps.

Parameter

string $data

output of ps

Return value

Returns array of processes.

Throws

Throws no exception.

Note

This function can not be called statically.

System_ProcWatch_Parser::getProcByPid()

System_ProcWatch_Parser::getProcByPid() -- Get info about a process by its PID

Description

Get information about a process by its PID.

Parameter

integer $pid

the PID of the process

Return value

Returns array with information about the process with the supplied PID.

Throws

Throws no exception.

Note

This function can not be called statically.

System_ProcWatch_Parser::getProcInfo()

System_ProcWatch_Parser::getProcInfo() -- Get information about processes

Description

Get information about processes matching the defined search.

Parameter

string $pattern

PCRE to match for process

string $search

the ps field/column to search in

Return value

Returns array of processes matching the search.

Throws

Throws no exception.

Note

This function can not be called statically.


System_WinDrives

Table of Contents
Introduction --  Enumerating drives on Windows systems
Example --  How to use System_WinDrives
Constants --  Constants defined and used in System_WinDrives
System_WinDrives() -- Outputs short description of the method
System_WinDrives::getDriveList() -- Gets array with path of all drives
System_WinDrives::getDriveName() -- Returns the user-defined name for a drive
System_WinDrives::getDrivesInformation() -- Gets information about all drives
System_WinDrives::getDriveType() -- Gets the type of a drive
System_WinDrives::getReadName() -- Returns if drive names shall be read or not
System_WinDrives::getTypeTitle() -- Gets the readable name to a drive type
System_WinDrives::guessDriveList() -- Tries to guess the drive list
System_WinDrives::isApiAvailable() -- Checks if the API is available
System_WinDrives::setReadName() -- Sets the readName setting

Provides functions to enumerate root directories ("Drives") on Windows systems by using win32 api calls.

Introduction

Introduction --  Enumerating drives on Windows systems

Contributors

  • Christian Weiske

Description

System_WinDrives uses win32 api calls to get a list of all installed roots ("Drives") on the current Windows operating system (The folders "A:\" until "Z:\").

Additional to the list of drives, detail information like the name and the drive type (network, harddisk, removable etc) is given.

The win32 api functions are used to access the Windows application programming interface. This means that the extension php_w32api.dll on PHP4 and php_ffi.dll on PHP5 have to be installed to use all functions. If no dll is available, the drives are guessed, but drive types and drive names can't be determined.

Example

Example --  How to use System_WinDrives

Constants

Constants --  Constants defined and used in System_WinDrives

System_WinDrives()

System_WinDrives() -- Outputs short description of the method

Description

Constructor. Creates a new System_WinDrives instance.

Parameter

boolean $bReadName

If the titles/names of drives shall be read. It is disabled by default, because it might cause PHP to crash.

System_WinDrives::getDriveList()

System_WinDrives::getDriveList() -- Gets array with path of all drives

Description

Returns an array with all drive paths (e.g. A:\, C:\).

If no API is available, the drive list is guessed. To get more data (like drive type and name), you should use getDrivesInformation().

Return value

array - array with all the drives

System_WinDrives::getDriveName()

System_WinDrives::getDriveName() -- Returns the user-defined name for a drive

Description

Returns the user-given name for the given drive. The function does not work on PHP5 and returns an empty string ''.

Parameter

string $strDrive

The drive path, whose name shall be read.

Return value

string - The drive label

System_WinDrives::getDrivesInformation()

System_WinDrives::getDrivesInformation() -- Gets information about all drives

Description

Returns an array with all pieces of information one can get for the drives.

Return value

array - Array of little objects. Key is the drive path, the value is an object with the following values: type, name and typetitle.

System_WinDrives::getDriveType()

System_WinDrives::getDriveType() -- Gets the type of a drive

Parameter

string $strDrive

The drive that type shall be returned.

Return value

integer - the type (use the constants for comparison)

System_WinDrives::getReadName()

System_WinDrives::getReadName() -- Returns if drive names shall be read or not

Description

Returns of drive names should be read or not.

Return value

boolean - true if they shall be read, false if not.

System_WinDrives::getTypeTitle()

System_WinDrives::getTypeTitle() -- Gets the readable name to a drive type

Description

Gets the readable name to a drive type, e.g. "Harddisk" for the type 3 (SYSTEM_WINDRIVE_FIXED).

Parameter

string $nType

The type whose name shall be returned

Return value

string - the name for the type

System_WinDrives::guessDriveList()

System_WinDrives::guessDriveList() -- Tries to guess the drive list

Description

Tries to guess the drive list by brute-force checking all letters.

Return value

array - Array with all found drive paths.

System_WinDrives::isApiAvailable()

System_WinDrives::isApiAvailable() -- Checks if the API is available

Description

Checks if the API methods to read the drive list are available, and returns that.

They may not be available if the necessary extensions (win32api on PHP4, php_ffi on PHP5) are not installed on the system.

If the API is not available, the drive list is brute-force guessed. Drive types are not available in that case.

Return value

boolean - true if they are there, false if not.

System_WinDrives::setReadName()

System_WinDrives::setReadName() -- Sets the readName setting

Description

Set, if drive names shall be read or not. Drive name reading may crash PHP, so this is disabled by default. You can enable label reading with this method.

Parameter

boolean $bReadName

If the names shall be read or not


Chapter 62. Text

Packages for text manipulation and analysis.



Text_CAPTCHA

Implementation of CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart).


Introduction

This package provides the functionality to create CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart). Features include:

The package creates CAPTCHAs; due to the stateless nature of the HTTP protocol, the logic to secure a webpage using the package must be specifically implemented. See the usage example for detailled information.

Currently, the graphical CAPTCHA driver depends on Image_Text which in turn requires TTF support to be compiled into PHP.


Example

The following example implements the standard use of a CAPTCHA: Submitted form data is only evaluated when a CAPTCHA has been solved correctly.


Text_CAPTCHA_Numeral

Implementation of mathematic operation CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart).


Introduction

This package provides the functionality to create Numeral CAPTCHAs (Completely Automated Public Turing tests to tell Computers and Humans Apart). Features include:

The package creates numeral CAPTCHAs; due to the stateless nature of the HTTP protocol, the logic to secure a webpage using the package must be specifically implemented. See the usage example for detailled information.


Text_Figlet

Render text using FIGlet fonts.

With Text_Figlet you can create ASCII-art like text using FIGlet font description files (FIGlet fonts). The package supports horizontal smushing, German symbols (e.g. äöü), RTL and LTR writing directions as well as incomplete and gzipped fonts (as long as php's zlib extension is installed).


Using the Text_Figlet class

Text_Figlet has only two methods you can use: loadFont() to select a FIGlet font file that will be used later on, and lineEcho() that actually returns the passed text, rendered with the previously selected font.

loadFont() takes the name/path of the FIGlet font file (*.flf or *.flf.gz) as first parameter, and the option if German characters should also be loaded as second, optional parameter (defaults to true). The method either returns true if the font could be loaded, or a PEAR_Error in case of a problem.

lineEcho() can be called (multiple times if needed) after loading the font with loadFont(). The method takes the text that should be rendered using the font as first parameter, and an optional second parameter that determines if the text should be outputted in HTML text. In this case, special characters are escaped and everything is setup so that the text will look correctly. This parameter defaults to false. You should also wrap the line into <pre> tags, since they will monospace the text. Unlike the name implies, the rendered text is not echoed but returned.

The Text_Figlet package already ships some fonts. They are stored in its data directory which can be found calling pear config-get data_dir, and appending Text_Figlet/fonts/ to it. It will contain the following fonts:

Passing one of the font names to loadFont() will automatically look them up in the Text_Figlet font data directory if they are not found.


Text_Highlighter

Provides functionality to perform syntax highlighting for different file formats.


Output Customization

The default behaviour of Text_Highlighter is to generate a syntax highlighted HTML version of the input.

It is possible to instead generate output that is suitable for being displayed on color-capable terminals such as xterm or through less(1) by telling Text_Highlighter to use another renderer:

Also it is possible to further customize the output of both the HTML- and the console-renderer by passing an associative array of options to the constructor:

The following options are applicable:


Text_LanguageDetect

Detects the language of a given piece of text.

The package attempts to detect the language of a sample of text by correlating ranked 3-gram frequencies to a table of 3-gram frequencies of known languages.

It implements a version of a technique originally proposed by Cavnar & Trenkle (1994): "N-Gram-Based Text Categorization".


Example

<?php
require_once 'Text/LanguageDetect.php';
$l = new Text_LanguageDetect();

echo "Supported languages:\n";
$langs = $l->getLanguages();
if (PEAR::isError($langs)) {
    die($langs->getMessage());
}
sort($langs);
echo implode(', ', $langs) . "\n\n";

$text = <<<EOD
Hallo! Das ist ein Text in deutscher Sprache.
Mal sehen, ob die Klasse erkennt, welche Sprache das hier ist.
EOD;

$result = $l->detect($text, 4);
if (PEAR::isError($result)) {
    echo $result->getMessage(), "\n";
} else {
    print_r($result);
}
?>

The above example would give the following output:

Supported languages:
albanian, arabic, azeri, bengali, bulgarian, cebuano, croatian,
czech, danish, dutch, english, estonian, farsi, finnish, french,
german, hausa, hawaiian, hindi, hungarian, icelandic, indonesian,
italian, kazakh, kyrgyz, latin, latvian, lithuanian, macedonian,
mongolian, nepali, norwegian, pashto, pidgin, polish, portuguese,
romanian, russian, serbian, slovak, slovene, somali, spanish,
swahili, swedish, tagalog, turkish, ukrainian, urdu, uzbek,
vietnamese, welsh

Array
(
    [german] => 0.407037037037
    [dutch] => 0.288065843621
    [english] => 0.283333333333
    [danish] => 0.234526748971
)

Text_Password

Table of Contents
Introduction --  Introduction to Text_Password
Supported types of passwords --  This part of the documentation introduces the different supported types of passwords and gives examples for their usage.

Creating passwords with PHP.

Introduction

Introduction --  Introduction to Text_Password

Introduction

Generating passwords is a very common task in web applications. This package provides an easy-to-use and intuitive API to generate

For the last point, multiple, simple "obfuscation" algorithms are supported.

Setup

Requirements

Text_Password requires PHP 4.2.0 or better.

Installation

The Text_Password package can be installed using the PEAR installer command pear install Text_Password.

Alternative installation methods for situations where one has no access to the pear installer command can be found in the general installation chapter.

Uninstallation

Uninstalling the package can be done with pear uninstall Text_Password.

Supported types of passwords

Supported types of passwords --  This part of the documentation introduces the different supported types of passwords and gives examples for their usage.

Pronounceable passwords

One feature of the package is the ability to create passwords that are pronounceable using the static create() method. createMultiple() can be used to create several passwords at once.

Passwords based on given strings

Text_Password provides the ability to create passwords that are based on a given string. In a lot of cases this string is a existing username for a authentication system.

Example 62-3. Creating passwords based on a given string:

require_once "Text/Password.php";

echo "\nCreating password from login 'olivier', type is 'reverse':\t";
echo Text_Password::createFromLogin('olivier', 'reverse') . "\n\n";

echo "\nCreating password from login 'olivier', type is 'rot13':\t";
echo Text_Password::createFromLogin('olivier', 'rot13') . "\n\n";

echo "\nCreating password from login 'olivier', type is 'rotx':\t";
echo Text_Password::createFromLogin('olivier', 'rotx', 13) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'rotx++':\t";
echo Text_Password::createFromLogin('olivier', 'rotx++', 13) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'rotx--':\t";
echo Text_Password::createFromLogin('olivier', 'rotx--', 13) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'xor':\t";
echo Text_Password::createFromLogin('olivier', 'xor', 5) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'ascii_rotx':\t";
echo Text_Password::createFromLogin('olivier', 'ascii_rotx', 5) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'ascii_rotx++':\t";
echo Text_Password::createFromLogin('olivier', 'ascii_rotx++', 5) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'ascii_rotx--':\t";
echo Text_Password::createFromLogin('olivier', 'ascii_rotx--', 5) . "\n\n";

echo "\nCreating password from login 'olivier', type is 'shuffle':\t";
echo Text_Password::createFromLogin('olivier', 'shuffle', 1) . "\n\n";

echo "\nCreating password from an array of login 'olivier', 'martin', 'vanhoucke', 'jansen', type is 'reverse':\n";
$logins = array('olivier', 'martin', 'vanhoucke', 'jansen');
print_r(Text_Password::createMultipleFromLogin($logins, 'reverse'));

Currently the following obfuscation algorithms are supported:

  • xor

  • rotx

  • rotx++

  • rotx--

  • ascii_rotx

  • ascii_rotx++

  • ascii_rotx--

  • shuffle

  • reverse


Text_Statistics

Table of Contents
Introduction --  computation of readability scores for text documents.

computation of readability scores for text documents.

Introduction

Introduction --  computation of readability scores for text documents.

Text_Statistics Description

Text_Statistics allows for computation of readability indexes for text documents.

Text_Statistics calculates some basic readability metrics on a block of text. The number of words, the number of sentences, and the number of total syllables is counted. These statistics can be used to calculate the Flesch score for a sentence, which is a number (usually between 0 and 100) that represents the readability of the text. A basic breakdown of scores is:

More info can be read up on WikiPedia article

see the unit tests for additional examples.

Text_Word calculates the number of syllables in a word, based off of the number of contiguous vowel groupings in the word and applying matches to detect special cases.


Text_Wiki

Table of Contents
Introduction --  Abstracts parsing and rendering rules for Wiki markup in structured plain text

Abstracts parsing and rendering rules for Wiki markup in structured plain text

Introduction

Introduction --  Abstracts parsing and rendering rules for Wiki markup in structured plain text

Text_Wiki Description

The Text_Wiki package allows you to transform text structured using Wiki rules into any defined target output format, such as XHTML, RTF, LaTeX, and so on.

The full online documentation is available here


Chapter 63. Tools and Utilities


MIME_Type

Table of Contents
Detecting MIME types -- How to determine the MIME type of a file
Getting infos about a MIME type -- How to get more information about a MIME type
Editing MIME types -- How to change things

Utility class for dealing with MIME types.

MIME_Type provides methods to detect the MIME (Multipurpose Internet Mail Extension) type of files, retrieving information about MIME types and parsing them.

Detecting MIME types

Detecting MIME types -- How to determine the MIME type of a file

Detecting the MIME type of a file

The most simple way to detect the MIME type of any file is to use MIME_Type's static autoDetect() method. It will try to determine the file's type and return it as a string. If an error occurs, a PEAR_Error object is returned.

By default, only the plain MIME type will be returned, without any comments or parameters. If you pass true as second parameter to the method, all available MIME parameters will be appended to the returned type.

Matching a MIME type

If you want to check if a certain MIME type matches a wildcard type, use the static wildcardMatch(). It takes the wildcard as first, and the type to be checked as second parameter. It returns true if the wildcard matches the MIME type, false if not.

Getting infos about a MIME type

Getting infos about a MIME type -- How to get more information about a MIME type

What a MIME type can be

Using MIME_Type you can get different data about a MIME type. All methods mentioned here can be called statically.

  • getMedia() returns the main part (media part, portion before the slash) of a MIME type. It would return image for image/png.

  • getSubType() returns the subtype of the given type. For image/png, it returns png.

  • isExperimental() checks if a given MIME type is experimental. It returns true or false (e.g. text/x-vcard).

  • isVendor() determines if the given type is a vendor specific MIME type (e.g. as in application/vnd.mozilla.xul+xml).

  • isWildcard() tells you if the passed type is a wildcard type (is either */* or something/*).

Editing MIME types

Editing MIME types -- How to change things

Editing a MIME type

With MIME_Type, you can edit existing MIME types or create new ones from scratch. Just create a new instance of MIME_Type - with the MIME type string as only parameter, if you have one - or no parameter if you want to begin a new one.

To set or retrieve the media type (part before the slash), use the object's $media property. The same applies to the subtype, the property name is $subType.

If you are done editing your MIME type, use get() to retrieve the MIME type's string representation.

Working with parameters

To retrieve parameters, use the $parameters property. It is an array consisting of MIME_Type_Parameter objects if there are any.

You can remove any parameter by calling removeParameter() and passing the parameter's name as only parameter.

Parameters are added with addParameter(). It takes the $name, $value and an optional $comment as parameters.

Again: If you are done editing the parameters, use get() to retrieve the MIME type's string representation.

There are three static methods that help you working with parameters:

  • hasParameters() checks if the passed MIME type string has any parameters in it.

  • getParameters() returns an array of MIME_Type_Parameter objects if there are any parameters in the passed type string.

  • stripParameters() removes all parameters and comments from the given type string.


VersionControl_SVN

VersionControl_SVN is a simple Object-Oriented interface for the svn command-line application that makes up the core of Subversion, a free/open-source version control system.


Introduction

Subversion can be used to manage trees of source code, text files, image files -- just about any collection of files.

VersionControl_SVN's features include:

The power of a version control system like Subversion, when accessed through VersionControl_SVN, can be extended far beyond typical "source code" repositories.

For example, what content management system (CMS) couldn't benefit from version control functionality? For many non-programmers, version control is a confusing subject to get a firm grasp on. With VersionControl_SVN, developers are now able to customize the interface to Subversion with the ease-of-use goals of their particular audience in mind. VersionControl_SVN lets you leverage the strengths of version control without burdening end-users with the learning curve of change control fundamentals.


A Simple Example

So you've got Subversion repository set up somewhere, and you want to take a look at what's inside with a PHP script. With the VersionControl_SVN::VersionControl_SVN_List() command, you're just a few steps away.

If your example repository above happened to have the VersionControl_SVN source in it, your output would be something like this:

Array
(
    [0] => Array
        (
            [name] => docs
            [type] => D
        )

    [1] => Array
        (
            [name] => package.xml
            [type] => F
        )

    [2] => Array
        (
            [name] => SVN.php
            [type] => F
        )

    [3] => Array
        (
            [name] => SVN
            [type] => D
        )

    [4] => Array
        (
            [name] => tests
            [type] => D
        )

)

Note that in the above output, directories are flagged as type D, and files are flagged as type F.


One Factory To Rule Them All

Have a script that needs to utilize several VersionControl_SVN subclasses? At the expense of a little overhead, you can be sure your $svn objects are fully-loaded by using the VersionControl_SVN::factory() command keyword __ALL__.

For example, in a basic script to get the list of current files in a repository, you just need the VersionControl_SVN::VersionControl_SVN_List() subclass.

However, if you need to get a recursive list of files in a repository, look up the recent log activity for those files, and view the annotated source for those files, you've got two options.


Further Reading

If you are interested in learning more about Subversion, see the following:

  • Version Control with Subversion - The primary reference manual for all things related to Subversion, from general use to repository administration.

  • Subversion Website - The official Subversion website offers a FAQ, mailing list, and of course, the Subversion source code. Also included are links to GUI Subversion applications.


Chapter 64. Validate

Validate offers a set of packages to validate common or specific data. The main package validates the common data. Specific data are localised or thematic.

Localized validation class

  • Argentina: Validate_AR

  • Austria: Validate_AT

  • Australia : Validate_AU

  • Belgium: Validate_BE

  • Brasil: Validate_PTBR

  • Canada: Validate_CA

  • Denmark: Validate_DK

  • Finland: Validate_FI

  • France: Validate_FR

  • Germany: Validate_DE

  • Iceland: Validate_IS

  • Ireland: Validate_IE

  • Netherlands: Validate_NL

  • New Zealand: Validate_NZ

  • Poland: Validate_PL

  • Republic of India: Validate_IN

  • South Africa: Validate_ZA

  • Spain: Validate_ES

  • Switzerland: Validate_CH

  • United Kingdom: Validate_UK

  • United States: Validate_US

Thematic validation class

  • Financial: Validate_Finance

  • Credit Cards: Validate_Finance_CreditCard

  • International Standard Product Numbers : Validate_ISPN


Validate_AU

Table of Contents
Introduction -- introduction to Validate_AU
List of available validations -- available validation in Validate_AU
Package Validate_AU Constants -- Constants defined in and used by Validate_AU
Validate_AU::abn() -- Australian Business Number (ABN).
Validate_AU::acn() -- Validate an Australian Company Number (ACN)
Validate_AU::phoneNumber() -- Validate a telephone number.
Validate_AU::postalCode() -- Validate Austrialian postal codes.
Validate_AU::region() -- Validates Australian Regional Codes
Validate_AU::ssn() -- Social Security Number.
Validate_AU::tfn() -- Tax File Number (TFN)

Caution

This package is in alpha state

Package contains locale validation for Australia such as:

  1. Tax File Number

  2. Postal Code

  3. Phone Number

  4. Australian Business Number

  5. Australian Company Number

  6. Regions (States)

See also :

Introduction

Introduction -- introduction to Validate_AU

Description

The package offers some methods to validate specific data for Australia

Usage

General usage

Every module of Validate follows the same philosophy. Propose some validation method which returns a boolean result. Some methods have some optional parameters to set stronger checks.

sample

<?php

// Include the package
require_once 'Validate/AU.php';
?>

List of available validations

List of available validations -- available validation in Validate_AU

Validate a Australian TFN / SSN

Most Australian's will have a TFN (Tax File Number) however not all, it is the closet equivalent we have to a Social Security Number. Note that this validation routine can be accessed through both Validate_AU::tfn() and Valdiate::ssn() methods.

sample

<?php

// Include the package
require_once('Validate/AU.php');

$badTFN = '23 456 782';
$result = Validate_AU::tfn($badTFN);
echo 'Test ' . $badTFN .' : <br />';
var_export($result);

echo '<br /><br />';
$goodTFN = '123 456 782';
$result = Validate_AU::tfn($goodTFN);
echo 'Test ' . $goodNationalId .' : <br />';
var_export($result);
?>

Output :

Test 23 456 782 :
false

Test 123 456 782 :
true
     

Validate a Australian postcode

Australian post code are 4 digit formed.

First parameter is the post code to validate.

An optional parameter for activate strong checks using a list of postcodes.

sample

<?php

// Include the package
require_once('Validate/AU.php');

$badPostCode = 'ABCD';
$result = Validate_AU::postalCode($badPostCode);
echo 'Test ' . $badPostCode .' : <br />';
var_export($result);

echo '<br /><br />';
$goodPostCode = '3000';
$result = Validate_AU::postalCode($goodPostCode);
echo 'Test ' . $goodPostCode .' : <br />';
var_export($result);
?>

Output :

Test ABCD :
false

Test 3000 :
true
     

sample using strong parameter

1234 appears to be a valid 4 digit postcode, however it does not appear in the official list.
<?php

// Include the package
require_once('Validate/AU.php');

$badPostCode = '1234';
$goodPostCode = '7930';

$result = Validate_AU::postalCode($badPostCode);
echo 'Test ' . $badPostCode .' : <br />';
var_export($result);

$result = Validate_AU::postalCode($badPostCode, false);
echo '<br /><br />Test ' . $badPostCode .' : <br />';
var_export($result);

$result = Validate_AU::postalCode($badPostCode, true);
echo '<br /><br />Test ' . $badPostCode .' : <br />';
var_export($result);

$result = Validate_AU::postalCode($goodPostCode, true);
echo '<br /><br />Test ' . $goodPostCode .' : <br />';
var_export($result);
?>

Output :

Test 1234 :
true

Test 1234 :
true

Test 1234 :
false

Test 7930 :
true
     

Validate an ABN

Validate an Australian Business Number.

sample

<?php

// Include the package
require_once('Validate/AU.php');

$badABN = '00 043 145 470';
$result = Validate_AU::abn($badABN);
echo 'Test ' . $badRegion .' : <br />';
var_export($result);

echo '<br /><br />';
$goodABN = '28 043 145 470';
$result = Validate_AU::abn($goodABN);
echo 'Test ' . $goodRegion .' : <br />';
var_export($result);
?>

Output :

Test 00 043 145 470 :
false

Test 28 043 145 470 :
true
     

Validate a Region / State

Validates a 2/3 region (state) code.

sample

<?php

// Include the package
require_once('Validate/AU.php');

$badRegion = 'asdf';
$result = Validate_AU::region($badVAT);
echo 'Test ' . $badRegion .' : <br />';
var_export($result);

echo '<br /><br />';
$goodRegion = 'VIC';
$result = Validate_AU::region($goodRegion);
echo 'Test ' . $goodRegion .' : <br />';
var_export($result);
?>

Output :

Test asdf :
false

Test VIC :
true
     

Validate a phonenumber

Validate an Australian phone number passed as first param. Second parameter can be used to specify flags that signify the type of number to be validated.

Flags can be any combination of the bitwise constants VALIDATE_AU_PHONENUMBER_* as follows:

sample

<?php

// Include the package
require_once('Validate/AU.php');

$nationalPhone       = '03 9999 9999';
$nationalStrictPhone = '0399999999';
$indialPhone         = '1300 131 121';
$internationalSyntax = '+61.3 8779 7212';

echo 'Test ' . $goodPhone .' : <br />';
$result = Validate_AU::phoneNumber($nationalPhone); // the flag VALIDATE_AU_PHONENUMBER_NATIONAL is default
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalPhone, VALIDATE_AU_PHONENUMBER_NATIONAL | VALIDATE_AU_PHONENUMBER_STRICT);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalPhone, VALIDATE_AU_PHONENUMBER_INDIAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalPhone, VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalPhone, VALIDATE_AU_PHONENUMBER_NATIONAL | VALIDATE_AU_PHONENUMBER_INDIAL | VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result);

echo '<br /><br />';
echo 'Test ' . $nationalStrictPhone .' : <br />';
$result = Validate_AU::phoneNumber($nationalStrictPhone);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalStrictPhone, VALIDATE_AU_PHONENUMBER_NATIONAL | VALIDATE_AU_PHONENUMBER_STRICT);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalStrictPhone, VALIDATE_AU_PHONENUMBER_INDIAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalStrictPhone, VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($nationalStrictPhone, VALIDATE_AU_PHONENUMBER_NATIONAL | VALIDATE_AU_PHONENUMBER_INDIAL | VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';

echo '<br /><br />';
echo 'Test ' . $indialPhone .' : <br />';
$result = Validate_AU::phoneNumber($indialPhone);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($indialPhone, VALIDATE_AU_PHONENUMBER_INDIAL | VALIDATE_AU_PHONENUMBER_STRICT);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($indialPhone, VALIDATE_AU_PHONENUMBER_INDIAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($indialPhone, VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($indialPhone, VALIDATE_AU_PHONENUMBER_NATIONAL | VALIDATE_AU_PHONENUMBER_INDIAL | VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';
echo '<br /><br />';

echo 'Test ' . $internationalSyntax .' : <br />';
$result = Validate_AU::phoneNumber($internationalSyntax);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($internationalSyntax, VALIDATE_AU_PHONENUMBER_INTERNATIONAL | VALIDATE_AU_PHONENUMBER_STRICT);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($internationalSyntax, VALIDATE_AU_PHONENUMBER_INDIAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($internationalSyntax, VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';
$result = Validate_AU::phoneNumber($internationalSyntax, VALIDATE_AU_PHONENUMBER_NATIONAL | VALIDATE_AU_PHONENUMBER_INDIAL | VALIDATE_AU_PHONENUMBER_INTERNATIONAL);
var_export($result) . '-';

?>

Output :

Test 03 9999 9999 :
true - false - false - false - true

Test 0399999999 :
true - true - false - false - true

Test 1300 131 121 :
false - false - true - false - true

Test +61.3 8779 7212 :
false - false - true - true - true
     

Package Validate_AU Constants

Package Validate_AU Constants -- Constants defined in and used by Validate_AU

Validate_AU::abn()

Validate_AU::abn() -- Australian Business Number (ABN).

Description

Validates an ABN using a modulus calculation

Parameter

string $abn

ABN to validate

Return value

returns Returns true on success, otherwise false

Throws

throws no exceptions thrown

author

author Byron Adams <byron.adams54@gmail.com>

Note

This function can not be called statically.

Validate_AU::acn()

Validate_AU::acn() -- Validate an Australian Company Number (ACN)

Description

The ACN is a nine digit number with the last digit being a check digit calculated using a modified modulus 10 calculation.

Parameter

string $acn

ACN number to validate

Return value

returns Returns true on success, false otherwise

Throws

throws no exceptions thrown

author

author Byron Adams <byron.adams54@gmail.com>

author Daniel O'Connor <daniel.oconnor@gmail.com>

Note

This function can not be called statically.

Validate_AU::phoneNumber()

Validate_AU::phoneNumber() -- Validate a telephone number.

Description

Note that this function supports the following notations:

  • Landline: 03 9999 9999

  • Mobile: 0400 000 000 (as above, but usually notated differently)

  • Indial: 131 812 / 1300 000 000 / 1800 000 000 / 1900 000 000

  • International: +61.3 9999 9999

For International numbers, only +61 will be valid, as this is Australia's dial code, and the format MUST be +61.3, where 3 represents the state dial code, in this case, Victoria.

Note: If the VALIDATE_AU_PHONENUMBER_STRICT flag is not supplied, then all spaces, dashes and parenthesis are removed before validation. You will have to strip these yourself if your data storage does not allow these characters.

Parameter

string $number

The telephone number

integer $flags

Can be a combination of the following flags:

  • VALIDATE_AU_PHONENUMBER_STRICT: if supplied then no spaces, parenthesis or dashes (-) will be removed.

  • VALIDATE_AU_PHONENUMBER_NATIONAL: when supplied valid national numbers (eg. 03 9999 9999) will return TRUE.

  • VALIDATE_AU_PHONENUMBER_INDIAL: when supplied valid indial numbers (eg. 13/1300/1800/1900) will return TRUE.

  • VALIDATE_AU_PHONENUMBER_INTERNATIONAL: when supplied valid international notation of Australian numbers (eg. +61.3 9999 9999) will return TRUE.

ToDo

todo Check that $flags contains a valid flag.

Throws

throws no exceptions thrown

author

author Alex Hayes <ahayes@wcg.net.au>

author Daniel O'Connor <daniel.oconnor@gmail.com>

Note

This function can not be called statically.

Validate_AU::postalCode()

Validate_AU::postalCode() -- Validate Austrialian postal codes.

Description

This package is not documented yet.

Parameter

string $postcode

postcode to validate

boolean $strong

strong checks against a list of postcodes

Return value

returns true if postcode is ok, false otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Validate_AU::region()

Validate_AU::region() -- Validates Australian Regional Codes

Description

This package is not documented yet.

Parameter

string $region

region code to validate

Return value

returns returns true on success, false otherwise

Throws

throws no exceptions thrown

author

author Byron Adams <byron.adams54@gmail.com>

Note

This function can not be called statically.

Validate_AU::ssn()

Validate_AU::ssn() -- Social Security Number.

Description

Australia does not have a social security number system, the closest equivalent is a Tax File Number

Parameter

string $ssn

ssn number to validate

Return value

returns Returns true on success, false otherwise

Throws

throws no exceptions thrown

Note

This function can not be called statically.

Validate_AU::tfn()

Validate_AU::tfn() -- Tax File Number (TFN)

Description

Australia does not have a social security number system, the closest equivalent is a Tax File Number.

Parameter

string $tfn

Tax File Number

Return value

returns Returns true on success, false otherwise

Throws

throws no exceptions thrown

author

author Byron Adams <byron.adams54@gmail.com>

Note

This function can not be called statically.


Validate_BE

Table of Contents
Introduction -- Introduction to validate_BE
List of aivailable validations -- aivailable validation in validate_be

Caution

This package is in beta state

This package offers methods to validate specific values from Belgium

See also :

Introduction

Introduction -- Introduction to validate_BE

Description

The package offers some methods to validate specific data for Belgium

Usage

General usage

Every module of Validate follows the same philosophy. Propose some validation method retuning boolean result. Some methods have some optional parameters to set a stronger check.

sample

<?php

// Include the package
require_once 'Validate/BE.php';
?>

List of aivailable validations

List of aivailable validations -- aivailable validation in validate_be

Validate a Belgian nationalId

The belgian nationalId on the identity card of all belgian.

A check digit is the last one, computed the standard _get_control_number function.

sample

<?php

// Include the package
require_once('Validate/BE.php');

$badNationalId = '730111-361-99';
$result = Validate_BE::nationalId($badNationalId);
echo 'Test ' . $badNationalId .' : <br />';
var_export($result);

echo '<br /><br />';
$goodNationalId = '730111 361 73';
$result = Validate_BE::nationalId($goodNationalId);
echo 'Test ' . $goodNationalId .' : <br />';
var_export($result);
?>

Output :

Test 730111-361-99 :
false

Test 730111 361 73 :
true
     

Validate a Belgian social security number

The belgian social security number is on the SIS card of all belgian.

A check digit is the last one, computed the standard _get_control_number function.

sample

<?php

// Include the package
require_once('Validate/BE.php');

$badSsn = '72011136173';
$result = Validate_BE::ssn($badSsn);
echo 'Test ' . $badSsn .' : <br />';
var_export($result);

echo '<br /><br />';
$goodSsn = '73011136173';
$result = Validate_BE::ssn($goodSsn);
echo 'Test ' . $goodSsn .' : <br />';
var_export($result);
?>

Output :

Test 72011136173 :
false

Test 73011136173 :
true
     

Validate a Belgian postcode

Belgian post code are 4 digit formed.

First parameter is the post code to validate.

An optional parameter for activate strong checks using a list of postcodes.

sample

<?php

// Include the package
require_once('Validate/BE.php');

$badPostCode = 'ABCD';
$result = Validate_BE::postalCode($badPostCode);
echo 'Test ' . $badPostCode .' : <br />';
var_export($result);

echo '<br /><br />';
$goodPostCode = '7930';
$result = Validate_BE::postalCode($goodPostCode);
echo 'Test ' . $goodPostCode .' : <br />';
var_export($result);
?>

Output :

Test ABCD :
false

Test 7930 :
true
     

sample using strong parameter

1234 like a good post code, but don't exit in the official list.
<?php

// Include the package
require_once('Validate/BE.php');

$badPostCode = '1234';
$goodPostCode = '7930';

$result = Validate_BE::postalCode($badPostCode);
echo 'Test ' . $badPostCode .' : <br />';
var_export($result);

$result = Validate_BE::postalCode($badPostCode,false);
echo '<br /><br />Test ' . $badPostCode .' : <br />';
var_export($result);

$result = Validate_BE::postalCode($badPostCode,true);
echo '<br /><br />Test ' . $badPostCode .' : <br />';
var_export($result);

$result = Validate_BE::postalCode($goodPostCode);
echo '<br /><br />Test ' . $goodPostCode .' : <br />';
var_export($result);
?>

Output :

Test 1234 :
true

Test 1234 :
true

Test 1234 :
false

Test 7930 :
true
     

Validate a Belgian bank account number

Belgian bankcodes consist of

  • 3 figure number for the bank society

  • 7-figure number for the account number

  • 2-figure number for mod 97

sample

<?php

// Include the package
require_once('Validate/BE.php');
$badBankCode = '310164533227';
$result = Validate_BE::bankCode($badBankCode);
echo 'Test ' . $badBankCode .' : <br />';
var_export($result);

echo '<br /><br />';
$goodBankCode = '310164533207';
$result = Validate_BE::bankCode($goodBankCode);
echo 'Test ' . $goodBankCode .' : <br />';
var_export($result);
?>

Output :

Test 310164533227 :
false

Test 310164533207 :
true
     

Validate a Belgian transfert message

Belgian transfert (virement) can be done with a structured message 12 figures

  • 10-figure number for the message

  • 2-figure number for mod 97

sample

<?php

// Include the package
require_once('Validate/BE.php');

$badBankTransferMessage = '053/3140/16211';
$result = Validate_BE::bankTransferMessage($badBankTransferMessage);
echo 'Test ' . $badBankTransferMessage .' : <br />';
var_export($result);

echo '<br /><br />';
$goodBankTransferMessage = '054/3140/16211';
$result = Validate_BE::bankTransferMessage($goodBankTransferMessage);
echo 'Test ' . $goodBankTransferMessage .' : <br />';
var_export($result);
?>

Output :

Test 053/3140/16211 :
false

Test 054/3140/16211 :
true
     

Validate a VAT account number

Belgian VAT consist of 3-figure number.

Actually no doc was found about a checksum.

sample

<?php

// Include the package
require_once('Validate/BE.php');

$badVAT = '102.239.951';
$result = Validate_BE::vat($badVAT);
echo 'Test ' . $badVAT .' : <br />';
var_export($result);

echo '<br /><br />';
$goodVAT = '202-239-951';
$result = Validate_BE::vat($goodVAT);
echo 'Test ' . $goodVAT .' : <br />';
var_export($result);
?>

Output :

Test 102.239.951 :
false

Test 202-239-951 :
true
     

Validate a phonenumber

Validate a belgian phone number passed as first param second specify if it would be a mobile or a traditional line or both. "/" (slash), "-" (dash), "." (dot), and white spaces are ignored. "+" are use a exit code : 0 in Belgium.

NOTE : this validate want a BELGIAN phonenumber to return true, not a valid number to call FROM belgium

sample

<?php

// Include the package
require_once('Validate/BE.php');

$badPhone = '00 32 12 123 45 67';
$result = Validate_BE::phoneNumber($badPhone);
echo 'Test ' . $badPhone .' : <br />';
var_export($result);

echo '<br /><br />';
$goodPhone = '00 32 45 12 34 56';
$result = Validate_BE::phoneNumber($goodPhone);
echo 'Test ' . $goodPhone .' : <br />';
var_export($result);
?>

Output :

Test '00 32 12 123 45 67' :
false

Test '00 32 45 12 34 56' :
true
     

sample

See now with the parameter

<?php

// Include the package
require_once('Validate/BE.php');

$goodPhone = '00 32 45 12 34 56';
$mobilePhone = '00 32 485 34 56';

echo 'Test ' . $goodPhone .' : <br />';
$result = Validate_BE::phoneNumber($goodPhone);
var_export($result) . '-';
$result = Validate_BE::phoneNumber($goodPhone,VALIDATE_BE_PHONENUMBER_TYPE_ANY);
var_export($result) . '-';
$result = Validate_BE::phoneNumber($goodPhone,VALIDATE_BE_PHONENUMBER_TYPE_NORMAL);
var_export($result) . '-';
$result = Validate_BE::phoneNumber($goodPhone,VALIDATE_BE_PHONENUMBER_TYPE_MOBILE);
var_export($result) . '-';

echo '<br /><br />';
$result = Validate_BE::phoneNumber($mobilePhone);
var_export($result) . '-';
$result = Validate_BE::phoneNumber($mobilePhone,VALIDATE_BE_PHONENUMBER_TYPE_ANY);
var_export($result) . '-';
$result = Validate_BE::phoneNumber($mobilePhone,VALIDATE_BE_PHONENUMBER_TYPE_NORMAL);
var_export($result) . '-';
$result = Validate_BE::phoneNumber($mobilePhone,VALIDATE_BE_PHONENUMBER_TYPE_MOBILE);
var_export($result);

?>

Output :

Test 00 32 45 12 34 56 :
true - true - true - false

Test 00 32 485 34 56 :
false - false - false - false
     


Validate_CA

Table of Contents
Introduction -- Introduction to validate_CA
List of aivailable validations -- available validation in validate_ca

Caution

This package is in alpha state

Package contains locale validation for Canada such as:

  1. Social Inurance Numbers (SIN)

  2. Regions (Provinces)

  3. Postal Codes

  4. Phone Numbers

See also:

Introduction

Introduction -- Introduction to validate_CA

Description

The package offers some methods to validate specific data for Canada

Usage

General usage

Every module of Validate follows the same philosophy. Propose some validation method retuning boolean result. Some methods have some optional parameters to set a stronger check.

sample

<?php

// Include the package
require_once 'Validate/CA.php';
?>

List of aivailable validations

List of aivailable validations -- available validation in validate_ca

Validate a canadian social security number

The canadian social security number is on the SIS card of all canadian.

A check digit is the last one, computed the standard _get_control_number function.

sample

<?php

// Include the package
require_once('Validate/CA.php');

$badSsn = '012345674';
$result = Validate_CA::ssn($badSsn);
echo 'Test ' . $badSsn .' : <br />';
var_export($result);

echo '<br /><br />';
$goodSsn = '123456782';
$result = Validate_CA::ssn($goodSsn);
echo 'Test ' . $goodSsn .' : <br />';
var_export($result);
?>

Output :

Test 012345674 :
false

Test 123456782 :
true
     

Validate a canadian postcode

The postal code is a six-character, uniformly structured alphanumeric code in the form of ANA NAN where "A" represents an alphabetic character and "N" represents a numeric character.

The postal code is made up of two segments:

The first, the Forward Sortation Area (FSA), is a combination of three characters (alpha - numeric - alpha).

It identifies a major geographic area in an urban or a rural location.

The third character of the FSA segment (M4B), in conjunction with the first two characters, describes an exact area of a city or town or other geographic area.

The second segment, Local Delivery Unit (LDU), is a combination of three characters (numeric - alpha - numeric).

It identifies the smallest delivery unit within a forward sortation area.

The LDU, identified by the last three characters of the postal code, allows for a final sort within an FSA.

In Urban Areas, the last three digits may indicate a specific city block (one side of a street between two intersecting streets), a single building or, in some cases, a large volume mail receiver.

In Rural Areas, the last three digits (LDU), together with the FSA, identify a specific Rural community.

First parameter of the method is the post code to validate.

An optional parameter for limite the request to a province.

sample

<?php

// Include the package
require_once('Validate/CA.php');

$badPostCode = '48103';
$result = Validate_CA::postalCode($badPostCode);
echo 'Test ' . $badPostCode .' : <br />';
var_export($result);

echo '<br /><br />';
$goodPostCode = 'H2M 2J1';
$result = Validate_CA::postalCode($goodPostCode);
echo 'Test ' . $goodPostCode .' : <br />';
var_export($result);
?>

Output :

Test 48103 :
false

Test H2M 2J1 :
true
     

sample using province parameter

H2M 2J1 like a good post code, but province don't exit.
<?php

// Include the package
require_once('Validate/CA.php');

$postalCode = 'H2M 2J1'; // in Montreal area

$result = Validate_CA::postalCode($postalCode);
echo 'Test ' . $postalCode .' : <br />';
var_export($result);

echo '<br /><br />';
$result = Validate_CA::postalCode($postalCode,'QC');
// QC for Montreal
echo 'Test ' . $postalCode .' in QC: <br />';
var_export($result);

echo '<br /><br />';
$result = Validate_CA::postalCode($postalCode,'AB');
// AB for Toronto
echo 'Test ' . $postalCode .' in AB: <br />';
var_export($result);

?>

Output :

Test H2M 2J1 :
true

Test H2M 2J1 in QC:
true

Test H2M 2J1 in AB:
false
     

Validate a phonenumber

Canada and the United States share the same numbering plan, hence you can also call Validate_US::phoneNumber()

Can allow only seven digit numbers.

Also allows the formats, (xxx) xxx-xxxx, xxx xxx-xxxx, and now x (xxx) xxx-xxxx or various combination without spaces or dashes.

sample

<?php
// Include the package
require_once('Validate/CA.php');

$phoneNumber = '467875098x';
$result = Validate_CA::phoneNumber($phoneNumber);
echo 'Test ' . $phoneNumber .' : <br />';
var_export($result);
echo '<br />';

$phoneNumber = '4678750987';
$result = Validate_CA::phoneNumber($phoneNumber);
echo 'Test ' . $phoneNumber .' : <br />';
var_export($result);

?>

Output :

Test 467875098x :
false
Test 4678750987 :
true
     

sample

See now with the parameter

<?php
// Include the package
require_once('Validate/CA.php');

$phoneNumber = '8750987';
$result = Validate_CA::phoneNumber($phoneNumber,false);
echo 'Test ' . $phoneNumber .' : <br />';
var_export($result);

echo '<br /><br />';
$phoneNumber = '8750987';
echo 'Test ' . $phoneNumber .' : <br />';
echo 'With $requireAreaCode false <br />';
$result = Validate_CA::phoneNumber($phoneNumber,false);
var_export($result);
echo '<br />';
echo 'With $requireAreaCode true<br />';
$result = Validate_CA::phoneNumber($phoneNumber,true);
var_export($result);


echo '<br /><br />';
$phoneNumber = '(467)8750987';
echo 'Test ' . $phoneNumber .' : <br />';
echo 'With $requireAreaCode false <br />';
$result = Validate_CA::phoneNumber($phoneNumber,false);
var_export($result);
echo '<br />';
echo 'With $requireAreaCode true<br />';
$result = Validate_CA::phoneNumber($phoneNumber,true);
var_export($result);


?>

Output :

Test 8750987 :
true

Test 8750987 :
With $requireAreaCode false
true
With $requireAreaCode true
false

Test (467)8750987 :
With $requireAreaCode false
false
With $requireAreaCode true
true
     


Validate_FI

Table of Contents
Introduction -- introduction to Validate_FI
Validate_FI::postalCode() -- Validate Finnish postal code
Validate_FI::phoneNumber() -- Validate Finnish telephone number
Validate_FI::carLicensePlate() -- Validate Finnish car license plate number
Validate_FI::bikeLicensePlate() -- Validate Finnish motorbike license plate number
Validate_FI::pin() -- Validate Personal Identity Number (HETU)
Validate_FI::finuid() -- Validate Finnish Unique Identification Number (SATU)
Validate_FI::businessId() -- Validate Finnish Business ID (Y-tunnus)
Validate_FI::partyId() -- Validate Finnish Party Identification number (OVT-tunnus)
Validate_FI::vatNumber() -- Validate Finnish Value Added Tax number (ALV-numero)
Validate_FI::bankAccount() -- Validate Finnish bank account number
Validate_FI::refNum() -- Validate Finnish bank reference number
Validate_FI::creditCard() -- Validate credit card number

Specific validation methods for data used in Finland.

See also:

Introduction

Introduction -- introduction to Validate_FI

Description

Specific validation methods for data used in Finland.

Usage

General usage

Every module of Validate follows the same philosophy. Propose some validation method which returns a boolean result.

Some methods have some optional parameters to set stronger checks.

Sample using phoneNumber()

<?php
// Include the package
require_once 'Validate/FI.php';

// Validate Finnish telephone number
$phoneNumber = '+358 40 1234567';
if ( Validate_FI::phoneNumber($phoneNumber) ) {
    print 'Valid';
} else {
    print 'Not valid!';
}
?>

Output:


Valid
    

Validate_FI::postalCode()

Validate_FI::postalCode() -- Validate Finnish postal code

Description

Validate Finnish postal code.

Five digit postal code, maybe with a leading 'FI-' (XXXXX or FI-XXXXX).

An optional parameter for activate strong checks using a list of postcodes (not implemented).

Parameter

string $number

The postal code to be validated

boolean $strong

optional; strong checks (e.g. against a list of postal codes)(not implemented)

Return value

boolean - true if postal code is valid, false otherwise

Validate_FI::phoneNumber()

Validate_FI::phoneNumber() -- Validate Finnish telephone number

Description

Validate Finnish telephone number.

Simple check: number must be numeric when (, ), -, +, ., ' ' chars are removed and 3-20 digit number.

Parameter

string $number

The telephone number to be validated

Return value

boolean - true if telephone number is valid, false otherwise

Validate_FI::carLicensePlate()

Validate_FI::carLicensePlate() -- Validate Finnish car license plate number

Description

Validate Finnish car license plate number. Format: AAA-XXX, CD-XXXX or C-XXXXX. First or only number cannot be zero.

AAA-XXX: AAA is 2-3 letters UPPERCASE A-Z + ÅÄÖ and XXX is 1-3 numbers.

CD-XXXX: CD- and XXXX is 1-4 numbers (diplomat licence plate).

C-XXXXX: C- and XXXXX is 1-5 numbers (other tax-free diplomat licence plate).

Parameter

string $number

The license plate number to be validated

Return value

boolean - true if license plate number is valid, false otherwise

Validate_FI::bikeLicensePlate()

Validate_FI::bikeLicensePlate() -- Validate Finnish motorbike license plate number

Description

Validate Finnish motorbike license plate number. Format: AAAXXX. First or only number cannot be zero.

Where AAA is 2-3 letters UPPERCASE A-Z + ÅÄÖ and XXX is 1-3 numbers. Letters and numbers are actually in separate lines.

Parameter

string $number

The license plate number to be validated

Return value

boolean - true if license plate number is valid, false otherwise

Validate_FI::pin()

Validate_FI::pin() -- Validate Personal Identity Number (HETU)

Description

Validate Personal Identity Number (HETU).

The Finnish PIN number (HETU) aka Social Security Number (SSN) is a 11 digit number with birthdate as ddmmyycxxxy where c is century, xxx is a three digit individual number and the last digit is a control number (y).

If xxx is odd it's a male PIN number and if even a female.

Return gender (Male or Female) and date of birth (YYYY-MM-DD) in array if PIN is valid, is available by switching $info (2nd parameter) to true.

Example: 010101-123N would be a male and born in 1st of January 1901.

Parameter

string $number

PIN number to be validated

boolean $info

optional; Return gender and date of birth on success

Return value

mixed - Returns true or false if $info = false or gender (Male or Female) and date of birth (YYYY-MM-DD) in array if PIN is valid, false otherwise

Validate_FI::finuid()

Validate_FI::finuid() -- Validate Finnish Unique Identification Number (SATU)

Description

Validate Finnish Unique Identification Number (SATU). Format: xxxxxxxxy.

FINUID (SATU) is a 9 digit number. The last digit is a control number.

Parameter

string $number

FINUID number to be validated

Return value

boolean - true if FINUID is valid, false otherwise

Validate_FI::businessId()

Validate_FI::businessId() -- Validate Finnish Business ID (Y-tunnus)

Description

Validate Finnish Business ID (Y-tunnus). Format: xxxxxxx-y.

The Finnish Business ID number (Y-tunnus) is a 9 digit number. The last digit is a control number (y).

Parameter

string $number

Business ID number to be validated

Return value

boolean - true if Business ID is valid, false otherwise

Validate_FI::partyId()

Validate_FI::partyId() -- Validate Finnish Party Identification number (OVT-tunnus)

Description

Validate Finnish Party Identification number (OVT-tunnus).

The Finnish Party Identification number (OVT-tunnus) is a 12-17 digit number and it is generated from Business ID.

Example: 0037AAAAAAAABBBBB, 0037 indicates Finland, AAAAAAAA is the Business ID and BBBBB is optional organization number.

Parameter

integer $number

Party Identification number to be validated

Return value

boolean - true if number is valid, false otherwise

Validate_FI::vatNumber()

Validate_FI::vatNumber() -- Validate Finnish Value Added Tax number (ALV-numero)

Description

Validate Finnish Value Added Tax number (ALV-numero). Format: FIXXXXXXXX.

The Finnish VAT number (ALV-numero) is maximum of 14 digits and is generated from Business ID.

Parameter

string $number

VAT number to be validated

Return value

boolean - true if VAT number is valid, false otherwise

Validate_FI::bankAccount()

Validate_FI::bankAccount() -- Validate Finnish bank account number

Description

Validate Finnish bank account number. Format: XXXXXX-XXXXXXXX, 6 digits, - and 2-8 digits.

This method checks the bank account number according to Finnish Bank Association.

Parameter

string $number

Finnish bank account number to be validated

Return value

boolean - true if bank account is valid, false otherwise

Validate_FI::refNum()

Validate_FI::refNum() -- Validate Finnish bank reference number

Description

Validate Finnish bank reference number.

This method checks the bank reference number according to Finnish Bank Association.

Parameter

string $number

Finnish bank reference number to be validated (spaces and dashes tolerated)

Return value

boolean - true if reference number is valid, false otherwise

Validate_FI::creditCard()

Validate_FI::creditCard() -- Validate credit card number

Description

Validate credit card number.

This method checks the credit card number according to Luhn algorithm. This method doesn't guarantee that the card is legitimate.

Parameter

string $number

credit card number to be validated (spaces and dashes tolerated)

Return value

boolean - true if credit card number is valid, false otherwise


Validate_IE

Table of Contents
Introduction -- Introduction to validate_IE
List of available validations -- available validation in validate_ie

Caution

This package is in beta state

Package contains locale validation for Ireland such as:

  1. Bank Account

  2. Drivers Licence Numbers

  3. IBAN

  4. Passport Numbers

  5. Phone Numbers

  6. Postal Code

  7. SSN/PPSN

  8. SWIFT Codes

See also :

Introduction

Introduction -- Introduction to validate_IE

Description

The package offers some methods to validate specific data for Ireland

Usage

General usage

Every module of Validate follows the same philosophy. Propose some validation method retuning boolean result. Some methods have some optional parameters to set a stronger check.

sample

<?php

// Include the package
require_once 'Validate/IE.php';
?>

List of available validations

List of available validations -- available validation in validate_ie

Validate an Irish PPSN number

The Personal Public Service Number (PPS No) is an identifier issued by Client Identity Services, Department of Social and Family Affairs on behalf of the Minister for Social and Family Affairs in the Republic of Ireland.

sample

<?php

// Include the package
require_once 'Validate/IE.php';

$badSsn = '012345674';
$result = Validate_IE::ssn($badSsn);
echo 'Test ' . $badSsn .' : <br />';
var_export($result);

echo '<br /><br />';
$goodSsn = '1234567W';
$result = Validate_IE::ssn($goodSsn);
echo 'Test ' . $goodSsn .' : <br />';
var_export($result);
?>

Output :

Test 012345674 :
false

Test 1234567W :
true
     

Validate an Irish postcode

There is no national post code system in Ireland; at present the postalCode method only validates Dublin postal districts: "Dublin 6W", or "D 4" for example.

Validate a phonenumber

Ireland has phone numbers that are built similar to US and Canadian numbers however they have a couple of distinctions.

For instance the STD [Standard Trunk Dial] prefix varies in length: Dublin has the code '01', Cork has '021', Galway 091, and so on.

The phoneNumber method takes two parameters: the first is the phone number to be tested and the second is a flag indicating whether the number should be checked for a valid prefix. This boolean flag defaults to true.

sample with area code prefix testing on by default.

<?php
// Include the package
require_once 'Validate/IE.php';

$phoneNumber = '467875098x';
$result = Validate_IE::phoneNumber($phoneNumber);
echo 'Test ' . $phoneNumber .' : <br />';
var_export($result);
echo '<br />';

$phoneNumber = '014142438';
$result = Validate_IE::phoneNumber($phoneNumber);
echo 'Test ' . $phoneNumber .' : <br />';
var_export($result);

?>

Output :

Test 467875098x :
false

Test  014142438:
true
     

sample

See now with the requiredAreaCode parameter being utilised.

<?php
// Include the package
require_once 'Validate/IE.php';

$phoneNumber = '87509824';
$result = Validate_IE::phoneNumber($phoneNumber,false);
echo 'Test ' . $phoneNumber .' : <br />';
var_export($result);

echo '<br /><br />';
$phoneNumber = '8750987';
echo 'Test ' . $phoneNumber .' : <br />';
echo 'With $requireAreaCode false <br />';
$result = Validate_IE::phoneNumber($phoneNumber,false);
var_export($result);
echo '<br />';
echo 'With $requireAreaCode true<br />';
$result = Validate_IE::phoneNumber($phoneNumber,true);
var_export($result);


echo '<br /><br />';
$phoneNumber = '(0915)8750987';
echo 'Test ' . $phoneNumber .' : <br />';
echo 'With $requireAreaCode false <br />';
$result = Validate_IE::phoneNumber($phoneNumber,false);
var_export($result);
echo '<br />';
echo 'With $requireAreaCode true<br />';
$result = Validate_IE::phoneNumber($phoneNumber,true);
var_export($result);


?>

Output :

Test 87509824 :
true

Test 8750987 :
With $requireAreaCode false
true
With $requireAreaCode true
false

Test (091)8750987 :
With $requireAreaCode false
false
With $requireAreaCode true
true
     


Chapter 65. Web Services


Services_Blogging

Generic driver-based package to post and read blog entries.


Introduction to Services_Blogging

Weblogs are an important part of the internet: They allow normal people to express their opinions and thoughts to their family, friends and the whole world by simply publishing some text on a server. This process is very easy and you don't need a grade in computer science to even host a blog on your own or a rented server.

One drawback of blog software is mostly their user interface: Since it is browser based, it requires you to be either online all the time while writing your blog post, or write it in a normal text editor and copy&paste it when going online. Using a text editor you cannot apply font styles to your text.. An offline tool to write blog entries would be really nice in this case.

Considering the idea of an offline tool for writing blog entries leads to the availability of access to your blog from outside the normal web interface - e.g via web services. Most blog hosters and blogging software packages have support for such a web services API, mostly via XML-RPC.

Unfortunately, there are many different of these application programming interfaces in the wild. Some of them support only posting of blog entries, other ones also allow reading. Some blog softwares support images and tags in their posts, others not. The variety is large, and so you could end up writing custom code for every blog server you want to access because of the differences in their API.

This is the point at which Services_Blogging comes into play: It provides a unified API to post and read blog entries, independent of the API supported by the server software hosting the blog. It uses a driver-based approach to communicate with different APIs out there. If a new blogging API is invented, someone just needs to write a driver for the Services_Blogging package, and everyone can access also this blogs.

As of April 2007, the package has the following drivers:


Connecting your blog server

To post entries to your blog, you first need to obtain an instance of the Services_Blogging_Driver suitable for your blog. You need to either find out which API your blog system supports, or let Services_Blogging magically autodiscover those settings.

Creating a driver is done using Services_Blogging's factory() method. It requires five parameters: The driver name, username, password, server URL and the path of the API on the server.

Some blog drivers don't need server and path variables, just fill in null in this case.


Autodiscovering settings

Since it can be tedious to find out which settings are needed for your own blog, this package has a feature called autodiscovery. You either can automatically detect the settings needed to create an instance of the driver needed, or let the class automatically detect and return an instance of the driver needed for your blog system.

Autodiscovering the settings of your blog can be done via Services_Blogging's discoverSettings(), passing the URL of your blog as only parameter. It returns an array with all the needed settings.

Most of the blogging softwares today support multiple blogging APIs. After getting a list of supported APIs via autodiscovery, you need to choose which one fits you best; it's usually the one supporting the most features. Services_Blogging also helps you with this task by providing a method called getBestAvailableDriver(), just passing the array of recently discovered settings to it. Now you have all data needed to instantiate the driver itself.

If that all is still too much work for you, you can let do Services_Blogging everything by calling discoverDriver(), passing the URL of your blog, your username and password to it. It returns a the driver object.


Services_Delicious

Table of Contents
Introduction -- Introduction to Services_Delicious
Example -- Basic examples of Services_Delicious

Object-oriented abstraction for del.icio.us XML API.

Introduction

Introduction -- Introduction to Services_Delicious

Introduction to Services_Delicious

Services_Delicious is an abstraction for the webservice of the social bookmarking site del.icio.us. del.icio.us allows you to easily add sites you like to your personal collection of links, to categorize those sites with keywords, and to share your collection not only between your own browsers and machines, but also with others.

del.icio.us is using "tags" to categorize your bookmarks and allows other users to browse bookmarks by topic.

Services_Delicious enables you to access, add and even delete your social bookmarks by using a Services_Delicious class that provides functions like getAllPosts(), addPost() or deletePost().

Example

Example -- Basic examples of Services_Delicious

Services_Ebay

Table of Contents
Introduction -- Introduction to Services_Ebay
Getting started -- Getting started with the eBay webservice
XML encoding -- XML encoding in Services_Ebay
Error Handling -- Error Handling in Services_Ebay
Architecture -- The architecture of Services_Ebay
Example -- Basic example of Services_Ebay

Object-oriented abstraction for eBay's XML API.

Introduction

Introduction -- Introduction to Services_Ebay

Introduction to Services_Ebay

Services_Ebay is an object-oriented abstraction layer for eBay's XML API. In addition to a SOAP-service, eBay provides an API, that does not follow any standards except wrapping all webservice calls and parameters in XML. This webservice still is more powerful than eBay's SOAP server and in addition has been heavily tested by real-life applications.

eBay's webservice enables you to use all of eBay's features (except bidding on items) in your own PHP applications. The features range from adding new items to managing the transaction, payment and shipping. Currently there are about 70 method calls available, all accept a range of parameters.

Services_Ebay (as of version 0.7.0) already provides wrappers for 50 methods as well as some model classes which help you working with the results from the calls.

To use this package you will need PHP5 with cURL support enabled and should be familiar with PHP5's exception handling.

Getting started

Getting started -- Getting started with the eBay webservice

Developing eBay applications

The eBay webservice is of course not free to use by the public. To develop and test your applications, you will have to register as an eBay developer (which is free of charge). Furthermore, you will not be able to test and develop on the eBay site, before your application has been certified.

The eBay sandbox

The eBay Developers Program Sandbox is a test environment that represents a "mini" eBay site. The Sandbox provides the most important features of the eBay site, allowing you to build and test your application in a non-production environment. The eBay Sandbox supports both API testing as well as site testing via the GUI interface.

While developing your application, you will always be using the eBay sandbox, which can be accessed via web at http://sandbox.ebay.com/. This site looks and behaves like any eBay website you are being used to.

Using the sandbox

To develop applications in the sandbox you will have to register at the eBay developers program. To do this, follow these steps:

  1. Register as an eBay user:

    In order to register as an eBay developer, you'll have to be an eBay user. As eBay users are valid on all international sites, it is sufficient if you have an eBay user id for your local eBay site, like ebay.com or ebay.de.

  2. Register as an eBay developer:

    Next, you will have to register as an eBay developer at the eBay developer program. This procedure can take some time, as they require you to enter a lot of information, so you should do this carefully. If you are developing an open source application using Services_Ebay, you should apply for an Individual license.

    After the registration has been finisehd, you will recieve three keys that you will need to authenticate your eBay application: DevID, AppID and CertID. You will need these keys later so you should save them somewhere.

  3. Create one or more test users:

    As the sandbox does not share any data with the eBay sites, you will have to create new users that you can use to add items, make transactions and give feedback. You can create as many users as you need for testing purposes, just use the registration form in the sandbox.

    You will need a valid email address for each of your users, as well as a valid US address and telephone number, you can easily get on by using YellowPages. A credit card is not required, your test users will receive money from eBay they can spend in the sandbox. Of course, this is no real money, which has not use outside of the sandbox.

  4. Validate your test users:

    If you want your test users to sell items on eBay, you will need to validate them. This can be done using the ValidateTestUserRegistration() API call, which is already supported by Services_Ebay.

Authentication and Authorization

eBay's Auth&Auth process is quite complex and can be the biggest hurdle for getting started with the webservice. To make an API call the following information is required:

  • DevID (received after registration, unique per developer)

  • AppID (received after registration, unique per application)

  • CertID (received after registration, unique per application)

  • Authentication Token, unique for each user of your application

While you already are in possession of the first three tokens, you still need the last one to make an API call. If your application is used by more than one user (which is the case for web applications), eBay does not want your application to receive the usernames and passwords of your users. If a user authenticates, your application is supposed to redirect him to the eBay login page and pass an additional parameter (a so called RuName). The user will then enter his login information as he is used to on the eBay website and then authorize your application to make API calls on his behalf.

After that, eBay will redirect the user back to your application and pass a unique token, which can be used to identify this user when your application is making API calls. This technique has several advantages:

  • Single sign-on system for eBay applications

  • When your application is hacked, no passwords are revealed

  • The user only sees the login screen he is used to.

As this authentication procedure is quite complex and requires various API calls to function there is an easier way, which can be used for testing. eBay provides the so called Single-User-Tool, an HTML-based tool, which creates tokens that you can use to authenticate a user. All you need to do is submit your DevID, AppID and CertID and select whether the token will be used in the sandbox or production environment.

Getting started with Services_Ebay

Services_Ebay provides a lot of examples, which demonstrate how the API calls have to be used. After installing Services_Ebay, they will be located in the docs/ directory of your PEAR installation. In order to run the examples, you will have to supply the authentication credentials you received from eBay. The easiest way to do this, is to modify the config.php file, which is located in the examples folder.

XML encoding

XML encoding -- XML encoding in Services_Ebay

XML encoding in Services_Ebay

Since mid-2005, the eBay API will only accept UTF-8 encoded XML-documents. As encoding all data to UTF-8 is tedious, Services_Ebay will take care of this for you. All you need to do is specify the encoding you want to use in your script when creating a session object.

The umlaut characters contained in the description of the item will be automatically converted to UTF-8 when the XML-document is created. Furthermore the result document which is returned by the eBay API will be decoded again to ISO-8859-1 so you do not have to worry about UTF-8 at all.

Of course, it is also possible to supply UTF-8 encoded data to Services_Ebay. All you have to do is change the encoding type, when creating the session object.

In this example you are using utf8_encode() to encode the data prior to passing it to Services_Ebay. To avoid duplicated encoding, you need to set the encoding to UTF-8.

Error Handling

Error Handling -- Error Handling in Services_Ebay

Exceptions in Services_Ebay

As Services_Ebay is a PHP 5 only package, it uses exception handling and the PEAR_Exception class as base class for all exceptions. Exceptions can be thrown, whenever you try to call any of the API calls provided by Services_Ebay, which means you should always nest those in a try/catch-block:

When calling a non-existent API call or passing the wrong parameters to the API, eBay will abort the API call and return an XML-document that contains error information. Services_Ebay will automatically convert this into an exception that can be easily handled by your PHP application.

Warnings in Services_Ebay

In some cases, the eBay API will still process your request, even if you passed invalid parameters and include error information in the resulting XML-document alongside the actual response of your request.

In this case, the errors will be tagged as warnings, as they were not serious errors. Services_Ebay will not convert these errors to exceptions, but only to instances of Services_Ebay_Error. These objects will be stored in the Services_Ebay_Session and can be retrieved by your application at a later point.

Architecture

Architecture -- The architecture of Services_Ebay

Overview of Services_Ebay architecture

Services_Ebay consists of a lot of small classes, which keeps the used codebase small, as only the functionality that you use in your applications are loaded and parsed.

This will give you a short overview of the different types of objects that are provided and for which tasks they are used.

Services_Ebay

The Services_Ebay class is used for the following tasks:

  1. Provides factory methods.

    The Services_Ebay provides methods to load and instantiate all of the other classes, that are included in the Services_Ebay distribution. That means that this is the only class you should include and instantiate yourself. Factory methods include loadApiCall(), getSession() and loadModel().

  2. Provides constants.

    This class also defines some constants like the eBay site ids that you will need in your applications, constants include Services_Ebay::SITEID_ID, Services_Ebay::AUTH_TYPE_TOKEN or Services_Ebay::FEEDBACK_BRIEF. Whenever the eBay webservice expects an integer value in an XML tag, Services_Ebay tries to provide a matching constant.

  3. Provides static helper methods.

    The class also provides some helper methods, which can be called statically like getAvailableApiCalls().

  4. Acts as a proxy class.

    The most important usage is that Services_Ebay acts as a proxy class for the API calls, that means you can call methods on the class which will then be redirected to the appropriate call object.

Services_Ebay_Session

The Services_Ebay_Session class is used to handle the serialization and unserialization of the incoming and outgoing XML streams. Furthermore it builds the HTTP headers that are needed and manages all user authentication.

You will probably always use the session indirectly by at first passing it to the Services_Ebay object which will then use the session for making API calls.

Services_Ebay_Transport

The Services_Ebay_Transport classes are used to build up network connections to the eBay webservices and send and recieve the raw data which has been created by Services_Ebay_Session.

Theoretically there may be different transport classes, but due to bugs in PHP's stream functions and some SSL libraries, the only working transport class is Services_Ebay_Transport_Curl, which uses PHP's curl extension.

Services_Ebay_Call

The Services_Ebay_Call classes contain information about the API calls that the eBay webservice offers. Each API call is encapsulated in an object that contains information about the API call, which XML tags have to be used and what the call is expected to return.

There are two ways in which the call objects can be used:

  1. Instantiate them directly (best via the factory method of Services_Ebay), pass all parameters and invoke Services_Ebay_Call::call() while passing the session object to this method.

  2. Use Services_Ebay as a proxy object which is able to do all the work by using PHP5's new object overloading features.

It is recommended to use Services_Ebay as a proxy instead of working directly on the Call objects. Services_Ebay will instantiate the class, pass the parameters and invoke the call method on the Call object.

Services_Ebay_Model

The Services_Ebay_Model classes act as local containers for the remote data stored on the eBay server. For example, when calling Services_Ebay::getItem(), the method will return an instance of Services_Ebay_Model_Item, which contains information about the item as well as some helper methods like Services_Ebay_Model_Item::addToDescription() which encapsulates a new API call.

Currently Services_Ebay provides models for accounts, disputes (single dispute and a list of disputes), user feedback (summary and a single feedback entry), items and list of items, MyeBay, orders, preferences, search results, shipments, eBay stores, transactions and users.

Services_Ebay_Cache

The Services_Ebay_Cache classes allow you to locally cache information that you retrieved from the eBay webservice without changing anything in your scripts. After registering a cache instance for any model type, Services_Ebay will query the cache before making a time-consuming API call.

The cache classes use a very high abstraction and allow you to create new cache containers, so you could store the data in a database, shared memory or wherever you like. Currently there is only one container available, which stores the data in the local filesystem.

To determine, whether a cache is still valid an instance of Services_Ebay_Cache_ExpiryCheck is used, which allows you to build "intelligent" caches that have a shorter expiry time the nearer the end of an auction is.

Example

Example -- Basic example of Services_Ebay

Services_Technorati

Table of Contents
Introduction and Quick Start -- Overview of Services_Technorati

A class for interacting with the Technorati API

Introduction and Quick Start

Introduction and Quick Start -- Overview of Services_Technorati

Description

Technorati is a blog search engine. By indexing blogs and exploring links between them, they provide tools for monitoring online conversations taking place on and between blogs. By far the richest source of this information is through their REST-based API, to which this module provides an OO PHP interface. Full documentation for Technorati's API is available on their developers' wiki. To use the API you will need an API key.

To protect against future changes to the underlying API it is accessed using a factory method:
$tapi =& Services_Technorati::factory($api_key);

The Technorati API limits you to 500 queries per day so those wishing to use it in a high-demand environment will want to employ some caching. Services_Technorati provides support for any caching system with a Cache_Lite-like API. To use a cache, you will need to create it and then pass it to the class in the factory:
$tapi =& Services_Technorati::factory($api_key, $cache_object);

Once you have instantiated the object you can start passing in queries. Each call takes the form of methodName(keyParameter, options) where options is an array.

(NB. Support for Technorati's attention. XML services is also included in accordance with the spec, but those services are currently in a state of flux so cannot be relied upon.)

The value returned from each query will be either an array representing the unserialized XML or a PEAR Error.

Example 65-1. An example return from the blogInfo query (for 'jystewart') is:

Array
(
    [version] => 1.0
    [document] => Array
        (
            [result] => Array
                (
                    [username] => jystewart
                    [firstname] => James
                    [lastname] => Stewart
                )

            [item] => Array
                (
                    [0] => Array
                        (
                            [weblog] => Array
                                (
                                    [name] => little more than a placeholder
                                    [url] => http://james.anthropiccollective.org
                                    [rssurl] => http://james.anthropiccollective.org/index.rdf
                                    [atomurl] => http://james.anthropiccollective.org/atom.xml
                                    [inboundblogs] => 52
                                    [inboundlinks] => 82
                                    [lastupdate] => 2005-08-27 09:01:42 GMT
                                    [rank] => 7483
                                    [lat] => 0
                                    [lon] => 0
                                    [lang] => 26110
                                    [foafurl] => http://jystewart.net/foaf.rdf
                                )

                        )

                    [1] => Array
                        (
                            [weblog] => Array
                                (
                                    [name] => something approaching a photo album
                                    [url] => http://approach.anthropiccollective.org
                                    [rssurl] =>
                                    [atomurl] =>
                                    [inboundblogs] => 1
                                    [inboundlinks] => 1
                                    [lastupdate] => 2004-08-13 17:40:02 GMT
                                    [rank] => 240760
                                    [lat] => 0
                                    [lon] => 0
                                    [lang] => 0
                                )

                        )

                    [2] => Array
                        (
                            [weblog] => Array
                                (
                                    [name] => grwifi.net : wireless internet (wifi) in grand rapids, michigan
                                    [url] => http://grwifi.net
                                    [rssurl] =>
                                    [atomurl] => http://grwifi.net/atom/
                                    [inboundblogs] => 9
                                    [inboundlinks] => 11
                                    [lastupdate] => 2005-04-15 19:44:46 GMT
                                    [rank] => 50688
                                    [lat] => 0
                                    [lon] => 0
                                    [lang] => 26110
                                )

                        )

                    [3] => Array
                        (
                            [weblog] => Array
                                (
                                    [name] => a work on process
                                    [url] => http://jystewart.net/process
                                    [rssurl] => http://jystewart.net/process/feed/
                                    [atomurl] => http://jystewart.net/process/feed/atom/
                                    [inboundblogs] => 3
                                    [inboundlinks] => 3
                                    [lastupdate] => 2005-08-31 20:44:38 GMT
                                    [rank] => 132735
                                    [lat] => 0
                                    [lon] => 0
                                    [lang] => 26110
                                    [foafurl] => http://jystewart.net/foaf.rdf
                                )
                        )
                )
        )
)

Full details of the XML returned by Technorati is included on the developers' wiki


Services_W3C_HTMLValidator

Table of Contents
Introduction --  Introduction to Services_W3C_HTMLValidator
Examples --  Using Services_W3C_HTMLValidator

This package provides a programmable interface to the W3's HTML Validation service at http://validator.w3.org/.

With this package you can use PHP to obtain usable validation results for HTML. The package utilizes the SOAP 1.2 output format of validator to populate validation result objects with true | false as well as any errors and warning messages.

See the examples included with the package for usage.

Introduction

Introduction --  Introduction to Services_W3C_HTMLValidator

Overview

The package provides an object oriented interface to communicate with W3C's HTML validator by using their XML-based output interface. See the examples page for information on how to use this package to get validation results.

Setup

Installation

The Services_W3C_HTMLValidator package can be installed using the PEAR installer command pear install Services_W3C_HTMLValidator. If the installation fails due to missing dependencies, one either needs to install them manually or can make the installer fetch all dependencies automatically: pear install -a Services_W3C_HTMLValidator.

Examples

Examples --  Using Services_W3C_HTMLValidator

Services_Weather

Table of Contents
Class Summary Services_Weather -- PEAR::Services_Weather
Services_Weather::apiVersion() -- For your convenience, when I come up with changes in the API...
Services_Weather::isError() -- Checks for an error object, same as in PEAR
Services_Weather::service() -- Factory for creating the services-objects
Class Summary Services_Weather_Common -- PEAR::Services_Weather_Common
Services_Weather_Common::calculateDewPoint() --  Calculate dewpoint from temperature and humidity This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateHumidity() --  Calculate humidity from temperature and dewpoint This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateWindChill() -- Calculate windchill from temperature and windspeed (enhanced formula)
Services_Weather_Common::convertDistance() -- Convert distance between km, ft and sm
Services_Weather_Common::convertPressure() -- Convert pressure between in, hpa, mb, mm and atm
Services_Weather_Common::convertSpeed() -- Convert speed between mph, kmh, kt, mps and fps
Services_Weather_Common::convertTemperature() -- Convert temperature between f and c
Services_Weather_Common::getUnitsFormat() -- Returns the selected units format
Services_Weather_Common::polar2cartesian() -- Convert polar coordinates to cartesian coordinates
Services_Weather_Common::setCache() -- Enables caching the data, usage strongly recommended
Services_Weather_Common::setDateTimeFormat() -- Changes the representation of time and dates (see http://www.php.net/date)
Services_Weather_Common::setHttpTimeout() -- Sets the timeout in seconds for HTTP requests
Services_Weather_Common::setUnitsFormat() -- Changes the representation of the units (standard/metric)
Class Summary Services_Weather_Ejse -- PEAR::Services_Weather_Ejse
Services_Weather_Ejse::getForecast() -- Get the forecast for the next days
Services_Weather_Ejse::getLocation() -- Returns the data for the location belonging to the ID
Services_Weather_Ejse::getUnits() -- Returns the units for the current query
Services_Weather_Ejse::getWeather() -- Returns the weather-data for the supplied location
Services_Weather_Ejse::searchLocation() -- EJSE offers no search function to date, so this function is disabled.
Services_Weather_Ejse::searchLocationByCountry() -- EJSE offers no search function to date, so this function is disabled.
Class Summary Services_Weather_Globalweather -- PEAR::Services_Weather_Globalweather
Services_Weather_Globalweather::getForecast() --  GlobalWeather has no forecast per se, so this function is just for compatibility purposes.
Services_Weather_Globalweather::getLocation() -- Returns the data for the location belonging to the ID
Services_Weather_Globalweather::getUnits() -- Returns the units for the current query
Services_Weather_Globalweather::getWeather() -- Returns the weather-data for the supplied location
Services_Weather_Globalweather::searchLocation() --  Searches IDs for given location, returns array of possible locations or single ID
Services_Weather_Globalweather::searchLocationByCountry() --  Returns IDs with location-name for a given country or all available countries, if no value was given
Class Summary Services_Weather_Metar -- PEAR::Services_Weather_Metar
Services_Weather_Metar::getForecast() --  METAR has no forecast per se, so this function is just for compatibility purposes.
Services_Weather_Metar::getLocation() -- Returns the data for the location belonging to the ID
Services_Weather_Metar::getUnits() -- Returns the units for the current query
Services_Weather_Metar::getWeather() -- Returns the weather-data for the supplied location
Services_Weather_Metar::searchAirport() --  Searches the nearest airport(s) for given coordinates, returns array of IDs or single ID
Services_Weather_Metar::searchLocation() --  Searches IDs for given location, returns array of possible locations or single ID
Services_Weather_Metar::searchLocationByCountry() --  Returns IDs with location-name for a given country or all available countries, if no value was given
Services_Weather_Metar::setMetarDB() --  Sets the parameters needed for connecting to the DB, where the location- search is fetching its data from. You need to build a DB with the external tool buildMetarDB first, it fetches the locations and airports from a NOAA-website.
Services_Weather_Metar::setMetarSource() -- Sets the source, where the class tries to locate the METAR data
Class Summary Services_Weather_Weatherdotcom -- PEAR::Services_Weather_Weatherdotcom
Services_Weather_Weatherdotcom::getForecast() -- Get the forecast for the next days
Services_Weather_Weatherdotcom::getLocation() -- Returns the data for the location belonging to the ID
Services_Weather_Weatherdotcom::getUnits() -- Returns the units for the current query
Services_Weather_Weatherdotcom::getWeather() -- Returns the weather-data for the supplied location
Services_Weather_Weatherdotcom::searchLocation() --  Searches IDs for given location, returns array of possible locations or single ID
Services_Weather_Weatherdotcom::searchLocationByCountry() --  Returns only false, as weather.com offers no country listing via its XML services
Services_Weather_Weatherdotcom::setAccountData() --  Sets the neccessary account-information for weather.com, you'll receive them after registering for the XML-stream
Package Services_Weather Constants -- Constants defined in and used by Services_Weather

Class Summary Services_Weather

Class Summary Services_Weather  -- PEAR::Services_Weather

PEAR::Services_Weather

This class acts as an interface to various online weather-services.

Services_Weather searches for given locations and retrieves current weather data and, dependant on the used service, also forecasts. Up to now, SOAP services from CapeScience and EJSE, XML from weather.com and METAR from noaa.gov are supported, further services will get included, if they become available and are properly documented.

Class Trees for Services_Weather

  • Services_Weather

Services_Weather::apiVersion()

Services_Weather::apiVersion()  -- For your convenience, when I come up with changes in the API...

Description

This package is not documented yet.

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather::isError()

Services_Weather::isError()  -- Checks for an error object, same as in PEAR

Description

This package is not documented yet.

Parameter

PEAR_Error|mixed $value

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather::service()

Services_Weather::service()  -- Factory for creating the services-objects

Description

Usable keys for the options array are:

  • debug enables debugging output

--- Common Options

  • cacheType defines what type of cache to use

  • cacheOptions passes cache options

  • unitsFormat use (US)-standard, metric or custom units

  • customUnitsFormat defines the customized units format

  • httpTimeout sets timeout for HTTP requests

  • dateFormat string to use for date output

  • timeFormat string to use for time output

--- EJSE Options

  • none

--- GlobalWeather Options

  • none

--- METAR Options

  • dsn String for defining the DB connection

  • dbOptions passes DB options

  • source http, ftp or file - type of data-source

  • sourcePath where to look for the source, URI or filepath

--- weather.com Options

  • partnerID You'll receive these keys after registering

  • licenseKey with the weather.com XML-service

Parameter

string $service

array $options

Throws

throws PEAR_Error

throws PEAR_Error::SERVICES_WEATHER_ERROR_SERVICE_NOT_FOUND

Note

This function can not be called statically.

Class Summary Services_Weather_Common

Class Summary Services_Weather_Common  -- PEAR::Services_Weather_Common

PEAR::Services_Weather_Common

Parent class for weather-services. Defines common functions for unit conversions, checks for cache enabling and does other miscellaneous things.

Services_Weather_Common::calculateDewPoint()

Services_Weather_Common::calculateDewPoint()  --  Calculate dewpoint from temperature and humidity This is only an approximation, there is no exact formula, this one here is called Magnus-Formula

Description

Temperature has to be entered in deg C!

Parameter

float $temperature

float $humidity

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::calculateHumidity()

Services_Weather_Common::calculateHumidity()  --  Calculate humidity from temperature and dewpoint This is only an approximation, there is no exact formula, this one here is called Magnus-Formula

Description

Temperature and dewpoint have to be entered in deg C!

Parameter

float $temperature

float $dewPoint

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::calculateWindChill()

Services_Weather_Common::calculateWindChill()  -- Calculate windchill from temperature and windspeed (enhanced formula)

Description

Temperature has to be entered in deg F, speed in mph!

Parameter

float $temperature

float $speed

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::convertDistance()

Services_Weather_Common::convertDistance()  -- Convert distance between km, ft and sm

Description

This package is not documented yet.

Parameter

float $distance

string $from

string $to

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::convertPressure()

Services_Weather_Common::convertPressure()  -- Convert pressure between in, hpa, mb, mm and atm

Description

This package is not documented yet.

Parameter

float $pressure

string $from

string $to

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::convertSpeed()

Services_Weather_Common::convertSpeed()  -- Convert speed between mph, kmh, kt, mps and fps

Description

This package is not documented yet.

Parameter

float $speed

string $from

string $to

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::convertTemperature()

Services_Weather_Common::convertTemperature()  -- Convert temperature between f and c

Description

This package is not documented yet.

Parameter

float $temperature

string $from

string $to

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::getUnitsFormat()

Services_Weather_Common::getUnitsFormat()  -- Returns the selected units format

Description

This package is not documented yet.

Parameter

string $unitsFormat

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::polar2cartesian()

Services_Weather_Common::polar2cartesian()  -- Convert polar coordinates to cartesian coordinates

Description

This package is not documented yet.

Parameter

float $latitude

float $longitude

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::setCache()

Services_Weather_Common::setCache()  -- Enables caching the data, usage strongly recommended

Description

Requires Cache to be installed

Parameter

string $cacheType

array $cacheOptions

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_CACHE_INIT_FAILED

Note

This function can not be called statically.

Services_Weather_Common::setDateTimeFormat()

Services_Weather_Common::setDateTimeFormat()  -- Changes the representation of time and dates (see http://www.php.net/date)

Description

This package is not documented yet.

Parameter

string $dateFormat

string $timeFormat

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::setHttpTimeout()

Services_Weather_Common::setHttpTimeout()  -- Sets the timeout in seconds for HTTP requests

Description

This package is not documented yet.

Parameter

integer $httpTimeout

Throws

No exceptions thrown.

Note

This function can not be called statically.

Services_Weather_Common::setUnitsFormat()

Services_Weather_Common::setUnitsFormat()  -- Changes the representation of the units (standard/metric)

Description

This package is not documented yet.

Parameter

string $unitsFormat

array $customUnitsFormat

Throws

No exceptions thrown.

Note

This function can not be called statically.

Class Summary Services_Weather_Ejse

Class Summary Services_Weather_Ejse  -- PEAR::Services_Weather_Ejse

PEAR::Services_Weather_Ejse

This class acts as an interface to the soap service of EJSE. It retrieves current weather data and forecasts based on postal codes (ZIP).

Currently this service is only available for US territory.

For a working example, please take a look at docs/Services_Weather/examples/ejse-basic.php

Class Trees for Services_Weather_Ejse

Services_Weather_Ejse Inherited Methods

Table 65-1. Inherited from Services_Weather_Common

Method NameSummary
Services_Weather_Common::calculateDewPoint() Calculate dewpoint from temperature and humidity This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateHumidity() Calculate humidity from temperature and dewpoint This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateWindChill() Calculate windchill from temperature and windspeed (enhanced formula)
Services_Weather_Common::convertDistance() Convert distance between km, ft and sm
Services_Weather_Common::convertPressure() Convert pressure between in, hpa, mb, mm and atm
Services_Weather_Common::convertSpeed() Convert speed between mph, kmh, kt, mps and fps
Services_Weather_Common::convertTemperature() Convert temperature between f and c
Services_Weather_Common::getUnitsFormat() Returns the selected units format
Services_Weather_Common::polar2cartesian() Convert polar coordinates to cartesian coordinates
Services_Weather_Common::setCache() Enables caching the data, usage strongly recommended
Services_Weather_Common::setDateTimeFormat() Changes the representation of time and dates (see http://www.php.net/date)
Services_Weather_Common::setHttpTimeout() Sets the timeout in seconds for HTTP requests
Services_Weather_Common::setUnitsFormat() Changes the representation of the units (standard/metric)

Services_Weather_Ejse::getForecast()

Services_Weather_Ejse::getForecast()  -- Get the forecast for the next days

Description

This package is not documented yet.

Parameter

mixed $id

integer $days

Values between 1 and 9

string $unitsFormat

string $int

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Ejse::getLocation()

Services_Weather_Ejse::getLocation()  -- Returns the data for the location belonging to the ID

Description

This package is not documented yet.

Parameter

string $id

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Ejse::getUnits()

Services_Weather_Ejse::getUnits()  -- Returns the units for the current query

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Ejse::getWeather()

Services_Weather_Ejse::getWeather()  -- Returns the weather-data for the supplied location

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Ejse::searchLocation()

Services_Weather_Ejse::searchLocation()  -- EJSE offers no search function to date, so this function is disabled.

Description

Maybe this is the place to interface to some online postcode service...

Parameter

string $location

boolean $useFirst

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Ejse::searchLocationByCountry()

Services_Weather_Ejse::searchLocationByCountry()  -- EJSE offers no search function to date, so this function is disabled.

Description

Maybe this is the place to interface to some online postcode service...

Parameter

string $country

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Class Summary Services_Weather_Globalweather

Class Summary Services_Weather_Globalweather  -- PEAR::Services_Weather_Globalweather

PEAR::Services_Weather_Globalweather

This class acts as an interface to the soap service of capescience.com. It searches for given locations and retrieves current weather data.

GlobalWeather is a SOAP frontend for METAR data, provided by CapeScience. If you want to use METAR, you should try this class first, as it is much more comfortable (and also a bit faster) than the native METAR-class provided by this package.

For a working example, please take a look at docs/Services_Weather/examples/globalweather-basic.php

Class Trees for Services_Weather_Globalweather

Services_Weather_Globalweather Inherited Methods

Table 65-1. Inherited from Services_Weather_Common

Method NameSummary
Services_Weather_Common::calculateDewPoint() Calculate dewpoint from temperature and humidity This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateHumidity() Calculate humidity from temperature and dewpoint This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateWindChill() Calculate windchill from temperature and windspeed (enhanced formula)
Services_Weather_Common::convertDistance() Convert distance between km, ft and sm
Services_Weather_Common::convertPressure() Convert pressure between in, hpa, mb, mm and atm
Services_Weather_Common::convertSpeed() Convert speed between mph, kmh, kt, mps and fps
Services_Weather_Common::convertTemperature() Convert temperature between f and c
Services_Weather_Common::getUnitsFormat() Returns the selected units format
Services_Weather_Common::polar2cartesian() Convert polar coordinates to cartesian coordinates
Services_Weather_Common::setCache() Enables caching the data, usage strongly recommended
Services_Weather_Common::setDateTimeFormat() Changes the representation of time and dates (see http://www.php.net/date)
Services_Weather_Common::setHttpTimeout() Sets the timeout in seconds for HTTP requests
Services_Weather_Common::setUnitsFormat() Changes the representation of the units (standard/metric)

Services_Weather_Globalweather::getForecast()

Services_Weather_Globalweather::getForecast()  --  GlobalWeather has no forecast per se, so this function is just for compatibility purposes.

Description

This package is not documented yet.

Parameter

mixed $id

integer $days

string $unitsFormat

string $int

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Globalweather::getLocation()

Services_Weather_Globalweather::getLocation()  -- Returns the data for the location belonging to the ID

Description

This package is not documented yet.

Parameter

string $id

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Globalweather::getUnits()

Services_Weather_Globalweather::getUnits()  -- Returns the units for the current query

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Globalweather::getWeather()

Services_Weather_Globalweather::getWeather()  -- Returns the weather-data for the supplied location

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Globalweather::searchLocation()

Services_Weather_Globalweather::searchLocation()  --  Searches IDs for given location, returns array of possible locations or single ID

Description

This package is not documented yet.

Parameter

string $location

boolean $useFirst

If set, first ID of result-array is returned

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA

throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION

Note

This function can not be called statically.

Services_Weather_Globalweather::searchLocationByCountry()

Services_Weather_Globalweather::searchLocationByCountry()  --  Returns IDs with location-name for a given country or all available countries, if no value was given

Description

This package is not documented yet.

Parameter

string $country

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA

throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION

Note

This function can not be called statically.

Class Summary Services_Weather_Metar

Class Summary Services_Weather_Metar  -- PEAR::Services_Weather_Metar

PEAR::Services_Weather_Metar

This class acts as an interface to the metar service of weather.noaa.gov. It searches for locations given in ICAO notation and retrieves the current weather data.

Of course the parsing of the METAR-data has its limitations, as it follows the Federal Meteorological Handbook No.1 with modifications to accommodate for non-US reports, so if the report deviates from these standards, you won't get it parsed correctly. Anything that is not parsed, is saved in the "noparse" array-entry, returned by getWeather(), so you can do your own parsing afterwards. This limitation is specifically given for remarks, as the class is not processing everything mentioned there, but you will get the most common fields like precipitation and temperature-changes. Again, everything not parsed, goes into "noparse".

If you think, some important field is missing or not correctly parsed, please file a feature- request/bugreport at http://pear.php.net/ and be sure to provide the METAR report with a _detailed_ explanation!

For a working example, please take a look at docs/Services_Weather/examples/metar-basic.php

Class Trees for Services_Weather_Metar

Services_Weather_Metar Inherited Methods

Table 65-1. Inherited from Services_Weather_Common

Method NameSummary
Services_Weather_Common::calculateDewPoint() Calculate dewpoint from temperature and humidity This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateHumidity() Calculate humidity from temperature and dewpoint This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateWindChill() Calculate windchill from temperature and windspeed (enhanced formula)
Services_Weather_Common::convertDistance() Convert distance between km, ft and sm
Services_Weather_Common::convertPressure() Convert pressure between in, hpa, mb, mm and atm
Services_Weather_Common::convertSpeed() Convert speed between mph, kmh, kt, mps and fps
Services_Weather_Common::convertTemperature() Convert temperature between f and c
Services_Weather_Common::getUnitsFormat() Returns the selected units format
Services_Weather_Common::polar2cartesian() Convert polar coordinates to cartesian coordinates
Services_Weather_Common::setCache() Enables caching the data, usage strongly recommended
Services_Weather_Common::setDateTimeFormat() Changes the representation of time and dates (see http://www.php.net/date)
Services_Weather_Common::setHttpTimeout() Sets the timeout in seconds for HTTP requests
Services_Weather_Common::setUnitsFormat() Changes the representation of the units (standard/metric)

Services_Weather_Metar::getForecast()

Services_Weather_Metar::getForecast()  --  METAR has no forecast per se, so this function is just for compatibility purposes.

Description

This package is not documented yet.

Parameter

mixed $id

integer $days

string $unitsFormat

string $int

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Metar::getLocation()

Services_Weather_Metar::getLocation()  -- Returns the data for the location belonging to the ID

Description

This package is not documented yet.

Parameter

string $id

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Metar::getUnits()

Services_Weather_Metar::getUnits()  -- Returns the units for the current query

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Metar::getWeather()

Services_Weather_Metar::getWeather()  -- Returns the weather-data for the supplied location

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

throws PHP_Error

Note

This function can not be called statically.

Services_Weather_Metar::searchAirport()

Services_Weather_Metar::searchAirport()  --  Searches the nearest airport(s) for given coordinates, returns array of IDs or single ID

Description

This package is not documented yet.

Parameter

float $latitude

float $longitude

integer $numResults

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION

throws PEAR_Error::SERVICES_WEATHER_ERROR_DB_NOT_CONNECTED

throws PEAR_Error::SERVICES_WEATHER_ERROR_INVALID_LOCATION

Note

This function can not be called statically.

Services_Weather_Metar::searchLocation()

Services_Weather_Metar::searchLocation()  --  Searches IDs for given location, returns array of possible locations or single ID

Description

This package is not documented yet.

Parameter

string|array $location

boolean $useFirst

If set, first ID of result-array is returned

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION

throws PEAR_Error::SERVICES_WEATHER_ERROR_DB_NOT_CONNECTED

throws PEAR_Error::SERVICES_WEATHER_ERROR_INVALID_LOCATION

Note

This function can not be called statically.

Services_Weather_Metar::searchLocationByCountry()

Services_Weather_Metar::searchLocationByCountry()  --  Returns IDs with location-name for a given country or all available countries, if no value was given

Description

This package is not documented yet.

Parameter

string $country

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION

throws PEAR_Error::SERVICES_WEATHER_ERROR_DB_NOT_CONNECTED

throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA

Note

This function can not be called statically.

Services_Weather_Metar::setMetarDB()

Services_Weather_Metar::setMetarDB()  --  Sets the parameters needed for connecting to the DB, where the location- search is fetching its data from. You need to build a DB with the external tool buildMetarDB first, it fetches the locations and airports from a NOAA-website.

Description

This package is not documented yet.

Parameter

string $dsn

array $dbOptions

See

see DB::parseDSN

Throws

throws DB_Error

Note

This function can not be called statically.

Services_Weather_Metar::setMetarSource()

Services_Weather_Metar::setMetarSource()  -- Sets the source, where the class tries to locate the METAR data

Description

Source can be http, ftp or file. An alternate sourcepath can be provided.

Parameter

string $source

string $sourcePath

Throws

No exceptions thrown.

Note

This function can not be called statically.

Class Summary Services_Weather_Weatherdotcom

Class Summary Services_Weather_Weatherdotcom  -- PEAR::Services_Weather_Weatherdotcom

PEAR::Services_Weather_Weatherdotcom

This class acts as an interface to the xml service of weather.com. It searches for given locations and retrieves current weather data as well as forecast for up to 10 days.

For using the weather.com xml-service please visit http://www.weather.com/services/xmloap.html and follow the link to sign up, it's free! You will receive an email where to download the SDK with the needed images and guidelines how to publish live data from weather.com. Unfortunately the guidelines are a bit harsh, that's why there's no actual data-representation in this class, just the raw data. Also weather.com demands active caching, so I'd strongly recommend enabling the caching implemented in this class. It obeys to the times as written down in the guidelines.

For a working example, please take a look at docs/Services_Weather/examples/weather.com-basic.php

Class Trees for Services_Weather_Weatherdotcom

Services_Weather_Weatherdotcom Inherited Methods

Table 65-1. Inherited from Services_Weather_Common

Method NameSummary
Services_Weather_Common::calculateDewPoint() Calculate dewpoint from temperature and humidity This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateHumidity() Calculate humidity from temperature and dewpoint This is only an approximation, there is no exact formula, this one here is called Magnus-Formula
Services_Weather_Common::calculateWindChill() Calculate windchill from temperature and windspeed (enhanced formula)
Services_Weather_Common::convertDistance() Convert distance between km, ft and sm
Services_Weather_Common::convertPressure() Convert pressure between in, hpa, mb, mm and atm
Services_Weather_Common::convertSpeed() Convert speed between mph, kmh, kt, mps and fps
Services_Weather_Common::convertTemperature() Convert temperature between f and c
Services_Weather_Common::getUnitsFormat() Returns the selected units format
Services_Weather_Common::polar2cartesian() Convert polar coordinates to cartesian coordinates
Services_Weather_Common::setCache() Enables caching the data, usage strongly recommended
Services_Weather_Common::setDateTimeFormat() Changes the representation of time and dates (see http://www.php.net/date)
Services_Weather_Common::setHttpTimeout() Sets the timeout in seconds for HTTP requests
Services_Weather_Common::setUnitsFormat() Changes the representation of the units (standard/metric)

Services_Weather_Weatherdotcom::getForecast()

Services_Weather_Weatherdotcom::getForecast()  -- Get the forecast for the next days

Description

This package is not documented yet.

Parameter

string $id

integer $days

Values between 1 and 10

string $unitsFormat

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Weatherdotcom::getLocation()

Services_Weather_Weatherdotcom::getLocation()  -- Returns the data for the location belonging to the ID

Description

This package is not documented yet.

Parameter

string $id

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Weatherdotcom::getUnits()

Services_Weather_Weatherdotcom::getUnits()  -- Returns the units for the current query

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Weatherdotcom::getWeather()

Services_Weather_Weatherdotcom::getWeather()  -- Returns the weather-data for the supplied location

Description

This package is not documented yet.

Parameter

string $id

string $unitsFormat

Throws

throws PEAR_Error

Note

This function can not be called statically.

Services_Weather_Weatherdotcom::searchLocation()

Services_Weather_Weatherdotcom::searchLocation()  --  Searches IDs for given location, returns array of possible locations or single ID

Description

This package is not documented yet.

Parameter

string $location

boolean $useFirst

If set, first ID of result-array is returned

Throws

throws PEAR_Error::SERVICES_WEATHER_ERROR_WRONG_SERVER_DATA

throws PEAR_Error::SERVICES_WEATHER_ERROR_UNKNOWN_LOCATION

Note

This function can not be called statically.

Services_Weather_Weatherdotcom::searchLocationByCountry()

Services_Weather_Weatherdotcom::searchLocationByCountry()  --  Returns only false, as weather.com offers no country listing via its XML services

Description

This package is not documented yet.

Parameter

string $country

Throws

No exceptions thrown.

Deprecated

deprecated

Note

This function can not be called statically.

Services_Weather_Weatherdotcom::setAccountData()

Services_Weather_Weatherdotcom::setAccountData()  --  Sets the neccessary account-information for weather.com, you'll receive them after registering for the XML-stream

Description

This package is not documented yet.

Parameter

string $partnerID

string $licenseKey

Throws

No exceptions thrown.

Note

This function can not be called statically.

Package Services_Weather Constants

Package Services_Weather Constants -- Constants defined in and used by Services_Weather

Services_Yahoo

Table of Contents
Introduction --  Introduction to Services_Yahoo
Examples --  Using Services_Yahoo
Design --  Services_Yahoo's design

Interface to the Yahoo! Search API.

The package provides an object oriented model to communicate with Yahoo's services via their REST-based XML interface.

Introduction

Introduction --  Introduction to Services_Yahoo

Overview

The package provides an object oriented model to communicate with Yahoo's web services via their REST-based XML interface.

Currently the package only supports the Yahoo! Search Web Services, which is natural because Yahoo! does not expose other services via their API at the moment. Due to the modular layout of the package it is easy to add support for other services at a later point though. More information about the design of the package is available in a separate section.

Setup

Requirements

Services_Yahoo requires PHP 5 and a bunch of PEAR packages. For a complete list of dependencies please see the download page.

Installation

The Services_Yahoo package can be installed using the PEAR installer command pear install Services_Yahoo. If the installation fails due to missing dependencies, one either needs to install them manually or can make the installer fetch all dependencies automatically: pear install -a Services_Yahoo.

Alternative installation methods for situations where one has no access to the pear installer command can be found in the general installation chapter.

Uninstallation

Uninstalling the package can be done with pear uninstall Services_Yahoo.

Examples

Examples --  Using Services_Yahoo

About the examples

The following sections provide you with examples of using the different feature sets of Services_Yahoo. Currently this includes documentation for the interfaces to Yahoo! Search and Content Analysis.

All public methods in Services_Yahoo have in common that exceptions will be raised when something goes wrong. This is why try { ... } catch { } blocks are wrapped around all examples.

Note: The examples are designed to be run from a command line shell. If you would like to test them in a web browser you should replace \n with <br /> for better readability.

Speaking to Yahoo! Search

The following examples will communicate with Yahoo! Search.

Note: In order to query the Image, News, Video or Local search, one only needs to replace the argument "web" in the call of the factory() method with one of "image", "news", "video", or "local".

Using the Yahoo! Content Analysis services

The following examples will show you how to use the Content Analysis Services provided by Yahoo!.

Design

Design --  Services_Yahoo's design

Overview

Services_Yahoo is split up into chunks that group similar functionality. Currently there are chunks for the interfaces to Yahoo Search and to the Content Analysis functions.

Each chunk basically contains two top-level element in the source tree: A .php file and a directory that holds the implementation of the chunk. The file is a class that contains only one method which implements that factory pattern. This method dynamically loads the right file from the related directory and returns an instance of the class that implements the desired function.

Due to this modular layout Services_Yahoo can easily be extended when Yahoo adds new functions to their API.

More information

If you would like to study the code of the package, you can do so by either downloading a release from the package homepage or by browsing the code in CVS.

Also the automatically generated API documentation should help you.


Services_YouTube

Table of Contents
Introduction -- Introduction to Services_YouTube
Example -- Basic examples of Services_YouTube

Object-oriented abstraction for YouTube API.

Introduction

Introduction -- Introduction to Services_YouTube

Introduction to Services_YouTube

Services_YouTube is an abstraction for the webservice of YouTube APIs. Using YouTube APIs, you can easily integrate online videos from YouTube's rapidly growing repository of videos into your application. To use YouTube API and this package, create a YouTube account and create a YouTube developer profile.

YouTube APIs currently allow read-only access to key parts of the YouTube video respository and user community. Services_YouTube provides functions for YouTube APIs using O-O abstraction access.

Example

Example -- Basic examples of Services_YouTube

Basic examples of Services_YouTube

The following examples show how to use some basic features of Services_YouTube:


UDDI

Table of Contents
Introduction --  UDDI implementation for PHP

UDDI implementation for PHP

Introduction

Introduction --  UDDI implementation for PHP

UDDI Description

Implementation of the Universal Description, Discovery and Integration API for locating and publishing Web Services listings in a UBR (UDDI Business Registry)

The full online documentation is available here


XML_RPC

Table of Contents
Introduction -- 
Support -- Getting support for XML_RPC
Examples -- Usage examples for the XML_RPC package
API -- Class documentation of the package

PHP implementation of the XML-RPC protocol.

This is a PEAR-ified version of Useful inc's XML-RPC for PHP. It has support for HTTP transport, proxies and authentication.

Introduction

Introduction -- 

General introduction

XML-RPC is a format devised by Userland Software for achieving remote procedure call via XML. XML-RPC has its own web site, www.XmlRpc.com.

The most common implementations of XML-RPC available at the moment use HTTP as the transport. A list of implementations for other languages such as Perl and Python can be found on the www.xmlrpc.com.

This collection of PHP classes provides a framework for writing XML-RPC clients and servers in PHP.

Acknowledgements

This package has been orginially written by Edd Dumbill of Useful Information Company, so he deservers most of the credits. Apart from that following people have contributed to the initial codebase that is still being maintained by Edd:

Manifest - Files in the package

Server.php

the XML-RPC server class. include() this to get server functionality.

RPC.php

the XML-RPC client classes. include() this to get client functionality.

Support

Support -- Getting support for XML_RPC

Online Support

The package is offered "as-is" without any warranty or commitment to support. However, informal advice and help is available via the PEAR user mailing list and XML-RPC.com.

  • The PEAR user mailing list can be contacted for questions concerning the usage of the package. More details can be found here.

  • For more general XML-RPC questions, there is a Yahoo! Groups XML-RPC mailing list.

  • The XML-RPC.com discussion group is a useful place to get help with using XML-RPC. This group is also gatewayed into the Yahoo! Groups mailing list.

The Jellyfish Book

Together with Simon St.Laurent and Joe Johnston, Edd Dumbill wrote a book on XML-RPC for O'Reilly and Associates on XML-RPC. It features a rather fetching jellyfish on the cover.

Complete details of the book are available from O'Reilly's web site.

If you've benefitted from the effort he has put into writing this software, then please consider buying the book!

Examples

Examples -- Usage examples for the XML_RPC package

A Complete Client and Server Combination

Example 65-2.

Here is the server script. It's named xmlrpc.php and located in the document root of the web server at localhost:

require_once 'XML/RPC/Server.php';

/*
 * Declare the functions, etc.
 */
function returnTimes2($params) {
    $obj = new some_class_name;
    return $obj->returnTimes2($params);
}

class some_class_name {
    function returnTimes2($params) {
        $param = $params->getParam(0);

        // This error checking syntax was added in Release 1.3.0
        if (!XML_RPC_Value::isValue($param)) {
            return $param;
        }

        $val = new XML_RPC_Value($param->scalarval() * 2, 'int'); 
        return new XML_RPC_Response($val);
    }
}

$some_object = new some_class_name;


/*
 * Establish the dispatch map and XML_RPC server instance.
 */
$server = new XML_RPC_Server(
    array(
        'function_times2' => array(
            'function' => 'returnTimes2'
        ),
        'class_paamayim_nekudotayim_times2' => array(
            'function' => 'some_class_name::returnTimes2'
        ),
        'class_times2' => array(
            'function' => array('some_class_name', 'returnTimes2')
        ),
        'object_times2' => array(
            'function' => array($some_object, 'returnTimes2')
        ),
    ),
    1  // serviceNow
);

And here is the client script:

require_once 'XML/RPC.php';

$input = 8;
$params = array(new XML_RPC_Value($input, 'int'));
$msg = new XML_RPC_Message('function_times2', $params);

$cli = new XML_RPC_Client('/xmlrpc.php', 'localhost');
// $cli->setDebug(1);
$resp = $cli->send($msg);

if (!$resp) {
    echo 'Communication error: ' . $cli->errstr;
    exit;
}

if (!$resp->faultCode()) {
    $val = $resp->value();
    echo $input . ' times 2 is ' . $val->scalarval();
} else {
    /*
     * Display problems that have been gracefully cought and
     * reported by the xmlrpc.php script.
     */
    echo 'Fault Code: ' . $resp->faultCode() . "\n";
    echo 'Fault Reason: ' . $resp->faultString() . "\n";
}

API

API -- Class documentation of the package

XML_RPC_Client

This is the basic class used to represent a client of an XML-RPC server.

Methods

This class supports the following methods.

send()

This method takes the form:

Where $xmlrpc_message is an instance of XML_RPC_Message and $response is an instance of XML_RPC_Response (see XML_RPC_Response).

The $timeout is optional, and will be set to 0 (wait forever) if omitted. This timeout value is passed to fsockopen().

If the value of $response is 0 rather than an XML_RPC_Response object, then this signifies an I/O error has occured. You can find out what the I/O error was from the values $client->errno and $client->errstring.

In addition to low-level errors, the XML-RPC server you were querying may return an error in the XML_RPC_Response object. See XML_RPC_Response for details of how to handle these errors.

XML_RPC_Message

This class provides a representation for a request to an XML-RPC server. A client sends an XML_RPC_Message to a server, and receives back an XML_RPC_Response.

XML_RPC_Value

This is where a lot of the hard work gets done. This class enables the creation and encapsulation of values for XML-RPC.

Ensure you've read the XML-RPC spec at http://www.xmlrpc.com/stories/storyReader$7 before reading on as it will make things clearer.

The XML_RPC_Value class can store arbitrarily complicated values using the following types: i4, int, boolean, string, double, dateTime.iso8601, base64, array or struct. You should refer to the spec for more information on what each of these types mean.

Notes on types

int

The type i4 is accepted as a synonym for int. The value parsing code will always convert i4 to int: int is regarded by this implementation as the canonical name for this type.

base64

Base 64 encoding is performed transparently to the caller when using this type. Therefore you ought to consider it as a binary data type, for use when you want to pass none 7-bit clean data. Decoding is also transparent.

boolean

The values true and 1 map to true. All other values (including the empty string) are converted to false.

string

The characters <, >, " and & are converted to their entity equivalents &lt;, &gt;, &quot; and &amp; for transport through XML-RPC. The current XML-RPC spec recommends only encoding < and & but this implementation goes further, for reasons explained by the XML 1.0 recommendation.

Note: Currently, passing a string "-1" to XML_RPC_Value's constructor creates an empty result since it serves as a special/magic value.

TODO: &apos; entity is not yet supported

Methods

XML_RPC_Server

The current implementation of this class has been kept as simple as possible. The constructor for the server basically does all the work. Here's a minimal example:

function foo ($params) {
   ...
}

$s = new XML_RPC_Server(array("examples.myFunc" => array("function" => "foo")));

This performs everything you need to do with a server. The single argument is an associative array from method names to function names. The request is parsed and despatched to the relevant function, which is reponsible for returning a XML_RPC_Response object, which gets serialized back to the caller.

Here is a more detailed look at what the handler function foo() may do:

function foo ($params) {
    global $XML_RPC_erruser; // import user errcode value

    // $params is the received XML_RPC_Message object.
    if ($err) {
        // this is an error condition
        return new XML_RPC_Response(0, $XML_RPC_erruser+1, // user error 1
           "There's a problem, Captain");
    } else {
        // this is a successful value being returned
        return new XML_RPC_Response(new XML_RPC_Value("All's fine!", "string"));
    }
}

The dispatch map

The first argument to the XML_RPC_Server() constructor is an array, called the dispatch map. In this array is the information the server needs to service the XML-RPC methods you define.

The dispatch map takes the form of an associative array of associative arrays: the outer array has one entry for each method, the key being the method name. The corresponding value is another associative array, which can have the following members:

  • function - this entry is mandatory. It must be a name of a function in the global scope which services the XML-RPC method.

    It is possible to use regular functions, class names with method names and objects with method names. The Examples page of this manual demonstrates the appropriate syntax for all of these approaches.

  • signature - this entry is an array containg the possible signatures (see Signatures) for the method. If this entry is present then the server will check that the correct number and type of parameters have been sent for this method before dispatching it.

  • docstring - this entry is a string containing documentation for the method. The documentation may contain HTML markup.

Method signatures

A signature is a description of a method's return type and its parameter types. A method may have more than one signature.

Within a server's dispatch map, each method has an array of possible signatures. Each signature is an array of types. The first entry is the return type.

Let's run through an example. Imagine you wanted to write a regular PHP function like this:
function is_8($input, $strict = false) {
    if ($strict) {
       return ($input === 8);
    } else {
       return ($input == 8);
    }
}

To get it to work in an XML_RPC server, you would have to write it like this:
function is_8($params) {
    // This parameter is required.
    $param = $params->getParam(0);
    if (!XML_RPC_Value::isValue($param)) {
        return $param;
    }
    $input = $param->scalarval();

    // This parameter is optional.
    $param = $params->getParam(1);
    if (!XML_RPC_Value::isValue($param)) {
        $strict = false;
    } else {
        $strict = $param->scalarval();
    }

    if ($strict) {
       $answer = ($input === 8);
    } else {
       $answer = ($input == 8);
    }

    $val = new XML_RPC_Value($answer, 'boolean');
    return new XML_RPC_Response($val);
}

Here is a signature covering all of the possible permutations:
array(
    array('boolean', 'int'),
    array('boolean', 'int', 'boolean'),
    array('boolean', 'string'),
    array('boolean', 'string', 'boolean'),
)

The server could be instatiated like this:
$server = new XML_RPC_Server(
    array(
        'isan8' =>
            array(
                'function' => 'is_8',
                'signature' =>
                     array(
                         array('boolean', 'int'),
                         array('boolean', 'int', 'boolean'),
                         array('boolean', 'string'),
                         array('boolean', 'string', 'boolean'),
                     ),
                'docstring' => 'Is the value an 8?'
            ),
    ),
    1,
    0
);

The strings representing the XML-RPC types have been encoded as global variables for your convenience:

$GLOBALS['XML_RPC_I4']       = 'i4';
$GLOBALS['XML_RPC_Int']      = 'int';
$GLOBALS['XML_RPC_Boolean']  = 'boolean';
$GLOBALS['XML_RPC_Double']   = 'double';
$GLOBALS['XML_RPC_String']   = 'string';
$GLOBALS['XML_RPC_DateTime'] = 'dateTime.iso8601';
$GLOBALS['XML_RPC_Base64']   = 'base64';
$GLOBALS['XML_RPC_Array']    = 'array';
$GLOBALS['XML_RPC_Struct']   = 'struct';

Delaying the server response

You may want to construct the server, but for some reason not fulfill the request immediately (security verification, for instance). If you pass the constructor a second argument of 0 this will have the desired effect. You can then use the service() method of the server class to service the request. For example:

$s = new XML_RPC_Server($myDispMap, 0);

// ... some code that does other stuff here

$s->service();

Fault reporting

Fault codes for your servers should start at the value indicated by the global $xmlrpcerruser + 1.

Standard errors returned by the server include:

1 Unknown method

Returned if the server was asked to dispatch a method it didn't know about

2 Invalid return payload

This error is actually generated by the client, not server, code, but signifies that a server returned something it couldn't understand.

3 Incorrect parameters

This error is generated when the server has signature(s) defined for a method, and the parameters passed by the client do not match any of signatures.

4 Can't introspect: method unknown

This error is generated by the builtin system.*() methods when any kind of introspection is attempted on a method undefined by the server.

5 Didn't receive 200 OK from remote server

This error is generated by the client when a remote server doesn't return HTTP/1.1 200 OK in response to a request. A more detailed error report is added onto the end of the phrase above.

100- XML parse errors

Returns 100 plus the XML parser error code for the fault that occurred. The faultString returned explains where the parse error was in the incoming XML stream.

XML_RPC_Dump

This class generates string representations of the data in XML_RPC_Value objects.


XML_RPC2

PHP5 implementation of the XML-RPC protocol.

This is a "PHP5 only" implementation of the XMLRPC protocol. This package provides the client and the server side of the protocol. An optimized cache is also available for both parts.

As a client library, XML_RPC2 is capable of creating a proxy class which exposes the methods exported by the server. As a server library, XML_RPC2 is capable of exposing methods from a class or object instance, seamlessly exporting local methods as remotely callable procedures.

Introduction

Introduction -- 

Description

XML_RPC2 is a "PHP5 only" implementation of the XMLRPC protocol. This package provides the client and the server side of the protocol. An optimized cache is also available for both parts.

As a client library, XML_RPC2 is capable of creating a proxy class which exposes the methods exported by the server. So it's very easy and natural to call XMLRPC exported methods. Like in Python language, the classic way to use XML_RPC2 client side is :

  • We make a XML_RCP2_Client object with server informations as arguments.

  • In a classic way, we call a method of this object.

  • Then, the method call is XMLRPC encoded, sent to the server, the response is decoded into PHP native types and we get the result of the call (all this logic is made by the library in a completely transparent way).

As a server library, XML_RPC2 is capable of exposing methods from a class or object instance, seamlessly capable of exposing methods from a class or object instance, seamlessly exporting local methods as remotely callable procedures. Method signatures are automatically determined and checked by using the reflection API and PHPDOC comments. An automatic documentation about XMLRPC exported methods is dynamically built and available at the server URL (with a simple HTTP GET).

For both sides, an optimized cache based on Cache_Lite can be set. It can be really usefull especially on public XMLRPC servers.

Requirements

XML_RCP2 need PHP5 and the CURL extension. To avoid in next version, the CURL dependency, we are waiting for a PHP5 E_STRICT PEAR module for HTTP_Request.

If you want to use the integrated cache, you will also need the Cache_Lite PEAR module but it's of course an optional dependency.

XML_RPC2 can use two backends for the XMLRPC encoding/decoding :

  • XMLRPCEXT, which of course need this PHP extension (probably the better choice but it's an additional dependency) ;

  • PHP, which doesn't need the XMLRPCEXT extension at all (this is full PHP but slower).

A first example of the client side use

Let's start with a XMLRPC call to the pear.php.net XMLRPC server :
<?php

require_once 'XML/RPC2/Client.php';

$options = array(
	'prefix' => 'package.'
);

// We make the XML_RPC2_Client object (as the backend is not specified, XMLRPCEXT
// will be used if available (full PHP else))
$client = XML_RPC2_Client::create('http://pear.php.net/xmlrpc.php', $options);

try {

    // Because of the prefix specified in the $options array, indeed,  we will call
    // the package.info() method with a single argument (the string 'XML_RPC2')
    $result = $client->info('XML_RPC2');

    // $result is a complex PHP type (no XMLRPC decoding needed, it's already done)
    print_r($result);

} catch (XML_RPC2_FaultException $e) {

    // The XMLRPC server returns a XMLRPC error
    die('Exception #' . $result->getFaultCode() . ' : ' . $e->getFaultString());

} catch (Exception $e) {

    // Other errors (HTTP or networking problems...)
    die('Exception : ' . $e->getMessage());

}

?>

A first example of the server side use

Let's build a XMLRPC "echo server" :
<?php

require_once 'XML/RPC2/Server.php';

// Let's define a class with public static methods
// PHPDOC comments are really important because they are used for automatic
// signature checking

class EchoServer {

    /**
     * echoes the message received
     *
     * @param string  Message
     * @return string The echo
     */
    public static function echoecho($string) {
        return $string;
    }

}

$options = array(
    'prefix' => 'test.' // we define a sort of "namespace" for the server
);

// Let's build the server object with the name of the Echo class 
$server = XML_RPC2_Server::create('EchoServer', $options);
$server->handleCall();

?>
If you do a simple HTTP GET on the server URL, you will get an automatic HTML documentation about the echoecho function. If you make a XMLRPC client request on the same URL about the "test.echoecho()" method (with one argument), you will get your argument as a response. If you call another method or with a bad arguments number, you will get an error (because of automatic method signature checking).

A first example of the client side use (with integrated cache)

As the caching process is completely transparent, this is very similar to the standard client side use :
<?php

require_once 'XML/RPC2/CachedClient.php';

$options = array(
    'prefix' => 'package.',
    'cacheDebug' => false, // with cacheDebug set to true, it's very easy
                           // to get an indication about the cache using (or not)
    'cacheOptions' => array(
        'cacheDir' => '/tmp/',
        'lifetime' => 3600,      // during this lifetime, the local cache will be used 
        'cacheByDefault' => true // all methods call will be cached
                                 // (but a more precise way is possible)
    )
);

// We make the XML_RPC2_CachedClient object (same syntax than XML_RPC2_Client)
$client = XML_RPC2_CachedClient::create('http://pear.php.net/xmlrpc.php', $options);

try {

    // First call, the cache won't be used
    $result = $client->info('XML_RPC2');
    print_r($result);

    // Second call, the cache will be used  (in a transparent way) and no
    // additional HTTP request will be sent to the server
    $result = $client->info('XML_RPC2');
    print_r($result);

} catch (XML_RPC2_FaultException $e) {

    // The XMLRPC server returns a XMLRPC error
    die('Exception #' . $result->getFaultCode() . ' : ' . $e->getFaultString());

} catch (Exception $e) {

    // Other errors (HTTP or networking problems...)
    die('Exception : ' . $e->getMessage());

}

?>

A first example of the server side use (with integrated cache)

As the caching process is completely transparent, this is very similar to the standard server side use :
<?php

require_once 'XML/RPC2/CachedServer.php';

// Let's define a class with public static methods
// PHPDOC comments are really important because they are used for automatic
// signature checking

// IMPORTANT : note the @xmlrpc.caching PHPDOC tags to indicate
// that the method has to be cached

class EchoServer {

    /**
     * echoes the message received
     *
     * @param string  Message
     * @return string The echo
     * @xmlrpc.caching true
     */
    public static function echoecho($string) {
        return $string;
    }

}

$options = array(
    'prefix' => 'test..',
    'cacheDebug' => false, // with cacheDebug set to true, it's very easy
                           // to get an indication about the cache using (or not)
    'cacheOptions' => array(
        'cacheDir' => '/tmp/',
        'lifetime' => 3600,
        'cacheByDefault' => false // we don't cache by default (only methods with @xmlrpc.caching true)
    )
);

$server = XML_RPC2_CachedServer::create('EchoServer', $options);  
$server->handleCall();

?>

Client Side

Client Side -- 

Introduction about the XML_RPC2 client side usage

Thanks to PHP5, it's really easy to do XMLRPC client requests with XML_RPC2. The usage is really straightforward.

First, you include 'XML/RPC2/Client.php' file (only this one).
require_once 'XML/RPC2/Client.php';

Second, you make an assocative arrays of options to tune XML_RPC2 (prefix, proxy, manual backend choice...).
$options = array(
    'prefix' => 'package.'
);

Third, you make a XML_RPC2_Client object with the server URL and the with the options array.
$client = XML_RPC2_Client::create('http://pear.php.net/xmlrpc.php', $options);

Then, you send your request by calling the server method as it was a local method of the $client object.
$result = $client->info('XML_RPC2');
This single line will encode a XMLRPC client request for the package.info() (prefix + method name) method with a single argument (the string 'XML_RPC2'), will send the request over HTTP to the server and will decode the response into PHP native types. With a single line !

Of course, to catch server errors, you have to add a few lines around you client call like for example :
try {
    $result = $client->info('XML_RPC2'); 
    print_r($result);
} catch (XML_RPC2_FaultException $e) {
    // The XMLRPC server returns a XMLRPC error
    die('Exception #' . $result->getFaultCode() . ' : ' . $e->getFaultString());
} catch (Exception $e) {  
    // Other errors (HTTP or networking problems...)
    die('Exception : ' . $e->getMessage());
}

Making the XML_RPC2_Client object

It's really easy to make the XML_RPC2_Client object. Use the following syntax :
// $XMLRPCServerURL is a string : 'http://pear.php.net/xmlrpc.php' (for example)
// $options is an optional array : see previous section for more informations
$client = XML_RPC2_Client::create($XMLRPCServerURL, $options);
Don't try to call the XML_RPC2_Client constructor directly, use the call() static method.

Call the XMLRPC exported method

When the XML_RPC2_Client object is created, you can directly call the remote method as it was local. For example :
// We call the remote foo() method without any arguments
$result1 = $client->foo();

// We call the remote bar() method with two arguments (an integer : 123, a string : 'foo')
$result2 = $client->bar(123, 'foo');

// We call the remote foobar() method with complex data types (2 integer, a string, a structure)
$result3 = $client->foobar(1, 2, 'foo', array('foo' => 1, 'bar' => 2));

Be careful, XMLRPC spec allows some remote method names with some special characters like "." or "/"... which are not available as PHP method names. To deal with them, you have to fix a prefix in a the options array. For example :
$options = array('prefix' => 'foo.');
$client = XML_RPC2_Client::create('http://...', $options);

// We call the foo.bar() method because of the prefix 'foo.' fixed in $options array
$result = $client->bar();

In most cases, XML_RPC2 transforms automatically PHP native types into XMLRPC types (as described in the SPEC) for the request. In most cases too, XML_RPC2 transforms the XML server response into PHP native types too. Yet, there are two exceptions : 'dateTime.iso8601' and 'base64' which doesn't really exist in PHP.

To manipulate explicitely these two types, you have to use special objects. Let's see a complete example :
<?php

// Classic usage
require_once 'XML/RPC2/Client.php';

// To manipulate these types, we need to include this file too
require_once 'XML/RPC2/Value.php';

// To get a 'dateTime.iso8601' object, you have first to set a string with an iso8601 encoded date :
$tmp = "20060116T19:14:03";

// Then, you call this static method to get your 'dateTime.iso8601' object
$time = XML_RPC2_Value::createFromNative($tmp, 'datetime');

// For 'base64', you call the same static method with your string to get a 'base64' object
$base64 = XML_RPC2_Value::createFromNative('foobar', 'base64');

// Then, you can use XML_RPC2_Client as usual :
$options = array('prefix' => 'validator1.');
$client = XML_RPC2_Client::create('http://phpxmlrpc.sourceforge.net/server.php', $options);
$result = $client->manyTypesTest(1, true, 'foo', 3.14159, $time, $base64);

// The remote validator1.manyTypesTest() method returns an array with the 6 given arguments
$result_datetime = $result[4]; // a 'dateTime.iso8601' object
$result_base64 = $result[5];   // a 'base64' object

// To transform these objects into PHP native types, you have to use public properties of
// these objects as follow :
var_dump($result_datetime->scalar);      // will return string(17) "20060116T19:14:03"
var_dump($result_datetime->xmlrpc_type); // will return string(8) "datetime"
var_dump($result_datetime->timestamp);   // will return int(1137435243)
var_dump($result_base64->scalar);        // will return string(6) "foobar"
var_dump($result_base64->xmlrpc_type);   // will return string(6) "base64"

?>

Server Side

Server Side -- 

to be written

to be written

Client Side with cache

Client Side with cache -- 

Introduction about the XML_RPC2 "cached client side" usage

Thanks to PHP5 and PEAR/Cache_Lite, it's really easy to do XMLRPC "cached client" requests with XML_RPC2. The usage is really straightforward.

First, you include 'XML/RPC2/CachedClient.php' file (only this one).
require_once 'XML/RPC2/CachedClient.php';

Second, you make an assocative arrays of options to tune XML_RPC2 (prefix, proxy, manual backend choice...).
$options = array(
    'prefix' => 'package.',
    'cacheOptions' => array(
        'cacheDir' => '/tmp/',
        'lifetime' => 3600
    )
);

Third, you make a XML_RPC2_CachedClient object with the server URL and the with the options array.
$client = XML_RPC2_CachedClient::create('http://pear.php.net/xmlrpc.php', $options);

Then, you send your request by calling the server method as it was a local method of the $client object.
$result = $client->info('XML_RPC2');
This single line will encode a XMLRPC client request for the package.info() (prefix + method name) method with a single argument (the string 'XML_RPC2'), will send the request over HTTP to the server and will decode the response into PHP native types. With a single line ! Moreover, the result will be cached into a file for the given lifetime. So the next call will not send any HTTP request and it will be really fast.

Of course, to catch server errors, you have to add a few lines around you client call like for example :
try {
    $result = $client->info('XML_RPC2'); 
    print_r($result);
} catch (XML_RPC2_FaultException $e) {
    // The XMLRPC server returns a XMLRPC error
    die('Exception #' . $result->getFaultCode() . ' : ' . $e->getFaultString());
} catch (Exception $e) {  
    // Other errors (HTTP or networking problems...)
    die('Exception : ' . $e->getMessage());
}

Making the XML_RPC2_CachedClient object

It's really easy to make the XML_RPC2_CachedClient object. Use the following syntax :
// $XMLRPCServerURL is a string : 'http://pear.php.net/xmlrpc.php' (for example)
// $options is an optional array : see previous section for more informations
$client = XML_RPC2_CachedClient::create($XMLRPCServerURL, $options);
Don't try to call the XML_RPC2_CachedClient constructor directly, use the call() static method.

Call the XMLRPC exported method

See "non cached client side" documentation, there is no difference.

The caching process is completly embedded and automatic. If a cache is available, result will be get from cache and no HTTP request will be sent. If there is no cache available for this particular call (method name and arguments), the classical XMLRPC communication will be used (and the result will be stored into a cache file for the next use).

Server Side with cache

Server Side with cache -- 

to be written

to be written


Chapter 66. XML

Provides Packages for creating and working with XML



XML_Beautifier

Table of Contents
Introduction -- Introduction to XML_Beautifier
Example -- Example for the usage of XML_Beautifier
Options -- List of all XML_Beautifier options
XML_Beautifier::XML_Beautifier() -- create new instance
XML_Beautifier::setOption() -- set an option
XML_Beautifier::setOptions() -- set several options
XML_Beautifier::resetOptions() -- reset options to default
XML_Beautifier::apiVersion() -- return API version
XML_Beautifier::formatFile() -- beautify a file
XML_Beautifier::formatString() -- beautify a string

Package to "beautify" XML documents. This package will add line breaks, indentation and other layout elements to an XML document, so it can be easier read by humans.

Introduction

Introduction -- Introduction to XML_Beautifier

Introduction to XML_Beautifier

XML_Beautifier is a package, that helps you making XML documents easier to read for human beings.

It is able to add line-breaks, indentation, sorts attributes, convert tag cases and wraps long comments. It recognizes tags, character data, comments, XML declarations, processing instructions and external entities and is able to format these tokens nicely.

The document is split into these tokens using the XML_Beautifier_Tokenizer class and the expat parser. Then a renderer is used to create the string representation of the document and formats it using the specified options.

Currently only one renderer is available, but as XML_Beautifier uses a driver-based architecture, other renderers (like syntax-highlighting) will follow soon.

Example

Example -- Example for the usage of XML_Beautifier

Basic example

Let's assume, you've got an XML document that is really badly formatted:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE page [
    <!ENTITY foo SYSTEM "foo.xml">
    <!ENTITY bar SYSTEM "bar.xml">
]>
<document title="Current News">
<meta project="none" foo="bar">
    <keywords/><description/>
<author>Stephan Schmidt</author>
<getMetaNav/>
</meta>
<page label="PHP Application Tools" sublabel="Current News">
<?php
    for($i = 0; $i < count($_GET); $i++) {
        echo    $_GET[$i]."<br>";
    }
?>
&foo;&bar;
<intro>
   <!-- This Comment
has more
    than one line.
                    -->
        <introtitle>Welcome to PHP
Application Tools &amp; PEAR!</introtitle>
<para>
        If you're new to pat, and would like
        <!-- This is a comment in a single line that contains an &amp; -->
         to know
         
         what we do
         
         here, take a look at
         
         <link url=
         "/about/project.xml">
         "About Pat"</link> 
or
check out the
<link url="/about/projectsOverview.xml">"projects overview"</link>. Otherwise, you probably know your way 
around
the site already <smiley type="smile"/>
</para>
                                            </intro>
</page>
</document>

All you have to do is to use XML_Beautifier, pass the filename of the original file and the filename for the new file:

require_once "XML/Beautifier.php";
$fmt = new XML_Beautifier();
$result = $fmt->formatFile('originalFile.xml', 'beautifiedFile.xml');

if (PEAR::isError($result)) {
    echo $result->getMessage();
    exit();
}
echo "File beautified, awaiting orders!<br />";

And voila, your document looks nice:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE page [
    <!ENTITY foo SYSTEM "foo.xml">
    <!ENTITY bar SYSTEM "bar.xml">
]>
<document title="Current News">
    <meta foo="bar" project="none">
        <keywords />
        <description />
        <author>Stephan Schmidt</author>
        <getMetaNav />
    </meta>
    <page label="PHP Application Tools" sublabel="Current News">
        <?php
        for($i = 0; $i < count($_GET); $i++) {
                echo    $_GET[$i]."<br>";
            }
        ?>
        &foo;
        &bar;
        <intro>
            <!--
                This Comment
                has more
                than one line.
            -->
            <introtitle>Welcome to PHP Application Tools &amp; PEAR!</introtitle>
            <para>
                If you&apos;re new to pat, and would like
                <!-- This is a comment in a single line that contains an &amp; -->
                to know what we do here, take a look at
                <link url="/about/project.xml">&quot;About Pat&quot;</link>
                or check out the
                <link url="/about/projectsOverview.xml">&quot;projects overview&quot;</link>
                . Otherwise, you probably know your way around the site already
                <smiley type="smile" />
            </para>
        </intro>
    </page>
</document>

Options

Options -- List of all XML_Beautifier options

Introduction to options

Options let you influence the beautifiying process. They are passed to the renderer and thus, you have to check, whether the renderer you are using supports the options you want to use.

As there currently is only one renderer (Plain) available, you should not worry about this too much.

Options can be passed as an associative array to the constructor of XML_Beautifier. You may also use setOption(), or setOptions() to set one or more options after the instance of XML_Beautifier has been created.

XML_Beautifier::XML_Beautifier()

XML_Beautifier::XML_Beautifier() -- create new instance

Description

Creates a new instance of XML_Beautifier.

Parameter

  • array $options - options are used to influence to beautifying process. You may set the indent string, specify whether case folding should be enabled, etc...

    See XML_Beautifier options for more information.

Return value

object XML_Beautifier object

Note

This function can not be called statically.

XML_Beautifier::setOption()

XML_Beautifier::setOption() -- set an option

Description

Set an option for the beautifying process.

See XML_Beautifier options for more information.

Parameter

  • string $option - name of the option

  • mixed $value - value of the option

Return value

void

Note

This function can not be called statically.

XML_Beautifier::setOptions()

XML_Beautifier::setOptions() -- set several options

Description

Set several options for the beautifying process.

See XML_Beautifier options for more information.

Parameter

  • array $options - associative array containing options and their values, like you would pass it to the constructor.

Return value

void

Note

This function can not be called statically.

XML_Beautifier::resetOptions()

XML_Beautifier::resetOptions() -- reset options to default

Description

Reset all options to their default values.

See XML_Beautifier options for more information.

Parameter

This method does not accept any parameters.

Return value

void

Note

This function can not be called statically.

XML_Beautifier::apiVersion()

XML_Beautifier::apiVersion() -- return API version

Description

Returns API version of XML_Beautifier.

Return value

string API version

Note

This function can be called statically.

XML_Beautifier::formatFile()

XML_Beautifier::formatFile() -- beautify a file

Description

Beautifies a file.

Parameter

  • string $file - filename of the original file

  • string $newFile - filename for the beautified file. If no file is given, the method will return the resulting XML document. To overwrite the original file, pass XML_BEAUTIFIER_OVERWRITE.

  • string $renderer - renderer to use, currently only a "Plain" XML renderer can be used.

Return value

mixed Either true, if file has been written or the XML document string.

Note

This function can not be called statically.

XML_Beautifier::formatString()

XML_Beautifier::formatString() -- beautify a string

Description

Beautifies an XML string. Use this method to beautify an XML document that has been generated on-the-fly.

Parameter

  • string $string - string containing an XML document.

  • string $renderer - renderer to use, currently only a "Plain" XML renderer can be used.

Return value

string beautified XML document

Note

This function can not be called statically.


XML_DTD

Table of Contents
Introduction -- Introduction to XML_DTD

Parses DTD files and does DTD validation of XML documents.

Introduction

Introduction -- Introduction to XML_DTD

Introduction to XML_DTD

XML_DTD is able to parse a document type definition (DTD) file and validate XML documents according to this DTD. A DTD is the grammar of an XML application, it consist of rules that declare how tags have to be nested and which attributes may be used in the tags.

If you want to learn how to create a DTD, you should take a look at the W3C.

XML_DTD consits of two parts:

  • XML_DTD_Parser, which will parse a DTD file and return an XML_DTD_Tree object

  • XML_DTD_XmlValidator, which validates an XML document using a DTD file

If you validate an XML_Document using XML_DTD_XmlValidator, it will automatically parse the DTD file and create an XML_DTD_Tree from it.


XML_Feed_Parser

Table of Contents
Introduction and Quick Start -- Overview of XML_Feed_Parser
XML_Feed_Parser and Extensions -- Handling extensions with XML_Feed_Parser

XML_Feed_Parser is a parser for (the various) RSS and Atom format XML feeds. It provides a somewhat unified API while still allowing access to the full details of each feed type.

Introduction and Quick Start

Introduction and Quick Start -- Overview of XML_Feed_Parser

Description

XML_Feed_Parser provides a generic interface to a number of the most popular XML-based syndication formats (Atom, RSS1, RSS2, etc). In order to focus on its core competencies, it does not provide any HTTP or feed creation features, but instead parses a wide range of formats quickly and simply.

Presuming the XML for a feed is stored in the variable $xml_source, the simplest way to create an instance of the parser is:
try {
    $feed = new XML_Feed_Parser($xml_source);
} catch (XML_Feed_Parser_Exception $e) {
    die('Feed invalid: ' . $e->getMessage());
}

The constructor accepts a number of parameters, as follows:
/* The file you wish to parse */
$source = 'my_source.xml';

/* Where Relax NG is available, we can force validation of the feed */
$validate = true;

/* Whether or not to suppress non-fatal warnings */
$suppress_warnings = false;

/* If the feed is not valid XML and the tidy extension is installed we can
 * attempt to use it to fix the feed */
$use_tidy = true;

$feed = new XML_Feed_Parser($source, $validate, $suppress_warnings, $use_tidy);

Once you have an instance of the parser you can extract feed-level data by querying it directly. eg.
$title = $feed->title;

You can also access elements by iterating over the feed, or directly by offset or id.
foreach ($feed as $entry) {
    print $entry->title . "\n";
}

$first_entry = $feed->getEntryByOffset(0);

$particular_entry = $feed->getEntryById('http://jystewart.net/entry/1');

XML_Feed_Parser and Extensions

XML_Feed_Parser and Extensions -- Handling extensions with XML_Feed_Parser

Description

Using XML namespaces, the various syndication formats are very easy to extend and the number of extensions in use is enormous.

XML_Feed_Parser focuses on core functionality shared between the various syndication formats. Some of the most common extensions are handled natively—particularly when they provide one format with features to bring it into line with others, such as the content extension for RSS2—but the majority provide specialist content and providing support for them would quickly result in a bloated package.

It is possible that a proper extensions mechanism may be introduced in a future version, but as an alternative the DOM models in use within the classes are publicly accessible, allowing the package to be wrapped with special handlers.

For example, to make use of the 'pheed' extension (namespace http://www.pheed.com/pheed/) we might use:
$feed = new XML_Feed_Parser($xml_source);
$entry = $feed->getEntryByOffset(0);
$eModel = $entry->model;

$thumbnails = $eModel->getElementsByTagNameNS(
    'http://www.pheed.com/pheed/', 'thumbnail');

if ($thumbnails->length) {
    $thumbnail_url = $thumbnails->item(0)->nodeValue;
}


XML_Parser

Table of Contents
Introduction -- Introduction to XML_Parser
Example -- Example for the usage of XML_Parser
Modes -- Explanation of possible parsing modes
Choosing input -- Explanation of different types of input data

Object-oriented abstraction for PHP's xml extension.

Introduction

Introduction -- Introduction to XML_Parser

Introduction to XML_Parser

XML_Parser provides an object-oriented abstraction to PHP's ext/xml. It helps you processing XML documents by supplying methods that are needed when working with XML documents, like automatic error handling, parsing from a file, URL or string as well as an easy way to register callbacks.

XML_Parser uses SAX-based parsing, which is a simple API to retrieve information from XML documents. While the parser reads the document, it will call methods for the different nodes that are found. These nodes range from opening and closing tags to character data and processing instructions.

You will not be able to use XML_Parser directly to parse your documents, but you have to create a new class that extends XML_Parser and implement handlers for the tags and all other elements you need to process.

Several of PEAR's XML packages use this approach and thus rely on XML_Parser. If you would like to take a look at real-life examples, just install XML_RDDL, XML_Beautifier, XML_Statistics or XML_Serializer.

A tutorial that explains nearly every feature of XML_Parser is available at http://www.schst.net/articles/XML_Parser.

Example

Example -- Example for the usage of XML_Parser

Basic example

This example shows you how to create a very simple parser that handles start, end elements (i.e. opening and closing tags), and character data (the "content" between the tags).

require_once 'XML/Parser.php';

class myParser extends XML_Parser
{
  function myParser()
  {
    parent::XML_Parser();
  }

 /**
  * handle start element
  *
  * @access private
  * @param  resource  xml parser resource
  * @param  string    name of the element
  * @param  array     attributes
  */
  function startHandler($xp, $name, $attribs)
  {
    printf('handle start tag: %s<br />', $name);
  }

 /**
  * handle end element
  *
  * @access private
  * @param  resource  xml parser resource
  * @param  string    name of the element
  */
  function endHandler($xp, $name)
  {
    printf('handle end tag: %s<br />', $name);
  }

 /**
  * handle character data
  *
  * @access private
  * @param  resource  xml parser resource
  * @param  string    character data
  */
  function cdataHandler($xp, $cdata)
  {
    // does nothing here, but might e.g. print $cdata
  }
}

$p = &new myParser();

$result = $p->setInputFile('xml_parser_file.xml');
$result = $p->parse();

This parser will just output the names of the opening and closing tags that are found while parsing the document.

Modes

Modes -- Explanation of possible parsing modes

Parser modes of XML_Parser

XML_Parser provides two modes for parsing:

  • func

  • event

In the 'event' mode, XML_Parser will always call the methods startHandler() and endHandler(), independent of the tag name. In these methods you'll have to check for the tagname, which is passed as the second parameter and decide what you need to do. In most cases, this is done with a switch/case statement.

In the 'func' mode, XML_Parser will call different methods based on the name of the tag. This allows you to dispatch different tags to different methods. The methods to handle the start tag have to be called xmltag_[tagname](), where [tagname] has to be substituted by the name of the element that you wish to process. That means if you wish to write a method to process all opening <title> tags, it has to be called xmltag_title.

Methods to handle closing tags have to be named xmltag_[tagname]_() (distinguishes from the start element handler using a traling underscore).

As XML tags may contain chars like ".", ":" and "-" and those chars are not allowed in PHP function names, XML_Parser will replace them with "_" when building the name of the callback function.

If a method does not exist, XML_Parser will skip the tag without handling the element, unless you implemented the methods xmltag() and xmltag_(), which will be used as fallback methods.

Setting the mode

There are two ways of setting the mode:

  • Specifying the mode in the constructor as the second parameter.

    In the subclass of XML_Parser that you implemented to process the XML documents, you will have to call XML_Parser::XML_Parser() in the constructor. This method accepts the mode as its second parameter.

  • Setting the mode using XML_Parser::setMode().

Choosing input

Choosing input -- Explanation of different types of input data

Selecting the input for XML_Parser

XML_Parser is able to parse from several inputs:

  • filesystem or anything that can be accessed via stream

  • strings

  • resources

You will have to set the input using setInputFile(), setInputString() or setInput() and then call parse() to start the XML processing.

Parsing from a file

To parse from a file or URL, you'll have to set the name or URI using XML_Parser::setInputFile(). You may not only use files located on the filesystem, but any location that can be opened using fopen(). You may combine this functionality with the stream functions or PEAR's Streams packages to parse documents from shared memory, databases or anything else.

You may also use any of PHP's built-in wrappers to open HTTP or FTP locations as well as STDIN.

Parsing from a string

To parse an XML string, pass the string to XML_Parser (or your subclass of XML_Parser) using XML_Parser::setInputString(). A big advantage of SAX-based parsing is that the parser does not have to read the whole XML document to process it. If you are parsing very large documents, you should aboid setInputString() and use setInput() or setInputFile() instead.

Parsing from any resource

There's a third, but seldomly used way to specify XML_Parser's input. XML_Parser allows you to pass a PHP resource, like a file pointer that has been returned by fopen(). This can be useful, if you are generating the document on-the-fly and already opened it before. Instead of closing the file and passing its name to XML_Parser, you may simply use XML_Parser::setInput() to pass the resource. Make sure that the file pointer is at the correct location in your file using fseek().


XML_Query2XML

Allows you to transform records retrieved with one or more SQL SELECT queries into XML data.

Introduction

Introduction -- Start here

Major Features

XML_Query2XML allows you to transform the records retrieved with one or more SQL SELECT queries into XML data. Very simple to highly complex transformations are supported. Is was written with performance in mind and can handle large amounts of data. No XSLT needed!

  • 1. XML_Query2XML works with the classes provided by PHP5's built-in DOM API

  • 2. minimum effort necessary to get the simple jobs done

  • 3. highly configurable for more complex tasks

  • 4. ISO/IEC 9075-14:2005 support: mapping of SQL identifiers to XML names

  • 5. works with any database that is supported by PDO, PEAR DB, PEAR MDB2 or ADOdb

  • 6. easy integration of other XML data sources (e.g. raw XML data stored in the DB)

  • 7. debugging, logging and profiling features

  • 8. XML encoding: support for UTF-8, ISO-8859-1 and others

  • 9. in-depth documentation and case studies: tutorials and API documentation

  • 10. 1084 phpt unit tests


XML_RDDL

Table of Contents
Introduction -- Introduction to XML_RDDL
Example -- Example for the usage of XML_RDDL
XML_RDDL::XML_RDDL() -- Constructor
XML_RDDL::parseRDDL() -- parse a document that contains RDDL resources
XML_RDDL::getAllResources() -- return all resources that have been found
XML_RDDL::getResourceById() -- get one resource from the document
XML_RDDL::getResourcesByNature() -- selects all resources of a specified nature
XML_RDDL::getResourcesByPurpose() -- selects all resources of a specified nature
XML_RDDL::getResourcesByLanguage() -- selects all resources of a specified language
XML_RDDL::apiVersion() -- return API version

Class to read RDDL (Resource Directory Description Language) documents.

Introduction

Introduction -- Introduction to XML_RDDL

Introduction to XML_RDDL

XML_RDDL is a class that allows the extraction of RDDL resources from an XML document.

The Resource Directory Description Language is an extension of XHTML Basic 1.0 with an added element named resource. This element serves as an XLink to the referenced resource, and contains a human-readable description of the resource and machine readable links which describe the purpose of the link and the nature of the resource being linked to. The nature of the resource being linked to is indicated by the xlink:role attribute and the purpose of the link is indicated by the xlink:arcrole attribute.

For more information on RDDL, visit the RDDL website.

Example

Example -- Example for the usage of XML_RDDL

XML_RDDL::XML_RDDL()

XML_RDDL::XML_RDDL() -- Constructor

Description

Creates a new instance of XML_RDDL that can be used to parse RDDL documents.

When instantiating you may specifiy RDDL and XLINK namespaces. This may change, when XML_Parser supports namespaces and XML_RDDL will be able to extract the correct namespace abbrevations.

Parameter

  • string $rddlNamespace - abbrevation for the RDDL namespace.

  • string $xlinkNamespace - abbrevation for the XLink namespace.

Note

This function can not be called statically.

XML_RDDL::parseRDDL()

XML_RDDL::parseRDDL() -- parse a document that contains RDDL resources

Description

Parses an XML or XHTML document that contains RDDL resources and stores information about them for retrieval by the other methods.

Parameter

  • string $input - input to parse, either a string or a file. If it's a file, you have to set $isFile to true.

  • boolean $isFile - flag to indicate whether the $input parameter should be treated as a filename.

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

XML_RDDL::getAllResources()

XML_RDDL::getAllResources() -- return all resources that have been found

Description

Returns an array containing all reources that have been found. You have to call XML_RDDL::parseRDDL() first.

Return value

array array containing all resources

Note

This function can not be called statically.

XML_RDDL::getResourceById()

XML_RDDL::getResourceById() -- get one resource from the document

Description

Gets one resource from a document. You have to call XML_RDDL::parseRDDL() first.

Parameter

  • string $id - ID of the resource you want to get.

Return value

array array containing all information about the specified resource or a PEAR_Error if the resource does not exist.

Note

This function can not be called statically.

XML_RDDL::getResourcesByNature()

XML_RDDL::getResourcesByNature() -- selects all resources of a specified nature

Description

Gets all resources of a given nature from an RDDL document. You have to call XML_RDDL::parseRDDL() first. The nature of a resource is specified by the 'xlink:role' attribute. A nature can be a stylesheet, a DTD, a HTML document, etc. You can find a list of well known natures at http://www.rddl.org/natures/.

Parameter

  • string $nature - nature of the resources you want to get.

Return value

array array containing all resources with the specified nature.

Note

This function can not be called statically.

XML_RDDL::getResourcesByPurpose()

XML_RDDL::getResourcesByPurpose() -- selects all resources of a specified nature

Description

Gets all resources of a given purpose from an RDDL document. You have to call XML_RDDL::parseRDDL() first. The purpose of a resource is specified by the 'xlink:arcrole' attribute. The purpose of a resource link determines what the link will be used for. Frequently the purpose of a link can be determined from the nature of the referenced resource. For example the purpose of an XML Schema is typically schema validation, yet a schema may be comprised of a number of included modules and even when included modules are themselves an XML Schema, the purpose is as a module. You can find a list of well known purposes at http://www.rddl.org/purposes/.

Parameter

  • string $purpose - purpose of the resources you want to get.

Return value

array array containing all resources with the specified purpose.

Note

This function can not be called statically.

XML_RDDL::getResourcesByLanguage()

XML_RDDL::getResourcesByLanguage() -- selects all resources of a specified language

Description

Gets all resources of a given language from an RDDL document. You have to call XML_RDDL::parseRDDL() first. If a resource has no xml:lang attribute, the xml:lang attribute of the root of the document is used.

Parameter

  • string $language - language of the resources you want to get.

Return value

array array containing all resources with the specified language.

Note

This function can not be called statically.

XML_RDDL::apiVersion()

XML_RDDL::apiVersion() -- return API version

Description

Returns API version of XML_RDDL.

Return value

string API version

Note

This function can be called statically.


XML_RSS

Table of Contents
Introduction -- Introduction to XML_RSS
Requirements -- Requirements for running XML_RSS
Example -- Example for the usage of XML_RSS
XML_RSS::XML_RSS -- Constructor
XML_RSS::getStructure -- Get complete structure of RSS file
XML_RSS::getChannelInfo -- Get general information about current channel
XML_RSS::getItems -- Get items from RSS file
XML_RSS::getImages -- Get images from RSS document
XML_RSS::getTextinputs -- Get text input fields from RSS document

Parser for Resource Description Framework (RDF) Site Summary (RSS) documents.

Introduction

Introduction -- Introduction to XML_RSS

Requirements

Requirements -- Requirements for running XML_RSS

XML_Parser

To parse the XML files that contain the RSS feeds, XML_RSS requires that the package XML_Parser is installed. However this dependency will be automatically handled by the installer during the installation phase of XML_RSS.

allow_url_fopen configuration value

Since most RSS feeds are located on remote hosts, one has to ensure that the PHP configuration value "allow_url_fopen" is set to "On" before running XML_RSS.

To find out the current value of "allow_url_fopen", one can use the function ini_get(). To set a new value of "allow_url_fopen", you must modify the php.ini configuration file of PHP.

Example

Example -- Example for the usage of XML_RSS

XML_RSS::XML_RSS

XML_RSS::XML_RSS -- Constructor

Description

Constructor

Parameter

  • mixed $handle - file pointer or name of the RDF file.

Note

This function can not be called statically.

XML_RSS::getStructure

XML_RSS::getStructure -- Get complete structure of RSS file

Description

Get complete structure of RSS file

Return value

array - the array depends on the structure of the RSS document.

Note

This function can not be called statically.

XML_RSS::getChannelInfo

XML_RSS::getChannelInfo -- Get general information about current channel

Description

Get general information about current channel. This function returns an array containing the information that has been extracted from the <channel>-tag while parsing the RSS document.

Return value

array - an array of strings. The keys of the array are

  • 'title' - name of the channel

  • 'link' - URL to the channel site

  • 'description' - description of the channel

Note

This function can not be called statically.

XML_RSS::getItems

XML_RSS::getItems -- Get items from RSS file

Description

Get items from RSS document. This function returns an array containing the set of items that are provided by the RSS document.

Return value

array - a two-dimensional array. Every inner array contains information about a site. Use the array key 'title' to get the article title and the key 'link' for the URL of the site.

Note

This function can not be called statically.

XML_RSS::getImages

XML_RSS::getImages -- Get images from RSS document

Description

Get images from RSS document. This function returns an array containing the set of images that are provided by the RSS document.

Return value

array - a two-dimensional array. Every inner array contains information about an image of a site.

  • 'title' - name of the channel

  • 'link' - URL to the site

  • 'url' - URL of the image

Note

This function can not be called statically.

XML_RSS::getTextinputs

XML_RSS::getTextinputs -- Get text input fields from RSS document

Description

Get text input fields from RSS document.

Return value

array - an hash containing the data of an input field

  • 'title' - name of the input field

  • 'description' - description of the inout field

  • 'link' - URL for the request

  • 'name' - name of the request parameter

Note

This function can not be called statically.


XML_Serializer

Table of Contents
Introduction -- Introduction to XML_Serializer
Package XML_Serializer Constants -- Constants defined in and used by XML_Serializer
Class Summary XML_Serializer -- XML_Serializer - class that serializes various structures into an XML document
constructor XML_Serializer::XML_Serializer() -- constructor
XML_Serializer::apiVersion() -- return API version
XML_Serializer::serialize() -- serialize data
XML_Serializer::getSerializedData() -- get the result of the serialization
XML_Serializer::resetOptions() -- reset all options to default options
XML_Serializer::setOption() -- set an option
Example -- Example for the usage of XML_Serializer
Tutorial: Create an RSS Feed -- How to use XML_Serializer to build an RSS Newsfeed
Class Summary XML_Unserializer -- XML_Unserializer - class to unserialize (read) XML documents
XML_Unserializer Options -- List of all XML_Unserializer options
XML_Unserializer::XML_Unserializer() -- Constructor for XML_Unserializer
XML_Unserializer::apiVersion() -- return API version
XML_Unserializer::unserialize() -- unserialize data
XML_Unserializer::getUnserializedData() -- get the result of the unserialization
XML_Unserializer::getRootName() -- get the name of the root tag of the parsed document.
XML_Unserializer::setOption() -- set an option
XML_Unserializer::setoptions() -- set several options
XML_Unserializer::resetOptions() -- reset all options to default options

Introduction

Introduction -- Introduction to XML_Serializer

Introduction to XML_Serializer

XML_Serializer serializes complex data structures like arrays or object as XML documents. This class helps you generating any XML document you require without the need for DOM.

Currently there are two ways in which XML_Serializer can be used in your applications:

  • use XML_Serializer's functionality to create XML documents in a specific XML application (e.g. RDF) that is being processed by an existing script)

  • use XML_Serializer's functionality to serialize data structures that have to be unserialized at a later point. This is possible by adding type information to all XML elements.

The package not only contains a serializer class but also a matching XML_Unserializer, which is able to virtually read any XML document and return an array or object structure that represents the data stored in the document.

Tutorials on XML_Serializer

There are several tutorials on XML_Serializer available, that help you get started.

Package XML_Serializer Constants

Package XML_Serializer Constants -- Constants defined in and used by XML_Serializer

Class Summary XML_Serializer

Class Summary XML_Serializer -- XML_Serializer - class that serializes various structures into an XML document

XML_Serializer - class that serializes various structures into an XML document

This class can be used in two modes:

  1. Create an XML document from an array or object that is processed by other applications.

  2. This classes can be used to serialize any data structure in a way that it can later be unserialized again. XML_Serializer will store the type of the value and additional meta information in attributes of the surrounding tag. This meta information can later be used to restore the original data structure in PHP.

constructor XML_Serializer::XML_Serializer()

constructor XML_Serializer::XML_Serializer() -- constructor

Description

This package is not documented yet.

Parameter

mixed $options

array containing options for the serialization

Throws

throws no exceptions thrown

Note

This function can not be called statically.

XML_Serializer::apiVersion()

XML_Serializer::apiVersion() -- return API version

Description

This package is not documented yet.

Return value

returns API version

Throws

throws no exceptions thrown

static

static

Note

This function can not be called statically.

XML_Serializer::serialize()

XML_Serializer::serialize() -- serialize data

Description

This package is not documented yet.

Parameter

mixed $data

data to serialize

mixed $options

Return value

returns true on success, pear error on failure

Throws

throws no exceptions thrown

Note

This function can not be called statically.

XML_Serializer::getSerializedData()

XML_Serializer::getSerializedData() -- get the result of the serialization

Description

This package is not documented yet.

Throws

throws no exceptions thrown

Note

This function can not be called statically.

XML_Serializer::resetOptions()

XML_Serializer::resetOptions() -- reset all options to default options

Description

This package is not documented yet.

Throws

throws no exceptions thrown

See

see XML_Serializer::setOption(), XML_Unserializer()

Note

This function can not be called statically.

XML_Serializer::setOption()

XML_Serializer::setOption() -- set an option

Description

You can use this method if you do not want to set all options in the constructor

Parameter

mixed $name

mixed $value

Throws

throws no exceptions thrown

See

see resetOption(), XML_Serializer::XML_Serializer()

Note

This function can not be called statically.

Example

Example -- Example for the usage of XML_Serializer

Build a simple XML document

Example that uses the returnResult option to directly return the serialized XML document in the serialize() method.

In this example look at theses 3 lines.

$serializer = &new XML_Serializer($options);
$foo = PEAR::raiseError('Just a test', 1234);
$result = $serializer->serialize($foo);
error_reporting(E_ALL);
require_once 'XML/Serializer.php';
$options = array(
  XML_SERIALIZER_OPTION_INDENT        => '    ',
  XML_SERIALIZER_OPTION_RETURN_RESULT => true
  );

$serializer = &new XML_Serializer($options);

$foo = PEAR::raiseError('Just a test', 1234);

$result = $serializer->serialize($foo);

echo '<pre>';
echo htmlspecialchars($result);
echo '</pre>';

And this is the result

<pear_error>
    <error_message_prefix />
    <mode>1</mode>
    <level>1024</level>
    <code>1234</code>
    <message>Just a test</message>
    <userinfo />
    <backtrace>
        <XML_Serializer_Tag>
            <file>pathToMypear\PEAR.php</file>
            <line>566</line>
            <function>pear_error</function>
            <class>pear_error</class>
            <type>-&gt;</type>
            <args>
                <XML_Serializer_Tag>Just a test</XML_Serializer_Tag>
                <XML_Serializer_Tag>1234</XML_Serializer_Tag>
                <XML_Serializer_Tag>1</XML_Serializer_Tag>
                <XML_Serializer_Tag>1024</XML_Serializer_Tag>
                <XML_Serializer_Tag />
            </args>
        </XML_Serializer_Tag>
        <XML_Serializer_Tag>
            <file>pathToMyDocRoot\cvs.php.net\pear\xml_serializer\examples\serializeandreturn.php</file>
            <line>19</line>
            <function>raiseerror</function>
            <class>pear</class>
            <type>::</type>
            <args>
                <XML_Serializer_Tag>Just a test</XML_Serializer_Tag>
                <XML_Serializer_Tag>1234</XML_Serializer_Tag>
            </args>
        </XML_Serializer_Tag>
    </backtrace>
    <callback />
</pear_error>

You can find the last version of this source code in the package : serializeAndReturn.php

Build a RDF document

This example shows how to create an RDF document with a few lines of code. This can also be done with mode => simplexml.

In this example look at theses 3 lines.

$serializer = new XML_Serializer($options);
    $result = $serializer->serialize($rdf);
    echo    htmlentities($serializer->getSerializedData());
/**
   * @see    serializeIndexedArray.php
   */
    error_reporting(E_ALL);

    require_once 'XML/Serializer.php';

    $options = array(
      "indent"          => "    ",
      "linebreak"       => "\n",
      "typeHints"       => false,
      "addDecl"         => true,
      "encoding"        => "UTF-8",
      "rootName"        => "rdf:RDF",
      "rootAttributes"  => array("version" => "0.91"),
      "defaultTagName"  => "item",
      "attributesArray" => "_attributes"
      );
    
    $serializer = new XML_Serializer($options);

    $rdf = array(
      "channel" => array(
        "title" => "Example RDF channel",
        "link"  => "http://www.php-tools.de",
        "image" => array(
          "title" => "Example image",
          "url"   => "http://www.php-tools.de/image.gif",
          "link"  => "http://www.php-tools.de"
          ),
        "_attributes" => array( "rdf:about" => "http://example.com/foobar.html" ),
        array(
          "title"       => "Example item",
          "link"	=> "http://example.com",
          "_attributes" => array( "rdf:about" => "http://example.com/foobar.html" )
          ),
        array(
          "title"	=> "Another item",
          "link"	=> "http://example.com",
          "_attributes" => array( "rdf:about" => "http://example.com/foobar.html" )
          ),
        array(
          "title"	=> "I think you get it...",
          "link"	=> "http://example.com",
          "_attributes" => array( "rdf:about" => "http://example.com/foobar.html" )
          )
        )
      );
    
    $result = $serializer->serialize($rdf);
    
    if( $result === true ) {
        echo    "<pre>";
        echo    htmlentities($serializer->getSerializedData());
        echo    "</pre>";
    }

And this is the result

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF version="0.91">
    <channel rdf:about="http://example.com/foobar.html">
        <title>Example RDF channel</title>
        <link>http://www.php-tools.de</link>
        <image>
            <title>Example image</title>
            <url>http://www.php-tools.de/image.gif</url>
            <link>http://www.php-tools.de</link>
        </image>
        <item rdf:about="http://example.com/foobar.html">
            <title>Example item</title>
            <link>http://example.com</link>
        </item>
        <item rdf:about="http://example.com/foobar.html">
            <title>Another item</title>
            <link>http://example.com</link>
        </item>
        <item rdf:about="http://example.com/foobar.html">
            <title>I think you get it...</title>
            <link>http://example.com</link>
        </item>
    </channel>
</rdf:RDF>

You can find the last version of this source code in the package : serializeRDF.php

Note : if you search how to parse (read) an RDF/RSS document, look at XML_RSS package.

Build a XML document with a DTD

This example shows how to add a DocType Declaration to the XML document

In this example look at theses 3 lines.

$serializer = new XML_Serializer($options);
    $result = $serializer->serialize($rdf);
    echo    htmlentities($serializer->getSerializedData());
error_reporting(E_ALL);

    require_once 'XML/Serializer.php';

    $options = array(
      "indent"     => "    ",
      "linebreak"  => "\n",
      "addDecl"    => true,
      "addDoctype" => true,
      "doctype"    => array(
        'uri' => 'http://pear.php.net/dtd/package-1.0',
        'id'  => '-//PHP//PEAR/DTD PACKAGE 0.1'
        )
      );
    
    $serializer = new XML_Serializer($options);

    $foo    =   PEAR::raiseError("Just a test", 1234);    
    
    $result = $serializer->serialize($foo);
    
    if( $result === true ) {
        echo '<pre>';
        echo htmlentities($serializer->getSerializedData());
        echo '</pre>';
    }

And this is the result

<?xml version="1.0"?>
<!DOCTYPE pear_error PUBLIC "-//PHP//PEAR/DTD PACKAGE 0.1" "http://pear.php.net/dtd/package-1.0">
<pear_error>
    <error_message_prefix />
    <mode>1</mode>
    <level>1024</level>
    <code>1234</code>
    <message>Just a test</message>
    <userinfo />
    <backtrace>
        <XML_Serializer_Tag>
            <file>pathToMyPear\PEAR.php</file>
            <line>566</line>
            <function>pear_error</function>
            <class>pear_error</class>
            <type>-&gt;</type>
            <args>
                <XML_Serializer_Tag>Just a test</XML_Serializer_Tag>
                <XML_Serializer_Tag>1234</XML_Serializer_Tag>
                <XML_Serializer_Tag>1</XML_Serializer_Tag>
                <XML_Serializer_Tag>1024</XML_Serializer_Tag>
                <XML_Serializer_Tag />
            </args>
        </XML_Serializer_Tag>
        <XML_Serializer_Tag>
            <file>pathToMyDocumentRoot\cvs.php.net\pear\xml_serializer\examples\serializewithdtd.php</file>
            <line>24</line>
            <function>raiseerror</function>
            <class>pear</class>
            <type>::</type>
            <args>
                <XML_Serializer_Tag>Just a test</XML_Serializer_Tag>
                <XML_Serializer_Tag>1234</XML_Serializer_Tag>
            </args>
        </XML_Serializer_Tag>
    </backtrace>
    <callback />
</pear_error>

You can find the last version of this source code in the package : serializeWithDTD.php

Tutorial: Create an RSS Feed

Tutorial: Create an RSS Feed -- How to use XML_Serializer to build an RSS Newsfeed

Mission

Note: This tutorial has been written by cnb and been published on http://freedomink.org/node/62. The site is offline since 2005 and has been rescued using the Internet Archive's Wayback Machine.

Here's how you can create an XML news feed in just five minutes using PHP, PEAR and the PEAR XML_Serializer package by Stephan Schmidt.

What a news feed consists of in it's barest form is your "site name", "site url" and a "listing of stories" from your site. To create a news feed what we need to do is create a publically accessible (web) document which can show this information in a format other sites can understand. This is possible by creating this document in the standard RDF Site Summary (RSS) format. A format used by many sites.

What we are aiming at is creating a document which looks like the following:

Note: This isn't "well formed" XML but a stripped version making it as simple as possible for illustrative purposes. Once we understand the basics we can move on to create well formed XML.

<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF>
    <channel>
        <title>Freedom Ink</title>
        <link>http://freedomink.org/</link>
        <item>
            <item>
                <title>First Article</title>
                <link>http://freedomink.org/node/view/55</link>
                <description>Short blurb about article........</description>
            </item>
            <item>
                <title>Second Article</title>
                <link>http://freedomink.org/node/view/11</link>
                <description>This article shows you how ......</description>
            </item>
        </item>
    </channel>
</rdf:RDF>

Do it in PHP

Here's an easy way to do it in PHP.

Prerequisite: Install PEAR and the XML_Serializer package.

Include the following default options at the top of your php page.

<?php
require_once 'XML/Serializer.php';

$options = array(
    "indent"    => "    ",
    "linebreak" => "\n",
    "typeHints" => false,
    "addDecl"   => true,
    "encoding"  => "UTF-8",
    "tagName"   => "rdf:RDF",
    "defaultTagName" => "item"
);
?>

Let us first create an array containing a listing of the stories on your site.

We create array $stories and add one story.

$stories[] = array(
    'title'       => 'First Article',
    'link'        => 'http://freedomink.org/node/view/55',
    'description' => 'Short blurb about article........'
);

You can add more stories to the array in the same manner. Ideally this should be done in a "for" or "foreach" loop.

$stories[] = array(
    'title'       => 'Second Article',
    'link'        => 'http://freedomink.org/node/view/11',
    'description' => 'This article shows you how ......'
);

Finally we specify the channel details and add the stories to it.

$data['channel'] = array(
    "title" => "Freedom Ink",
    "link"  => "http://freedomink.org/",
    $stories
);

Now we generate the XML using the PEAR XML_Serializer package.

$serializer = new XML_Serializer($options);

if ($serializer->serialize($data)) {
    header('Content-type: text/xml');
    echo $serializer->getSerializedData();
}

And that's it! When a person visits the page containing this code an XML file like the one we saw above will be generated and served.

To learn how to parse XML/RSS files you can read this related article which has by far the easiest method of parsing XML/RSS documents.

Class Summary XML_Unserializer

Class Summary XML_Unserializer -- XML_Unserializer - class to unserialize (read) XML documents

XML_Unserializer - class to unserialize (read) XML documents

Class to unserialize XML documents that have been created with XML_Serializer. To unserialize an XML document you have to add type hints to the XML_Serializer options.

If no type hints are available, XML_Unserializer will guess how the tags should be treated, that means complex structures will be arrays and tags with only CData in them will be strings.

XML_Unserializer Options

XML_Unserializer Options -- List of all XML_Unserializer options

Introduction to options

Options let you influence, how XML_Unserializer treats the parsed XML. It allows you to define, whether attributes should be parsed, whether to use associative arrays or objects for complex data types and more.

Options can be passed as an associative array to the constructor of XML_Unserializer. You may also use setOption(), or setOptions() to set one or more options after the instance of XML_Unserializer has been created.

All available options

Here is a list of all options supported by XML_Unserializer.

Table 66-1. XML_Unserializer options

OptionPossible valuesDefaultDescription
complexType'array' or 'object''array'Defines, whether nested tags should be returned as associative arrays or objects
tagAsClassTRUE or FALSETRUE Defines, whether the tag name should be used as the class name if complexType is set to 'object'. If no class with the name of the tag exists, that class defined by 'defaultClass' is used.
defaultClassany stringstdClassDefines the class that is used to create objects, if the complexType option is set to 'object'.
keyAttributeany string or array'_originalKey' If the attribute specified in this option exists for a tag, the value will be used as key or property name in the parent object or array. You may also specify an associative array if you want to use differnt key attributes for different tags. In this case, the array key contains the tag name and the array vallue the corresponding attribute name.
typeAttributeany string'_type'If this attribute exists for a tag, the tag content will be converted to the specified type. Possible types are: string, integer, float, boolean, array and object
classAttributeany string'_class' If XML_Unserializer creates an object, it will be an instance of the value specified with the defaultClass option, unless the tag has the attribute specified in this option. If it is set, the classname stored in the attribute value will be used.
parseAttributesTRUE or FALSEFALSEWith this option, you may tell XML_Unserializer to also parse the attributes of the tags. The next two options define how to treat the parsed attributes.
attributesArrayFALSE or any stringFALSEIf set to false, the attributes will be treated like nested tags. If you set it to a string, a new aray will be created and stored in the parent structure using key you specified in this option
prependAttributesany string''Allows you to specify a prefix for attribute names.
contentNameany string'_content'If you decide to parse attributes or a tag contains cdata and tags, then the cdata will be stored in the index specified here.
tagMapassociative arrayarray()This allows you to map tag names to PHP classes. The names of the tags have to be in the keys and the values contain the class names to use for each tag.
forceEnumindexed arrayarray() This allows you to specify a list of tags which will automatically be converted to an indexed array, independent of the number of repetitions of the tag. This can save you a some if conditions in your code.
encodingany valid encoding stringnull Defines the encoding of the original document.
targetEncodingany valid encoding stringnull Defines the target encoding of the resulting data.
decodeFunctionany valid PHP callbacknull This option allows you to define a callback function or method, that will be applied to all character data and attributes in the document before they are stored in the result. This allows you to decode any decoded data in the XML or convert all content to lowercase.
returnResultTRUE or FALSEFALSE If set to TRUE XML_Unserializer::unserialize()() will return the result if the document could be unserialized instead of just TRUE.

XML_Unserializer::XML_Unserializer()

XML_Unserializer::XML_Unserializer() -- Constructor for XML_Unserializer

Description

Creates a new instance of XML_Unserializer.

Parameter

Note

This function can not be called statically.

XML_Unserializer::apiVersion()

XML_Unserializer::apiVersion() -- return API version

Description

Returns API version of XML_Unserializer. This may be useful to check if the needed functionality exists.

Return value

string API version

Note

This function can be called statically.

XML_Unserializer::unserialize()

XML_Unserializer::unserialize() -- unserialize data

Description

Unserialize an XML document from a string or a file.

The way the document is unserialized is influenced by the options you set in the constructor or with setOptions().

Parameter

  • string $data - either the file name of an XML document or a string containing the XML document.

  • boolean $isFile - indicates whether the first parameter should is a filename (TRUE) or an XML string (FALSE).

  • array $options - Options to override the options that have been set previously. The options will only be used for this unserialization and then reset the options you set before.

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

XML_Unserializer::getUnserializedData()

XML_Unserializer::getUnserializedData() -- get the result of the unserialization

Description

This method returns the result of the last unserialization. You have to call XML_Unserializer::unserialize() first.

Return value

mixed result of the unserialization. May either be an array or an object.

Throws

throws PEAR_Error object, if not document has been parsed.

Note

This function can not be called statically.

XML_Unserializer::getRootName()

XML_Unserializer::getRootName() -- get the name of the root tag of the parsed document.

Description

This method will return the name of the root tag, after a document has been unserialized. This can be extremely useful when returning an array. You have to call XML_Unserializer::unserialize() first.

Return value

string name of the root tag

Throws

throws PEAR_Error object, if not document has been parsed.

Note

This function can not be called statically.

XML_Unserializer::setOption()

XML_Unserializer::setOption() -- set an option

Description

Options influence the behaviour of XML_Unserializer and are the most important part of XML_Unserializer.

You can use this method if you do not want to set all options in the constructor.

Parameter

  • string $option - name of the option

  • mixed $value - value of the option

Note

This function can not be called statically.

XML_Unserializer::setoptions()

XML_Unserializer::setoptions() -- set several options

Description

Options influence the behaviour of XML_Unserializer and are the most important part of XML_Unserializer.

You can use this method if you do not want to set all options in the constructor.

Parameter

  • array $options - assoc array containing all options

Note

This function can not be called statically.

XML_Unserializer::resetOptions()

XML_Unserializer::resetOptions() -- reset all options to default options

Description

Resets all XML_Unserializer options to the default options.

Note

This function can not be called statically.


XML_sql2xml

Table of Contents
Introduction -- Simple transformations
Introduction -- Passing the data to transform
Introduction -- Using XPath
XML_sql2xml::XML_sql2xml -- Constructor
XML_sql2xml::add -- General method for adding new result sets
XML_sql2xml::addXmlFile -- Adds a XML file
XML_sql2xml::addXmlString -- Adds XML string
XML_sql2xml::addResult -- Adds an PEAR::DB result set
XML_sql2xml::addSql -- Adds an result set from a SQL statement
XML_sql2xml::addArray -- Adds an aditional result set from an array
XML_sql2xml::getXML -- Returns a XML representation of the result set.
XML_sql2xml::getXMLObject -- return an XML DomDocument object
XML_sql2xml::setOptions -- set options for the instance
XML_sql2xml::setEncoding -- set encoding charset
XML_sql2xml::getXpathValue -- return match of a XPath expression
XML_sql2xml::getXpathChildValues -- return child tags from match of a XPath expression

Translates SQL-Queries to XML-Resultsets.

XML_sql2xml takes an existing result set or a SQL statement and transforms it to an XML representation

Introduction

Introduction -- Simple transformations

Example database

In this tutorial, the examples refers to this database tables:
mysql> select * from bands;
+----+--------------+------------+-------------+-------------+
| id | name         | birth_year | birth_place | genre       |
+----+--------------+------------+-------------+-------------+
|  1 | The Blabbers |       1998 | London      | Rock'n'Roll |
|  2 | Only Stupids |       1997 | New York    | Hip Hop     |
+----+--------------+------------+-------------+-------------+

mysql> select * from albums;
+----+---------+------------------+------+-----------------+
| id | bandsID | title            | year | comment         |
+----+---------+------------------+------+-----------------+
|  1 |       1 | BlaBla           | 1998 | Their first one |
|  2 |       1 | More Talks       | 2000 | The second one  |
|  3 |       2 | All your base... | 1999 | The Classic     |
+----+---------+------------------+------+-----------------+

Transformations based on Join queries

If your query result base on joined tables, a nested XML data structure can represent how the DBMS joins the tables. To enable or to disable this behavoir use setOptions() with the option key 'nested'. The default value is TRUE - the nesting is enabled.

If you disable the nesting, the XML structure of rows is flat.

Introduction

Introduction -- Passing the data to transform

Overview

There are three ways to pass the data for transforming to the object:

  • with a direct query

    This way you see in the first part of the introduction already.

  • with an existing DB_result object

    If you need the full power of the PEAR::DB or PEAR::MDB API, you should choose this way.

  • with an array

    This is not directly an SQL to XML transformation; if you pass an indice array to the instance, the keys of the array are transformed into XML tags, their values into the tag content. This feature his helpful for adding data to an XML transformed result set.

Direct query

This behavoir does connecting to the DBMS, quering and fetching he result automatically. XML_sql2xml requires an valid DSN as construtor parameter. The query has to be passed to the getXML() or add() method.

Take a look into the first part of the introduction for examples.

Passing an DB_Result object

PEAR::DB and PEAR::MDB return the result set of a query as DB_result object. You have to provide a DB_common instance to the construtor and the DB_result instance to getXML() or add().

The XML output in $xmlstring is equal to the example in "The typical using".

This way is the only one, if you want to benefit from all the features of the database APIs.

Passing more then one result set

You can call add() several result sets to XML document. Just call the method for every result set; if you have added all result sets, call getXml() without any arguments to get the XML document.

Introduction

Introduction -- Using XPath

Why XPath support?

The XPath support was introduced to provide an access to the result set after doing the SQL query. This allows further proccessing of the result set without quering the database again.

XPath is a W3-Standard and for further information about that, ask your preferred XSL/XML book, or http://www.w3.org/.

XML_sql2xml::XML_sql2xml

XML_sql2xml::XML_sql2xml -- Constructor

Description

The Constructor can take a Pear::DB Data Source Name (DSN) and will then connect to the database; or a PEAR::DB object handle, if you already connected the database before. Providing sql-strings will not work.

If you provide only a DSN, you have to add a DB_result object, SQL statement or an array later.

The $root parameter is used, if you want to provide another name for your root-tag than <root>. If you give an empty string (""), there will be no root element created here, but only when you add a resultset, array or SQL Statement. And the first tag of this result is used as the root tag.

Parameter

  • mixed $dsn - PEAR::DB "data source name" or DB_common object

  • string $root - the name of the XML-root element.

Note

This function can be called statically.

XML_sql2xml::add

XML_sql2xml::add -- General method for adding new result sets

Description

General method for adding new result sets to the object. Give a SQL statement, a PEAR::DB_result object or an array as input parameter and the method calls the appropriate method for this input.

Parameter

  • string $resultset - SQL statement, an DB_result object or an array

  • mixed $params - parameters for the following functions

Note

This function can not be called statically.

XML_sql2xml::addXmlFile

XML_sql2xml::addXmlFile -- Adds a XML file

Description

Adds the content of a XML file on the same level as a normal result set (mostly just below <root>).

Parameter

  • string $file - file name

  • mixed $xpath - either a string with the XPath expression or an array with the keys "xpath"=>XPath expression and "root"=>tag/subtag/etc, which are the tags to be inserted before the result.

Note

This function can not be called statically.

XML_sql2xml::addXmlString

XML_sql2xml::addXmlString -- Adds XML string

Description

Adds the content of a xml-string on the same level as a normal result set (mostly just below <root>)

Parameter

  • string $string - XML string

  • mixed $xpath - either a string with the XPath expression or an array with the keys "xpath"=>XPath expression and "root"=>tag/subtag/etc, which are the tags to be inserted before the result.

Note

This function can not be called statically.

XML_sql2xml::addResult

XML_sql2xml::addResult -- Adds an PEAR::DB result set

Description

Adds an additional PEAR::DB_result result set

Parameter

Note

This function can not be called statically.

XML_sql2xml::addSql

XML_sql2xml::addSql -- Adds an result set from a SQL statement

Description

Adds an aditional result set generated from an SQL statement. The function executes the statement and transform it into XML. You have to pass an DSN to the constructor.

Parameter

  • string $sql - a string containing an SQL statement.

Note

This function can not be called statically.

XML_sql2xml::addArray

XML_sql2xml::addArray -- Adds an aditional result set from an array

Description

Adds an aditional result set generated from an array. The XML represents the nesting of the array.

Parameter

  • array $array - data array

Note

This function can not be called statically.

XML_sql2xml::getXML

XML_sql2xml::getXML -- Returns a XML representation of the result set.

Description

Returns an XML string with a XML representation of the result set. The result set can be directly provided here, or if you need more than one in your XML, then you have to provide each of them with add() before you call getXML(), but the last one can also be provided here.

Parameter

  • mixed $result - a DB_result object from a DB query or a SQL query

Return value

string - the XML string

Note

This function can not be called statically.

XML_sql2xml::getXMLObject

XML_sql2xml::getXMLObject -- return an XML DomDocument object

Description

Returns an XML DomDocument object with a XML representation of the result sets. The result set can be directly provided here, or if you need more than one in your XML, then you have to provide each of them with add() before you call getXMLObject(), but the last one can also be provided here.

Parameter

Return value

Object - DomDocument object

Note

This function can not be called statically.

XML_sql2xml::setOptions

XML_sql2xml::setOptions -- set options for the instance

Description

This method sets the options for the class instance.

Parameter

  • array $options - array of options. The array key defines the option to set. Avaible options are:

    • boolean $options['nested'] - if TRUE the result of an join query will be nested. The default value is FALSE.

    • boolean $options['tagNameRow'] - name for the row mark up tag. Default is >row<

    • boolean $options['tagNameResult'] - name for the result-set mark up tag. Default is >result<

  • constant $delete - the old sub options should be deleted

Note

This function can not be called statically.

XML_sql2xml::setEncoding

XML_sql2xml::setEncoding -- set encoding charset

Description

Sets the encoding for the db2xml transformation. The $encoding_from value depends on your database system; check the DBMS manual which encoding your system use to deliever result sets.

The $encoding_to sets the charset for the created XML document.

Parameter

  • string $encoding_from - encoding to transform from

  • string $encoding_to - encoding to transform to

Note

This function can not be called statically.

XML_sql2xml::getXpathValue

XML_sql2xml::getXpathValue -- return match of a XPath expression

Description

Returns the content of the first match of the XPath expression.

Parameter

  • string $expr - XPath expression

Return value

mixed - content of the evaluated XPath expression

Note

This function can not be called statically.

XML_sql2xml::getXpathChildValues

XML_sql2xml::getXpathChildValues -- return child tags from match of a XPath expression

Description

Returns the values from the child tags from the first match of the XPath.

Parameter

  • string $expr - XPath expression

Return value

array - the content of the child tags. The child tag name is assigned as key, the content as value.

Note

This function can not be called statically.


XML_Statistics

Table of Contents
Introduction -- Introduction to XML_Statistics
Example -- Example for the usage of XML_Statistics
XML_Statistics::apiVersion() -- return API version
XML_Statistics::analyzeFile() -- Analyze an XML file
XML_Statistics::analyzeString() -- Analyze an XML string
XML_Statistics::countTag() -- count the occurences of a tag
XML_Statistics::countTagsInDepth() -- count the tags in a certain depth
XML_Statistics::countPI() -- count the occurences of a processing instruction
XML_Statistics::countExternalEntity() -- count the occurences of an external entitity
XML_Statistics::getMaxDepth() -- get the maximum nesting level
XML_Statistics::countAttribute() -- count the occurences of an attribute
XML_Statistics::countDataChunks() -- count the occurences of a data blocks
XML_Statistics::getCDataLength() -- get the combined length of all CData sections

Package to statistically analyze an XML document.

Introduction

Introduction -- Introduction to XML_Statistics

Introduction to XML_Statistics

XML_Statistics is a package that allows you to analyze XML documents, which can be files or strings.

XML_Statistics is able to count tags, attributes, processing instructions, external entities and cdata blocks. Furthermore you can apply filters so you are able to count only the tags in a specific depth or only the attributes of a specific tag.

Example

Example -- Example for the usage of XML_Statistics

XML_Statistics::apiVersion()

XML_Statistics::apiVersion() -- return API version

Description

Returns API version of XML_Statistics.

Return value

string API version

Note

This function can be called statically.

XML_Statistics::analyzeFile()

XML_Statistics::analyzeFile() -- Analyze an XML file

Description

Analyzes an XML document by reading from a file. You have to analyze a document before you can extract any statistical information.

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

XML_Statistics::analyzeString()

XML_Statistics::analyzeString() -- Analyze an XML string

Description

Analyzes an XML document directly from a string. This can be useful if your documents are created on the fly by any other application. You have to analyze a document before you can extract any statistical information.

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function can not be called statically.

XML_Statistics::countTag()

XML_Statistics::countTag() -- count the occurences of a tag

Description

Counts how often a certain tag is used in the document. If no tagname is specified ot will count the total number of tags.

Parameter

  • string $tagname - name of the tag to count

Return value

integer occurences of the tag

Note

This function can not be called statically.

XML_Statistics::countTagsInDepth()

XML_Statistics::countTagsInDepth() -- count the tags in a certain depth

Description

Thru nesting a tag can be at a certain depth. The root tag is at depth zero. By counting the amount of tags in a depth you can count the number of recordsets in an XML document.

Parameter

  • integer $depth - tag depth (0 is root)

Return value

integer number of tags in this depth

Note

This function can not be called statically.

XML_Statistics::countPI()

XML_Statistics::countPI() -- count the occurences of a processing instruction

Description

Counts how often a certain processing instruction (e.g. <?PHP) is used in the document. The target is the 'language' of the processing instruction. You only need to specify the name, without the leading question mark. If no target is specified it will count the total number of processing instructions.

Parameter

  • string $target - target of the processing instruction

Return value

integer occurences of the processing instruction

Note

This function can not be called statically.

XML_Statistics::countExternalEntity()

XML_Statistics::countExternalEntity() -- count the occurences of an external entitity

Description

Counts how often a certain external is used in the document. If no name is specified ot will count the total number of external entities.

Parameter

  • string $name - name of the external entity, without '&' and ';'

Return value

integer occurences of the external entity

Note

This function can not be called statically.

XML_Statistics::getMaxDepth()

XML_Statistics::getMaxDepth() -- get the maximum nesting level

Description

The nesting level of a document tells you the maximum depth of the tags in the document.

Parameter

This method does not accept any parameters.

Return value

integer maximum nesting level.

Note

This function can not be called statically.

XML_Statistics::countAttribute()

XML_Statistics::countAttribute() -- count the occurences of an attribute

Description

Counts how often a certain attribute is used in the document. If no attribute is specified ot will count the total number of tags.

With the second parameter you may limit the search to a special tag.

Parameter

  • string $attribute - if no attribute name is supplied, all attributes are counted

  • string $tagname - this allows you to limit your search to a tag

Return value

integer occurences of the attribute or a PEAR_Error if the attribute could not be found.

Note

This function can not be called statically.

XML_Statistics::countDataChunks()

XML_Statistics::countDataChunks() -- count the occurences of a data blocks

Description

This is influenced by the 'ignoreWhitespace' option. Furthermore a new chunk is counted when the parser find a linebreak or internal entity.

Parameter

This method does not accept any parameters.

Return value

integer number of data chunks in the document

Note

This function can not be called statically.

XML_Statistics::getCDataLength()

XML_Statistics::getCDataLength() -- get the combined length of all CData sections

Description

If you need to know how many chars you have between your tags, this is the method that gets it.

Parameter

This method does not accept any parameters.

Return value

integer total length of all CData blocks in the XML document

Note

This function can not be called statically.


XML_Transformer

XML Transformations in PHP.

Introduction

Introduction -- Introduction to XML_Transformer

Introduction to XML_Transformer

With the XML Transformer class one can easily bind PHP functionality to XML tags, thus transforming the input XML tree into an output XML tree without the need for XSLT. Single XML elements can be overloaded with PHP functions, methods and static method calls, XML namespaces can be registered to be handled by PHP classes.

XML_Transformer::XML_Transformer

XML_Transformer::XML_Transformer -- 

Description

Constructor of the XML_Transformer class. It can be passed an associative array that may have the following keys:

  • caseFolding: If TRUE, XML attribute and element names will be case-folded.

    caseFoldingTo: May be either CASE_UPPER or CASE_LOWER and sets the target case for the case-folding.

    debug: May be either TRUE or FALSE, thus enabling or disabling complete debugging information. May also be an array containing the names of elements to which the generated debugging information shall be limited. The special keywords "&CDATA" and "&RECURSE" may be used to enable debugging information for CDATA and recursion events.

    recursiveOperation: If TRUE, the transformation will continue recursively until the XML contains no more overloaded elements. Can be overrided on a per-element basis.

    overloadedElements: Associative array with pre-defined set of overloaded elements.

    overloadedNamespaces: Associative array with pre-defined set of overloaded elements.

XML_Transformer::overloadElement

XML_Transformer::overloadElement -- 

Description

Overloads an XML element and binds its opening and closing tags to a PHP callback. A PHP callback can be one of the following:

  • A PHP Function.

  • A PHP Method on an object.

  • A static PHP Method.

The optional fourth parameter can be used to override the global setting for recursive operation.

XML_Transformer::overloadNamespace

XML_Transformer::overloadNamespace -- 

Description

Overloads an XML Namespace and binds all its elements to a PHP object, that must provide startElement($element, $attributes)() and endElement($element, $cdata)() methods.

If the PHP object provides a initObserver($namespacePrefix, $transformer)() method it is automatically called with the registered namespace prefix and a reference to the XML_Transformer object.

XML_Transformer::isOverloadedElement

XML_Transformer::isOverloadedElement -- 

Description

Returns TRUE if the given element is overloaded, FALSE otherwise.

XML_Transformer::isOverloadedNamespace

XML_Transformer::isOverloadedNamespace -- 

Description

Returns TRUE if the given namespace is overloaded, FALSE otherwise.

XML_Transformer::unOverloadElement

XML_Transformer::unOverloadElement -- 

Description

Reverts overloading of the given element.

XML_Transformer::unOverloadNamespace

XML_Transformer::unOverloadNamespace -- 

Description

Reverts overloading of the given namespace.

XML_Transformer::start

XML_Transformer::start -- 

Description

Starts the transformation, if it has not yet been started, for instance by the constructor.

XML_Transformer::transform

XML_Transformer::transform -- 

Description

Transforms a given XML string.

XML_Transformer::setCaseFolding

XML_Transformer::setCaseFolding -- 

Description

Sets the XML parser's case-folding option.

XML_Transformer::setDebug

XML_Transformer::setDebug -- 

Description

Enables or disables debugging to error.log.

The parameter may be either TRUE or FALSE, thus enabling or disabling complete debugging information. May also be an array containing the names of elements to which the generated debugging information shall be limited. The special keywords "&CDATA" and "&RECURSE" may be used to enable debugging information for CDATA and recursion events.

XML_Transformer::setDebug

XML_Transformer::setDebug -- 

Description

Enables or disables the recursive operation.

XML_Transformer::stackdump

XML_Transformer::stackdump -- 

Description

Returns a stack dump as a debugging aid.

XML_Transformer::attributesToString

XML_Transformer::attributesToString -- 

Description

Returns string representation of attributes array.

XML_Transformer::canonicalize

XML_Transformer::canonicalize -- 

Description

Canonicalizes XML attribute arrays and element names.


XML_Tree

Table of Contents
XML_Tree::XML_Tree -- Constructor
XML_Tree::&addRoot -- add root node
XML_Tree::&insertChild -- inserts a child/tree
XML_Tree::&removeChild -- remove child from tree
XML_Tree::&getTreeFromFile -- map XML file to tree
XML_Tree::clone -- copy tree
XML_Tree::dump -- print XML tree.
XML_Tree::&get -- get XML tree.
XML_Tree::&getName -- get namespace.
XML_Tree::registerName -- register namespace.

Build XML documents using a tree representation

The XML_Tree package allows one to build XML data structures using a tree representation, without the need for an extension like DOMXML.

XML_Tree::XML_Tree

XML_Tree::XML_Tree -- Constructor

Description

Constructor

Parameter

  • string $filename - name of the file to parse

  • string $version - XML version to use

Note

This function can not be called statically.

XML_Tree::&addRoot

XML_Tree::&addRoot -- add root node

Description

Adds a new root node to the XML datastructure.

Parameter

  • string $name - name of root element

  • string $content - data between the opening and closing tag

  • array $attributes - additional attributes for the tag. The attribute name is represented as the array key and the attribute value as entry for the key.

Return value

object XML_Tree_Node - reference to root node

Note

This function can not be called statically.

XML_Tree::&insertChild

XML_Tree::&insertChild -- inserts a child/tree

Description

Inserts a child or tree into the tree in the path $path on position $pos and maintains namespace integrity

Parameter

  • array $path - path to parent of child to insert

  • integer $pos - position of child to be inserted in its parent's children-list

  • mixed $child - child-node (by XML_Tree, XML_Node or Name)

  • string $content - content (text) for new node

  • array $attributes - attribute-hash for new node

Return value

object XML_Tree_Node - inserted child (node)

Note

This function can not be called statically.

XML_Tree::&removeChild

XML_Tree::&removeChild -- remove child from tree

Description

Removes a child ($path,$pos) from tree and maintains namespace integrity

Parameter

  • array $path - path to parent of child to remove

  • integer $pos - position of child in parents children-list

Return value

object XML_Tree_Node - parent whichs child was removed

Note

This function can not be called statically.

XML_Tree::&getTreeFromFile

XML_Tree::&getTreeFromFile -- map XML file to tree

Description

Maps a XML file to an object tree

Return value

object XML_Tree - the object tree

Note

This function can not be called statically.

XML_Tree::clone

XML_Tree::clone -- copy tree

Description

Get a copy of this tree instance.

Return value

object XML_Tree - the copied object

Note

This function can not be called statically.

XML_Tree::dump

XML_Tree::dump -- print XML tree.

Description

Print text representation of XML tree.

Note

This function can not be called statically.

XML_Tree::&get

XML_Tree::&get -- get XML tree.

Description

Get text representation of XML tree.

Return value

string - XML document

Note

This function can not be called statically.

XML_Tree::&getName

XML_Tree::&getName -- get namespace.

Description

Get the current namespace.

Parameter

  • string $name - namespace

Return value

string - namespace

Note

This function can not be called statically.

XML_Tree::registerName

XML_Tree::registerName -- register namespace.

Description

Registers a namespace.

Parameter

  • string $name - namespace

  • string $path - path

Note

This function can not be called statically.


XML_Util

Table of Contents
Introduction -- Introduction to XML_Util
Example -- Example for the usage of XML_Util
XML_Util::apiVersion() -- return API version
XML_Util::attributesToString() -- create XML attribute string
XML_Util::collapseEmptyTags() -- collapse empty XML tags in a string
XML_Util::createTag() -- create a tag
XML_Util::createTagFromArray() -- create a tag from an array
XML_Util::createStartElement() -- create a start element
XML_Util::createEndElement() -- create an end element
XML_Util::createCDataSection() -- create a CData section
XML_Util::createComment() -- create an XML comment
XML_Util::getDocTypeDeclaration() -- build a document type declaration
XML_Util::getXMLDeclaration() -- build an xml declaration
XML_Util::isValidName() -- verify an XML name
XML_Util::replaceEntities() -- replace XML entities
XML_Util::reverseEntities() -- replace XML entities
XML_Util::splitQualifiedName() -- split qualified name

Collection of often needed methods that help you creating XML documents.

Introduction

Introduction -- Introduction to XML_Util

Introduction to XML_Util

XML_Util is a utility class that helps you working with (and especially creating) XML documents.

All methods of XML_Util can be called statically, that means you do not have to instantiate an XML_Util object to use the provided methods.

The funcionality of XML_Util ranges from validating an XML tag name (as there are strict rules for tag and attribute names) to the creation of namespaced XML tags.

Example

Example -- Example for the usage of XML_Util

XML_Util::apiVersion()

XML_Util::apiVersion() -- return API version

Description

Returns API version of XML_Util.

Return value

string API version

Note

This function should be called statically.

XML_Util::attributesToString()

XML_Util::attributesToString() -- create XML attribute string

Description

create string representation of an attribute list

Parameter

  • array $attributes - assoc array containg attributes

  • boolean $sort - whether to sort the attributes alphabetically

  • boolean $multiline - whether to display the attributes on more than one line (makes it easier to read)

  • string $indent - indentation characters, only used when multiline is set to TRUE

  • string $linebreak - linebreak character, only used when multiline is set to TRUE

  • integer $entities - define, which entities should be replaced in the attribute values. One of XML_UTIL_ENTITIES_NONE, XML_UTIL_ENTITIES_XML, XML_UTIL_ENTITIES_XML_REQUIRED or XML_UTIL_ENTITIES_HTML

Return value

string string representation of the attributes

Note

This function should be called statically.

XML_Util::collapseEmptyTags()

XML_Util::collapseEmptyTags() -- collapse empty XML tags in a string

Description

This method collapses empty tags like <foo></foo> with the short version <foo/> by applying a regular expression. This is especially helpful when dealing with XHTML-documents, as there is an important difference in rendering these tags in the browser.

This method has been added in XML_Util 1.1.0.

Parameter

  • string $string - string, in which empty tags should be collapsed

  • integer $mode - collapse all empty tags (XML_UTIL_COLLAPSE_ALL) or only XHTML tags (XML_UTIL_COLLAPSE_XHTML_ONLY).

Return value

string string with collapsed empty tags

Note

This function should be called statically.

XML_Util::createTag()

XML_Util::createTag() -- create a tag

Description

create a tag with attributes, namespace and adds 'xmlns' if needed.

Parameter

  • string $qname - qualified tag name

  • array $attributes - assoc array with attributes

  • string $content - string content of the tag

  • string $namespaceUri - URI of the namespace if xmlns attribute should be added

  • integer $replaceEntities - whether to replace XML entities in content, embedd it in a CData section or leave it untouched. Possible values are FALSE, XML_UTIL_REPLACE_ENTITIES or XML_UTIL_CDATA_SECTION.

Return value

string xml tag

Note

This function should be called statically.

XML_Util::createTagFromArray()

XML_Util::createTagFromArray() -- create a tag from an array

Description

create a tag from an array. This is similar to XML_Util::createTag(), but more flexible.

Parameter

  • array $tag - array containing information about the tag

  • integer $replaceEntities - whether to replace XML entities in content, embedd it in a CData section or leave it untouched. Possible values are FALSE, XML_UTIL_REPLACE_ENTITIES or XML_UTIL_CDATA_SECTION.

Return value

string xml tag

Note

This function should be called statically.

XML_Util::createStartElement()

XML_Util::createStartElement() -- create a start element

Description

create a start element with attributes, namespace and adds 'xmlns' if needed. (<pear foo="bar">)

Parameter

  • string $qname - qualified tag name

  • array $attributes - assoc array with attributes

  • string $namespaceUri - URI of the namespace if xmlns attribute should be added

Return value

string opening xml tag

Note

This function should be called statically.

XML_Util::createEndElement()

XML_Util::createEndElement() -- create an end element

Description

create an end element (</foo>)

Parameter

  • string $qname - qualified tag name

Return value

string closing xml tag

Note

This function should be called statically.

XML_Util::createCDataSection()

XML_Util::createCDataSection() -- create a CData section

Description

Creates a CData section, by embedding the data in <!CDATA[ and ]]>. If you use a CData section inside an XML document, entities do not have to be replaced in this sections.

Parameter

  • string $data - data for the CData section.

Return value

string CData section

Note

This function should be called statically.

XML_Util::createComment()

XML_Util::createComment() -- create an XML comment

Description

Creates an XML comment, by embedding the supplied data in <!-- and -->.

Parameter

  • string $data - data for the comment.

Return value

string comment

Note

This function should be called statically.

XML_Util::getDocTypeDeclaration()

XML_Util::getDocTypeDeclaration() -- build a document type declaration

Description

Returns a document type declaration based on parameters.

Parameter

  • string $root - root tag

  • mixed $uri - URI of the document type definition or array containing the public id and the URI of the DTD

  • mixed $internalDtd - internal definitions

Return value

string document type declaration

Note

This function should be called statically.

XML_Util::getXMLDeclaration()

XML_Util::getXMLDeclaration() -- build an xml declaration

Description

Returns an XML declaration based on parameters.

Parameter

  • string $version - XML version

  • string $encoding - XML encoding

  • boolean $standalone - whether document is standalone

Return value

string XML declaration

Note

This function should be called statically.

XML_Util::isValidName()

XML_Util::isValidName() -- verify an XML name

Description

Checks, whether a string is a valid XML name. In XML the names of tags and attributes must follow strict rules. This method can be used to validate the names you are using.

Parameter

  • string $string - string to be checked

Return value

Returns TRUE on success, PEAR_Error on failure.

Note

This function should be called statically.

XML_Util::replaceEntities()

XML_Util::replaceEntities() -- replace XML entities

Description

In XML documents you are not allowed to use & and <. The have to be replaced with their respective entities. This method does this for you and furthermore replaces all other predefined XML entities.

Parameter

  • string $string - string, in which entities have to be replaced

Return value

string string with entities replaced

Note

This function should be called statically.

XML_Util::reverseEntities()

XML_Util::reverseEntities() -- replace XML entities

Description

This is the reverse function to XML_Util::replaceEntities()(). It replaces all XML (or HTML) entities in a string by their corresponding characters. This can be useful when working with XML documents without using an XML parser.

This method has been added in XML_Util 1.0.0.

Parameter

  • string $string - string, in which entities have to be removed

Return value

string string with entities removed

Note

This function should be called statically.

XML_Util::splitQualifiedName()

XML_Util::splitQualifiedName() -- split qualified name

Description

Splits a qualified name and returns array with namespace and local part.

Parameter

  • string $qname - qualified tag name (e.g. xsl:stylsheet)

  • string $defaultNs - default namespace, will be used in return value, if qualified name contains only a local part

Return value

array assoc array containing namespace and local part of the tag

Note

This function should be called statically.