What is Kohana?

Kohana is a PHP5 framework that uses the Model View Controller architectural pattern. It aims to  be secure, lightweight, and easy to use. 

Features
1. Strict PHP5 OOP. Offers many benefits: visibility protection, automatic class loading,  overloading, interfaces, abstracts, singletons, etc. 2. Community, not company, driven. Kohana is driven by community discussion, ideas, and  code. Kohana developers are from all around the world, each with their own talents. This  allows a rapid and flexible development cycle that can respond to new bugs and requests  within hours. 3. GET, POST, COOKIE, and SESSION arrays all work as expected. Kohana does not  limit your access to global data, but provides XSS filtering and sanity checking of all global  data. 4. Cascading resources, modules, and inheritance. Controllers, models, libraries, helpers,  and views can be loaded from any location within your system, application, or module paths.  Configuration options are inherited and can by dynamically overwritten by each application. 5. No namespace conflicts. Class suffixes and prefixes are used to prevent namespace  conflicts. 6. Auto­loading of classes. All classes in Kohana are automatically loaded by the framework,  and never have to be manually included. 7. API consistency. Classes that require access to different protocols use “drivers” to keep the  the visible API completely consistent, even when the back­end changes. 8. Powerful event handler. Kohana events can transparently be: added, replaced, or even  removed completely.

Goals
To be secure means to use best practices regarding security, at all times: 
• •

Kohana comes with built­in XSS protection, and can also use HTMLPurfier as an XSS filter. All data inserted into the database is escaped using database­specific functions, like  mysql_real_escape_string, to protect against SQL injection attacks. magic quotes are  disabled by Kohana. All POST, GET, and COOKIE data is sanitized to prevent malicious behavior. Kohana uses convention over configuration as much as possible. Sane defaults and highly optimized environment detection routines allow Kohana to run in  almost any PHP5 environment.   Loose coupling   is used to always load the minimum number of files, reducing resource  usage. A clean API and using native functions whenever possible makes Kohana one of the fastest  PHP5 frameworks available.

To be lightweight means to provide the highest amount of flexibility in the most efficient manner: 
• • • •

To be easy to use means to provide understandable API and usage documentation, based on 

community feedback. 

MVC
Kohana uses the Model View Controller architectural pattern. This keeps application logic separate  from the presentation and allows for cleaner and easier to work with code.  In Kohana this means: 
• • •

A Model represents a data structure, usually this is a table in a database. A View contains presentation code such as HTML, CSS and JavaScript. A Controller contains the page logic to tie everything together and generate the page the  user sees.

Features
• • • • • • •

Highly secure Extremely lightweight Short learning curve Uses the MVC pattern 100% UTF­8 compatible Loosely coupled architecture Extremely easy to extend

Technology
• • • • •

Strict PHP5 OOP Simple database abstraction using SQL helpers Multiple session drivers (native, database, and cookie) Powerful event handler allows small modifications dynamically Originally based on CodeIgniter

Credits
Most of the Kohana source code is written by the Kohana Team. There are a few notable credits,  however. 

CodeIgniter
Kohana was originally a fork of CodeIgniter (CI), which is an open­source product of EllisLab.  There are still many similarities between CI and Kohana, particularly in naming conventions and  filesystem design, but all of the code is either new or completely rewritten.  CodeIgniter is © 2006 EllisLab, Inc. 

phputf8
All of the Kohana UTF­8 functions are ported from the phputf8 project. 

phputf8 is © 2005 Harry Fuecks. 

Popoon
The default XSS filter used by Kohana was originally created by Christian Stocker for the popoon  framework. The original file is called externalinput.php.  popoon is © 2001­2006 Bitflux GmbH 

HTML Purifier
The alternative XSS filter used by Kohana is HTML Purifier. This is an optional download.  HTML Purifier is © 2006­2007 Edward Z. Yang 

SwiftMailer
The recommended way to send emails in Kohana is using SwiftMailer. This is an optional  download.  SwiftMailer is © Chris Corbyn 

PHP Markdown
Markdown is a simple text­to­HTML formatting tool. Kohana includes PHP Markdown as an  optional download.  PHP Markdown is © 2006 Michel Fortin  Those who cannot remember the past are condemned to repeat it. George Santayana 

History
The history of Kohana is told backwards, because we are looking forward. 

Kohana 2.1.x
• •

February 7, 2008 ­ Release of Kohana 2.1.1 February 5, 2008 ­ Release of Kohana 2.1

Kohana 2.0
November 2007  Kohana version 2.0 is released. PHP5 based. New fully OOP framework, no legacy code, includes  modules, built on the cascading resources concept. 

The Good Old Days
September ­ October 2007 

We get a BDFL. Almost total rewrite undertaken by  developers. . Server with Unicode support 2. Kohana is known to work with: Apache 1.0. There are a few minimum  server requirements:  1. Trac.  Our initial happiness.0+. There are  database drivers for MySQL and PostgreSQL. if you wish to use a database with Kohana. PHP version >= 5.   PCRE   must be compiled with –enable-utf8 and –enable-unicode-properties for UTF­8 functions to work properly.  A new Name.3+. lighttpd. a community fork of CodeIgniter is released. (All three of them)  The Worst of Times August 2007. decision to go PHP5 only. without documentation.  Kohana 1. new goals. Apache 2. An HTTP server.0 June ­ July 2007 Kohana is re­released as version 1. and  MS IIS Optionally. not much happens.  Basic Requirements Kohana will run in almost any environment with minimal configuration. The fork splits. and later unhappiness.  Lots of ideas and discussions on the way forward. Our Project leader goes walkabout. new life.1.3 3.  In The Beginning BlueFlame.  Reactions and responses. with CI.  Required Extensions 1. you will need a database server. with addition drivers planned. forum.  May 31 2007 BlueFlame announced  Before The Beginning Up until May 2007  The founding members of Kohana are from the Codeigniter community.  Kohana June 2007.

  mbstring   will dramatically speed up Kohana's UTF­8 functions. If you're new to  Kohana you should first read all articles in the user guide under the 'General' section. 7. 3. Chmod to 666. 1) SPL Recommended Extensions 1. 3. your Kohana installation is complete!  Removing index. 2.2.php in each URL this is possible.  After installation After installation you're ready to build your first web application with Kohana. Test your installation by opening the URL you set as the base_url in your favorite  browser If you see the Welcome page.php from URL's If you want really clean URL's and therefore remove the index. you can copy over system/config/database. note that the  mbstring extension must not be overloading PHP's native string functions! Install Kohana Kohana is installed in several easy steps:  1.     is required for several core libraries. please read  the Troubleshooting page of the user guide.   mcrypt   is required for encryption. Make the application/logs directory writeable. For example if you want to  configure a database connection. This should create a kohana directory. Make the application/cache directory writeable if you use the cache library.php 5.php for Apache webserver   Additional Configuration You can provide your installation with additional configuration by copying files from the system/ config directory to the application/config directory. Chmod  to 666.php to  application/config/database. 4.php and edit the database connection details. 4.  .   Download   a copy of Kohana.   iconv   is required for UTF­8 transliteration. or ask for assistance in the  community forums. Unzip the package you downloaded. placing index.  Experiencing Problems? If you were not able to view the Kohana Welcome page on your server after installing.  •   Tutorial ­ Remove index. However. Upload the Kohana files to your webserver. Edit the global configuration file application/config/config. 6.php in the directory that you  would like Kohana accessible from. visit the Kohana Wiki.

php in the webroot.   Download   a copy of Kohana. A  correctly configured server will not allow public access to files or directories above webroot in the  directory tree. This  allows for easy upgrades.  It is considered a good security practice to move application. You can now point all of your applications to this one system folder for easy upgrades. system and modules out of  the webroot. This  makes your life a whole lot easier when you have 10+ kohana sites on your server. or your webserver is  compromised. Put the system folder somewhere on your server.  Upgrading • •   2. Simply refer to the same system in the $kohana_system in application  A. simply follow these steps.0 to 2. should PHP be disabled. So you can use the same system for multiple applications. such as stylesheet.2     2.php file. Set the variable $kohana_application to the application directory you're using (must  contain config/config.php file in an editor 3.  For Experienced Users To use a multi­site Kohana install.  In a few steps this can be accomplished  1. Set the variable $kohana_system to the system directory you're using Note that moving the system directory out of webroot.1   Basic Instructions These instructions assume that you have not edited your system folder in any way. 3. For your application's index. Open index.php file) 4. to prevent potential public access. If you have then  . 4. Delete the system folder in your current application. please report it. are typically placed within  webroot. 2. Static content. 5.php in 2. also makes it more easily accessible by  multiple Kohana applications. If you have found a bug. and all other files outside  of it. image and javascript files.1 to 2.  1. Kohana enables you to place the index.[moveTo: Troubleshooting] The Kohana Team tries to make sure that Kohana is as free from bugs as  possible. Moving system and application directory out of webroot 'webroot' is defined as the top level directory to which a webserver will allow public access. B etc. change the $kohana_system variable to the  relative or absolute path of where you put the system folder. preferably outside of your webserver's  document root. Move the directories out of the webroot but leave index.

Delete the contents of your system folder.php' and your application  'config. You must now manually instance the  libraries you want to use.php: • name should only contain alphanumeric characters with at least one letter.php has been removed.0 to 2. 3.  Install the new 'index.1 Upgrading There are a number of changes to the main 'index. The '$kohana_system' should  point to the new versioned system folder. e. Call the backups file_name_version.0. You can then simply revert to a previous version if there are  any issues.php' files.php' and 'application/config. The Pagination create_links() method has been renamed to render() 2. Follow the instructions from the relevant pages for your upgrade in the list above.of. • include_paths has been renamed to modules. Changes to config/database.php: . Replace it with the system folder from the version you wish to upgrade to.  Configuration • • • Changes to config/config. 2.Kohana.php' system  file.php' file.  You could consider naming your system folder with the version number: 'system_2.2 Upgrading Configuration • preload in config.you will need to apply your changes again after upgrading if you use this method.g.php: • display_errors has been added. • autoload has been renamed to preload. • output_compression has been added.  This method is more reliable than making incremental changes to existing files based on a list ­ and  you can simple swap back to the old version if things go wrong. 2.  Then continue with the changes in other files (if needed) stated below. Changes to config/session.1.php_2. • gc_probability has been added.1' rather  than copying the new one over the top.  1. and update any values  in them to reflect the changes you made in your original files.1 to 2. and $example = new Example_Model(). The quickest way to upgrade is make a backup of your 'index. index. Libraries and models must now be created using the  following syntax: $example = new Example(). Libraries • • Loader library has been removed.php' file and the 'config.

