diff options
author | Bharat Mediratta <bharat@menalto.com> | 2008-12-15 09:22:32 +0000 |
---|---|---|
committer | Bharat Mediratta <bharat@menalto.com> | 2008-12-15 09:22:32 +0000 |
commit | 93977e579cca9a9d0df28099e1fb7596bcc1c825 (patch) | |
tree | 6968d4a9f4a3cadb332e23e8e807748eccd25deb /modules/forge/libraries/Forge.php | |
parent | 4fe895a2c473cd22e4741552186fe2be48503167 (diff) |
Refresh of Forge r168 from vendor/forge/modified
Diffstat (limited to 'modules/forge/libraries/Forge.php')
-rw-r--r-- | modules/forge/libraries/Forge.php | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/modules/forge/libraries/Forge.php b/modules/forge/libraries/Forge.php new file mode 100644 index 00000000..f6bca42b --- /dev/null +++ b/modules/forge/libraries/Forge.php @@ -0,0 +1,319 @@ +<?php +/** + * FORGE (FORm GEneration) library. + * + * $Id$ + * + * @package Forge + * @author Kohana Team + * @copyright (c) 2007-2008 Kohana Team + * @license http://kohanaphp.com/license.html + */ +class Forge_Core { + + // Template variables + protected $template = array + ( + 'title' => '', + 'class' => '', + 'open' => '', + 'close' => '', + ); + + // Form attributes + protected $attr = array(); + + // Form inputs and hidden inputs + public $inputs = array(); + public $hidden = array(); + + // Error message format, only used with custom templates + public $error_format = '<p class="error">{message}</p>'; + public $newline_char = "\n"; + + /** + * Form constructor. Sets the form action, title, method, and attributes. + * + * @return void + */ + public function __construct($action = NULL, $title = '', $method = NULL, $attr = array()) + { + // Set form attributes + $this->attr['action'] = $action; + $this->attr['method'] = empty($method) ? 'post' : $method; + + // Set template variables + $this->template['title'] = $title; + + // Empty attributes sets the class to "form" + empty($attr) and $attr = array('class' => 'form'); + + // String attributes is the class name + is_string($attr) and $attr = array('class' => $attr); + + // Extend the template with the attributes + $this->attr += $attr; + } + + /** + * Magic __get method. Returns the specified form element. + * + * @param string unique input name + * @return object + */ + public function __get($key) + { + if (isset($this->inputs[$key])) + { + return $this->inputs[$key]; + } + elseif (isset($this->hidden[$key])) + { + return $this->hidden[$key]; + } + } + + /** + * Magic __call method. Creates a new form element object. + * + * @throws Kohana_Exception + * @param string input type + * @param string input name + * @return object + */ + public function __call($method, $args) + { + // Class name + $input = 'Form_'.ucfirst($method); + + // Create the input + switch (count($args)) + { + case 1: + $input = new $input($args[0]); + break; + case 2: + $input = new $input($args[0], $args[1]); + break; + default: + throw new Kohana_Exception('forge.invalid_input', $input); + } + + if ( ! ($input instanceof Form_Input) AND ! ($input instanceof Forge)) + throw new Kohana_Exception('forge.unknown_input', get_class($input)); + + $input->method = $this->attr['method']; + + if ($name = $input->name) + { + // Assign by name + if ($method == 'hidden') + { + $this->hidden[$name] = $input; + } + else + { + $this->inputs[$name] = $input; + } + } + else + { + // No name, these are unretrievable + $this->inputs[] = $input; + } + + return $input; + } + + /** + * Set a form attribute. This method is chainable. + * + * @param string|array attribute name, or an array of attributes + * @param string attribute value + * @return object + */ + public function set_attr($key, $val = NULL) + { + if (is_array($key)) + { + // Merge the new attributes with the old ones + $this->attr = array_merge($this->attr, $key); + } + else + { + // Set the new attribute + $this->attr[$key] = $val; + } + + return $this; + } + + /** + * Validates the form by running each inputs validation rules. + * + * @return bool + */ + public function validate() + { + $status = TRUE; + + $inputs = array_merge($this->hidden, $this->inputs); + + foreach ($inputs as $input) + { + if ($input->validate() == FALSE) + { + $status = FALSE; + } + } + + return $status; + } + + /** + * Returns the form as an array of input names and values. + * + * @return array + */ + public function as_array() + { + $data = array(); + foreach (array_merge($this->hidden, $this->inputs) as $input) + { + if (is_object($input->name)) // It's a Forge_Group object (hopefully) + { + foreach ($input->inputs as $group_input) + { + if ($name = $group_input->name) + { + $data[$name] = $group_input->value; + } + } + } + else if (is_array($input->inputs)) + { + foreach ($input->inputs as $group_input) + { + if ($name = $group_input->name) + { + $data[$name] = $group_input->value; + } + } + } + else if ($name = $input->name) // It's a normal input + { + // Return only named inputs + $data[$name] = $input->value; + } + } + return $data; + } + + /** + * Changes the error message format. Your message formatting must + * contain a {message} placeholder. + * + * @throws Kohana_Exception + * @param string new message format + * @return void + */ + public function error_format($string = '') + { + if (strpos((string) $string, '{message}') === FALSE) + throw new Kohana_Exception('validation.error_format'); + + $this->error_format = $string; + } + + /** + * Creates the form HTML + * + * @param string form view template name + * @param boolean use a custom view + * @return string + */ + public function render($template = 'forge_template', $custom = FALSE) + { + // Load template + $form = new View($template); + + if ($custom) + { + // Using a custom view + + $data = array(); + foreach (array_merge($this->hidden, $this->inputs) as $input) + { + $data[$input->name] = $input; + + // Groups will never have errors, so skip them + if ($input instanceof Form_Group) + continue; + + // Compile the error messages for this input + $messages = ''; + $errors = $input->error_messages(); + if (is_array($errors) AND ! empty($errors)) + { + foreach ($errors as $error) + { + // Replace the message with the error in the html error string + $messages .= str_replace('{message}', $error, $this->error_format).$this->newline_char; + } + } + + $data[$input->name.'_errors'] = $messages; + } + + $form->set($data); + } + else + { + // Using a template view + + $form->set($this->template); + $hidden = array(); + if ( ! empty($this->hidden)) + { + foreach ($this->hidden as $input) + { + $hidden[$input->name] = $input->value; + } + } + + $form_type = 'open'; + // See if we need a multipart form + $check_inputs = array($this->inputs); + while ($check_inputs) { + foreach (array_shift($check_inputs) as $input) { + if ($input instanceof Form_Upload) + { + $form_type = 'open_multipart'; + } + if ($input instanceof Form_Group) + { + $check_inputs += array($input->inputs); + } + } + } + + // Set the form open and close + $form->open = form::$form_type(arr::remove('action', $this->attr), $this->attr, $hidden); + $form->close = form::close(); + + // Set the inputs + $form->inputs = $this->inputs; + } + + return $form; + } + + /** + * Returns the form HTML + */ + public function __toString() + { + return (string) $this->render(); + } + +} // End Forge |