freenode. md5. Check the Kohana log files. of course). $key.php from the URL in html helpers now defaults to false. $type) has changed to join($table.• show_errors has been removed.g. Post your problem in the Kohana Forum (after having searched first. Validation • • trim. $type).  • • • • See what you're doing. Validation rule 'regex' must now specify the delimiter. Drop in at #kohana on irc. Deprecated stuff • • • Use http_build_query() instead of html::query_string(). Kohana makes this one easy: • Throw variables at Kohana::debug(). Eliminate possible causes of the bug. Use $this→pagination→sql_offset instead of  $this→pagination→sql_offset(). $query→num_rows() has been removed. • Turn on the Profiler to see global variables and the executed queries. sha1 Validation rules must now be preceded by = (e. $value.net Can't figure things out on your own?  • • Deploying Kohana to Production: Here are a few items you should keep in mind before deploying your Kohana application to a  . Database • • join($table. '=trim'). The parameter to add index. If your using MySQL turning on query logging will help you understand what queries  Kohana is running on your database. Helpers • • Helpers must be renamed from helper_name to helper_name_Core if they need to  be extended. Troubleshooting Programming is art? So is debugging! A few tips to keep your code bug free and how Kohana can  help. it  needs to be specified as TRUE if you require it. $cond. Use count(query) instead. Use $this→pagination→sql_limit instead of  $this→pagination→sql_limit(). Isolate the problem.

 but can slow down your application.  Although this is an optional step and not required by Kohana.php (if enabled in $config['modules']) modules/forge/controllers/forge_demo.php ­ set your $config['domain'] system/config/session.production environment.php to be sure.php ­ set your $config['_default'] to your default  controller system/config/encryption. Higher threshold levels will log less  critical notices and information. Since  most web hosts give you access to at least one level above the web server document root. This sets  your log threshold to a suitable level for production.php ­ set or verify $config['driver']. this should  .php ­ change the default $config['key'] modules/auth/config/auth. You can still check error messages in your log file. Move Kohana core directories outside of the document root If your host does not allow this structure.php ­ set your $config['threshold'] = 1.  system/config/routes. Modify your configuration files Kohana provides various default configuration files in the system/config directory.  1. set $config['display_errors'] = FALSE. you have the option to either utilize the default  configuration file versions or override these files with your own custom versions by creating a copy  in the application/config directory. $config['expiration'] system/config/database.php (if enabled in  $config['modules']) 2.htaccess file to protect the core directories.  $config['name'].php application/controllers/welcome. Since  Kohana utilizes a cascading file system. You should always try to create custom versions of the following files:  • • • • • You should also consider creating custom versions of the following files:  • • 3. Remove the various demo and example controllers Kohana bundles a various demos and example controllers to help users when getting started.php ­ change the default salt offsets in  $config['salt_pattern'] (if you use the Auth module) system/config/cookie.php ­ configure your custom database connections (if  required) system/config/log. $config['encryption'].php:  • • change $config['site_domain'] from your development setting to the production  domain. it is considered a good security  practice to place as few files as possible in your public web server document root directory. Check your settings in  config/log.. Here  are a few that should be removed:  • • • • application/controllers/examples.  Modify your application/config. use an .php (if it is not used) modules/auth/controllers/auth. to disable error messages from being  displayed.

php from your website URLs look better. . Note: This example assumes one­level above public_html. First.application +. do the following:  1. 2.php file:  • $kohana_application = '.php | ../modules'. You could also create a set of  common modules used across all of your web sites.  Moving your core Kohana directories also gives you the ability to utilize one central Kohana  codebase on your server that can be shared by multiple websites.modules +. • $kohana_modules = '.htaccess document to enable URL rewriting: # Turn on URL rewriting RewriteEngine On # Put your installation directory here: # If your URL is www. • $kohana_system = '.system +.htaccess Removing index.public_html (web server document root) | .  Your final directory structure will look similar to this:  yourdomain_root_directory +. The same goes for this particular task and. and modules directories at least one level  above your document root directory (typically public_html or www)./system'. and can help with SEO. however. move your Kohana system.com/kohana/. as is always the  case. you will need to create a . Let's look at a few to help you decide which is best for your  situation. but can be adapted for other HTTP servers.com/. use /kohana/ RewriteBase / # Do not enable rewriting for files or directories that exist RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # For reuests that are not actual files or directories. application.php From URLs Removing the index. Note: This tutorial only focuses on Apache.example.. each has its own pros and cons.htaccess We should start out by reminding you that in programming and computing there is always more than  one way to accomplish the same job. ./application'.  To accomplish this in Kohana.not be a problem. you can use relative or  absolute directories when specifying directory locations.example. modify the following lines in your index. use / # If your URL is www..index..

kohanaphp.# Rewrite to index.com/installation to learn how to move system/ and application/ out of  your document root.php/access_denied/$1 [PT.php/URL RewriteRule ^(. continue on in this tutorial for other options.  So someone could enter.example. Ideally. a Kohana error page (ex:  404) is displayed.example.php/access_denied/URL RewriteRule ^(.php/URL RewriteRule ^(. use /kohana/ # If your URL is www.example.com/. but you get consistency in your error  pages site wide.L]   controllers/access_denied. Any files and directories that exist under  your document root will be served.com/kohana/. the page is served.L]   This example is quite dynamic in that you can add files and directories to your document root as you  desire and you'll never need to modify the rewrite rules. If you find that you do not have proper access on your server to change your  file system setup. this approach does not protect your more sensitive an unintended PHP files against access.L] # Do not enable rewriting for other files that exist RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # Rewrite to index. for example.php/access_denied/. we will need a  Controller to handle these URLs. you should never have your system or application  directories.  Read "Moving system and application directory out of webroot" at  http://doc.htaccess Let's protect against direct access to these files: # Turn on URL rewriting RewriteEngine On # Put your installation directory here: # If your URL is www. But some servers  are setup such that your access to the server is restricted to document root and you have no choice.php Because we are rewriting the URL to index. However.php/$1 [PT. the request is rewritten to be routed through  index. If a request is made for a non­existant file or directory (which is  really what the index. If it can be routed by Kohana.*)$ index. http://www. under your document root. use / RewriteBase /kohana/ # Protect application and system files from being viewed RewriteCond $1 ^(application|system) # Rewrite to index.php/$1 [PT. So you not only have dynamic rewrite rules.php­less Kohana URLs are). Let's create one now: .php transparently. .com/application/views/ and get a list of all your view files. if it wasn't a  request for an existing file or directory and could not be routed by Kohana. Finally.*)$ index.*)$ index. or any other files you do not want accessed.

ico .'</tt>. cannot be accessed directly.com/.  an error page will be displayed.com/kohana/. and prevents  access to protected files. when a user attempts to access any file or directory inside of application/ or system/. js/. } }   Now. // Display an error page throw new Kohana_User_Exception ( 'Direct Access Denied'.example.' ).*)$ index. working solution that keeps index. and rewriting everything else.php (DO NOT FORGET THIS!) . 'You may return to the '.<?php class Access_denied_Controller extends Controller { function _remap() { // Attempted access path.$path. use /kohana/ # If your URL is www.php/access_denied/$1 [PT. with "access_denied/" removed $path = preg_replace('|^access_denied/|'. or css/ directories .html::anchor(''.php our of our URL. .Any file inside of the images/.example. Now we have a good.index.L] # # # # # Allow these directories and files to be displayed directly: . $this->uri->string()).txt . ''. we can still make this more secure.htaccess # Turn on URL rewriting RewriteEngine On # Put your installation directory here: # If your URL is www.robots.php/access_denied/URL RewriteRule ^(. 'home page'). 'The file or directory you are attempting to access.' at any time. <tt>'. '. However.favicon. by only allowing specific  files to be displayed. use / RewriteBase /kohana/ # Protect application and system files from being viewed RewriteCond $1 ^(application|system) # Rewrite to index.

Note: Don't feel like you have to use the most secure solution. Edit application/config/config. delete application folder.x to  application/config 2.ico|images|js| css) # No rewriting RewriteRule ^(.txt|favicon\.x (“Blueflame”) or CodeIgniter 1.L]   Now we are really done. check the Apache  Documentation.php. Migration Users of Kohana version 1. if your old controller was  Page. For example. make it Page_Controller. parent::__construct() instead of parent::Controller() . or any of these solutions. the main configuration files for your  application 3. Each of the examples here will work better for some  situations than others.*)$ index. Copy the application/config directory from Kohana 2.L] # Rewrite all other URLs to index. Choose the  .  specific needs are.php|robots\.*)$ .[PT.  Make your Controller contructors PHP5 if needed:  1.RewriteCond $1 ^(index\.htaccess file that best suits your needs.  Installation Starting with a fresh Kohana install. If you want more information about mod_rewrite.x migrating to Kohana 2.  Class Names Rename all your controllers to {NAME}_Controller.  1. Review the User Guide: Configuration page Logging The logs directory needs to be writable by the webserver or you can turn logging off.php/URL RewriteRule ^(.  Configuration Remove your old config folder. function __construct() instead of function Page() 2. You can change the allowed files and directories to whatever your own.php/$1 [PT. and copy your existing  application folder to the same location.0 can follow  these steps to migrate their application.

Change all your model loads to just model name: $this→load→model('page') 3. For example. 2. Use the PHP5 syntax for the constructor in your base controller URI The CI function uri_to_assoc($offset) becomes segment_array($offset. wrap all the functions in the file in class foo { } 2.  This is not valid for Kohana so if you have copied this line for your own helpers etc you need to  . $associative) with $associative set to TRUE. Example: html::anchor() instead of anchor() Example: url::base instead of base_url() Example: form::open() instead of form_open() The default helpers are available in system/helpers If you have custom helpers they need to be changed. Change references to MY_Controller in your controllers to Controller 3.  Helpers Change all your helper calls to the new syntax: helper::function()  1. Change the MY_Controller extends Controller to Controller extends Controller_Core 2. Note: This also applies to Models! Rename all your models to {NAME}_Model  1. make it Page_Model 2. If you add a __construct() function.  $this→load→ is deprecated. prepend public static in front of all the function names Calls are now made via foo::function(). if your old model was PageModel.php:  1. 3.  Other Class names need to have _Core appended to them and be capitalized. Kohana uses auto loading so you can instantiate an object (e.3.  References to those classes need to be capitalized to match the library calls (without the core).g. be sure to call parent::__construct() Libraries Base Controllers If you have a base controller for your application (in the libraries folder) your will need to:  1. new  View()) without including the class first.  Note also that the CodeIgniter helpers and libraries typically have this line at the top of the script:  <?php if (!defined('BASEPATH')) exit('No direct script access allowed'). 4. Assuming your helper file is foo. The file names should also  have the same caps as the class name (without the core).

  // Load the view and set the $title variable $view = new View('template'.  Views Views are now treated somewhat differently.  Models There is a important note. . // Sets the $username variable in the view $view->username = 'JohnDoe'. $visits. and easier “view­in­view” handling. Note: Using print or echo on a View will cause it to render into a string.change it to the following to work in Kohana:  <?php defined('SYSPATH') or die('No direct access allowed. $value = $uri->segment(3). a View object.  This allows much greater flexibility. // Displays the view $view->render(TRUE). Instead of being “flat” files.This example is the "template" view from above --> <h1><?php echo $title ?> for <?php echo $username ?></h1> <div id="visits"><?php echo $visits ?></div> In the above example. // Sets the $visits variable to another view $view->visits = new View('user/visits'. This is very useful in  Views:  <!-.'). in CI you can use the $this in the model and you have the same libraries  as your controller. This syntax is encouraged  because it is very short and readable when mixed with HTML. // Can not use $this->uri->segment(3) as used in CI // Use the instance of your controller $value = Kohana::instance()->uri->segment(3). // Renders the view to a string $str_view = $view->render(). was used as a string. array('title' => 'User Details')). array('user_id' => 3)). in kohana only the db library is loaded on a model. If you need more libraries you  have two options:  // Create a new object with the library $uri = new Uri. views are now objects.

Reference .

General .

controllers | +.application | +.  Once you have unpacked it you will see this (note: the contents of your modules directory will vary  according to the options you select on the download page):  root +.core | +.helpers | +.Kohana Filesystem File types Strictly from Kohana's interpretation of MVC­Lh (MVC ­ Libraries helpers):  • • • • • Models are used to represent a specific piece of data. either in the  form of an array (e.libraries .controllers | +. which can be used to “hook into” Kohana during very early processes In addition. repetitive tasks. Controllers are used as the “entry point”.modules | +. access the same as config (file..models | +.hooks | +. Kohana adds the following supporting structure:  • • • The Basics First of all you should get acquainted with the directory structure of a default Kohana installation.. such as creating HTML tags. Session.config | +. simple static arrays that are accessed by convention (file. Configuration files.config | +.controllers | +.views | +.media | +. Helpers are used for simple. Views as used as data­to­HTML rendering layers. and handle how a URI is converted into an  application. making a URI  into a URL..config | +.cache | +..logs | +.libraries | +. such as a database row in a specific  table... such as ORM  (database table) or Archive (filesystem).helpers | +. +. or an HTML form. Libraries are used for as a tool that operate on some form of pre­existing data.key) Hooks.helpers | +.g. Input) or some other data structure.libraries | +.key) Language (i18n) files.system | +. Validation.i18n | +. or validating an email address.

 They are hardcoded into the  Kohana startup procedures and will not be overridden by files higher up the include path. the one in system/views will be returned when searched for.  Cascading The Kohana filesystem is made up of a single directory structure that is mirrored in all directories  along what we call the include path.models | +.  See the cascading filesystem in action.  See Modules on how to set these up.  The core files as part of system/core are also not cascading.php You will notice that a lot of the directories in the application and system directories are  exactly the same.  The application and system directories can be thought of as hardcoded modules.  For example.  Modular The Kohana filesystem is also modular.  .vendor | +.  Configuration and i18n Files These files are special as their content entries are merged when multiple files of the same name are  found along the include path. if you have a view file called layout. It will not be read if it  exists within a module or the system directory. The reason for this is that it contains the  modules setting which must be read before all others so the framework knows where the rest of  the config files are along the include path.php is  searched for as it is highest in the include path order. This is because Kohana has a cascading filesystem.php in the application/views and  system/views directories. the one in application will be returned when layout.php MUST reside in the application/config directory.| +.views | +. Entries in files greater up the order still override those of which are in  files lower down. which goes as follows:  application > modules > system Files that are in directories higher up the include path order take precedence over files of the same  name lower down the order.index. This means that custom directories can be inserted along  the include path to be scanned when a file is searched for.  Exceptions There are 2 main exceptions in the filesystem:  config. They are  treated no differently from regular modules apart from the exceptions listed below. If you then delete that file from  application/views.

  models See Models. They are split up into sub­directories using  the country code and locale as the name.  helpers See Helpers.  views See Views.  i18n Language files read by Kohana::lang() are stored here.See Configuration and Internationalization for more information on this. See  Libraries for more information. See Internationalization.  config All configuration files that are read by the Config class must be stored here. the Cache library uses this directory to store its caches when using the File driver.  controllers All controllers to be directed to by the router must go in here.  hooks See Hooks.  libraries See Libraries.  logs By default.  Built in directories cache By default. It  should also be where you store any custom cached data from your application.  .  vendor 3rd party libraries and scripts that are not integrated into Kohana should be stored here. log files generated by the Log class are stored in the application/logs directory.

  Structure of config files Configuration files contain an array named $config. can be removed with URL .extra Kohana resource paths.an extension that will be added to all generated URLs . see <Kohana. cache lifetime and garbage collection.g.php is hardcoded into Kohana. File structure of config files The file structure of config files follows Kohana's file structure.libraries and models to be loaded with the controller Configuration files cache.  Example  $config['site_domain'] = 'localhost/'. Keys of this array are the actual configuration  items e.Configuration Information on retrieving and setting configuration items can be found on the config page.  /* * Options: * site_domain * site_protocol * index_page rewriting * url_suffix * allow_config_set * global_xss_filtering input * render_stats output * extension_prefix * modules * autoload */ . The one exception is config.  config.filename prefix for library extensions . See for more information the Cache  library.find_file> .php Config. meaning it has to be in the application/config directory.name of the front controller.domain and installation directory .  .enable or disable XSS attack filtering on all user .php which is  hardcoded into the application/config directory and cannot be moved elsewhere.render the statistics information in the final page .protocol used to access the site.enable or disable setting of Config items .  application > modules > system Meaning that configuration files in the application directory take precedence over those in modules  take precedence over those in the system directory. usually HTTP .php Sets the cache driver.

 See User Agent  .  log.php Sets upload directory.  profiler.  locale. (See the validation/upload page?)  pagination.  payment.php Sets defaults for cookies. See the Pagination page.php Sets the locale and timezone of an application.  hooks.php Sets database connection settings.php Sets the routes Kohana should use. See Routing  session.  database.php Sets the logging threshold. See the Log page. See Session.php Sets session settings including the session driver. See Hooks page.php Sets available user agents including robots and mobile browsers.php Sets payment settings.php Enable or disable hooks.php Sets pagination settings.  user_agents. Includes _default and _allowed.  upload.  mimes.php Sets the information the profiler should show.cookie. See the database  configuration page.php Sets the available mime­types. See for more information the Cookie helper. Multiple configurations are possbile. See Internationalization page. See the Profiler page.  routes.

$title)  An example of what a controller would look like when this url is used. A typical segmented URL is  http://localhost/control/action/arg1/arg2  The segments correspond (in order ) to a controller.view. Kohana urls contain segments.g.php Allowed file types (deprecated?)  Kohana URLs URLs in Kohana are composed of segments.  Example  class Articles_Controller extends Controller { function __construct(){ parent::__construct().  Example  http://localhost/index. If a non­existing method is set it will try to call _default() or trigger an 404. E. edit($id. } function index() { } function edit($id. $this->load->view('articles/edit').  The third and fourth segment refer to arguments given to the edit() method.php?/articles/edit/1/my-first-article // or the same URL with url rewriting on http://localhost/articles/edit/1/my-first-article When you segmentize this url it becomes  • • • • articles (the controller) edit (the action) 1 (first argument) my­first­article (second argument) This will correspond to the controller articles found for example in  application/controllers/articles.php If no second segment is set it will call the  index() method.php ­ see Controllers for more information  The second segment maps to a method edit in the Articles_Controller class in  application/controllers/articles.$title){ //get the article from the database and edit it echo $id.  . } } Segments As said. a controller method. and the method arguments.

0.php?/articles/edit/1/my-first-article // or the same URL with url rewriting on http://localhost/articles/edit/1/my-first-article The latter looks nicer and is SEO proof.php?/articles/edit/1/my-first-article.  http://localhost/index.246.html     http://forumarchive. See for more information the routing page.php.  The following urls might be of interest when setting up such a system:  • •   http://kohanaphp.Example  http://localhost/articles/edit/1/my-first-article Contains the segments  • • • • articles edit 1 my­first­article A URI class and a URL helper provide methods to make working with a url easier.php file under url_suffix  Allowed characters Some characters are not allowed in urls.com/tutorials/remove_index.  Query strings and GET support Query strings and GET support are enabled in Kohana. and various other operations.html   They offer slightly different solutions but each should work equally good. You can retrieve  segments.  URL rewriting By default.php file. This does not look very nice and also is not optimized  for search engines. Kohana urls contain index. The keys and values are inspected and cleansed by the Input library when  global_xss is on.kohanaphp. You can simply append your urls with ? var=value to pass it on. determine the current url segment. You can set the allowed characters in the  config/routes.  Suffix Kohana allows you to set a suffix to your urls.  .html Setting this can be done in the application/config/config.php/topic.com/index. See the difference between the following urls.  Example  http://localhost/index.

 however.  .  There are cases. It is used to indicate which controller  should be used when a URI contains no segments.example.php will have two entries:  $config['_allowed'] = '-a-z 0-9~%. For example.com/class/function/arg1/arg2 The first segment refers to the controller class.  http://www. you may  want to use URIs like this: www.example. you would see the page at  www. take care not to allow characters in the URI that could compromise your application. the second to a method in that class and any other  segments become that method's arguments.com/welcome. if your Kohana web application were installed at www. For example. $config['_allowed'] determines which characters are allowed in a URI. $config['_default'] specifies the default route. if your web application is at  www.example.com and you  had the following routing rule:  $config['test'] = 'foo/bar'. you can also specify your own routes.com and you visit this address with a web browser.example. a URI will map to a controller class and method on a one­to­one basis and provide  arguments where necessary.  Specifying your own routes In addition to the default route above.  So.Routing Typically.:_'.example. and class/method would replace it.. for example. The result would be the same as if the  browser had gone to www. If it is not already there copy the one from the  system/config directory. the second segment of the  URI is an article number. For example.  $config['_default'] = 'welcome'.example. not a controller method. and you visited www. the welcome controller  would be used even though it wasn't specified in the URI.php in your  application/config directory. When changing  this. where you might want to change this behaviour.com/foo/bar. where route is the URI you want to route.com/test in a web browser.com/article/22.  Kohana's routing configuration In order to alter routing you have to have a copy of routes.example. which is an argument. The basic format for a  routing rule is:  $config['route'] = 'class/method'. Here.  The default routes. The routing feature of  Kohana allows you to change how URIs are mapped to controllers and methods.

 They are:  • • :any matches any non­blank string of characters :num matches any number These can be used in place of the sub­pattern in the regular expression. Note: This is not the same as Kohana autoloading.com/article/22 is routed to  www.example.example.  Examples Loading resources Since Kohana 2.com/news/show/22 had been visited. on every pageload.example.Using regular expressions The route part of a routing rule is actually a regular expression. Kohana's autoloading will load a certain library. In the www. there are also two shortcuts provided. and you can make use of the sub­ pattern back referencing technique to re­use parts of the URI in it's replacement.example.  . which looks much neater. we could have used the following routing rule:  $config['article/(:num)'] = 'news/show/$1'. it is as if the  URL www. you can  be more selective about which URIs will match your routing rules.  This is best described with an example. we might use a routing rule like this:  $config['article/([0-9]+)'] = 'news/show/$1'.1. $this->layout = new View('layout'). If you are unfamiliar with regular  expressions you can read more about them at the PHP website.  Shortcuts In addition to being able to use regular expressions.2 $this→load() is deprecated  Autoloading PHP has functionality to automatically load files if a certain class has not been loaded yet. If the URI takes  this form. Using regular expressions.  Example  $user = new User_Model. we will use the news controller and call it's show() method passing in the article  number as the first argument. etc. you might want to start the Session library on every  page. $cache = new Cache().  model. Kohana  employs this functionality. Suppose we wanted to make the URL  www. so in the previous example  where www. html::stylesheet().com/article/22 work. which would match URIs starting with “article/” followed by some numeric digits.com/news/show/22.example.com/article/22 example. For example.

  . // will load the file views/layouts/layout.  Loading helpers Note: Loading a helper using $this→load→helper() is deprecated. For example loading the session library:  $this->load->library('session'). echo $session->id().  Using a helper is fairly simple. They can be embedded into each other so as to help you in  making your site. More on views can be found on the views page Information on the  view class can be found on the view class page. Just call method as a static method. it won't work and will  trigger a debug error in the log. Loading views Views are the final output of Kohana. more can be found on  the Models page.Loading libraries Libraries can be loaded in general in two different ways. PHP5's nifty auto_load function Loading database Apart from the aforementioned methods loading the database can also be done like this  $this->load->database(). The actual rendering of a view is  not done when you load one.php //alternate syntax $this->layout=$this->load->view('layouts/layout'). echo $this->session->id() // this is the CodeIgniter compatible approach // another possiblity using $session = new Session. Loading models To load a model there is more than one method. //will render the view $this->layout->render(TRUE).g. These are the basic methods. The class will be loaded  automatically  echo url::base(). There is more than one syntax to load a view. Note: in models the database is loaded automatically.  Example  $this->layout=new View('layouts/layout'). // the object can be approached with $this->session e.

g. Preloading resources This functionality is deprecated and will no longer be available in Kohana 2. Use a base controller  instead. the filename would be models/user. For  example database inserts.  Controllers are called by an url.  Controller naming and anatomy A controller's filename can be basically anything.php The loading  of the model happens in the controller. updates and deletes for data change and database selects for information  retrieval. Articles_Controller must have the Controller class as (grand)parent controller methods preceded by '_' (e. e. e. Router and Input. They pass information on  to the model when data needs to be changed and they request information from the model.For instance your model is User_Model.php you can configure which libraries or models should be  automatically loaded on each page load.  $config['preload'] = array ( 'libraries' => 'database. $name = $user->get_user_name($id).g.php controller class must map to filename and capitalized.  Conventions for a controller  • • • • • must reside in a controllers (sub­)directory  controller filename must be lowercase. and must be appended with  _Controller. The name of the controller class must correspond  to the filename.  Note: Some libraries are always loaded automatically: URI. //get_user_name is a method defined in User_Model // alternative syntax $this->load->model('user'). $name = $this->user->get_user_name($id). see for more information Urls for more information. session'.  Controllers Controllers stand in between the models and the views in an application. Example  $user = new User_Model. articles.2. _do_something() ) cannot be called by the URI  mapping . 'models' => 'book' ) Multiple entries should be separated by commas. the views contain the final  output for the users. Controllers pass on the information of the model to the views.g.  In the application/config/config.

php  class Article_Controller extends Controller { public function index() { echo 'Hello World!'. You can see all conventions are applied.php  class Article_Controller extends Controller { public function index() .yoursite.yoursite. your first controller.com/article url. } public function overview() { echo 'Article list goes here!'.  application/controllers/article.yoursite. It would also be called by the following url:  www.  application/controllers/article.  application/controllers/article. } } Now if you call the url www.A simple controller We start with a simple controller.com/article/index  If the second segment of the url is not empty. for example the article with the title being yourarticle-title and the id of the article is 1. the index method is called.yoursite. it determines which method of the controller is called.  The url would look like www.yoursite. It will show Hello World on the screen.com/article/view/your­article­title/1 The last two segments  of the url are passed on to the view() method.com/article/overview it will display  Article list goes here! Controller with arguments Say we want to display a specific article. } } Now if you enter www.php  class Article_Controller extends Controller { public function index() { echo 'Hello World!'. If the second  segment of the url is empty.  More advanced controller In the example above the index() method is called by the www.com/article you should see  Hello World That's it.

 Kohana will include the  subdirectory in the mapping to the controller. and the following url is called http://example.  Special methods index index() is the method that will be called when there is no other method call. E. $title. a file in  application/controllers/admin/user.g. $data ) .  The method is passed two parameters which can be handled as in the example below:  class Article_Controller extends Controller { public function _remap( $method.g. public function overview() { echo 'Article list goes here!'. then all requests to the controller are sent to it.yoursite.{ } echo 'Hello World!'. bypassing  the default URI to method mapping. E.com/article/view/your­article­title/1 it will display  1 .  _remap If you have this method in you controller. } public function view($title. have localhost/about/me map to  http://localhost/articles/view/1  See Routing for more information on this.g. if your controller  is called Welcome_Controller.com/welcome  then the index method is called.your-article-title Controllers and subdirectories If you put a controller in a subdirectory of the /controllers/ directory. // you'd retrieve the article from the database here normally } } When you call www. ' .php will correspond to the url http://localhost/ admin/user  Routing controllers elsewhere If for some reason the mapping from the URI to the controller and method is not right for you you  can use routing to map a URI to another controller.$id) { echo $id .' . E.

com/welcome/sthrandom90923 .  _default _default() is the method called when a method of a controller is called that doesn't exist. E.  You would not use _remap if your URI schema was this simple. } . This is handy if you want to trigger a 404 for example. the method sthrandom90923 doesn't exist so if it exists  _default() will be called.php  class Article_Controller extends Controller { public function index() { echo 'Hello World!'.com/article returns:  method = index  data = none  www.domain.  Private methods Sometimes you want some methods in your controller which should not be available on your  website.g.{ // method is the first part of the uri. http:// example. but this shows how _remap works.domain. // it'll be index if there is no segment following the controller name // or the segment if there is // the $data param is an array of the remaining uri segments (if any) // otherwise it is an empty array } } Examples www.  There is also a tutorial showing the use of _remap.domain.com/article/read returns:  method = read  data = none  www.com/article/read/1 returns:  method = index  data = array( '1' ). This can be done by declaring methods private and/or  prepending them with _  application/controllers/home. They are only used internally.

$article = $this->db->getwhere('articles'. protected $session.private function _article_form() { echo 'Article form'. for example to load some resources for the entire  controller.  Special Controllers Using a base controller for your application Using a base controller for your application can be very helpful.  Class constructors If you declare a constructor in your controller.php  class Article_Controller extends Controller { protected $db. useful for authenticating and authorizing users for example or doing session  magic. } } When you call www. If  you call www. you have to call the parent constructor. public function __construct() { parent::__construct(). } } This example also shows how you can retrieve an article from the database using URL segments.php  <?php class Controller extends Controller_Core { .yoursite. $this->session = new Session. } public function index() { $this->session->get('user_id'). } public function view($article_id) { $article_id = (int) $article_id. it will retrieve the article whose id is 5.  Example MY_Controller. array('id' => $article_id)).  application/controllers/home.com/article/view/5 .yoursite. You can execute code on every  page for example. //this must be included $this->db = new Database.com/article/_article_form you'll encounter a 404.

For example. the first letter must be a upper­case) For a new library.public function __construct() { parent::__construct().  Note: The prefix MY_ can be configured in application/config/config. Alternatively.2.  For more information.. if you wish to load libraries manually.e.1. see the page on Loading. Library class names must be all capitalized (I. Note: using the above “manual” method of loading libraries is deprecated since Kohana 2. // authentication goes here for example } public function do_something() { // method available in all controllers } } The file should be named MY_Controller. you can just add the following line to your controller's constructor:  $this->profiler = new Profiler.  in modules/libraries) Library files must be named the same as the library class (but without any ”_Core” suffix). You might create the  following file:  .  Adding your own libraries When creating your own libraries.php by  changing the $config['extension_prefix']  Libraries The following Kohana libraries are loaded automatically by the framework and should always be  available to you:  • • • Loader URI Input Other libraries can be loaded automatically by Kohana when they are used. the class name can have ”_Core” appended to the end to enable you to  extend it in the same way you can with Kohana's built­in libraries.php It should then be placed in  application/libraries This class has all the methods of the original Controller plus your  own. to load and  use the Profiler library. you can do the following:  $this->load->library('some_library'). these are the conventions that are suggested:  • • • • Library files should be put in application/libraries (or if you're creating a module. lets suppose that you wanted to create a new “book” library. For example.

 You might do the  following:  File: application/libraries/MY_Controller.  Here are some examples of why you might want to extend Kohana's Controller class in particular:  • • • You may wish to implement site­wide page caching. or templating methods to a controller.php  <?php defined('SYSPATH') or die('No direct script access. The class name must be the same as the class name you are extending and must not have  ”_Core” appended to it. Lets say. You should never change the files in  system/libraries. see the  configuration page.  You can also extend your own libraries. so long as you have added ”_Core” to the end of their  class names.php  <?php defined('SYSPATH') or die('No direct script access. such as site­wide behaviour. or change the way they work. for example. These could be  implemented in your extended controller and would be accessible to every controller in the  . class Controller extends Controller_Core { public function __construct() { // don't for get to call the parent constructor! parent::__construct(). this is the preferred way  to achieve it. This prefix is configurable. Instead you can create a new library that extends a built­in library. You may wish to implement an authentication mechanism. You might want to provide layout.  When extending a library. that you want to extend Kohana's controller class.'). } } ?> Extending the core classes is not only allowed in Kohana. If you wish to implement  behaviour that should apply to a kohana class.').File: application/libraries/Book. the conventions are the same as for when you are creating a new library. class Book_Core { // add constructor/methods/properties here } ?> Extending libraries Kohana also allows you to extended it's built­in libraries so that you can add your own functionality  to them. but is expected.  with a couple of exceptions:  • • The filename must be prefixed with ”MY_”.

 Loading them from Kohana is simple. you might do the following:  // example .'vendor/ze nd/library/'). The same behaviour can be achieved by extending the core Controller class  and loading any libraries and models from the constructor.PATH_SEPARATOR. class Profiler_Core { // define your own profiler here } ?> 3rd­party libraries If you should require 3rd­party libraries (such as Simplepie.'). The conventions are the same as when you are adding your own library.  sometimes renaming the file and the class name is all that is necessary. Zend Framework Zend Framework's files may struggle to load it's dependencies which will be loaded incorrectly  without further configuration. or Pear libraries) you  can place these in the application/vendors directory. you can use an  alternative method of loading.php  <?php defined('SYSPATH') or die('No direct script access. with one  exception:  • Appending ”_Core” to the class name is not optional ­ you must do it! If. If so.application. To include a Zend Framework component.  Replacing Kohana's built­in libraries It is also possible (although probably less often required) to replacing one of Kohana's built­in  libraries entirely.ini_get('include_path').APPPATH. for example. The deprecated preload configuration option (which pre­loads libraries and models) has been  replaced by this method. Zend Framework. you want to replace the Profiler library. see the Kohana class page. You might do the following:  $this->load->library('some_lib'). If the zend folder is in applications/vendor/zend the  following code can be used.  Note that some 3rd party libraries can be adjusted to be Kohana libraries without much effort. you might create the following file:  File: application/libraries/Profiler.  You might do the following:  Kohana::find_file('vendors'.  // make sure you put this somewhere before loading a Zend Framework component ini_set('include_path'.'some_class') For more information.

Note that it also can be placed in the SYSPATH folder but it then might be overwritten by a new  version of Kohana. the helper classes are automatically loaded by the framework when they are used. these are the conventions that are suggested:  • • • • Helper files should be put in application/helpers (or if you're creating a module.  Helpers are similar to library methods. In this case use  ini_set('include_path'.SYSPATH. For a new helper. For example.  Adding your own helpers When creating your own helpers. $acl = new Zend_Acl(). but there is a subtle difference.  Here is an example call to a helper:  // show the location of this Kohana installation echo url::base(). suppose that you wanted to create a helper to help with JavaScript.require_once 'Zend/Service/Flickr. Helpers Helpers are simply “handy” functions that help you with development.  so there is no need to load them yourself. As with most of Kohana. // or another example require_once 'Zend/Acl.'vendor/ze nd/library/'). } } . class javascript_Core { public static function alert($message) { return "alert('$message'). Helper class names must be all lowercase.php'.ini_get('include_path'). you might create  the following file:  File: application/helpers/javascript. you can add your own helpers and replace or extend Kohana's built­in  ones. Module folders will do as well. With a library. you have to  create an instance of the library's class to use its methods.php  <?php defined('SYSPATH') or die('No direct script access. Helpers are declared as static methods of  a class. in  modules/helpers) Helper files must be named the same as the helper class (but without any ”_Core” suffix). so there is no need to instantiate the class.PATH_SEPARATOR.php'.  As with libraries.').\n". the class name can have ”_Core” appended to the end to enable you to  extend it in the same way you can with Kohana's built­in helpers. You can think of them as “global functions”.

 except it must have ”MY_”  prefixed to it. you would do the following:  javascript::alert("Oh no!").  Replacing Kohana's built­in helpers It is also possible (although probably less often required) to replacing one of Kohana's built­in  helpers entirely. class html extends html_Core { public static function your_custom_method() { } } ?> Extending the core classes is not only allowed in Kohana.php  <?php defined('SYSPATH') or die('No direct script access. with one  exception:  • Appending ”_Core” to the class name is not optional ­ you must do it! If. class url_Core { // define your own url helper here . lets suppose that you want to extend Kohana's HTML helper. you want to replace the url helper.?> and then to use your helper.'). so long as you have added ”_Core” to the end of their class  names.  When extending a helper. The conventions are the same as when you are adding your own helper.').  You can also extend your own helpers. For example. you might do something like:  File: application/helpers/url. the conventions are the same as for when you are creating a new helper. You should never change the files in system/helpers! Instead. You might do the  following:  File: application/helpers/MY_html. Extending helpers Kohana also allows you to extended its built­in helpers so that you can add your own functionality to  them. This prefix is configurable. see the configuration page. but is expected. you can create a new  helper that extends a built­in helper.  with a couple of exceptions:  • • The filename must be the same as the helper you're extending.php  <?php defined('SYSPATH') or die('No direct script access. The class name must be the same as the class name you are extending and must not have  ”_Core” appended to it. for example.

// Filename list. It is important to note that this simply creates an instance of the  View class.  While this is true.php in sub-directory 'products' $view = new View('products/list'). Views are  executed in the Controller namespace so you have access to all resources you have loaded into  $this→  When this view is rendered it is executed just as any PHP script would and the output from it is  returned (or sent to the browser if you so wish). .} ?> Views See View class for more in depth information on using views in your code.  Overview Views are files that contain the display information for your application.  $view = new View('welcome'). CSS and JavaScript but can be anything you require such as XML or Json for AJAX output. This only happens  when it is rendered. This is most commonly  HTML.  The purpose of views is to keep this information separate from your application logic for easy  reusability and cleaner code.  Examples  // Filename home. Views can be arranged in sub­directories if needed but the path must be specified  when loading them. views themselves can contain code used for displaying the data you pass into  them.php $view = new View('home'). Views are still PHP files so you can use any code you normally would. Loading views There are 3 ways to load a view.  Creating views Views need to be placed in the views directory.  New object Create a new instance of the class. The filename minus the extension becomes the  view's name. at this point the view file has not been read and no output is created. For example. looping through an array of product information and display each one on a new  table row.

?></h1> <p><?php echo $content. $view->content = "My content here.Factory Use the factory() static method. see more examples below Note: You cannot use $view→data = $data.  Let's look at the Controller:  class Welcome_Controller extends Controller { function index() { // Load the view as an object $view = new View('yourview').  $view = $this->load->view('welcome'). . Passing data into your views Data is passed from the controller to the view by way of an an object.2 loader is deprecated. This is essentially the same as creating a new object except it is  immediately returned so method chaining is possible.1.  $view = View::factory('welcome'). $view->heading = "My Heading". The loader method is mainly provided for easier migration  from CodeIgniter. // Adding variables to the object that will be displayed in the view $view->title = "Welcome to Kohana !".?></title> </head> <body> <h1><?php echo $heading.?></p> </body> </html> Note: Use of arrays (CodeIgniter style) is still possible in Kohana. // Render the view $view->render(TRUE). } } Now open your view file and add variables:  <html> <head> <title><?php echo $title.". Using the factory method is preferred over this as it does the exact same  thing but factory is shorter and clearer.  Use the built in loader. Loader Since Kohana 2.

php $view->content->heading = 'Heading of your page'. // string for variable $title in view header. // string for variable $heading in view footer. ?></title> </head> View: content.Views within views To load views within other views:  // Example of code inside your Controller $view = new View('template'). this can merge the header. breadcrumbs and  dynamic content (banners. // string for variable $heading in view content. customized ads) to add a professional touch. You may also need custom helpers to generate navigation.php  <html> <head> <title><?php echo $title. $view->content = new View('content'). ?></h1> View: footer. ?> <?php echo $footer.php $view->footer->copyright = 'Copyright'.  Note: Please also consider using the Template_Controller.php  <?php echo $copyright. ?> <?php echo $content. $view->header = new View('header'). $view->header->title = 'Title of page'. View: template. using stylesheets and applying them to divs within your layout would give the exact  design you want.php  <body> <h1><?php echo $heading. ?> View: header. ?> </body> </html> Output:  <html> <head> <title>Title of page</title> </head> <body> <h1>Heading of your page</h1> Copyright </body> </html> Of course.php and  .php $view->render(TRUE). $view->footer = new View('footer').php  <?php echo $header.

An array of product data is defined.  Examples Ex 1: Render on View instance  $view = new View('sample'). $view->title = 'Products'.footer. $products).  Data scope Rendering Execute the render method on the view instance.php  $products = array( array( 'name' => 'Product1'.php into one file. 'quantity' => '7' ) ). $view->render(TRUE). $view = new View('products/list'). Ex 2: Render on View::factory  View::factory('sample')->render(TRUE). echo '</td><td>' . echo $product['name'].php  <html> <head> <title><?= $title ?></title> </head> <body> <h1><?= $title ?></h1> <table> <?php foreach ($products as $product) { echo '<tr><td>'. Complete Example Controller: products. The view is rendered and outputted straight to the browser. The products list view is loaded and the variables title and  products are set. $view->set('products'. 'quantity' => '3' ).  View: products/list. array( 'name' => 'Product2'. $view->render(TRUE).

 These are:  • • • • Models go into the application/models/ directory. you have a guestbook. The title variable is echo'd. do not have _model appended to them and should be the  singular form of the name. Model filenames are lowercase. echo '</td></tr>'. the  model returns those entries to the controller who passes them on to a view. The products array is iterated over and each product is echo'd  within table row and column tags. there are other. update existing ones or even delete some. you are free to do  so.  Note that Kohana doesn't force you to use models.} ?> </table> </body> </html> echo $product['quantity'].  Naming models Kohana uses specific rules for the naming of models.  Output:  <html> <head> <title>Products</title> </head> <body> <h1>Products</h1> <table> <tr><td>Product1</td><td>3</td></tr> <tr><td>Product2</td><td>7</td></tr> </table> </body> </html> Models What are models? Models are classes designed to work with information given by or asked for by the controller. If you choose not to use them. the controller will ask the model to retrieve the last ten entries. The model class name is capitalized. does have _Model appended to it and should be the  singular form of the name. For  example. conventions. The controller might  also send new entries to the model. The model  . For models that use ORM. Example Suppose that you have a table in the database called users (which is a plural name). more specific.

Usage A model might look something like this:  class User_Model extends Model { . for example. you can add the following to the Template_Controller constructor:  $this->user = new User_Model. User_Model // get_user_name is a method defined in Inheriting If.  For instance. you use the Kohana Template_Controller and need access to your model from all  descendant controllers.1 and will no  longer be supported in Kohana 2. User_Model // get_user_name is a method defined in Deprecated The following alternative method using the Loader library is deprecated in Kohana 2.  // Model name is called without _Model.2. to load the user model (above) from application/models/user.1 $this->load->model('user').that represents the users table would reside in the file application/models/user. class User_Model extends Model { public function __construct() { // load database library into $this->db (can be omitted if not required) parent::__construct(). $name = $this->user->get_user_name($id).php and the class would be called User_Model (which are both singular names).  The file would initially look something like this:  <?php defined('SYSPATH') or die('No direct script access.php add the  following to your controller:  $user = new User_Model. like  this:  $name = $user->get_user_name($id). You can then access the user model from any controller that extends the Template_Controller.'). $name = $user->get_user_name($id). case doesn't matter // Deprecated as of Kohana 2. } } Loading models The generally accepted way of loading a Model in Kohana is to do so within your Controller.

com' ) * @return void */ public function insert_user($data) { $this->db->insert('users'. you can integrate this model into your controller as follows:  1.g. the default database  functionality will be loaded into $this→db.. $data) { $this->db->where('user_id'.. This can be done  . * @param array user data. } /** * Replace user details. TRUE) to ensure data is sanitized before using. 'email' => 'test@example. You can use all of the database's functions with the  $this→db object.g. E. $this->db->update('users'. given their user_id * @param integer the user_id * @return the result object */ public function get_user($user_id) { $this->db->where('user_id'. $data). Assumes an auto incrementing user_id in the database.com' ) * @return void */ public function update_user($user_id.  Using a model in your controller Using the example model above. * @param array user data. Learn more about the Input library. $user_id). $data). Create an instance of the model in your controller to make it accessible. } /** * Get information about a user. return $this->db->get('users'). } } Note: When utilizing data from a form always use $this→input→post('var_name'. E. * array( 'name' => 'test'. } /** * Add a new user. $user_id)..  Using a database in your model If your model's constructor contains the line parent::__construct(). 'email' => 'test@example.public function __construct($id = NULL) { // load database library into $this->db (can be omitted if not required) parent::__construct($id). * array( 'name' => 'test'.

name. The $user variable now contains a database result set  object (for the user with id = 1) that can be passed to your View. A controller object will be created. 2.post_routing Kohana 2. running.  Kohana events consist of a name and callback. you can now retrieve user information from your  database within any of your controller methods with: $user = $this→user→get_user(1). If you passed the entire $user variable to your View. Another aspect of ORM is that it turns a  record from a database into an object. All of the core events are prefixed as system. find_all_by_lastname) commonly used in a  model as well as support for relationships between tables.ready Called immediately after hooks are loaded. If  .  system.  System Events The following events are defined in the Kohana core files. but  are not required to. removing and using custom events. If you want the model  accessible from all of your controller methods. Calls Router::find_uri and Router::setup by default.  system. Based on its name it will derive for example the table it is a model  for.routing Processes the URL and does routing.  Calls Kohana::instance by default. 3.directly in a controller method as $user = new User_Model. Hooks are loaded before this point.  system. See Database Library for more  information. you can access specific user data  elements within your View in the form $user→name. ORM See for more information  •   ORM   ORM is a special kind of model.2 Triggered after all routing is done so interventions in routing can be done here. create an instance of the model in your  controller constructor: $this→user = new User_Model. Names usually include a prefix with the name 1). This is the earliest attachable event.  system. Nothing is attached  to this event by default. If you used the constructor method above.execute Controller locating and initialization.  Events See Event for information on adding. The pre­defined actions for these events  are added in Kohana::setup. it will also have some basic functions (find($id). as an instance of Kohana.

 Kohana::instance will return the  controller at this point.404 Called when a page cannot be found.  system. after the controller constructor has been called.post_controller_constructor Called within system.name Hooks Hooks are basically files included at the start of Kohana.execute.shutdown Last event to run.php  .post_controller Called within system.  system. Runs the Kohana::shutdown method by  default.execute. controllers are  loaded so you can check for for example authentication early in Kohana.  system.php core/Bootstrap.  1) An example of a “prefix” is prefix. and views can be loaded. before any content is displayed. and Session data will not be saved. Views can be loaded.  Hooks Hooks are included early in Kohana and can be used to execute code before e.  system.pre_controller Called within system. Writing  cookies is not possible after this point. and views can be loaded.  system. just before PHP starts to shut down. Events and hooks go hand  in hand since in hooks you can attach code to events. to be more specific they are loaded in the  Kohana::setup() method.g. Controller methods have not been called  yet. so their methods can be used  • • • index. after the controller file is loaded. but headers have already been  sent.  system. but before an object is created. Calls Kohana::show_404 by default.display Displays the output that Kohana has generated.  system. At this time these files are loaded. Kohana::instance will  return the controller at this point.send_headers Called just before the global output buffer is closed.Router::$controller is empty after this event a 404 is triggered.execute. See for more information the Hooks page. after the controller object is created. The rendered output can be manipulated as Event::$data.php core/Benchmark.

display'.Powered by Kohana-->'. Hooks and events The power of hooks mainly comes from the Events class. 'Kohana')). This will add a small notice to the bottom of each page (<!– Powered by Kohana–>).php  core/Config.  Set $config['enable'] to an array with filenames and those and only those files will be  included. For example you load the following file as a hook  Example hooks/power.  Configuring hooks To configure hooks edit 'hooks.• • • • • core/utf8.php  core/Kohana.php  core/Event.php  class Power { public function Kohana(){ Event::$data=Event::$data.  It will look something like this:  File: hooks.php in your application/config directory.  Example hooks. //or to load page_cache. Set $config['enable'] to TRUE and all files in the hooks directory  (application/hooks) will be included and the code will be executed.  Constants When using hooks you might need to get under the hood of Kohana. Hooks are loaded before any of the events  are started so you can attach a hook to an event. If the file is not there  copy the one from system/config. the first to be started is system.php  No event has been started yet.'<!-. array('Power'.php  core/Log. When the hooks are loaded  . It utilizes the  Event::$data to manipulate the final output.php  $config['enable'] = FALSE. } } Event::add('system.php  //To include all files in application/hooks $config['enable'] = TRUE.php $config['enable'] = array('page_cache').ready  Hook files should be put in application/hooks or similarly in a module folder.

math./i18n/en_US/general. This determines whether errors should be  outputted to the screen or not. but in  production set this to FALSE so as to prevent users from seeing errors. if($x == 0) throw new Kohana_Exception('math.  Kohana_Exception Kohana_Exception extends Exception..php' KOHANA ­ basename DOCROOT ­ dirname APPPATH ­ path to the application directory SYSPATH ­ path to the system directory MODPATH ­ path to the modules directory Error Handling See for more information  •   Log class   explanation of the log class.display_errors In the index.these constants are set in index. string $message]).  Syntax /** * @param string i18n language key for the message * @param array addition line parameters */ throw new Kohana_Exception(string $i18_lang_key [. During development you'd want to set this to TRUE. .php // "Cannot divide by zero. // Throw a $lang['division_by_zero'] exception in . Config.division_by_zero'). $x).php  • • • • • • EXT ­ contains the default file extension used for files in Kohana.  Exceptions Exceptions in Kohana are handled by the Kohana Exception classes.. Kohana_User_Exception and Kohana_404_Exception." else if($x < 0) throw new Kohana_Exception('general.negative_number'..php and pass the message $x // "The number passed was negative: -5" //. This won't affect logging of  errors.php file there is a setting display_errors. To throw a Kohana_Exception an i18n  language file must exist.. Defaults to './i18n/en_US/math. // Throw a $lang['math']['negative_number'] exception in . Example //. There are three types of  exceptions: Kohana_Exception.

if($x == 0) throw new Kohana_404_Exception('divide by zero'). string $template]]).. Cannot divide by zero... if($x == 0) throw new Kohana_User_Exception('Cannot divide by zero'.. You can overload  this one by having a kohana_error_page. Example //. 'You passed a zero'). "Cannot use a negative number $x").. This exception will display a 404  error message to the user. string $message [." //. Example //.  Syntax /** * @param string exception title string * @param string exception message string * @param string custom error template */ throw new Kohana_User_Exception(string $title. // "The page you requested. This is similar to  Kohana_Exception except that the exception messages do not have to be in the i18n structure. else if($x < 0) throw new Kohana_User_Exception('Number Type Exception'...php is the default error page.php in your application/views directory or  in a similar modules directory. //.  Syntax /** * @param string URL of page * @param string custom error template */ throw new Kohana_404_Exception([string $page [. Triggering errors Custom error pages The system/views/kohana_error_page. string $template]). could not be found.Kohana_User_Exception Kohana_User_Exception extends the Kohana_Exception.. Kohana_404_Exception Kohana_404_Exception extends Kohana_Exception.  .

 Modules are reusable collections of related files that  together add a particular functionality to an application.models | +.The default error page will show you the error as well as a stack trace if available. debug messages and informational messages. You may want to re­use some helpers or  add authentication across multiple applications.  Modules Kohana is easily extendable using modules.  The Filesystem page should be read before this one to understand it properly. they must be configured for  Kohana to use them.vendor | | +.i18n | +. but absolute paths are also possible $config['modules'] => array .  Logging Kohana can log errors.models | | +.php file using the 'modules' setting.application +. This can be done in the application/config/config. For instance.php See for more information on logging the Log class.i18n | | +.  root +.php Configuring Only placing modules in the modules directory won't load them.views | | | +.  Example  // Paths are relative to the docroot.libraries | +.vendor | +.modules | +.  Setting up It is most common to have a directory called modules in the same directory as the  application and system directories. The setting can be found in  application/config/log.helpers | +. Place it in a module folder and you can copy it with  ease or have multiple applications use the same module directory. we created a module for ACL (access  control lists) and authentication (auth) since we want to reuse it across applications.auth | +.views | +.libraries | | +.index.helpers | | +.system +.acl | | +.

cache.i18n | +.en_US | | +.en_US | | +. if it's not there copy the one from the system/config directory.  The file will look somewhat like this  $config['language'] = 'en_US'.php | | | +.php | | | +. $config['language'] sets the language that should be used. $config['timezone'] = ''. German in de_DE etc.zh_CN | | +.system | +.php | +.cache.coffee.cache.application | +.coffee.zh_CN | | +. ) In the cascading filesystem.coffee.i18n | +. English files are in  en_US.  Internationalization Internationalization files can be found in the i18n directories.php sets which locale will be used. application or modules directories. see for more information  http://php. Dutch in nl_NL. It maps to the directories in the  i18n directory. The file can be found in the  application/config directory.php .php | | | +. files in modules that are higher up the list take precedence over those  lower down just as files in the application directory do over those in modules and the system directory.de_DE | | +. 'modules/auth'.net/timezones  File structure root +.de_DE | | +.( 'modules/acl'. Kohana's own internationalization files can be found in  the system directory. $config['timezone'] sets the timezone.  In the i18n directories the directories with the language files can be found. These directories can be found in  system.  Locale setting The configuration file locale.php | | | +.

resources'). echo Kohana::lang('coffee. In the case of en_US. add the directory of the locale and add the file with the language strings. Kohana::lang('cache. For example. ). //outputs is locale is set to en_US // Caching of resources is impossible. => 'Coffee is created from beans.java').php and place it in application/i18n/en_US/  Format of the file  $lang = array ( 'cup' 'beans' 'java' language'.resources') maps to  i18n/en_US/cache. da diese nicht serialisiert werden können.beans'). because resources cannot be serialized. echo Kohana::lang('coffee.'. => 'Coffee goes in here'. //If locale is set to de_DE // Das Cachen von Ressourcen ist nicht möglich.php and within this file to $lang['resources']  Kohana also allows to give extra arguments to Kohana::lang()  Setting your own language strings It is possible to have your own language strings in your application/module. Example  echo Kohana::lang('cache. => 'Place where coffee comes from. . Simply add a directory  i18n. Name the file coffee. not the programming These language strings can now be called from your application  Example  echo Kohana::lang('coffee.cup'). you  want to have language strings for coffee and stuff related to coffee.Retrieving language strings Using Kohana::lang() languages strings can be retrieved.

Core .

$decimals) is used to retrieve the results of a benchmark. By default several benchmarks are run:  • • • • • • Kohana Loading  Environment Setup  System Initialization  Controller Setup  Controller Execution  Total Execution  The results of the benchmarks will be outputted by the Profiler. Supply an unique name.  Benchmark::start('benchmark1').  print_r(Benchmark::get('benchmark1'. get() Benchmark::get($name. // Output: Array ( [477f51931a33e_total_execution] => Array ( [time] => 0. memory in bytes. Returns void. // Output: Array ( [time] => 0.  print_r(Benchmark::get('benchmark1')). Supply the name given when the  benchmark was started. Its default value is 4.Benchmark Class The benchmark class allows you to time your code.023 .  Methods start() Benchmark::start($name) is used to start a new benchmark.007802 [memory] => 472 ) If you set the $name parameter to TRUE. 6)).  Returns an array with the results: time is expressed in seconds.  print_r(Benchmark::get(TRUE. all benchmarks will be returned. // Output: Array ( [time] => 0. 3)).0078 [memory] => 472 ) The $decimal parameter is optional.  If a view is rendered {execution_time} and {memory_usage} can be used in the view to be replaced  by the actual execution time and memory usage.  Note: Benchmark does not have to be loaded nor instanced. stop() Benchmark::stop($name) is used to stop a benchmark. It is automatically loaded during the system  setup and all its methods are static.  Benchmark::stop('benchmark1').  Returns void.

[memory] => 618940 ) [477f51931a33e_kohana_loading] => Array ( [time] => 0.012 [memory] => 369104 ) [477f51931a33e_environment_setup] => Array ( [time] => 0.002 [memory] => 54300 ) [477f51931a33e_system_initialization] => Array ( [time] => 0.003 [memory] => 65884 ) [477f51931a33e_controller_setup] => Array ( [time] => 0.008 [memory] => 177688 ) [477f51931a33e_controller_execution] => Array ( [time] => 0.000 [memory] => 4236 ) [benchmark1] => Array ( [time] => 0.008 [memory] => 472 ) )

Note: If for some reason the memory_get_usage() function is not available on your system, memory will  be set to 0. 

Config Class
Provides methods for working with configuration items. 

Where to put the configuration?
Configuration files must be placed in a folder named config, this folder can reside in system,  application or a module. Application is more important than system and will override it. Modules  override system files but are overridden by application files.  The config file must be in this format: 
$config = array ( 'language' => 'en_US', 'timezone' => '' );

Methods
Retrieving configuration items
Config::item($key, $slash = FALSE, $required = TRUE) retrieves a  configuration item, can return a string, array or boolean. $slash will force a forward slash at the end  of the item. $required determines whether an item is required or not. 
config::item('locale.language'); //returns the language from the **locale.php** file and returns the config['language'] item.

Setting a configuration item
For setting configuration items in realtime you must enable this setting in the config.php file.  (core.allow_config_set)  Config::set($key, $value) sets a configuration item, returns TRUE on success or FALSE  when it didn't succeed. 
config::set('locale.language','nl_NL');

Note:

If you want to set a configuration in realtime make sure the config.allow_config_set is set to  TRUE in application/config.php 

Getting the include paths
Config::include_paths($process= FALSE) gets the include paths and returns an array.  First in the array is the application path, last will be the system path, other items will be include  paths set in the configuration item 'core.include_paths'. $process, if true, will reprocess the  include_paths. 
config::include_paths();

Load a configuration file
Config::load($name, $required = TRUE) loads a configuration file. Config::item()  loads them as well if they're not already loaded and retrieves the items straightaway. 
config::load('locale');

Event Class
For an overview for a programming overview of events, please see Event_handler and Event_loop.  Kohana stores events in queues, as opposed to stacks. This simply means that, by default, new  events will be processed after existing events. 

What is an Event?
Kohana events consist of a unique name and a callback. By default, there are several events defined  by Kohana. Names are completely freeform, but the convention is to use a prefix.name to make  event names more unique. All pre­defined events are prefixed as system.name, eg:  system.post_controller. 

Methods
All Event methods are static, and Event should never be instanced. 

add
Used to add a new callback to an event. If the event does not already exist, it will be created. 
// Calls the function "foo" after the controller method is executed Event::add('system.post_controller', 'foo'); // Calls the static method "Foo::bar" after the controller method is executed Event::add('system.post_controller', array('foo', 'bar')); // Calls the "bar" method in the "$foo" object when the output is rendered Event::add('system.display', array($foo, 'bar'));

You can also create entirely new events this way: 

// Creates a custom user.login event Event::add('user.login', array($user, 'login'));

add_before
Used to add a callback immediately before another callback in an event. 
// Add the function "faa" to be executed before "foo" Event::add_before('system.post_controller', 'foo', 'faa');

If the event you are inserting before does not exist, add_before will functional exactly the same  as add. 

add_after
Used to add a callback immediately after another callback in an event. 
// Add the function "fzz" to be after "foo" Event::add_after('system.post_controller', 'foo', 'fzz');

If the event you are inserting after does not exist, add_after will functional exactly the same as  add. 

replace
Used to replace a callback with another callback in an event. 
// Replace the "foo" function with the "oof" function Event::replace('system.post_controller', 'foo', 'oof');

If the event you are replacing does not exist, no event will be added. 

get
Returns of the callbacks as a simple array. 
// Returns of the callbacks for system.post_controller $events = Event::get('system.post_controller'); // Loop through each event and call it foreach ($events as $event) { $return_value = call_user_func($event); }

If no events exist, and empty array will be returned. It is recommended to use empty if you need to  validate that events exist. 

clear
Clear one or all callbacks from an event. 
// Clears the "oof" function from system.post_controller Event::clear('system.post_controller', 'oof');

If this method is called without a second argument, it will clear the entire queue for the given event. 

Event data is cleared immediately after all of the callbacks are run.  // Debug the data echo Kohana::debug($data).post_controller'. The browser will interpret the page with the new charset. charset=iso-8859-1'). has_run Checks if an event has already been run.'. This can is useful to make an event run only once.  header('Content-type: text/html. It loads up the Router.  Character set The class also sets a utf­8 header. and can be manipulated by all of the callbacks.  // Run the system.  Kohana Class The Kohana class is at the center of Kohana.  // Test if the event has already run if (Event::has_run('system.post_controller'). // Display the changed data echo Kohana::debug($data). and can only be accessed during  callback execution.post_controller')) { echo 'post_controller has been run.post_controller event Event::run('system. .post_controller'). If you want a different charset you can override it by placing this  in for example your controller.post_controller') or Event::run('system. dispatches to the controller and  does the final output.run Execute all of the callbacks attached to an event. // Run the post_controller event with data Event::run('system. The data is assigned by  reference. } // Run the post controller event if it has not already been run Event::has_run('system. Data Event::data is a special variable that can be set when using Event::run. $data).

anothernode' [array] Array to search in. It displays an overview of files and functions called so you can  spot the source of the error. because resources cannot be serialized. 'b' => 'aab'.  echo Kohana::debug($this->input->post()). Prints out the POST variable  backtrace() Will be called when an error occurs.  Example  echo Kohana::lang('cache. Very useful for debugging. 'leveltwo2' => array . Should be in form of 'rootnode.childnode.Methods debug() Returns HTML formatted strings of variables that can be echo to screen nicely. In the case of en_US. Should be an array of values and/or another arrays to represent  nodes Example  $a = array ( 'levelone1' => array ( 'leveltwo1' => array ( 'a' => 'aaa'. It takes:  • • [string] Key to search for.php and within this file to $lang['resources']  Kohana also allows to give extra arguments to Kohana::lang()  key_string() Searches for given key in a nested array.resources'). Kohana::lang('cache. //outputs is locale is set to en_US // Caching of resources is impossible. da diese nicht serialisiert werden können. //If locale is set to de_DE // Das Cachen von Ressourcen ist nicht möglich.resources') maps to  i18n/en_US/cache.  lang() Using Kohana::lang() languages strings can be retrieved. 'c' => 'aac' ).

'b' => 'abb'.( 'a' => 'aba'. this means it will first look in the application  directory to see if a file exists.foo'. 'levelone2' => array ( 'a' => 'ba'. Exception to this is the i18n files and the config files. 'c' => 'abc' ).  Example  // find a file named 'article.php file and then the system directory. variables declared in the system  directory will be supplanted by the one in the application directory. defaults to FALSE) It returns array of file paths to found files.leveltwo1. Result is that you can copy half a language file  from the system directory and place it in the application directory.b'. When file is found it returns a string with  the path to the file. TRUE or FALSE (defaults to FALSE) Returns an array if the type is i18n or a configuration file. throws an error if this is true and the file cannot be found [bool] Use a custom file extension.'article')). ) ).php' in the 'controllers' directory. include (Kohana::find_file('controllers'.  This method uses the cascading filesystem of Kohana. It takes two parameters:  • • [string] In which directory to search in [bool] Should find_files be recursive? (TRUE or FALSE.  Example  $controllers = Kohana::list_files('controllers'.leveltwo2. .  They are loaded from the system directory upwards. $a). //Returns 'abc' Kohana::key_string('levelone2.c'. $a). TRUE). It will return FALSE if the file is not found. //Returns 'bar' list_files() Iterates through all directories of a given name and returns found files. $a). //Returns 'aab' Kohana::key_string('levelone1.  • • • • [string] Directory to search in [string] Filename to look for (including extension if 4th parameter is TRUE) [bool] Is the file required. 'b' => 'bb'. // Now $controllers is an array containing paths to all controllers in your Kohana installation find_file() Find a resource file in a given directory using Kohana's cascading filesystem. 'foo' => 'bar' ) Kohana::key_string('levelone1. then any module that exists in order they are supplied in the  config.

 By default nothing is logged to level 2 or 3 by Kohana. Log Class Provides methods to work with logging. levels 2 and 3 can be used without  the overhead of debug.  Level 1 is recommended in production use as it will only log errors.Example  // find a file named 'database. Nothing is logged to level 3 by Kohana by  default. but can be used for custom logging by applications.  $config['format'] format for the timestamps according to date()  Kohana 2. or absolute.  • • • • • 0 ­ Logging is disabled 1 ­ Error messages including PHP errors 2 ­ Application Alert messages (changed level) 3 ­ Application Information messages (changed level) 4 ­ Debug messages (new level) .2 makes a small change to the logging threshold order. $config['threshold'] can be set at four levels:  • • • • 0 ­ Logging is disabled 1 ­ Error messages including PHP errors 2 ­ Debug messages 3 ­ Informational messages When set to 3 it will also log 2 and 1. $config['format'] = 'Y-m-d H:i:s'.  There are three settings for the Log class:  $config['threshold'] = 0.  $config['directory'] log file directory. See for more information on the  Config page. relative to application/.  Configuration The configuration file Log. include (Kohana::find_file('config'. If it's not  there it can be copied from the system/config directory.  Important setting the level to 2 or 3 can slow down your application significantly. Same goes for 2.php can be found in the application/config directory. it will log all libraries loaded and any errors. Level 2 is useful while  debugging.'database')). $config['directory'] = 'logs'.php' in the 'config' directory.

// returns void Log::add('debug'. See for more  information on events the Event page.shutdown). However. Methods clean utf8::clean() recursively cleans arrays.  Example:  var_dump(utf8::is_ascii("a\0b". The mbstring extension is highly recommended. $message) logs the message according to the type given  (error. // returns void Writing the log entries to the file Log::write() is called by default on the shutdown event (event.  Requirements:  • • •   PCRE   needs to be compiled with UTF­8 support. // returns void Unicode Functions Provides static methods to work with UTF­8 strings as PHP is not yet natively capable of doing that. it must not be overloading string  functions.debug. This method is also used internally in the utf8 class to determine when  to use native functions or UTF­8 functions. // bool(true) . the item will be preceded by a timestamp formatted according to  $config['format']. COOKIE and SERVER globals.  from_unicode is_ascii utf8::is_ascii() checks whether a string contains only 7bit ASCII bytes.  Log::write(). It removes ASCII control  characters (strip_ascii_ctrl) and converts to UTF­8 while silently discarding incompatible  UTF­8 characters.Methods Adding entries to the log file Log::add($type.chr(127).info). There is typically no need to call it manually. The iconv extension needs to be loaded. It returns TRUE if  it does so. 'Query went wrong').  Note: The clean() method is automatically applied to the GET. objects. POST. and strings. 'Custom library X loaded').  Log::add('error'.'c')). FALSE otherwise.

var_dump(utf8::is_ascii("a\0b".  Example:  echo utf8::strip_ascii_ctrl("a\0b". // Output: abc strip_non_ascii utf8::strip_non_ascii() removes all non­ASCII characters from a string.chr(128). // Output: Clichs . // bool(false) ltrim ord rtrim str_ireplace str_pad str_split strcasecmp strcspn strip_ascii_ctrl utf8::strip_ascii_ctrl() removes all ASCII control characters from a string.'c')).  Example:  echo utf8::strip_non_ascii('Clichés').chr(7).'c').

 You  can remove them afterwards with the strip_non_ascii method.'). Further reading: Wikipedia on transliteration  trim ucfirst ucwords View Class For a more in depth overview of views see General/Views. Special characters that are unknown to this method are left untouched.  . // Output: Jerome est un garcon.  Example:  echo utf8::transliterate_to_ascii('Jérôme est un garçon.stristr strlen strpos strrev strrpos strspn strtolower strtoupper substr substr_replace to_unicode transliterate_to_ascii utf8::transliterate_to_ascii() replaces many (not all) special/accented characters by  their ASCII equivalents.

$var). $view->bind('title'. $view->header = new View('header'). Setting data Methods set() set() can be used to set a variable in a view. bind() bind() is like set only the variable is assigned by reference. $var='Some value'. You can also supply an array and the keys and values  will be treated as variables. $var='Another value'.php $view->render(TRUE).  // loading views $view = new View('page'). $this→view→your_variable can be used to accomplish the same. $view->render(true).  $view = new View('welcome'). This  means you can use it with views in views for example. no browser output $this->template->content = $this->session->get_once('message').  $view = new View('welcome'). 'Title of page'). // setting variables in all views $view->set_global('title'.  // render and store.$content- .Creating an instance Creating an instance of the view class. render() render() renders the output of the View.  $view = new View('welcome'). 'Elvis lives'). // set variable $title for example in view header. $view->set('title'. default. //The 'title' variable will contain 'Another value' set_global() set_global() is like set only that the variables set are available throughout all views.

if(request::is_ajax()) //request helper also exists in 2. Parameters are the same as creating a new instance. // render output of view to browser $this->template->render(TRUE).  $view=new View. html::breadcrumb()) ->render().  public function _add_breadcrumb() { $crumbs = View::factory('admin/breadcrumb') ->set('crumbs'.$this->template->content.>render(). factory() This method is static.2 { $view->set_filename('ajax_view').2  set_filename() sets the name of the file used for the view. set_filename() This method only exists in version 2.  It creates a View instance and immediately returns it so method chaining is possible. } $this->template->content = $crumbs. } else { $view->set_filename('html_view'). } $view->render(TRUE). .

Addons .

 and the last argument is an array of attributes. The first argument is the form action. the form helper provides methods to create  forms. $remember) validates a user's authentication  credentials and logs a user in. completely destroy the session. array('id' => 'article_form')). the third argument is the  form submittal method. 'post').  $form->set_attr('class'. but only  remove the authentication information from the session. the second is the form title. It supports users.  Creating a form Creating a form is done by instantiating the Forge class  $form = new Forge(''. Forge coexists with the Form helpers. validating and filtering forms. the last of which is obviously the attribute array.  • [boolean] If true.  Methods auto_login() login() $this→auth→login($user. it doesn't replace it. The Forge class will accept up to four arguments. You can create forms with built­ in validation in one go. do not delete the session. This is the start of each form. . all of which are  optional.  multiple roles per user and auto­logins.  logout() $this→auth→logout($destroy) logs a user out by removing the appropriate session  variables. Take a look at the controller and the models to see how  simple applications work. $password.Auth Module The Auth module is a simple module to enable authentication on your site. You  can also set any of these attributes after the fact or on the fly by using the method below. 'POST'. 'Add article'.  Here you see only three arguments being used. if false. It employs ORM and Forge. If you're new to Kohana the  code of Auth might help you to get started. hash_password() Forge Module (Form Generation) The Forge module is a module to easily create and manage forms. Forge provides  help with rendering. 'form_class')->set_attr('method'.  Say we want to change the class and method attribute of the form.

  $form->input('title')->label(true)->rules('required|length[3. if($form->validate()) { echo $form->title->value. 'Add article'.array('id'. $form->set_attr('class'.40]| valid_alpha_numeric'). $form->submit('submit'). 'form_class')->set_attr('method'. 'article_form')). A complete form $form = new Forge(''. Now we set a label and add rules.array('id' => 'article_form')). takes no arguments.Adding elements Next step is adding elements.  as_array() as_array() returns an array with input names and values. echo $form->article->value. } else { echo $form->html(). 'form_class'). $form->set_attr('class'. 'post'). Useful for putting your form values  into the database.'id' => 'article_form')). $form->set_attr(array('class' => 'form_class'. $form->input('article')->label('Article text')->rules('required|| valid_alpha_numeric').'POST'. 'Add article'.  .  $form->input('title'). validate() validate() validates a form. } Form methods set_attr() set_attr() set an attribute of the <form> element. There are two parameters:  • • [array]/[string] Either the attribute name or an array of attribute names and values [string] Attribute value (Default NULL) $form = new Forge(''. 'post'. This is the basis of adding elements. Returns boolean. $form->input('title')->label(true)->rules('required|length[3.40]| valid_alpha_numeric')->value('title').

 Method is chainable. If the argument is boolean the input label will be based on the input  name. Method is chainable. Method is chainable. or  ->label('Custom input name'). Thus.  ->label(TRUE). Input label Show the field label or not. Also you can pass the custom label name.  In Kohana 2.  $form->input('input_name').  Form_Input Create input Create an input.2 changed to render()  Form Elements Note that all elements except for Form_Group inherit from Form_Input so methods below apply to  all of them. a rule normally  accessible by calling valid::ip would be utilized as:  ->rules('valid_ip') Input value Set the default value for the element.error_format() html() Returns a rendered form as a string. Input validation Set the validation rules for the field.  ->rules('list|of|validation|rules') Input validation using Kohana Validation helper You can utlize rules from Validation helper by prefixing the rule with valid_. Method is chainable.  ->value('input_value') .

 The key will be the option  value and the value will be the option text. wrap it in the PHP strtotime function. 'label' will be used as the label and the true| false indicates if the item is checked by default.  Form_Dateselect Example $form->dateselect('date')->label(TRUE)->years(date('Y')-3.  Example $form->checkbox('test')->label(TRUE)->value('1')->checked(TRUE).  Form_Dropdown You can set dropdown with single array or with two­dimensional array.  * Dateselect uses Unix timestamp format internally to calculate dates.  example  $form->input('title')->label(TRUE)->class('input_size'). * In the above example we are instructing Forge to generate years ranging from 3 years prior and 5  years after the current year. Form_Checkbox By default a checkbox checked status is off to turn on just call the checked method and set to true. true| false)} where 'value' will be the value of the checkbox. date('Y')+5)>value(strtotime($your_date_var)).Extra Attributes You can add extra attributes to input and all other form elements by using attribute name.255]')>value($this->page->title). Form_Checklist Example $form->checklist('blocks')->label('Blocks available')->options($option)>rules('required'). 'Margarita'))- . * $option should be sent as an array with each value in the format {'value' = array('label'.  Example $form->dropdown('pizzas')->label(TRUE)->options(array('Hawaiian'. To pass a MySQL date field  to the value() method. Example $form->input('title')->label(TRUE)->rules('required|length[0.

  Example $form->input('password')->label(TRUE). You can use groups for  example when you need to group some form elements within a `<fieldset>` tag.  Example $group = $form->group('pizzas')->label(TRUE). $group->dropdown('pizzas')->label(TRUE)->options(array('Hawaiian'. 'MA'=>'Margarita'))->selected('1').  Example $form->hidden('id')->value(1). Form_Submit Example $form->submit('Submit Button Name'). In the view groups get special attention and are rendered differently. 'Stuffed'))->selected('2'). All methods of the Forge  class are available save html(). $group->dropdown('bases')->label(TRUE)->options(array('Thin'. 'Pan'. Form_Password The method 'matches' matches a form field with another form field. $form->dropdown('pizzas')->label(TRUE)->options(array('HA'=>'Hawaiian'.255]')>value($this->page->description). 'Margarita'))->selected('1'). Form_Group Is an instance of the Forge class so you can have groups in your forms.  Form_Hidden In the default template hidden forms are added straight after the <form> tag. . $form->input('passconf')->label('Password Confirmation')->rules('required| length[5. Form_Textarea Example $form->textarea('description')->label(TRUE)->rules('length[0.32]')->matches($form->password).>selected('1').

  $form->upload('file'. you can utilize a custom form template.msg3841.g. if ($form->validate()) { // Do stuff } echo $form->html('login_form'.php config file (system/config/upload.php  <form method="post" action="<?= url::site('login') ?>"> <?= $username->label() ?> <br /> <?= $username->html() ?> <br /> <?= $username_errors ?> <br /><br /> <?= $password->label() ?> <br /> <?= $password->html() ?> <br /> <?= $password_errors ?> <br /> <input type="submit" value="Login" /> </form> Note: You don't have to use →label().  Otherwise it will create an unique name. Use $username→value to fill in the  values for input fields. You can write the HTML for label or form input fields  directly into your form view (e.php  $form = new Forge().php/topic. $form->password('password')->label(TRUE)->rules('required'). $form->input('username')->label(TRUE)->rules('required').com/index.  from: http://forumarchive. This  allows you to design the form however you want using HTML.  . <label for=”…”>). The default upload path is configured your upload.616.png. TRUE)->label(TRUE)->rules('required|size[200KB]| allow[jpg. specifies to View: application/views/login_form. TRUE).  Using Custom Form Templates If you need more control over your form.Form_Upload Example If the file exists and the second argument of upload() method is TRUE.php). it will overwrite this file.kohanaphp.html#msg3841  Example Controller: application/controllers/your_controller.gif]'). use a custom form // Only this is different. but still want to take advantage of the automated validation  and field re­population provided by the Forge library.

sheet2. 'sheet2'.  Configuration read the config for now  Usage Place all CSS files into the directory /application/views/media/css/ and all JavaScript files into  /application/views/media/js/. It does not support images at the current time.com/2008/03/13/saving­forms­as­libraries/ for a short  tutorial.  Media Module The Media Module is used to reduce the number and bandwidth of queries for CSS and JavaScript  files.  Once the module has been enabled in the standard way.Saving forms as a library Using Forge you can save forms as a library and thus have access to your form throughout your  application.kohanaphp. //defaults to template but you can set your own view file public $auto_render = TRUE.js"></script> Template Controller Template Controller Using the template controller you can set a template for your site.php  class Home_Controller extends Template_Controller{ public $template = 'template'. renders the template after the controller method is done public function __construct() { . //defaults to true.dojo.php. 'sheet3'))?> <?=media::script(array('jquery'.css" type="text/css" /> <script type="text/javascript" src="/media/js/jquery. it will intercept requests for  /media/css/… and /media/js/… transforming the results as specified in the config file  media. See http://learn.sheet3.  Example: application/controllers/home.  You then use the helpers to include them from your view pages like this:  <?=media::stylesheet(array('sheet1'. It's workings are simple. 'dojo'))?> Not to confuse matters the above is simply a helper for writing the following:  <link rel="stylesheet" href="/media/css/sheet1.

". // // // // the template page 'base_page' is loaded by default. Auto­render renders the template during the  post_controller event which is executed after the controller.= '<br><a href="test_2">page 2</a>'. // add our content to the template view: $this->template->content = $test. this is the same as uncommenting the following line: $this->template = new View('base_page'). so the template // is set up and ready for this pages content. 2008".php. . } function index() { // // don't forget that the __construct() is run // before this method.parent::__construct(). Me. $this->template->copyright = "&#169.  For a more detailed discussion of Template Learning Kohana: Template  Example 1 This is a simple example that shows the magic of the Template class.php. You set the template file in $template. // // Load this page (Test) view $test = new View('test'). // All pages have some things in common such as // the page title: $this->template->title = "Welcome to Kohana!". It defaults to  'template' which is found in views/template. // now create this page (Test) $test->heading = "Test :: Index Heading". //necessary } public function index() { $this->template->content= 'index page in a template'. $test->content = "Test :: Index :: content here.php which extends the  template controller. This all means you can change the  template and auto­render all in realtime. } } The example illustrates a file application/controllers/home.php  class Test_Controller extends Template_Controller { public $template = 'base_page'. $test->content . The template controller can be found in  system/controllers/template. public function __construct() { parent::__construct().  Save this as /application/controllers/test.

$this->template->copyright = "&#169. ?></title> </head> <body> <?php echo $content ?> <?php echo $copyright. 2008".= '<br><a href="index">page 1</a>'.0. Think of base_page as your base object.0. Me. // add our content to the base view: $this->template->content = $test.0.". alter the method:  public function __construct() { parent::__construct().} // the view is auto-render by default function test_2() { // Load this page (Test) view $test = new View('test'). // now create this page (Test) $test->heading = "Test :: test_2 :: Heading". For example.  Example 2 It is easy to add more interesting things in the construct() such as custom navigation menus for  this 'test section' of your website. $test->content . // Look: $this->template->menu = new View('test_menu').1/Kohana/test/test_2  The Template class is nice because it removes the need to split a template into two files. ?></h1> <p><?= $content ?></p> To test this browse to http://127. } Save this as /application/views/test_menu. // the view is auto-render by default } } This uses the following 2 views:  Save this as /application/views/base_page.1/Kohana/test/ and http://127.php inherits from.php  . $test->content = "Test :: test_2 :: content here.0. ?> </body> </html> Save this as /application/views/test.php  <h1><?php echo $heading. $this->template->title = "Welcome to Kohana!". which views/test. header and  footer.php  <html> <head> <title><?php echo $title.

<div style="width: 100px. ?> </body> </html> Obviously you'll need to add some meaningful content to the views    . ?></title> </head> <body> <?php echo $menu ?> <?php echo $content ?> <?php echo $copyright."> <ul> <li>menu 1</li> <li>menu 1</li> </ul> </div> Alter /application/views/base_page. border: 1px solid lightgreen. float: right.php to display the menu:  <html> <head> <title><?php echo $title.

Libraries .

 Relative paths must be relative to the root website dir. Relative paths must be relative to the root website dir.txt"). Tar Files. or it can send the binary file directly to the user  without saving to the hard drive. It accepts the following parameter:  • • [string] path to file or dir. Access to the library is available through $this→archive  The second argument of the load­library function contains the name of the archive driver you want  to use.  Loading the archive library The Archive class is loaded into your controller using $this→load→library :  //load the archive class with the Zip driver to create Zip archives $this->archive=new Archive('zip'). .  • [string] path to save the archive file.  • [string] name to be given to the archive file $this->archive->download("myarchive. save() save() saves the archive you've been creating to the disk.  Currently it only supports Zip Archives.zip"). Currently only a driver for Zip archives is available. $this->archive->save("myarchive. download() download() offers the archive as a download to the user.Archive Library Overview The Archive Library is a convenient way of constructing Archives (Zip Files.zip").  [boolean] whether to scan the dir recursively – default = TRUE This will result in file.txt being added to the archive:  $this->archive->add("files/uploads/file.  Methods add() add() adds files and directories to your archive. It can persist them to the file system. etc)  dynamically.

php file. $config['lifetime'] = 1800. Set to a negative number will disable automatic garbage collection  Available drivers • • • • • • APC ­ Alternative Php Cache Eaccelerator File Memcache SQlite Xcache Methods Loading the library $this->cache= new Cache.  $config['params'] driver specific parameters (in above example ­ path to server writable  cache dir) $config['lifetime'] sets the lifetime of the cache.$data. $lifetime = NULL) is used to set  . Specific lifetime can be set  when creating a new cache.  Configuration Configuration is done in the application/config/cache. $config['requests'] = 1000. Currently only file and SQlite are available. It utilizes tags and id's to identify caches.$tags = NULL. if it's not there take the one from  system/config and copy it. Setting caches set $this→cache→set($id.  For the API documentation:  • not available yet View the page caching screencast from Woody Gilk (Shadowhand). 'cache'.  $config['driver'] = 'file'. 0 means it will never be deleted automatically  $config['requests'] average number of requests before automatic garbage collection  begins. This is configurable by setting  the driver. config['driver'] sets the driver. $config['params'] = APPPATH .Cache Library Kohana's cache library can currently store caches in a file or SQlite.

 returns the data or NULL  print_r($this->cache->get('existentialists')). If none given the default lifetime from the  configuration file will be used. //returns //Array ( [existentialists] => Array ( [0] => Jean Paul Sartre [1] => Albert Camus [2] => Simone de Beauvoir ) [food] => Array ( [0] => French bread [1] => French wine [2] => French cheese) ) Deleting caches There are several methods to delete caches  delete $this→cache→delete($id) deletes a cache item by id. delete_tag $this→cache→delete_tag($tag) deletes all cache items with a given tag.  $tagsdefaults to none. This is useful when grouping caches  together.$data.'French wine'.array('french')). returns a boolean  $this->cache->delete('food'). Finding and getting caches get $this→cache→get($id) retrieves a cache with the given $id.  $food=array('French bread'. $this->cache->set('existentialists'. $data=array('Jean Paul Sartre'. returns a boolean  $this->cache->delete_tag('french'). $tags=array('existentialism'.'french'). print_r($this->cache->find('french')). 'Albert Camus'.'French cheese'). $this->cache->set('food'.$food. an array should be supplied. //returns: // Array ( [0] => Jean Paul Sartre [1] => Albert Camus [2] => Simone de Beauvoir ) find $this→cache→find($tag) supply with a string.$tags). $lifetime specific lifetime can be set. 'Simone de Beauvoir').'philosophy'. retrieves all caches with the given tag.caches. .  • • • • $id The id should be unique $data If $data is not a string it will be serialized for storage.

delete_all $this→cache→delete_all() deletes all cache items, returns a boolean 
$this->cache->delete_all();

SQLite Driver Schema
If you use the SQlite driver to store the caches the table can be constructed with this query. 
CREATE TABLE caches( id varchar(127), hash char(40), tags varchar(255), expiration int, cache blob);

Calendar Library
Overview
Provides methods for generating and working with a calendar. The library outputs a calendar month  in HTML, for use in the system view system/views/kohana_calendar.php 

Loading the calendar library
The Calendar class is loaded into your controller using: 
$this->calendar = new Calendar();

Access to the library is available through $this→calendar  The parameters of this constructor are: 
• • •

[integer] month [integer] year [boolean] put this argument on TRUE if you want weeks to start on monday (depends of  your localization)

Example
$cal = new Calendar(1,2008); // January, 2008. The default is current month and year echo $cal->render(); // the view is automatically rendered from the library

Produces an HTML calendar  January 2008 Sun 28 6 13 Mon 29 7 14 Tue 1 8 15 Wed 2 9 16 Thu 3 10 17 Fri 4 11 18 Sat 5 12 19

20 27

21 28

22 29

23 30

24 31

25 26 1 2

Adjusting the calendar
The layout of the calendar can be adjusted by creating the following file: application/views/ kohana_calendar.php The native Kohana calendar file can be copied from  system/views/kohana_calendar.php to have template to start working from. 

Database Library
The database library provides database access to your application using drivers.  Currently we have the following drivers available:  1. 2. 3. 4. MySQL MySQLi PostgreSQL PDOSqlite (available in SVN)

Table of Contents
• • • • • • •

  Configuration     Connecting     Querying     Query Builder     Query Result     Metadata     Query Caching  

Quick Examples
The following is example code for using common database functionality. For more in depth help  please read the individual topics linked above.  Initializing the database
$db = new Database(); // or $db = new Database('groupname'); given // "default" is assumed if groupname is not

Simple Query
$result = $db->query('SELECT username,password,email FROM users'); foreach ($result as $row) { echo $row->username; echo $row->password;

echo $row->email; }

Quick Example 2
This demonstrates using the query results in a template.  Query
class Clients_Controller extends Controller { public function index() { $db = new Database; $result = $db->query('SELECT name, code FROM clients'); $v = new View('clients'); $v->result = $result; $v->render(TRUE); }

}

Template
<html> <head> <style> /* * Zebra rows: When CSS3 is done we could simply use: * tr :nth-child(odd) { background-color: #D0D0D0; } * but for now we use PHP and CSS */ table.db tr { background-color: #F0F0F0; } table.db tr.odd { background-color: #D0D0D0; } table.db th { color: #f0f0f0; background-color: #303030; } </style> </head> <body> <h2>Client List</h2> <hr/> <table class="db"> <tr> <th>Client</th> <th>ID</th> </tr> <?php foreach( $result as $row ):?> <tr <?= text::alternate( '', ' class="odd"' ) ?>> <td><?= $row->name ?> </td> <td><?= $row->code ?> </td> </tr> <?php endforeach; ?> </table> </body>

  $config['cipher'] sets the cipher to be used for encryption.  $config['key'] = 'YOUR CYPHER KEY'. numbers. $config['mode'] = MCRYPT_MODE_NOFB. Access to the library is available through $this→encrypt  Configuration Configuration is done in application/config/encryption. It should be at least 16 characters long and  contain letters.  Loading the encryption library The Encryption class is loaded into your controller using $this→load→library :  $this->encrypt=new Encrypt. . and symbols.  See http://php.net/mcrypt for more information.  Methods encode($data) $this→encrypt→encode($data) returns an encrypted version of $data using the cipher  and key specified in the configuration file. echo $encrypted_text. $config['mode'] the MCrypt encryption mode to use.  You can choose what cypher you'd like the algorithm to use and you can specify your own key for  the encryption.php if it's not there take the  one from system/config and copy it. config['key'] sets the key used for encryption. decode($encrypted) $this→encrypt→decode($encrypted) returns a decrypted version of $encrypted using  the cipher and key specified in the configuration file.Encrypt Library Overview The Encrypt Library provides an easy way to encrypt and decrypt data using symmetric keys.  $encrypted_text = $this->encrypt->encode('The Answer is 42'). echo $this->encrypt->decode($encrypted_text). but you probably won't need to change this. $config['cipher'] = MCRYPT_RIJNDAEL_128.  $encrypted_text = $this->encrypt->encode('The Answer is 42').

using height to maintain aspect ratio. Various image formats such as JPEG. [integer] Height in pixels of the resized image.Image Library Provides methods for the dynamic manipulation of images./photo.  Methods resize() resize() is used to resize an image. quality and rotate or flip  Loading the Image library Uses a driver.  Image manipulation methods can be chained efficiently. and GIF can be resized. Options : Image::NONE.php. crop. The default driver uses the GD2 library. rotated and sharpened. This method is chainable. (relative or absolute) must be passed as a  parameter. Image::WIDTH Example:  // Resize original image to Height of 200 pixels. which is controlled by the 3rd argument. Image::NONE) //Note: The output image is resized to width of 400 and height of 200. ImageMagick may be used if available.  The top and left offsets may be specified. the aspect ratio will be  maintained automatically. Image::HEIGHT) // Note: Passing width = 400 has no effect on the resized width. without maintaining the aspect ratio crop() crop() is used to crop an image to a specific width and height.  . configured in config/image. the temporary image being written to a specified image file.  • • • [integer] Width in pixels of the resized image.  Image::HEIGHT.  PNG. Access to the library is available through $this→image Some methods are chainable. This method is chainable. [integer] Master dimension. $this->image->resize(400.jpg'). Recommended order: resize. By default 'top' and 'left' use the 'center' offset. Image::AUTO. 200. Only the save() method is  permanent.  sharpen. By default. default is Auto. maintain aspect ratio on height $this->image->resize(400. cropped.  bundled with PHP. a path to the image file. 200.  All image manipulations are applied to a temporary image.  Load the Image Library in your controller using the new keyword:  $this->image = new Image('.  When loading the library.

 pixel value or one of 'left'. Vertical = 6 Example:  // Rotate the image along the vertical access. Horizontal = 5. by a maximum of 180 degrees.  • [integer] Percentage amount to adjust quality. (negative rotates anti­clockwise) There is no default.  • [integer] Sharpen amount to apply to image. Example:  // Sharpen the image by an amount of 15. sharpen() sharpen() Is used to sharpen an image by a specified amount. $this->image->crop(400. $this->image->rotate(-45) flip() flip() is used to rotate an image along the horizontal or vertical axis. It cannot be used to actually improve the quality of an input  image. This method is chainable. Optimal amount is  about 20.  Note: The method is for reducing the quality of an image. in order to reduce the file size of the  image. There is no default. 'center'. [integer] Top offset of input image. $this->image->sharpen(15). pixel value or one of 'top'.  • [integer] Direction. starting from the 'center' of the image from the 'top' and the 'center' of the image from the 'left' // to a width of 400 and height of 350. 'center'. quality() quality() Is used to adjust the image quality by a specified percentage.  The image may be rotated clockwise or anti­clockwise. This method is  chainable. 350) rotate() rotate() is used to rotate an image by a specified number of degrees. $this->image->flip(6). Example:  // Crop from the original image. Optimal  . [integer] Height in pixels of the cropped image. The method is chainable. Range is between 1 and 100. saving bandwidth and load time. Example:  // Rotate the image by 45 degrees to the 'left' or anti-clockwise. 'bottom'. Range is between 1 and 100. [integer] Left offset of input image.• • • • [integer] Width in pixels of the cropped image. This method is chainable.  • [integer] Degrees to rotate. 'right'.

// $this->image->save('.  . This method is NOT chainable.'/.. // apply image manipulations $image->save($dir. 350. '/'./new-image.'/'. // Save image to a new file./upload')). // Write the changed image to a new file in the original input folder echo Kohana::debug($image). $_COOKIE and $_SERVER are all converted to utf­8.jpg').'super-cow-crop. Example:  // Reduce image quality to 75 percent of original $this->image->quality(75). POST and COOKIE data are sanitized when the Input library is loaded Loading the library This library is automatically loaded by the controller so you don't need to load it yourself.jpg'). There is no default.  $_POST. The default is to  overwrite the input image file. NULL)->crop(400. 'top')->sharpen(20)->quality(75). // Display some useful info about the operation **for debugging only**. Full Example Place this code into a controller  // The original image is located in folder /application/upload. It is  accessed by $this→input in the controller scope. Input Library The input library is useful for two things: ­ pre­process global input for security ­ provide some  useful functions for retrieving input data  Note:  • • • The $_REQUEST and $_GLOBAL variables are not available within Kohana.'moo. $dir = str_replace('\\'. $image = new Image($dir.percentage is from 75 to 85. Global GET.  • [string] The file path and output image file name. realpath(dirname(__FILE__). // Instantiate the library $image->resize(400. Accepts a relative or absolute file path.  Example:  // Save image and overwrite the input image file $this->image->save(). save() save() Is used to save the image to a file on disk. $_GET. Default is to overwrite input file.jpg').

Methods get() allows you to retrieve GET variables. if global XSS filtering is on (config) then data returned  by this function will be filtered.txt //Note that print statements are for documentation purpose only print Kohana::debug($this->input->get()).txt ) text. It will result in HTML as:  Array ( [articleId] => 123 [file] => text.  cookie() allows you to retrieve COOKIE variables. if global XSS filtering is on (config) then data returned by  this function will be filtered. print Kohana::debug($this->input->post('file')).  • [string] variable to retrieve – default = empty array (returns all variables) . if global XSS filtering is on (config) then data returned by this  function will be filtered.  • [string] variable to retrieve – default = empty array (returns all variables) //POST variables are articleId=123 and file=text.  • [string] variable to retrieve – default = empty array (returns all variables) //URL is http://www.example.txt ) text.txt //Note that print statements are for documentation purpose only print Kohana::debug($this->input->post()).txt You can also manually XSS clean the request by passing TRUE as the second parameter.txt You can also manually XSS clean the request by passing TRUE as the second parameter.php?articleId=123&file=text.com/index. It will result in HTML as:  Array ( [articleId] => 123 [file] => text.  post() allows you to retrieve POST variables. print Kohana::debug($this->input->get('file')).

  ip_address() 'ip_address' returns the IP­address of the user visiting using your webapplication.  server() allows you to retrieve SERVER variables.  • [string] IP address to be validated This function is identical to the IP address validation helper.//COOKIE name is "username" and the contents of this cookie is "aart-jan". the data returned by this function will not be filtered!  .0.  • [string] variable to retrieve – default = empty array (returns all variables) //Note that print statements are for documentation purpose only print Kohana::debug($this->input->server('HTTP_HOST')).  print $this->input->ip_address(). if global XSS filtering is on (config) then data returned  by this function will be filtered. print Kohana::debug($this->input->cookie('username')).  user_agent() 'user_agent' returns the user agent of the current request. Be careful! Even if global XSS filtering is  on.0. It returns '0.0.0'  if there's no IP.1 valid_ip() 'valid_ip' will check whether the specified IP is a valid IPV4 ip­address according to the RFC  specifications. //this example ran on a local server It will result in HTML as:  localhost You can also manually XSS clean the request by passing TRUE as the second parameter. //Note that print statements are for documentation purpose only print Kohana::debug($this->input->cookie()).0. //this example ran on a local server It will result in HTML as:  127. It will result in HTML as:  Array ( [username] => aart-jan ) aart-jan You can also manually XSS clean the request by passing TRUE as the second parameter.

 if you  create a custom method in a Model that extends ORM.  . rv:1.0.0 (Windows. you need to access the Kohana database  library methods as “self::$db→___”. For example:  public function username_exists($name) { return (bool) self::$db->where('username'. Windows NT 6. } ORM conventions In order for ORM to work properly there are some conventions that must be upheld. } } Without passing the $id to the parent. For example. ORM won't work. ORM Library The ORM library is the Object­Relational mapper for Kohana. if you have a table users (plural)  you would have a model User_Model (singular) in your application/models directory as follows:  user.0. nl.11) Gecko/20071127 Firefox/2.  • [string/array] The string or the array of strings to clean echo $this->input->xss_clean($suspect_input).0.11 xss_clean() allows you to clean a string to make sure it is safe. It is not  loaded like other libraries but works in the model.php  class User_Model extends ORM { } If you plan to override the constructor of the ORM model you need this code:  class User_Model extends ORM { public function __construct($id=FALSE) { parent::__construct($id).1. Therefore.8. It provides ways to handle records in  your database as if they were objects and it manages relationships between your tables. This could result in HTML as:  Mozilla/5.print $this->input->user_agent(). $name)->count_records('users'). U. You do not need to put a construct method in every model!  Tutorial: Learn the Basics of the Kohana ORM Library  Important: The ORM library is a complete replacement of the Kohana Model library (it does not  extend the Model class) and creates a “static” connection to the database object.

 user) with _Model appended to the  model name. For instance. So. you could flip the relationship.g.  protected protected protected protected protected $has_one = array(). user_id.a dorm has many students } class Student_Model{ protected $belongs_to=array('dorm'). $users=$user->find_all_by_email('example@example. In the  example of users and roles.g.g  Class Dorm_Model{ protected $has_many=array('students').com'). but ORM restricts finding to objects that “own” other  objects. the users  has_and_belong_to_many roles.a student belongs to (one) dorm } These tutorials can help you with relationships in ORM. It is vital you use pluralization and singularization correctly. e. when a relationship starts with “has_” it shows “ownership”. ORM does not yet support this from both  directions.com'). User_Model Each table has a primary key id (except for join tables) Foreign keys in a table are in the form of {related}_id. the table is called users_roles. but roles just belong_to_many users.  $users=ORM::factory('user')->find_all_by_email('example@example.//plural . because users “own” roles. e. In reality. but you would be able to do $role→find_related_users().• • • • • Table names are plural. if you used roles as the “owner” object.g.  • • A tutorial on the has_one/belongs_to relationship A tutorial on the has_many/belongs_to relationship A note about ORM relationships in Kohana: In ORM. $has_and_belongs_to_many = array(). if tracks belongs_to_many  albums. E.g. when you have users and roles. //equivalent to $user=new User_Model. or if you want to think of it  another way. it  makes sense that the user can find the roles they own.  ORM Factory method You can also use the factory method to make chaining of methods easier. $has_many = array(). you would not be able to do  $user→find_related_roles(). then the table is albums_tracks. Relationships Relationships are declared in the model. . $belongs_to_many = array(). The primary reason for this is  to enable the ORM library to choosewhich table name comes first in a joining/pivot table.  In theory. . $belongs_to = array().g. “parent” and “child”. book_id Join tables are in the form {parent}_{child}. e. users Model names are the singular of the table name (e. e. //singular.

 but you can only use either _and_ or _or_. or  $user->find_by_email_or_username('example@example. } //output emails of all users find_by find_by sets the model to the first record that matches the criterion. You can use any number of values. // see find_all(). echo $user->email. You can also use the second  argument to quickly find a record. //outputs the field email of table users of record with id = 1 $user->find(ALL). finds all records with a certain email address. $user->find_by_email('example@example. eg:  $user->find_by_email_and_password('example@example. 'example').  find_all_by find_all_by returns an array of all records that match the criterion  . A variation is you can use multiple values. $user->delete(). Can also return  all records if you supply the constant ALL  Example  $user=new User_Model().  $user=ORM::factory('user'.  $user=new User_Model. not both. //equivalent to $user=new User_Model(1). Get the user with id=1 and delete it in the second line.com'). $user->find(1). $user->delete(). find_all find_all is equal to find(ALL)  foreach($user->find_all() as $person){ echo $person->email.It gets the user model.com'.  Methods find() find() is used to find a single record in a table if you supply the id of the record. 'secret').1).com'. This method is chainable.

  $user=new User_Model. You can use _and_ or _or_. $users = $user->find_all_by_email('example@example. } add Used with the relationships defined in the model to provide handy relationship methods.  Syntax /** * @param mixed $var Can be an object. remove Removes the $dog from the $pet_enthusiast.$user=new User_Model. or a string which will be found using $model->find($var) * @return bool Can also return the boolean result from $model->save() */ $object->remove_$model(mixed $var). an array of strings which associate to object models.  find_related_ find_related_ returns the all related records. . //finds all related pages to user with id = 1 has Test for existence of relationship. $user->find(1).com').  For example if $has_many = array('dogs') then you may  $pet_enthusiast→add_dog($dog). or a string which will be found using $model->find($var) * @return bool Can also return the boolean result from $model->save() */ $object->add_$model(mixed $var). an array of strings which associate to object models.  For example if $has_many = array('dogs') then you can test for a relationship  if($pet_enthusiast->has_dog($dog)) { echo 'He has a dog!'. just like find_by (see above). $user->find_related_pages(). You must set a relationship in the model for this  to work.  Syntax /** * @param mixed $var Can be an object.

$user->save(). $user->save(). Also resets select and where  as_array Returns the object as an array with key/value pairs. to remove a dog $pet_enthusiast->remove_dog( $dog ).com').  .com delete delete deletes the current object.com' Update example  $user=new User_Model. $user->delete(). $user->find_by_email('test@test. if it does it  uses an UPDATE statement. $user->delete_all(). //will update a the test@test. //will insert a new user into the table with email being 'test@test.Example // For the pet enthusiast. save save saves an object to the database.com user with a new email example@example. //alternate syntax $user->delete(ALL). $user->email('example@example. If it doesn't exist it uses an INSERT statement. $user->find(1).com'.  $user=new User_Model. delete_all delete_all deletes all records in the table.  $user=new User_Model. loaded clear Empties an object setting its properties to ' '.com').  Insert example  $user=new User_Model. $user->email='test@test.

  • Defaults to FALSE $user=new User_Model. find_all() or find(). Using DB Builder methods In Kohana's ORM you can still use some of the methods of the DB builder  Example  //Fetch the latest 10 articles $articles=new Article_Model().'desc')->limit(10)->find_all().  $user=new User_Model.com'). $user->find_by_email('example@example.com'). The following db builder methods cannot be used  • • • • query get list_fields field_data Note: when chaining methods like this. find_by() etc. needs to be last since it  will execute the actual query. $user->auto_save=TRUE.'admin').  . $user->select('email').  auto_save If set to TRUE execute save() on the destruction of the object. $user->where('role'. role should be admin. Will add extra criterion. $articles=$articles->orderby('id'. Will only select the email field.  select Which fields to fetch  $user=new User_Model. If it's set to FALSE and you don't call save() means losing changes made to  the object. $user->find_by_email('example@example.Properties where Which criteria should the query use. You then don't have to call  save() manually.

} } Now find('your_username') as well as new User_Model('your_username') will work. Default Pagination Settings are located in  system/config/pagination. custom  pagination view.  Pagination Library The Pagination library automatically generates styled links like.  The page links are generated using a View file located in system/views/pagination.php. A method is provided to  help calculate SQL offsets. The same goes for new User_Model(1) syntax. You may edit these to suit your needs. it generates links.  The library is easily configurable.php  class User_Model extends ORM { protected function where_key($id = NULL) { return 'name'. You can override the system settings by creating a  pagination config file in your application/config or by passing configuration settings to the  library at run time.  You can expand this method for some extra tricks.php  protected function where_key($id = NULL) { if ( ! empty($id) AND is_string($id) AND ! ctype_digit($id)) { return valid::email($id) ? 'email' : 'username'.e.  user. In your model you  can override the where_key() method so you can change the default criterion field. You may also override the system styles by copying the views to your  application/views/pagination directory.  . Four  styles are provided. find(1)  will return the record with id=1. If so. or you can create a new. If the argument is not a string it is taken  to be an digit and therefore an id and therefore the parent will return the where_key as being 'id'. } Now the method will check if the argument is a string.  user.  Please note that the library does not interact with your data in any way.Changing the where key Be default the find() method will use the 'id' field as a criterion for selecting records. I. « First   <  1  2  3  4  5  >   Last »  for navigating through pages in a website. } return parent::where_key($id).  The links refer to the Page number and Not the offset of the data. it will check for email validity and if  true will say the where_key is 'email' if not it is 'username'. The  developer must write the code that fetches the data referred to by the links.

  $this->pagination->sql_offset().2 create_links() has been renamed to render().php Settings may also be  passed dynamically to the class as an array.  unless you wish to overwrite a config setting dynamically. not an  SQL row number.  $this→pagination→sql_limit() is used to automatically generate SQL code.  $this→pagination→sql_offset() is used to calculate the offset of the row to fetch. This method will automatically calculate the required row offset for you. Access to the library is available through $this→pagination  Methods initialize() $this→pagination→initialize() is used to dynamically set pagination configuration.  echo $this->pagination->sql_limit(). The generated pagination links refer to a logical page number. Please note: The links may also be output by simply  echoing $this→pagination  // Will overwrite the default 'classic' style with 'digg' style $this->pagination->create_links('digg')). // outputs the SQL below .1 – use $this→pagination→sql_limit property  instead.  $this→pagination→create_links() is used to generate the link output for display. create_links() In Kohana 2.  $this->pagination = new Pagination($config).  // Will overwrite only the existing setting for this config item $this->pagination->initialize(array('uri_segment' => 'pages')).Loading the Pagination library Load the Pagination class in your controller using the new keyword  Configuration settings are obtained from config/pagination. with the  correct LIMIT and OFFSET clause for the selected page number. Allows  you to select the pagination style dynamically. from the  current page number and the configured items­per­page setting. // returns sql row offset as an integer sql_limit() Note: this method is deprecated in version 2. for the  selected link page number. It is  automatically called by the library constructor. so there is no need to call this method explicitly.1 – use $this→pagination→sql_offset property instead. sql_offset() Note: this method is deprecated in version 2.

// Just echoing it is enough to display the links (__toString() rocks!) echo 'Classic style: '.$this->pagination.$this->pagination->create_links('digg'). extended.$this->pagination->create_links('punbb'). punbb. // You can also use the create_links() method and pick a style on the fly if you want echo '<hr />Digg style: '. echo 'done in {execution_time} seconds'. // pass a string as uri_segment to trigger former 'label' functionality 'total_items' => 254. digg. or add your own! )).$this->pagination->create_links('extended'). echo '<hr />PunBB style: '. // use db count query here of course 'items_per_page' => 10. // it may be handy to set defaults for stuff like this in config/pagination. echo '<hr />Extended style: '. // base_url will default to current uri 'uri_segment' => 'page'.LIMIT 3 OFFSET 6 Pagination class properties The following pagination class properties are available for use in your controller:  • • • • • • • • • • • url current_page total_pages  current_first_item  current_last_item  first_page  last_page  previous_page  next_page sql_offset  sql_limit Example One $this->pagination = new Pagination(array( // 'base_url' => 'welcome/pagination_example/page/'. This will output:  Classic style:  1 2 3 4 5 6 7 8 9 10 11 13 14 15 16 17 18 19 20 21 22 23 24 25 26 > last         › Digg style:  « previous 1 2 3 4 5 6 7 8 9 10 … 25 26 next         » .php 'style' => 'classic' // pick one from: classic (default).

$content->items = $items->get_items($page_no. // Set our base URL to controller 'items' and method 'page' 'uri_segment' => 'page'. )).  To customize an existing style or create a new pagination style.next”. this is because Pagination uses Kohana::lang to look up the text  from your locale. // page to get starting at offset.g. $items = new Items_Model. You have the option to either rename the existing pagination style to create a completely new  style (e. $this->template->set(array( 'title' => 'Items'. Copy one of the existing pagination styles from system/views/pagination (e.Extended style:  « previous | page 1 of 26 | items 1–10 of 254 | next         » PunBB style:  pages: 1 2 3 … 26  If you are seeing “pagination. } Excerpt from the View. showing how to display the links. 10). do the following:  1. Create a new directory called application/views/pagination 2. 'content' => $content )). number of items to get $this->pagination = new Pagination(array( 'base_url' => 'items/page/'.php”  Example Two Excerpt from the controller method  public function page($page_no) { $content = new View('pages/items').g  classic. Pagination locale text is stored in “system/i18n/[your_locale]/pagination. .php) to application/views/pagination 3.  <h3>Items</h3> <?php echo $this->pagination->create_links() ?> Creating Customized Pagination Styles The default Kohana pagination styles are located in the system/views/pagination directory. // Our URI will look something like http://domain/items/page/19 'total_items' => count($items->get_item_count()) // Total number of items. // Note that other config items are obtained from the pagination config file.php) or keep the same name to override one of the default styles. custom.

  • • • • card_num exp_date cvv description . Usually this  will include some sort of API username/password combination. $authorize_payment = new Payment('Authorize'). $payment->card_num = '1234567890123456'. if ($status = $payment->process() === TRUE) { // Report successful transaction } else { // $status has the error message.g. you must reference the new  custom filename when creating your pagination links (e.  Attributes The payment library has a set of default attributes it uses to send payments to the gateway. and remove the drivers you are not using. Just set the fields required by your driver.  $this→pagination→create_links('custom'))  Payment Library Overview The payment library allows you to easily process e­commerce transactions without having to worry  about all the backend details of connecting and setting up the cURL options. but it differs for each driver.  $payment = new Payment(). After you remove the non­required config lines.Note: If you create a new pagination style (by renaming the file). The  library can support using more than one driver per application by passing the driver name to the  constructor:  $paypal_payment = new Payment('Paypal'). 2. $payment->exp_date = '0510'. modify your driver config as needed. so display an error page based on it } Configuration In system/config/payment. It has many features:  1.php there is a sample config for each payment gateway we support.  Simply copy this file to your application directory. An extremely easy API (only one method required to process a transaction!) Detailed error reporting Extensible with backend drivers to connect to many different payment gateways Support for credit card gateways as well as PayPal­like gateways Using the library is very simple. These  attributes are fairly self explanatory and are listed below. 3. 4. and process().

  $payment = new Payment(). simply call this method in an if test. $attributes = array ( 'card_num' = '1234567890123456'.• • • • • • • • • • • • • • • • • • • • amount tax shipping first_name last_name company address city state zip email phone fax  ship_to_first_name ship_to_last_name ship_to_company ship_to_address ship_to_city ship_to_state ship_to_zip Specific drivers may require some or all of these fields. It currently supports the following gateways:  . $payment->set_fields($attributes). The  method returns TRUE on successful payment transaction or an error string on failure. It is up to you  how to handle the failure. 'exp_date' = '0510' }.  Methods The payment library has a minimal set of methods to use:  set_fields() This method allows you to set bulk payment attributes with an array. After you set your attributes. They may also have driver specific fields  that are noted in the Driver section.  Drivers The payment library uses drivers much like the Database library does in order to keep the API  consistent between payment gateways. process() This method does the magic.

exp_date 3. 5. amount TrustCommerce Required Fields 1. 2. exp_date 3. 5. card_num 2. 3. 4. Authorize. amount Trident Gateway Required Fields 1.net PayPal Authorize. card_num 2. 3.net Required Fields 1.1. exp_date 3. card_num 2.net Trident Gateway TrustCommerce YourPay. 6. card_num exp_date amount tax shipping cvv Driver Specific Details The amount above is the subtotal. amount YourPay. 4. 2.  . Tax and Shipping get added to the amount to form the grand total  inside the driver.net Required Fields 1.

PayPal
Required Fields 1. amount 2. payerid (after paypal authentication) Driver Specific Details Using the PayPal driver is a little different than a normal credit card transaction. It requires two  process() commands to be run. The first one will send the user to PayPal to authenticate, and the  second one will actually run the transaction. Below is an example of this. 
class Paypal_Controller extends Controller { // This will demo a simple paypal transaction. It really only comes down to two steps. function __construct() { parent::__construct(); } login $this->paypal = new Payment();

// This will set up the transaction and redirect the user to paypal to function index() { $this->paypal->amount = 5; $this->paypal->process(); }

// Once the user logs in, paypal redirects them here (set in the config file), which processes the payment function return_test() { $this->paypal->amount = 5; $this->paypal->payerid = $this->input->get('payerid'); echo ($this->paypal->process()) ? "WORKED" : "FAILED"; } // This is the cancel URL (set from the config file) function cancel_test() { echo 'cancelled'; } // Just some utility functions. function reset_session() { $this->session->destroy(); url::redirect('paypal/index'); } function session_status() { echo '<pre>'.print_r($this->session->get(), true); }

}

Writing Your Own Driver
There are many more payment gateways than there are drivers provided by Kohana. We encourage  you to write your own when you encounter a gateway not supported by the library. An easy way to  do it is like so:  1. Add a new entry in config/payment.php with your driver details. Use the previous entries as  an example. 2. Copy the Trident Gateway driver and rename it to *Gateway Name*.php 3. Alter the required fields array as instructed in the gateway's API manual (You have this,  right? ;) 4. Modify the fields array to include all the available relevant fields for the gateway 5. Modify the constructor to set default values from the config file (API username/password for  example) 6. Modify the set_fields() method to do variable translation (for example if your gateway names  cc_num something different. Look in your API manual for details.) 7. Modify the $post_url ternary statement to include the correct test and live mode API URLs 8. Modify how the return statement handles success and error based on what the specific  gateway status message is (Look in you API manual)

Profiler Library
The Profiler adds useful information to the bottom of the current page for debugging and  optimization purposes. 
• •

Benchmarks: The times and memory usage of benchmarks run by the Benchmark library. Database Queries: The raw SQL of queries executed through the Database library as well  as the time taken and number of affected rows. POST Data: The names and values of any POST data submitted to the current page. Session Data: All data stored in the current session if using the Session library. Cookie Data: The names and values of any cookies found for the current domain.

• • •

How to use
To enable the profiler output on your pages simply load the library: 
$this->profiler = new Profiler;

When loaded the profiler will add itself to the system.display event, calling the render() method when the page is being displayed and attaching the output to the bottom of the page.  The profiler can also be added to the library autoload list in config.php and it will automatically  be run on every page of your site. 

How to disable
The automatic rendering of the output can be disabled with the following code: 
$this->profiler->disable()

This is mostly useful when autoloading the profiler to disable the output for certain pages. 

Getting the output
The rendered output may be returned as a string at any time during the page execution by passing  TRUE as the first parameter in render(): 
$output = $this->profiler->render(TRUE)

Note: This will stop any benchmarks currently being run. Only benchmarks and queries that have  been run up until this call will be shown in the output. 

Configure the profiler
Edit config/profiler.php to configure which items (post, cookie, session, database,  benchmarks) the profiler will show.  This change is made to application/config/profiler.php so as to apply only to the  specific application. 
/** * Show everything except database queries. (Other entries are default TRUE, read from system profiler config. */ $config['database'] = FALSE;

A complete profiler.php would look like this 
<?php defined('SYSPATH') or die('No direct script access.'); $config['post'] = FALSE; $config['cookie'] = FALSE; $config['session'] = FALSE; $config['database'] = FALSE; $config['benchmarks'] = TRUE;

Remember to set at least one of the items to TRUE otherwise the profiler will die in a trace error. 

Session Library
Enables applications to persist user state across pages. 

What are sessions?
Sessions enable you to store and retrieve data between requests on a per­user basis. Typically, since  each web page (or AJAX request, etc) is an individual request, there is no way to set a variable in  one request and get it's value in another. Sessions are one of several mechanisms that exist to  overcome this limitation.  Sessions are useful where a small amount of data needs to be persisted across most pages and that  data is specific to the particular browser session. For example, if your website has a “login” page,  you may wish to remember, for one specific web browser only, that a particular user has logged­in.  If you want to store more general data between requests and it is less of an issue that the data be 

regenerate config value).  .  For example.  Note that you do not need to call this method to enable sessions. it will become available. or retrieve data from an existing session. regenerate() $this→session→regenerate() causes the session ID to be regenerated whilst keeping all  the current session data intact.  id() $this→session→id() retrieves the ID of the current session. this is done automatically by the framework after a number of requests for security purposes  (set by the session.associated with only one browser session. including the browser cookie that is  used to identify it. $this->session->id(). The above line of code has two effects:  • • The Session library will be available via $this→session.  echo 'Current session ID: ' . If any current session data exists. Working with sessions The following methods are available in the Session library:  create() $this→session→create() can be called to create a new session. a new  session is automatically started. add the following code to your controller constructor.  destroy() $this→session→destroy() destroys all session data. If no session data exists. It will destroy any current  session data. or to a particular  controller method: Add the code:  $this->session = new Session.  Note. Simply loading the Session library  is enough to create a new session. other mechanisms may be more appropriate:  • •   Kohana's Cache library   PHP's shared memory facility Starting a Session To load the Session library.

In addition to this.'bar'). set() $this→session→set($keys.  // set some_var to some_val $this->session->set('some_var'. If $key is  FALSE. $val = FALSE) is used to set data in the current session. or it can be an  array of “key ⇒ value” pairs (in which case the $val argument is ignored). .  These are:  get() $this→session→get($key = FALSE. to use the session  libraries driver. returns the string 'bar' instead. $value = $this->session->get_once('foo').  • • [mixed] $key specifies the name of the data to retrieve from the session. $value = $this->session->get('foo'. For example. // set several pieces of session data at once by passing an array to set() $this->session->set(array('fish' => 5. If it doesn't exist.  For example. [mixed] $default specifies a default value to be returned if the named data does not exist  in the session. // set some session data $_SESSION['fish'] = 5.Working with session data The Session library arranges for PHP's inbuilt sessions array. get() returns an array containing all of the data in the current session.  // returns value of foo.  // get some session data $data = $_SESSION['fish']. get_once() $this→session→get_once($key) works the same as get() except that it also deletes the  data from the current session afterwards. 'foo' => 'bar')). 'some_value'). $_SESSION. This means that accessing session data can be done in the normal way. For example. $val specifies the value of  that data. the Session library also provides it's own methods to deal with session data. $default = FALSE) retrieves a named value  from the session data.  • • [mixed] $keys can either specify the name of the data to set in the session.  For example.  // returns value of foo and deletes foo from the session. [mixed] if $keys is the name of the data to set in the session.

2 del() has been renamed to delete().  set_flash() $this→session→set_flash($keys. For example. 'Hello. For example.  you wouldn't want to delete your user_message in the example above because it wouldn't have  been shown to the user by the AJAX request. 'bas')). be used to  show a message to a user only once.  $this→session→keep_flash($keys) can be used to keep flash session data for one more  request (aka “freshening” flash data).  As with other session data. flash data is automatically deleted after the next request. // Don't delete messages 1-3 .  $this→session→del($keys) is used to delete a piece of data from the current session.  • [mixed] $keys specifies the name of the piece of data to delete from the session. though. It can also  be an array of several keys to be deleted. [mixed] if $keys is the name of the data to set in the session. // delete several pieces of data from the session by passing an array $this->session->del(array('bar'.del() In Kohana 2. you retrieve flash data using $this→session→get(). 'fish' => 5)). // set several pieces of flash session data at once by passing an array $this->session->set_flash(array('user_message' => 'How are you?'.  // set user_message flash session data $this->session->set_flash('user_message'. It could. $val specifies the value of  that data. for example. For example. $val = FALSE) sets flash data in the current  session. the next request might be an AJAX request for some data.  // delete foo $this->session->del('foo'). how are you?'). In this case. Sometimes this behaviour is not  desired.  • [string] $keys specifies the name(s) of the flash session variables to keep. or it can be an  array of “key ⇒ value” pairs (in which case the $val argument is ignored). // Don't delete the user_message this request $this->session->keep_flash('user_message'). keep_flash() Usually.  • • [mixed] $keys can either specify the name of the data to set in the session. "Flash" session Data “Flash” session data is data that persists only until the next request.

  Configuring a Session Edit the config file application/config/session. 'name' => 'kohanasession'. Session Storage By default session data is stored in a cookie. 'database' or 'native'. The driver can be set to 'cookie'.Number of page loads before the session is regenerated (set to 0 for NO automatic regeneration) * gc_probability . 'storage' => ''.  Using a Database The storage setting in config/session. Freshening multiple or all flash session variables is Kohana 2. Session name and  other configuration options can also be set here. 'encryption' => FALSE.Default session name * validate .php  /* * File: Session * * Options: * driver .  Table schema CREATE TABLE `kohana_session` ( `session_id` varchar(40) NOT NULL. set to FALSE to disable session encryption * expiration . 'validate' => array('user_agent'). used by drivers * name . 'gc_probability' => 2 ).'database' or 'native' * storage .  Optionally you can add a group in config/database.Percentage probability that garbage collection will be executed */ $config = array ( 'driver' => 'cookie'.Number of seconds that each session will last (set to 0 for session which expires on browser exit) * regenerate .$this->session->keep_flash('message1'. You can change this in the file  config/session. . 'message3').2 functionality.php.php must be set to the name of the database table.Encryption key.Session parameters to validate * encryption .  // Don't delete any flash variable $this->session->keep_flash(). If you don't supply any arguments to the function all current flash session variables will be  freshened.Session storage parameter. 'regenerate' => 3. 'expiration' => 7200.Session driver name: 'cookie'. if this is not  found it will use the default. 'message2'.php using the same name.

`data` text NOT NULL.`last_activity` int(10) UNSIGNED NOT NULL. Session::instance()->set('session_item'. Lifetime does not need to be set as it is overridden by the session expiration setting. article 2.  Instance To retrieve the instantiated session library you can use the instance() method. URI Library The URI class provides the methods for working with URI's and URI segments.com/index.  Note: This library is initialized automatically by Kohana. 'requests' => 10000 ).php/article/paris/hilton/ The segments would be:  1.  //url: http://www. If no instance is  available one will be created.  $var = Session::instance()->get('session_item'). 'item value'). $default = FALSE) retrieves a specific URI segment. $config['storage'] = array( 'driver' => 'apc'. Session instance methods can be called directly. PRIMARY KEY (`session_id`) ) Using a Cache The storage setting in config/session. No need to do it yourself  Methods segment() segment($index = 1. paris .example. $var = $session->get('session_item). Returns  $default when the segment does not exist. If you use routing it  also has methods to work with rerouted URI's.php must be set to  Cache config $config['driver'] = 'cache'.  $session=Session::instance().

  echo $this->uri->argument(1).$associative) returns an array of all the URI segments  total_segments() total_segments() returns the number of segments  echo $this->uri->total_segments(). //returns 3 string() string() returns the entire URI as a string  echo $this->uri->string(). // returns: hilton argument() argument() returns the requested arguments.  segment_array() segment_array($offset. it will return the  segment following the string. // Returns 'spears' Note: this method also accepts strings. 'spears'). // Returns FALSE rsegment() Identical to segment() except that it uses the rerouted URI to retrieve the segments from. // returns: array( 'hilton' ) .3.  echo $this->uri->segment('article'). When a string is given as first argument. // Returns 'hilton' echo $this->uri->segment('hilton'). // returns: hilton argument_array() argument_array() returns an array containing all arguments  echo $this->uri->argument_array(). // returns: article/paris/hilton/ last_segment() last_segment() returns the last segment of an URI  echo $this->uri->last_segment(). This differs from segments as it will only look at  the arguments given and skip the controller and method segment. // Returns 'hilton' echo $this->uri->segment(4. // Returns 'paris' echo $this->uri->segment('paris'). hilton echo $this->uri->segment(3).

// returns: 1 build_array() This method only exists in version 2.2. and returns TRUE if this is the case.g.2  User Agent Library This library is deprecated and will no longer be available in Kohana 2. All methods in this library rely on data provided  by the visitor's webbrowser. } is_robot() Checks if the current request is begin made by a robot(e.  Loading the library $this->user_agent = new User_agent. It can then be accessed through $this→user_agent. Pocket IE or Opera mini). so it could be faked.total_arguments() total_arguments() returns the total number of arguments. It's functionality will move  to the Kohana core class. and returns  TRUE if this is the case. } is_mobile() Checks if the current request is begin made by a mobile browser(e. a search engine spider).  Methods is_browser() Checks if the current request is being made by a webbrowser.  echo $this->uri->total_arguments().g.  if ($this->User_agent->is_mobile() == TRUE) { echo 'Hello mobile!'. and  returns TRUE if this is the case.  if ($this->User_agent->is_browser() == TRUE) { echo 'Hello browser!'.  if ($this->User_agent->is_robot() == TRUE) { echo 'Hello robot!'. } .

  • [string] Charset to check for – default = “utf­8” if ($this->User_agent->accept_charset('utf-8') == TRUE) { echo 'I\'m glad you accept UTF-8 charset!'.11) Gecko/20071127 Firefox/2. } accept_charset() The Accept­Charset header specifies the visitor's accepted charsets. The accept_lang checks the Accept­Language header for the specified language. and  returns TRUE if this language is in the Accept­Language Header. } Properties browser Contains the name of the browser.0.0. rv:1. anf alse if this is not the case. and returns TRUE if it is. Windows NT 6.0 (Windows.8. and  FALSE if it isn't.0.  print Kohana::debug($this->User_agent->agent).  • [string] Language to check for – default = 'en' if ($this->User_agent->accept_lang('nl') == TRUE) { // Send result in Dutch if accepted echo 'Hallo wereld!'.g. nl. } else { echo 'Please start supporting UTF-8'.1. It could result in HTML as:  Mozilla/5.11 . 'Firefox' or 'Internet Explorer') print Kohana::debug($this->User_agent->browser). } else { // Send result in English echo 'Hello world!'. agent Contains the complete user agent string.  // Prints name of the browser on screen (e. U.accept_lang() The Accept­Language header specifies in which language the visitor would like his request to be  returned. The accept_charset function checks if the specified charset is found in this header.

2  A new validation library will be released in Kohana 2. if the request has been made by a mobile device.  $validation = new Validation($somearray). The  . The associative array has several keys given the  name of a field assigned in the HTML of the form. That's up to you. It is available in the subversion repository  and is a complete rewrite of the current library. It could result in HTML as:  2.  This library will see significant API changes in Kohana 2. but you'll probably want to handle this differently. $somearray is an array passed to the validation class for approval.11 referrer Contains the referer string. This  probably should be the same one you called it when telling the user what to put in that field. Setup the Rules The rules are setup as an associative array of arrays.2.kohanaphp. It can simply  be $_POST if you desire. is the name you'd like to be used in the error message. The associated value is an array with 2 records.mobile Contains the name of the mobile browser.com/2008/02/23/a­peek­at­kohanas­new­ validation­library/  Getting started Load the Library In the code below. the first record. Validation Library If you're searching for some pre­made validation functions. check the validation helper.  print Kohana::debug($this->User_agent->version). It could result in HTML as:  Opera Mini version Contains the browser version.  The friendly name.0.  Information on its syntax:http://learn.0.  print Kohana::debug($this->User_agent->mobile).  print Kohana::debug($this->User_agent->referer).

50]| valid_email_rfc').30]'). if ($validation->run()) .50]|valid_email_rfc').'=trim|required[5. This will  return true if the array had no validation errors in it. '=trim|required[2.'=trim|required[2. Complete Example Code $validation = new Validation($_POST).  Report the Errors Use the code  $validation->error_string. to run the comparison of your $array that you passed when you initialized the validation. but  you may want to format this a bit more closely. 'LastName' => array('Last Name'. Validating Input Run the validation Use  $validation->run(). It will return false if there was an issue. '=trim|required[2.  $validation->error_format("<li>{message}</li>"). if ( ! empty($_POST)) { $validation->set_rules(array ( // Format: // key friendly name. )).second part is the validation rules.30]'). validation rules 'FirstName' => array('First Name'. 'Email' => array('Email Address'.30]'). you  can run this code before displaying the error string. to return the error in validation. validation rules 'FirstName' => array('First Name'.30]'). '=trim|required[2. 'LastName' => array('Last Name'. such as putting them in a list. )). If this is desired. 'Email' => array('Email Address'. '=trim|required[5. Notice that the string {message} is replaced by the actual error message.  $validation->set_rules(array( // Format: // key friendly name. Rules are a pipe delimited series of methods that are applied to  the string. These are returned in a format that you can show to your users. If you wanted to simply  add a horizontal rule after each one you could code that like this:  $validation->error_format("{message}<hr/>").

//will effectively call $this->validation->valid_password($data). '=trim|required[2.").  E.30] ­ same as required| Return FALSE if form field is  min_length[1]|max_length[30] or  empty.</p> <ul> <?php echo $validation->error_string ?> </ul> <?php } } set_message() Allows customization of the error message that is displayed upon failed validation for a specific  function.  public function _tester($value) { $this->validation->set_message(__FUNCTION__. Rules Rule  required  Parameter  Yes  Description  Example  required[1. Using your own custom callbacks Precede the rule with callback_  Example  array('First Name'. 'omg callback error'). $this->validation->add_error(__FUNCTION__. Please review the following issues with your form and resubmit it.g. $validation->error_format("<li>{message}</li>"). 'callback_valid_password|required[2.30]'). This is very  useful when utilizing custom callback validation functions.30]'). Note: The key name has to match the function name that it corresponds to. 'one').  array('First Name'. or length value is out of  required[30] ­ same as required| range parameters exact_length[30]  . } Using PHP functions on fields Precede the rule with =.{ } else { print("Your form successfully validated. ?> <p>Your form failed validation.

min_length Yes  max_length  Yes  exact_length  Yes  valid_email_ No  rfc  valid_email  No  valid_url  valid_ip  alpha  utf8_alpha  alpha_nume ric  utf8_alpha_ numeric  alpha_dash  utf8_alpha_ dash  digit  utf8_digit  numeric  No  regex  No  depends_on  Yes  range  No  Yes  No  Yes  Return FALSE if length field  value is less than parameter  Return FALSE if length field  value is greater than parameter  Return FALSE if length field  value is not same as parameter  Return FALSE if email is not  rfc822 valid  Return FALSE if email is not  valid  Return FALSE if url is not valid  Return FALSE if ip is not valid  Return FALSE if form field  does not consist only of  alphabetical characters  Return FALSE if form field  does not consist only of  alphabetical or numeric  characters  Returns FALSE if form fields  defined in parameter is not  filled in  depends_on[field_name]  Variable prepping Name  Parameter  Description  prep_for_form  prep_for_url  strip_image_tags  xss_clean  encode_php_tags  .

Helpers .

print ('<br /><br />').'405') ). 'BD' => array('25000'.  Methods rotate() 'rotate' rotates an array (two­dimensional) matrix. FALSE).'650').Array Helper The Array helper assists in transforming arrays via the rotate() and remove() methods. It will result in HTML as:  Array ( [CD] => Array ( [0] => 700 [1] => 780 ) [DVD] => Array ( [0] => 4700 [1] => 650 ) [BD] => Array ( [0] => 25000 [1] => 405 ) ) Array ( [0] => Array ( [CD] => 700 [DVD] => 4700 . print Kohana::debug($optical_discs). 'DVD' => array('4700'. $optical_discs = arr::rotate($optical_discs. '780'). print Kohana::debug($optical_discs). The two arguments are:  • • [array] The array you want to rotate [boolean] Do you want to keep the same keys in the rotated array? – TRUE by default Example:  // Please note that the print() statements are for display only $optical_discs = array ( 'CD' => array('700'.

print Kohana::debug($optical_discs). $cd = arr::remove('CD'. print Kohana::debug($optical_discs). It will result in HTML as:  Array ( [CD] => Array ( [0] => 700 [1] => 780 ) [DVD] => Array ( [0] => 4700 [1] => 650 ) [BD] => Array ( [0] => 25000 [1] => 405 ) ) .  The two arguments are:  • • [string] The key you want removed from an array [array] The array you want the key to be removed from Example:  // Please note that the print() statements are for display only $optical_discs = array ( 'CD' => array('700'.[BD] => 25000 ) [1] => Array ( [CD] => 780 [DVD] => 650 [BD] => 405 ) ) remove() 'remove' removes a key from an array and returns it. print Kohana::debug($cd). '780'). print ('<br />').'650'). print ('<br />'). 'BD' => array('25000'. $optical_discs).'405') ). 'DVD' => array('4700'.

'80'). $my_array). TRUE). [array] The sorted array you want to search in [boolean] Return the nearest value. // FALSE (not found) echo arr::binary_search('45'. // 3 echo arr::binary_search('35'. '50'. // 2 range() Cookie Helper Provides methods for working with COOKIE data. The four arguments are:  • • • • [mixed] The value you want to find. $my_array. or simply return FALSE (the default) [boolean] Sort the array before searching Example:  $my_array = array('10'. '20'. By default. echo arr::binary_search('50'. $my_array.Array ( [0] => 700 [1] => 780 ) Array ( [DVD] => Array ( [0] => 4700 [1] => 650 ) [BD] => Array ( [0] => 25000 [1] => 405 ) ) binary_search() 'binary_search' performs a basic binary search on an array. // 3 echo arr::binary_search('45'. it returns the key of the array  value it finds.  . $my_array). '30'. TRUE).

domain: A valid domain. Default is  FALSE. prefix your domain with a period .  $cookie_value = cookie::get($cookie_name. 6. Only the cookie name is required. $path. $xss_clean = FALSE). Note: Set to 0 (zero) seconds  for a cookie which expires when the browser is closed. $value. until  expired by the browser.com'. Default is '' (Use on  localhost). $secure. secure: The cookie will only be allowed over a secure transfer protocol (HTTPS). ). expire: The cookie lifetime. 'value' => 'Choclate Flavoured Mint Delight'. 'path' => '/'. prefix: A prefix may be set to avoid name collisions. You  may pass parameters to this method as discrete values:  cookie::set($name. httponly: The cookie can be accessed via HTTP only. and not via client scripts.php. $httponly.  Returns FALSE if the cookie item does not exist. Note: Requires at least PHP version 5. This  method is identical cookie::set() but sets the cookie value to '' effectively deleting it.Configuration Default settings for cookies are specified in application/config/cookie. get() cookie::get() accepts multiple parameters. Or you may pass an associative array of values as a parameter:  $cookie_params = array( 'name' => 'Very_Important_Cookie'. $expire. starting from when the cookie is set. for which the cookie may be written. cookie::set($cookie_params).2. Setting the third parameter to TRUE will filter the cookie for unsafe data.  1. For site­wide cookies.example. path: A valid path for which the cookie may be written. 'expire' => '86500'. 5.com 3. Default is  FALSE. 'domain' => '. 2. $prefix. Set the number of seconds the cookie should persist. You may  override these settings by passing parameters to the helper. Default is ''. Only the cookie name is required. 'prefix' => 'one_'.  delete() cookie::delete() accepts multiple parameters. only the cookie name and value are required. $domain. $prefix).0 Methods set() cookie::set() accepts multiple parameters. Default is the root directory '/' 4.example.  .

print ($time). 1987). $time = date::dos2unix($time). Date Helper The Date helper assists in formating dates and times allowing for addition and conversion between  different formats. It will result in HTML as:  317325312 616046400 offset() 'offset' calculates the seconds between two timezones The two arguments are:  • • [int] remote timezone [mixed] use local time? – default is TRUE – else enter your own  Example:  . It will result in HTML as:  616046400 317325312 dos2unix() 'dos2unix' converts DOS time into UNIX time The one arguments is:  • [int] DOS timestamp Example:  // Please note that the print() statements are for display purposes only $time = 317325312. $time = date::unix2dos($time).  Methods unix2dos() 'unix2dos' converts UNIX time into DOS time The one arguments is:  • [int] UNIX timestamp Example:  // Please note that the print() statements are for display purposes only $time = mktime(0. print ($time). 10. 0. print ($time).cookie::delete('stale_cookie'). 31. 0. print ($time).

It will result in HTML as:  -3600 3600 0 seconds() 'seconds' creates an array of numbers based on your input The three arguments are:  • • • [int] step (count by) – default = 1 [int] start number – default = 0 [int] end number – default = 60 Example:  // Please note that the print() statements are for display purposes only print Kohana::debug(date::seconds()).200.'<br />').// Please note that the print() statements are for display purposes only // This example was executed in the EST timezone print (date::offset('CST'). 'GMT'). It will result in HTML as:  Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 [11] => 11 [12] => 12 [13] => 13 [14] => 14 [15] => 15 [16] => 16 [17] => 17 [18] => 18 [19] => 19 [20] => 20 [21] => 21 [22] => 22 [23] => 23 [24] => 24 [25] => 25 [26] => 26 [27] => 27 [28] => 28 [29] => 29 . print Kohana::debug(date::seconds(2.'<br />').'<br />'). print (date::offset('UTC'.1. print (date::offset('CST'.400)). 'MST').7)). print Kohana::debug(date::seconds(100.

) [30] [31] [32] [33] [34] [35] [36] [37] [38] [39] [40] [41] [42] [43] [44] [45] [46] [47] [48] [49] [50] [51] [52] [53] [54] [55] [56] [57] [58] [59] => => => => => => => => => => => => => => => => => => => => => => => => => => => => => => 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Array ( [1] => 1 [3] => 3 [5] => 5 ) Array ( [200] => 200 [300] => 300 ) minutes() Please see seconds.  hours() 'hours' counts the number of hours there are left in a day or from a specific start point The three  arguments are:  • • • [int] step (count by) – default = 1 [boolean] 24­hour time? – default = FALSE [int] start hour – default = 1 Example:  .

date('g'))). print Kohana::debug(date::hours(1. 9)). TRUE. // 24-hour format of an hour without leading zeros It will result in HTML as:  Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 [11] => 11 [12] => 12 ) Array ( [9] => 9 [10] => 10 [11] => 11 [12] => 12 [13] => 13 [14] => 14 [15] => 15 [16] => 16 [17] => 17 [18] => 18 [19] => 19 [20] => 20 [21] => 21 [22] => 22 [23] => 23 ) Array ( [22] => 22 [23] => 23 ) Array ( [18] [19] [20] [21] [22] [23] ) => => => => => => 18 19 20 21 22 23 . TRUE.// Please note that the print() statements are for display purposes only // This example ran at 6:10PM EST print Kohana::debug(date::hours()). 22)). print Kohana::debug(date::hours(1. print Kohana::debug(date::hours(1. TRUE.

2007)). // 24-hour format of an hour without leading zeros It will result in HTML as:  AM PM PM days() 'days' counts the number of days there are in a specific month of a specific year The two arguments  are:  • • [int] month (1­12) [int] year – default: current year Example:  // Please note that the print() statement is for display purposes only print Kohana::debug(date::days(5. It will result in HTML as:  Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 [11] => 11 [12] => 12 [13] => 13 [14] => 14 [15] => 15 [16] => 16 [17] => 17 [18] => 18 [19] => 19 [20] => 20 [21] => 21 [22] => 22 [23] => 23 . print Kohana::debug(date::ampm(date('G'))).ampm() 'ampm' calculates whether the supplied integer makes the hour AM or PM The one argument is:  • [int] hour to calculate Example:  // Please note that the print() statements are for display only // This example ran at 5:45PM EST print Kohana::debug(date::ampm(1)). print Kohana::debug(date::ampm(13)).

It will result in HTML as:  Array ( [2002] [2003] [2004] [2005] [2006] => => => => => 2002 2003 2004 2005 2006 . It will result in HTML as:  Array ( [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 [10] => 10 [11] => 11 [12] => 12 ) years() 'years' returns an array with the years between the specified years.2002)).  Example:  // Please note that the print() statement is for display purposes only print Kohana::debug(date::months()). The two arguments are:  • • [int] start year– default = current year ­ 5 [int] end year – default = current year + 5  Example:  // Please note that the print() statements are for display purposes only // This example ran in 2007 print Kohana::debug(date::years()). print Kohana::debug(date::years(1998.) [24] [25] [26] [27] [28] [29] [30] [31] => => => => => => => => 24 25 26 27 28 29 30 31 months() 'months' returns an mirrored array with the month­numbers of the year.

'minutes')).seconds' Example:  // Please note that the print() statements are for display purposes only // This example ran in 2007 $timestamp = time() . time().minutes. 'years.Kohana::debug(date::timespan($timestamp.hours. time().days.) [2007] [2008] [2009] [2010] [2011] [2012] => => => => => => 2007 2008 2009 2010 2011 2012 Array ( [1998] [1999] [2000] [2001] [2002] ) => => => => => 1998 1999 2000 2001 2002 timespan() 'timespan' returns the time between two timestamps in a human readable format The arguments are:  • • • [int] timestamp 1  [int] timestamp 2 – default: current timestamp [string] format – default: 'years. print 'minutes: '.days')). // timestamp of 651 days ago $timestamp2 = time() . print Kohana::debug(date::timespan($timestamp. print Kohana::debug(date::timespan($timestamp.(60*60*24*7*50). // timestamp of 350 days ago print Kohana::debug(date::timespan($timestamp)). $timestamp2)).(60*60*24*7*31*3). It will result in HTML as:  Array ( [years] => 1 [months] => 9 [weeks] => 2 [days] => 2 [hours] => 0 [minutes] => 0 [seconds] => 0 ) Array ( [years] => 1 [days] => 286 ) Array ( [years] => 0 [months] => 10 [weeks] => 0 [days] => 1 .weeks.months.

/application/downloads/file.  Methods force() 'force' forces a download of a file to the user's browser.txt"). // OR use the defined application path download::force(APPPATH.txt').[hours] => 0 [minutes] => 0 [seconds] => 0 ) minutes: 937440 adjust() 'adjust' converts an hour integer into 24­hour format from a non­24­hour format.txt'). .  • • $filename ­ [string] filename of the file to be downloaded – default = ”” $data ­ [string] data to be sent if the filename does not exists – default = ”” Example:  // File path is relative to the front controller download::force("file.'downloads/file. It will result in HTML as:  23 Download Helper The download helper assists in forcing downloading of files by presenting users with the “save as”  dialog. 'PM')). The two arguments  are:  • • [int] hour in non­24­hour format [string] AM or PM Example:  // Please note that the print() statements are for display only print Kohana::debug(date::adjust(11. // For a file located in application/downloads // Use relative path download::force('. This function is binary­safe and will work  with any MIME type that Kohana is aware of.

Methods connect() send () 'send' sends an e­mail using the specified information.  Configuration The swiftmailer configuration for this helper is found in config/email. $config['options'] = array('hostname'=>'yourhostname'.  .Email Helper An Email helper to work with the Swift email library. // Address can also be array('to@example. More information on client­side page  caching can be found at caching­php­performance  Allows setting a page cache time by sending Last­Modified and Expires headers for the page. $message. Expires Helper Provides methods for managing browser aware page caching. The parameters are:  • • • • • [string] address to send email to [string] address to send email from [string] subject of the email [string] body of the email [boolean] send email as HTML (defaults to false) = 'to@example. $from. = 'This is an example subject'. $subject. If so.com'.php  Inside the config/email. 'username'=>'yourusername'. TRUE). the page is expired and a new  page must be ouput. a 304 not­modified status header and NO data is sent. email::send($to.  Allows checking if the page is older than the page cache time. 'password'=>'yourpassword'.com'. The page is  retrieved by the browser from it's own cache. If not. sendmail.com'. = 'This is an <strong>example</strong> message'. smtp  Example: using smtp  $config['driver'] = 'smtp'. 'port'=>'25').php file you can select the driver type which are native. Example:  $to 'Name') $from $subject $message = 'from@example.

  * [integer] The time in seconds. */ class Welcome_Controller extends Controller { public function index() { . The single parameter is.  Controller:  <?php defined('SYSPATH') or die('No direct script access. Default is 60 seconds. Called internally by expires::set() Returns boolean TRUE if a Last­Modified or Expires header has NOT been sent. Default is 60 seconds. browser page cache.  Example  if (expires::check_headers()) echo 'Safe to send Expires header'. check() expires::check() Determines if a cached page needs to be refreshed. The single parameter is:  • [integer] The time. prevent_output() expires::prevent_output() Has no parameters.Methods set() expires::set() Sets an expiry time for a local. If the page is reloaded within ten seconds.  Example  expires::set(300).'). Called internally by  expires::check() You would not normally call this function directly. as it clears the Kohana  output buffer. the cached page data should be displayed.  Example  expires::prevent_output() // will set Kohana::$output = ''. in seconds.  Example  if (expires::check(300) === FALSE) check_headers() expires::check_headers() Has no parameters. The objective is to cache the page for ten  seconds. until page expires. to add to the last modified time. /** * Default Kohana controller. Full Example The controller outputs a page from a single method.

0/modules/content/" xmlns:feedburner="http://rssnamespace. or local file path [int] maximum amount of items to parse – default = 0 (infinite) $feed = "feed. print Kohana::debug(feed::parse($feed)).  • • [string] remote feed url. but the browser that fetches a locally cached page $welcome->now = date(DATE_RFC822).0" encoding="UTF-8"?> <rss xmlns:content="http://purl. Use the code above on this RSS feed:  <?xml version="1.example.if (expires::check(10) === FALSE) expires::set(10).0" version="2. // We should only see the time updated in the view after 10 seconds // note. it is not this data that is cached.com/article34</link> <description>This article is really cool!</description> <author>Aart-Jan Boor</author> <pubDate>Sat. 08 Dec 2007 12:57:56 GMT</pubDate> </item> .org/rss/1. 08 Dec 2007 13:28:11 GMT</pubDate> </item> <item> <title>Some feed item2</title> <link>http://www.  Methods parse() 'parse' parses a RSS feed and returns the parsed feed as an array. } } View:  <h2>Welcome!</h2> <p>It is now <?php echo $now ?></p> <hr/> Feed Helper The Feed helper assist in the parsing of remote RSS feeds. $welcome->render(TRUE).com/article546</link> <description>This article is really cool too!</description> <author>Aart-Jan Boor</author> <pubDate>Sat.org/feedburner/ext/1. $welcome = new View('welcome').example.xml".0"> <channel> <item> <title>Some feed item</title> <link>http://www.

) . 08 Dec 2007 12:57:56 GMT ) [2] => Array ( [title] => Some feed item3 [link] => http://www. returning the entire string after the last period (. 08 Dec 2007 12:39:42 GMT</pubDate> </item> </channel> </rss> It will result in HTML as:  Array ( [0] => Array ( [title] => Some feed item [link] => http://www.example. 08 Dec 2007 12:39:42 GMT ) ) File Helper A helper designed to manipulate files and filenames.example. 08 Dec 2007 13:28:11 GMT ) [1] => Array ( [title] => Some feed item2 [link] => http://www.com/article34 [description] => This article is really cool! [author] => Aart-Jan Boor [pubDate] => Sat.<item> <title>Some feed item3</title> <link>http://www.example.  Methods extension() 'extension' runs a regular expression check.com/article546 [description] => This article is really cool too! [author] => Aart-Jan Boor [pubDate] => Sat.example.com/article4523 [description] => This article is the best! [author] => Aart-Jan Boor [pubDate] => Sat.com/article4523</link> <description>This article is the best!</description> <author>Aart-Jan Boor</author> <pubDate>Sat.) – also  known as the file extension The parameters are:  • • param: [string] filename to check extension of return: [string] entire string after last period (.

 assuming a .mp3.mp3.### extension. Example:  $file_in = 'humpty_dumpty. Example:  $file = 'humpty_dumpty. The parameters are:  • • • param: [string] split filename. // pretend it is 7.mp3'.mp3'.mp3'.file::mime($file).2) : 'can not find file!' . The parameters are:  • • • • param: [string] file to be split param: [string] directory to output to. if different then an the filename return: [integar] The number of pieces that were joined.ogg' echo $file. The parameters are:  • • param: [string] filename to check MIME­type of return: [mixed] string if found. without . in MB.FALSE.mp3 humpty_dumpty. defaults to the same directory as the file param: [integar] size.' ('. // output name echo file::join($file_in. . conf mime() 'mime' finds the MIME­type of a file first by using PHP's built­in database and then Kohana's  MIME configuration file (system/config/mimes.000 extension param: [string] output filename. FALSE if not found Example:  $file = 'my_movie.Example:  echo file::extension('/etc/apache2/apache2.')'. 4 Directory listing:  -rwxrwxrwx -rw-r--r--rw-r--r--rw-r--r--rw-r--r-1 1 1 1 1 www-data www-data www-data www-data www-data www-data www-data www-data www-data www-data 8186302 2097152 2097152 2097152 1894846 2008-05-06 2008-05-06 2008-05-06 2008-05-06 2008-05-06 20:11 20:15 20:15 20:15 20:15 humpty_dumpty.mp3.mp3.001 humpty_dumpty.$file_out). for each chunk to be return: [integar] The number of pieces that were created.003 humpty_dumpty. my_movie.conf').ogg (application/ogg) split() 'split' splits a file into pieces matching a specific size indicated in megabytes.004 join() 'join' joins splited files (possibly by file::split()).php). // from our last example $file_out = 'humpty_dumpty-back_together_again.002 humpty_dumpty.8 MB large echo (file_exists($file)) ? file::split($file.

002 humpty_dumpty. It does not do validation or  filtering. but the option exists to create them using  php. If you want to generate your forms with validation and filtering you can do so with the  Forge library  Getting Started You'll need to use a line like this to begin the form.mp3 humpty_dumpty.004 humpty_dumpty- Form Helper The Form helper provides methods to assist you in creating forms.  Adding Fields You may add form fields as you would in straight HTML. like  array('id' ⇒ 'forumid'. array $attr.4 Directory listing:  -rwxrwxrwx 1 www-data www-data -rw-r--r-.1 www-data www-data -rw-r--r-. All three can be left blank.  the submission URL will be assumed to be the page being submitted from.  print form::open() To add attributes:  // Submits the page to: domain. 'class'⇒'login_form'). Here are some examples.001 humpty_dumpty. $selected) print form::textarea($data) print form::input($data) Methods open() In order to open the form. . Where $submit is a relative URL like '/class/method' and $attr is an array with attributes.  print form::dropdown($data. using POST to submit  the form to the current page. $options.mp3.mp3.1 www-data www-data back_together_again.mp3. array $hidden ).1 www-data www-data -rw-r--r-. $hidden is an array of  hidden form fields.1 www-data www-data -rw-r--r-.html // CSS class 'search_form' is applied print form::open('products/search'.mp3. If you leave the first blank.tld/products/search. you simply need to: This uses the default values.mp3 8186302 2097152 2097152 2097152 1894846 8186302 2008-05-06 2008-05-06 2008-05-06 2008-05-06 2008-05-06 2008-05-06 20:11 20:15 20:15 20:15 20:15 20:17 humpty_dumpty. array('class'=>'search_form')).003 humpty_dumpty.  print form::open(string $submit.1 www-data www-data -rw-r--r-.

 The parameters are:  • • • [string]/[array] data input name and id or an array of HTML attributes [string] input value. open_multipart() Opens a form for submitting binary data via POST." /> It's not necessary to use all parameters.// Stay on the current page.  Example:  print print print name.for name and id form::input('field_name'. form::input(). when using a name [string] extra string attached to the end of the attributes Example:  print form::input('field_name'. // use only 1 parametr . The parameters are:  • [string]/[array] data for key attributes . // Sending a form to the current page using GET print form::open(''. // use only 2 parameters . array(). Result in HTML:  <input type="text" id="field_name" name="field_name" value="field_value" style="text-align: right."').php/welcome" enctype="multipart/form-data" method="post"> input() Creates an HTML form input tag. // don't use parameters form::input('field_name'). array('type'=>'product')). 'field_value').  Examples:  // Submits multipart form data to the current page print form::open(''. Defaults to a text type. Results in HTML  <form action="http://localhost/index. array('method'=>'get')). You must specify an encoding type attribute of  'multipart/form­data'.for id and value Result in HTML:  <input type="text" id="" name="" value="" /> <input type="text" id="field_name" name="field_name" value="" /> <input type="text" id="field_name" name="field_name" value="field_value" /> hidden() 'hidden' generates a hidden form field. array('enctype' => 'multipart/form-data')). and add a hidden input field named 'type' with value: 'product' print form::open(''. 'field_value'. ' style="text-align: right.

$array=array('field1'=>'value1'. $array=array('name'=>'fieldName'.'value'=>'fieldValue'. echo form::upload($attributes. The parameters are:  • • • [string]/[array] data for key attributes [string] value of the field – default = ”” [string] extra string to be added to the end of the attributes – default = ”” Example:  // Please note that the print() statements are for display purposes only print Kohana::debug(form::password("fieldName".'class'=> 'formField'). print Kohana::debug(form::hidden($array)).'id'=>'fieldId'. 'class' => 'your-class'). print Kohana::debug(form::password($array)).• [string] value of the field – default = ””  Example:  // Please note that the print() statements are for display purposes only print Kohana::debug(form::hidden("fieldName". It will result in HTML as:  <input type="password" id="fieldName" name="fieldName" value="fieldValue" /> <input type="password" id="fieldName" name="fieldName" value="fieldValue"id="fieldId" /> <input type="password" id="fieldId" name="fieldName" value="fieldValue" class="formField" /> upload() Generate HTML form input tag type “file” for upload files:  The parameters are:  • • • [string]/[array] ­ attribute name or array of attributes [string] ­ attribute value [optional] [string] ­ extra additional [optional] Example  $attributes = array('name' => 'file_1'. print Kohana::debug(form::password("fieldName". 'path/to/local/file') Result in HTML:  ."fieldValue". It will result in HTML as:  <input type="hidden" id="fieldName" name="fieldName" value="fieldValue" /> <input type="hidden" id="field1" name="field1" value="value1" /> <input type="hidden" id="field2" name="field2" value="value2" /> password() 'password' generates a password form field."fieldValue")).' id="fieldId"'))."fieldValue")).'field2'=>'value2').

Result in HTML:  <textarea name="field_name" class="our_class">field_value</textarea> dropdown() Creates a drop down selection box. 'value' => 'field_value'.  print form::textarea(string/array $data.<input type="file" name="file_1" value="path/to/local/file" class="your-class" / > textarea() Creates an HTML form textarea tag. 'field_value'). when using input name [string] the option to be selected by default [string] extra string to be added to the end of the attributes – default = ”” Example:  $selection = array('basic' =>'Basic'. 'standard' => 'Standard'. string $value) The parameters are:  • • [string]/[array] textarea name or an array of HTML attributes  [string] textarea value. // The 'standard' option will be the default selection print form::dropdown('input_dropdown'. Look at this example:  print form::textarea(array('name' => 'field_name'. Result in HTML:  <textarea name="field_name">field_value</textarea> We can also use array for the first parameter.'standard'). 'class' => 'our_class')).$selection. Results in HTML  <select id="input_dropdown" name="input_dropdown"> <option value="basic">Basic</option> <option value="standard" selected="selected">Standard</option> <option value="custom">Custom</option> </select> checkbox() Creates a 'tick box' type selection box. The parameters are:  • • • • [string]/[array] input name or array of HTML attributes [array] the select options. 'custom' => 'Custom'). when using a name Example  print form::textarea('field_name'.  .

'is_cute'). 'is_rich'). Example:  print print print print Results in HTML  <label for="check_spam_box">Always send me Spam (Opt in): </label> <input type="checkbox" id="check_spam_box" name="check_spam_box" value="send_spam" /> <label for="check_money_box">Never send me Money (Opt out): </label> <input type="checkbox" id="check_money_box" name="check_money_box" value="send_no_money" checked="checked" /> Browser output:  Always send me Spam (Opt in): Never send me Money (Opt out):  radio() Generates a 'radio' type selection box. 'I am cute: '). similar to checkbox. 'send_no_money'.  The parameters are:  • • • • [string/array] input name or an array of HTML attributes [string] input value. 'Never send me Money (Opt out): '). form::checkbox('check_money_box'. TRUE). form::radio('radio_single_box'. form::label('radio_rich_box'. Example:  print print print print print print Results in HTML  <label for="radio_cute_box">I am cute: </label> <input type="radio" id="radio_cute_box" name="radio_cute_box" value="is_cute" / ><br /> <label for="radio_single_box">I am single: </label> <input type="radio" id="radio_single_box" name="radio_single_box" value="is_single" checked="checked" /><br /> <label for="radio_rich_box">I am rich: </label> <input type="radio" id="radio_rich_box" name="radio_rich_box" value="is_rich" / ><br /> Browser output  . 'is_single'. 'Always send me Spam (Opt in): ').The parameters are:  • • • • [string/array] input name or an array of HTML attributes [string] input value.'<br />'. but allows for easier multiple selections.'<br />'. form::checkbox('check_spam_box'. form::label('radio_single_box'. form::radio('radio_rich_box'. form::label('check_money_box'. 'send_spam'). form::radio('radio_cute_box'. 'I am rich: ').'<br />'. TRUE). when using a name [boolean] make the checkbox checked by default [string] a string to be attached to the end of the attributes form::label('check_spam_box'. when using a name [boolean] make the radio selected by default [string] a string to be attached to the end of the attributes form::label('radio_cute_box'. 'I am single: ').

 when using a name [string] a string to be attached to the end of the attributes Example:  print form::submit('submit'.  The parameters are:  • • • [string/array] input name or an array of HTML attributes [string] input value. when using a name [string] a string to be attached to the end of the attributes Example:  print form::button('button'. 'Image Uploads'). Results in HTML  <label for="imageup">Image Uploads</label> . Note this is not the same as the button associated with input type  'submit' or 'reset'. 'Send'). Results in HTML  <button type="button" id="button" name="button">Does not do Much</button> label() Creates a label for a form entry field. 'Does not do Much'). Results in HTML  <input type="submit" id="submit" name="submit" value="Send" /> button() Creates a button for the form.I am cute:  I am single:  I am rich:  submit() Creates a 'submit' type button for the form.  The parameters are:  • • • [string/array] input name or an array of HTML attributes [string] input value.  The parameters are:  • • • [string/array] label “for” name or an array of HTML attributes [string] label text or HTML [string] a string to be attached to the end of the attributes Example:  print form::label('imageup'.

attributes()
Returns an attribute string, from an array of HTML attributes in key/value format, sorted by form  attributes first.  The parameters are: 

[array] HTML attributes array

Example: 
print form::attributes(array('id' => 'input_name', 'class' => 'submission'));

Outputs 
id="input_name" class="submission"

open_fieldset()
Creates a fieldset opening tag  The parameters are: 
• •

[array] an array of HTML attributes [string] a string to be attached to the end of the attributes

Example: 
print form::open_fieldset(array('class' => 'important'));

Results in HTML 
<fieldset class="important">

close_fieldset()
Generates a fieldset closing tag  Example: 
print form::close_fieldset();

Results in HTML 
</fieldset>

legend()
Creates a legend for describing a fieldset.  The parameters are: 
• • •

[string] legend text or HTML [array] an array of HTML attributes [string] a string to be attached to the end of the attributes

Example: 
print form::legend('More about you', array('id' => 'more_infos'));

Results in HTML 
<legend id="more_infos">More about you</legend>

close()
In order to close the form, you simply need to: 
print form::close()

Or you can set parameter: 
print form::close('</div>')

Result in HTML: 
</form></div>

HTML Helper
The HTML helper assists in calling various elements such as stylesheet, javascript, image links and  anchor links into position. 

Methods
specialchars()
'specialchars' is similar to PHP's htmlspecialchars() function. However, there are some small  differences: 
• • •

It will automatically use the UTF­8 character set in conversion (instead of ISO­8859­1). It will automatically translate both single and double quotes to HTML entities (instead of  only double quotes). It provides built­in fallback functionality for not double encoding existing HTML entities  (for PHP versions older than 5.2.3). [string] The string you want to encode [boolean] Do you want to encode existing HTML entities? – TRUE by default

The two arguments are: 
• •

Example: 
$string = '<p>"I\'m hungry"&mdash;Cookie Monster said.</p>'; echo html::specialchars($string);

It will result in the following HTML: 
&lt;p&gt;&quot;I&#039;m hungry&quot;&amp;mdash;Cookie Monster said.&lt;/p&gt;

When setting the second parameter to FALSE, existing HTML entities are preserved. Look closely  at &mdash;. 
echo html::specialchars($string, FALSE);

&lt;p&gt;&quot;I&#39;m hungry&quot;&mdash;Cookie Monster said.&lt;/p&gt;

query_string()
This method is deprecated and will not be available in Kohana 2.2. Use PHP function  http_build_query() instead  'query_string' creates a HTML query string from an array. The one argument is: 

[array] The string you want to encode

Example: 
echo html::query_string(array ( 'id' => 12, 'page' => 'home' ));

It will result in HTML as: 
id=12&page=home

anchor()
'anchor' creates a HTML anchor (<a href=””></a>), linking an internal page or external site  automatically The four arguments are: 
• • • •

[string] An internal or external page that you would like to link to [string] The title you would like to have show up as the hyperlink [string] Attributes to add to your anchor [string] The protocol your link will use: 'ftp', 'irc', etc. – This is only necessary if it's an  internal page with a non­absolute link for the first argument and you need to change the  protocol from 'http'

Example 1: 
echo html::anchor('home/news', 'Go to our news section!');

It will result in HTML as: 
<a href="http://localhost/home/news">Go to our news section!</a>

Example 2: 
echo html::anchor('irc://irc.freenode.net/kohana', 'Join us on IRC!', 'style="font-size: 20px;"');

It will result in HTML as: 
<a href="irc://irc.freenode.net/kohana" style="font-size: 20px;">Join us on IRC! </a>

file_anchor()
Similar to 'anchor', 'file_anchor' creates a HTML anchor (<a href=””></a>) linking to non­Kohana  resources. Therefore, it will always prefix the site's URL to the path of your file The four arguments 

'id="id432"'.html'. It will result in HTML as:  <a href="http://localhost/media/files/2007-12-magazine.html" id="id432">The Public Linux Archive</a> panchor() Similar to 'anchor'. but accepts the protocol attribute first instead of last The four arguments are:  • • • • [string] The protocol your link will use: ''ftp'. It will result in HTML as:  <a href="ftp://localhost/pub/index. 'Check out our latest magazine!'). – This is only necessary if you need to  change the protocol from 'http' Example 1:  echo html::file_anchor('media/files/2007-12-magazine. '/kohana'. – This is only necessary if it's an  internal page with a non­absolute link for the first argument and you need to change the  protocol from 'http' [string] An internal or external page that you would like to link to [string] The title you would like to have show up as the hyperlink [string] Attributes to add to your anchor Example:  echo html::panchor('irc'.pdf'. 'The Public Linux Archive'.pdf">Check out our latest magazine!</a> Example 2:  echo html::file_anchor('pub/index. It will result in HTML as:  <a href="irc://localhost/kohana">Join us on our custom IRC!</a> mailto() 'mailto' prints a <a href=“mailto:”></a> tag but escapes all characters of the e­mail address into  HTML. The three arguments are:  • • • [string] E­mail address [string] The title you would like to have show up as the hyperlink [string] Attributes to add to your anchor Example:  echo html::mailto('info@example. hex or raw randomly to help prevent spam and e­mail harvesting. 'irc'.are:  • • • • [string] An internal file that you would like to link to [string] The title you would like to have show up as the hyperlink [string] Attributes to add to your anchor [string] The protocol your link will use: 'ftp'. 'ftp'). 'Join us on our custom IRC!'). . 'irc'. etc.com'). etc.

fo&#x40.  alternate) [string or array] Either a string or array with values for the 'type' attribute  (application/rss+xml etc.&#x78.&#116. Linking to stylesheets also uses  the <link> tag but the html::stylesheet() helper can be used for those Arguments  • • • • • [string or array] Either a string with the file's location or an array of files [string or array] Either a string or array with values for the 'rel' attribute (e. defaults to FALSE [string or array] Either a string or array with values for the 'media' attribute (print. stylesheet. array ( 'screen'. Will render the <link> tag.&#108.&#097.  link() 'link' calls files such as feeds internally.css if it is not already present The three  arguments are:  • • • [string or array] Either a string with the file's location or an array of files [string or array] Media type such as 'screen'.fo&#x40.php” in the  URL (this will be the case until you modify this setting as explained in the tutorial from Christophe  http://kohanaphp. 'media/css/menu' ).e&#x2e.&#101.&#x63. screen  etc.">i&#x6e.&#x6f.&#x78.&#105.&#101. 'print' ).g.&#111.) .It will result in HTML as:  <a href="&#109.&#109.com/tutorials/video/working_with_media_files.&#109.mp&#108.</a> stylesheet() 'stylesheet' calls CSS files internally and will suffix .mp&#108. 'print' or 'aural' [boolean] Set to TRUE if you want to have the index.css" media="print" /> Important Don't forget to add a final TRUE parameter if your Kohana frameworks still need “index.) [boolean] set to TRUE to specify the suffix of the file.html).&#x61.e&# x2e. It will result in HTML as:  <link rel="stylesheet" href="http://localhost/media/css/default.&#x6f.php file included in the link – This  makes the difference between processing the request through Kohana (usually a media  controller) or simply calling the file with an absolute path Example:  echo html::stylesheet(array ( 'media/css/default'.&#x63.&#058. FALSE).i&#x6e.css" media="screen" /> <link rel="stylesheet" href="http://localhost/media/css/menu.&#x61 .

array('application/rss+xml'.js"></script> <script type="text/javascript" src="http://localhost/media/js/iefixes.  .html).php file included in the link – This  makes the difference between processing the request through Kohana (usually a media  controller) or simply calling the file with an absolute path Example:  echo html::link(array ( 'welcome/home/rss'.php” in the  URL (this will be the case until you modify this setting as explained in the tutorial from Christophe  http://kohanaphp. It will result in HTML as:  <script type="text/javascript" src="http://localhost/media/js/login.php file included in the link – This  makes the difference between processing the request through Kohana (usually a media  controller) or simply calling the file with an absolute path Example:  echo html::script(array ( 'media/js/login'. FALSE).html). 'media/js/iefixes.com/tutorials/video/working_with_media_files.js"></script> Important Don't forget to add a final TRUE parameter if your Kohana frameworks still need “index. FALSE).• [boolean] Set to TRUE if you want to have the index.php” in the  URL (this will be the case until you modify this setting as explained in the tutorial from Christophe  http://kohanaphp.js' ).js if not present in your file call There are two  arguments are:  • • [string or array] Either a string with the file's location or an array of files [boolean] Set to TRUE if you want to have the index. 'alternate'. It will result in HTML as:  <link rel="alternate" type="application/rss+xml" href="http://localhost/welcome/ home/rss" /> <link rel="alternate" type="application/atom+xml" href="http://localhost/welcome/home/atom" /> Important Don't forget to add a final TRUE parameter if your Kohana frameworks still need “index. 'welcome/home/atom' ).'application/atom+xml') .com/tutorials/video/working_with_media_files.  script() 'script' calls JavaScript files internally and will suffix .

<img src="http://localhost/media/images/thumbs/01. It will result in HTML as:  <a href="http://localhost/media/images/01. 'height' => 100. html::image('media/images/thumbs/01.png'. border-bottom: 1px solid #000. It will result in HTML as:  <img src="http://localhost/media/images/thumbs/01.png').html). 'rel="lightbox"').png').php/' included in the link (to use views to  serve images using Kohana) Example 1:  echo html::image('media/images/thumbs/01.  attributes() 'attributes' parses attributes for a HTML tag from an array There are two arguments are:  • [array] An array of attributes you'd like to add to a HTML tag Example 1:  echo html::attributes( array ( 'style' => 'font-size: 20px.png" rel="lightbox"><img src="http://localhost/media/images/thumbs/01. 'alt' => 'Thumbnail')).com/tutorials/video/working_with_media_files.  There are two arguments are:  • • [string or array] A string to specify the image 'src' attribute or an array of attributes [boolean] Set to TRUE if you want to have '/index.png" width="100" height="100" alt="Thumbnail" /> Example 2 (with html::anchor and lightbox):  echo html::file_anchor('media/images/01. It will result in HTML as:  style="font-size: 20px." rel="lightbox" class="image" .png" /> echo html::image(array('src' => 'media/images/thumbs/01.png'. border-bottom: 1px solid #000. 'width' => '100'. 'class' => 'image' ) ).png" /></a> Important Don't forget to add a final TRUE parameter if your Kohana frameworks still need “index.'.image() 'image' creates a 'img' HTML tag.php” in the  URL (this will be the case until you modify this setting as explained in the tutorial from Christophe  http://kohanaphp. 'rel' => 'lightbox'.

'. border-bottom: 4px solid #000. //returns TRUE inflector::uncountable('book').png'.png" style="font-size: 20px. borderbottom: 4px solid #000. 'See my picture!'." rel="lightbox" class="image">See my picture!</a> breadcrumb() The function returns an array of links for each segment.language')  inflector::uncountable('money'). defaults to using Router::$segments Example:  echo Kohana::debug(html::breadcrumb()). html::attributes( array ( 'style' => 'font-size: 20px. Arguments:  • segments to use as breadcrumbs. It will result in HTML as:  <a href="http://localhost/home/images/01.  Methods uncountable() inflector::uncountable($string) checks whether the given string is an uncountable  word.Example 2 (with html::anchor):  echo html::file_anchor('home/images/01. //returns FALSE . 'class' => 'image' ) ) ).php file. 'rel' => 'lightbox'. Returns TRUE or FALSE.  This method uses a words list from the inflector. located into the system/i18n/en_EN/ folder  (or the language specified in the config item 'locale. will produce the following output:  Array ( [0] => <a href="http://localhost/ajax">Ajax</a> [1] => <a href="http://localhost/ajax/welcome">Welcome</a> [2] => <a href="http://localhost/welcome/text">Text</a> ) Inflector Helper Provides methods for working with the pluralization and singularization of words as well as other  methods to work with phrases.

  inflector::singular('books'). //returns 'Underscores_a_phrase. Note: this function works for  English words only.  If a string is uncountable it will return the string without modification.  inflector::plural('book').  .'). //returns 'Remove underscores from a phrase.' inflector::humanize('Remove-dashes-from-a-phrase. //returns 'books' camelize() inflector::camelize($string) will attempt to camelize the given string.  inflector::humanize('Remove_underscores_from_a_phrase. Returns the  string.' Number Helper Provides methods for rounding integer numbers.  Returns the string.  inflector::camelize('system_initialization').  inflector::underscore('Underscores a phrase.singular() inflector::singular($string) will attempt to singularize the given string. Returns the string. //returns 'Remove dashes from a phrase.'). Returns the  string. Returns the string. If a string is uncountable it will return the string without modification. Note: this function  works for English words only. //returns 'book' plural() inflector::plural($string) will attempt to pluralize the given string. //returns 'systemInitialization' underscore() inflector::underscore($string) makes a phrase underscored instead of spaced.' humanize() inflector::humanize($string) makes a phrase human­readable instead of dashed or  underscored.'). //returns 'systemInitialization' inflector::camelize('system initialization').

example. It will result in HTML as:  <b>Check this image:</b> http://www.jpg .com/example.example.9.  Methods xss_clean() 'xss_clean' behaves the same as xss_clean in the Input library.  Example  // Given an input of: $numbers = array(1.com/example. 5) ?> </p> <?php endforeach ?> This will output as HTML  <p>Rounding numbers to nearest 5</p> <p>Round 1 to 0 </p> <p>Round 3 to 5 </p> <p>Round 5 to 5 </p> <p>Round 9 to 10 </p> <p>Round 99 to 100 </p> <p>Round 999 to 1000 </p> Security Helper The security helper assist in verifying the security of use input.99.3. and a nearest integer number to  round too.  • [string] String to be cleansed strip_image_tags() 'strip_image_tags()' strips the image tags out of a string and returns the string trimmed without the  image tags.5. print Kohana::debug(security::strip_image_tags($string)).jpg" />'. An integer to round.  • [string] String to be stripped $string = '<b>Check this image:</b> <img src="http://www.999). <p>Rounding numbers to nearest 5</p> <?php foreach ($numbers as $number): ?> <p>Round <?php echo $number ?> to <?php echo num::round($number.Methods round() num::round() accepts two arguments. defaults to 5.

$short_description = text::limit_words($long_description. Only the input string is required. print Kohana::debug(security::encode_php_tags($string)). $end_char.'. It will result in HTML as:  &lt. Text Helper Provides methods for working with Text. Generates:  The rain in Spain limit_chars() text::limit_chars() accepts multiple parameters.nbsp. $preserve_words). The number of parameters determines the  .  Methods limit_words() text::limit_words() accepts multiple parameters. Generates:  The r alternate() text::alternate() accepts multiple parameters. $preserve_words = FALSE.  $long_description = 'The rain in Spain falls mainly in the plain'. $limit. The  default end character is the ellipsis.  $long_description = 'The rain in Spain falls mainly in the plain'. $limit.nbsp.'. Only the input string is required. $limit = 4. The  default end character is the ellipsis.encode_php_tags() 'encode_php_tags' replaces PHP tags in a string with their corresponding HTML entities. $limit = 4.?php echo "<b>Hello World!</b>" ?&gt. $end_char = '&amp. $short_description = text::limit_chars($long_description.  • [string] String to santize $string = '<?php echo "<b>Hello World!</b>" ?>'. $end_char). $end_char = '&amp.

// Outputs: path/to/something ?> censor() text::censor() accepts multiple optional parameters.  Possible values for $type are:  • • • • • • alnum ­ 0­9. echo text::censor($str. but telemarketers are ****.'. $replacement = '*'. but telemarketers are scum. This is handy if you loop through something and you for example want to alternate the  color of a table row.'2'. $badwords = array('tax'. bytes() text::bytes($bytes.  <?php $str = "path/to//something". the characters passed in will be used. echo reduce_slashes($str).  • $bytes ­ Supply the number of bites . echo text::random($type = 'alnum'.$force_unit.$format. } //returns 12boom12 random() text::random() accepts multiple optional parameters.  for($i=0:$i<5:$i++) { echo text::alternate('1'.$si) Returns a human readable size. $length = 10). $replace_partial_words = FALSE). a­z and A­Z alpha ­ a­z. A­Z numeric ­ 0­9 nozero ­ 1­9 distinct ­ Only distinct characters that can't be mistaken for others. The input string and an array of marker  words is required. 'scum'). Generates:  The income *** is a three letter word.alternation.'boom'). Returns a string with the marker words censored by the specified replacement  character. $badwords. $replacement. Returns a random text string of specified  length. reduce_slashes() text::reduce_slashes() reduces multiple slashes in a string to single slashes. For values that don't match any of the above.  $str = 'The income tax is a three letter word.

. Donec . //returns 4.  • $string ­ String with potential widow words $paragraph='Lorem ipsum dolor sit amet.'GiB'). FALSE). Generates  . $paragraph=text::widont($paragraph). URL Helper Provides methods for working with URL(s). Via the second parameter  you can overwrite the default site_protocol from config.05 kB text::bytes('4194304'.) else  will return SI prefixes (kB.  It's considered bad style. NULL. GB etc) text::bytes('2048').php.00 MiB echo echo echo echo widont() text::widont() Returns a string without widow words by inserting a non­breaking space  between the last two words. MiB etc.php' echo url::base(TRUE.NULL.30 kB text::bytes('4194304'. consectetuer adipiscing elit. 'https').00 GiB text::bytes('4194304'. Set the first parameter to TRUE if you want to  append the index_page defined in config.php. MB.'. //returns 0. A widow word is a single word at the end of a paragraph on a new line. //returns 2. Cras id dolor.php to the base URL. when FALSE function will return IEC prefixes (KiB..  // site_domain = 'localhost/kohana/' // site_protocol = 'http' // index_page = 'index.'kB'). //returns 4194.• • • $force_unit ­ defaults to NULL when supplied the function will return in those units.  Methods base() url::base() returns the base URL defined by the site_protocol and site_domain in  config. Generates  http://localhost/kohana/ url::base() accepts two optional parameters.  // site_domain = 'localhost/kohana/' // site_protocol = 'http' echo url::base(). $format ­ format of the return string $si ­ Defaults to TRUE.

php/welcome/home. This method accepts one optional parameter. Generates  https://localhost/kohana/admin/login.  // // // // site_domain = 'localhost/kohana/' site_protocol = 'http' index_page = 'index. Generates  http://localhost/kohana/index.  The second one allows you to overwrite the default site_protocol from config.php.html current() url::current() returns the current URI string. 'https').html?query=string echo url::current().html' echo url::site().html' echo url::site('admin/login'. site_domain.html url::site() accepts two optional parameters.php.php site() url::site() returns a URL based on the site_protocol.html' // Current URL: http://localhost/kohana/index.php' url_suffix = '. Returns  welcome/home While  echo url::current(TRUE).  // // // // site_domain = 'localhost/kohana/' site_protocol = 'http' index_page = 'index. If  you set it to TRUE the query string will be included in the return value. index_page. Returns  welcome/home?query=string .  // // // // site_domain = 'localhost/kohana/' site_protocol = 'http' index_page = '' url_suffix = '.php' url_suffix = '. You can pass URL segments via the first one.  url_suffix defined in config.https://localhost/kohana/index.php/.

 there is no standard defined behavior for  what a user agent should do upon receiving a 300 and the list could be used to present the user with  the choices you have given. will be deleted. '_'). except for dashes or underscores  (depending on the second parameter). the input  title string. It currently features validation for email­addresses. However.  // site_domain = 'localhost/kohana/' // site_protocol = 'http' url::redirect('aboutus'.  $input_title = ' __Ecléçtic__ title\'s echo url::title($input_title. 301).kohana. entered by cràzed users.?> '.  The optional second parameter can be used to set the redirect method.php/').  . provide an array of URIs to the redirect  method:  url::redirect(array('aboutus'. 300).  url::redirect('http://www.  Valid Helper Provides methods for validating inputs. Will redirect the browser to the White House website.php. The first URI in the array is considered the preferred URI and will be placed in the Location header.'http://www. the URL title is converted to lowercase. ip's.  Finally.whitehouse.  redirect() url::redirect() generates an HTTP Server Header (302).gov'). digits/numbers and text.  url::redirect() will always call the php exit function to prevent further script execution.  url's. Will redirect with a 301 header to http://localhost/kohana/aboutus. The optional second parameter is used to set the separator character. is mandatory. which will redirect the browser to a  specified URL. by default site_domain defined in config. non­ascii characters will first be  transliterated (for example: à becomes a) in order to keep the URL title as readable as possible.title() url::title() returns a properly formatted title. The first parameter. You can only change this to an underscore. The default is 302. However. By  default this is a dash. for use in a URI. Generates:  eclectic_titles_entered_by_crazed_users What happens to the input title? All non­alphanumeric characters.  If you wish to send a Multiple Choice (300) redirect. Generally the browser will follow the  location header and this list will never be seen.  All of the URIs will then be output in a HTML unordered list.

if(valid::url($url.kohanaphp.ftp) – default = “http” $url = 'http://www. if(valid::email($email) == true){ echo "Valid email". This validation is less strict than the valid::email() function. if(valid::url($url) == true){ echo "Valid URL". }else{ echo "Invalid email".com'.kohanaphp.  • • [string] URL to be validated [string] protocol of the URL (e.com'.g. } It will result in HTML as:  Valid email email_rfc() 'email_rfc' validates an emailaddress based on the RFC specifications  (http://www.Methods email() 'email' check whether an emailaddress is valid. http.  • [string] Email address to validate $email = 'bill@gates. }else{ echo "Invalid email". } It will result in HTML as:  Valid email url() 'url' does some simple validation on an URL to find out it if it could be existing. }else{ .w3. } It will result in HTML as:  Valid URL $url = 'ftp://ftp. }else{ echo "Invalid URL"."ftp") == true){ echo "Valid URL".com'.org/Protocols/rfc822/). if(valid::email($email) == true){ echo "Valid email".com'. It is more strict then the valid::email_rfc() method.  • [string] Email address to validate $email = 'bill@gates.

181. }else{ echo "Invalid string". }else{ echo "Invalid string".678. } It will result in HTML as:  Valid URL ip() 'ip' validates an IP­address to make sure it could exist. } It will result in HTML as:  Valid IP alpha() 'alpha' checks whether a string consists of alphabetical characters only  • • [string] String to be validated [boolean] If true UTF­8 mode will be used – default = FALSE $string="KohanaPHP is cool". } .456. }else{ echo "Invalid IP". } It will result in HTML as:  Invalid string $string="KohanaPHPiscool". but does not guarantee it actually does.41". if(valid::alpha($string) == true){ echo "Valid string". if(valid::alpha($string) == true){ echo "Valid string".130.  • [string] IP­address to be validated $ip="123. if(valid::ip($ip) == true){ echo "Valid IP". } It will result in HTML as:  Invalid IP $ip="65.echo "Invalid URL". if(valid::ip($ip) == true){ echo "Valid IP". }else{ echo "Invalid IP".912".

}else{ echo "Invalid string". } It will result in HTML as:  Invalid string $string="KohanaPHPVersion2iscool". }else{ echo "Invalid string". } .It will result in HTML as:  Valid string alpha_numeric() 'alpha_numeric' checks whether a string consists of alphabetical characters and numbers only  • • [string] String to be validated [boolean] If true UTF­8 mode will be used – default = FALSE $string="KohanaPHP Version 2 is cool". if(valid::alpha_dash($string) == true){ echo "Valid string". } It will result in HTML as:  Valid string alpha_dash() 'alpha_dash' checks whether a string consists of alphabetical characters. if(valid::alpha_numeric($string) == true){ echo "Valid string". } It will result in HTML as:  Invalid string $string="KohanaPHP_Version-2-is_cool". }else{ echo "Invalid string". if(valid::alpha_numeric($string) == true){ echo "Valid string". underscores and  dashes only  • • [string] String to be validated [boolean] If true UTF­8 mode will be used – default = FALSE $string="KohanaPHP Version 2 is cool". }else{ echo "Invalid string". if(valid::alpha_dash($string) == true){ echo "Valid string". numbers.

It will result in HTML as:  Valid string digit() 'digit' checks whether a string consists of digits only (no dots or dashes)  • • [string] String to be validated [boolean] If true UTF­8 mode will be used – default = FALSE $digits = "23424. } It will result in HTML as:  Valid standard_text() . }else{ echo "Invalid". }else{ echo "Invalid". } It will result in HTML as:  Invalid $digits = "2342432". if(valid::digit($digits) == true){ echo "Valid". if(valid::numeric($number) == true){ echo "Valid". if(valid::digit($digits) == true){ echo "Valid".32".32". }else{ echo "Invalid". } It will result in HTML as:  Valid numeric() 'numeric' checks whether a string is a valid number (negative and decimal numbers allowed)  $number = "-23424.

Sign up to vote on this title
UsefulNot useful