| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 | <?php namespace System;class Form {	/**	 * Stores labels names.	 *	 * @var array	 */	private static $labels = array();	/**	 * Open a HTML form.	 *	 * @param  string  $action	 * @param  string  $method	 * @param  array   $attributes	 * @param  bool    $https	 * @return string	 */		public static function open($action = null, $method = 'POST', $attributes = array(), $https = false)	{		$attributes['action'] = HTML::entities(URL::to(((is_null($action)) ? Request::uri() : $action), $https));		// If the request method is PUT or DELETE, we'll default the request method to POST		// since the request method is being spoofed by the form.		$attributes['method'] = ($method == 'PUT' or $method == 'DELETE') ? 'POST' : $method;		if ( ! array_key_exists('accept-charset', $attributes))		{			$attributes['accept-charset'] = Config::get('application.encoding');					}		$html = '<form'.HTML::attributes($attributes).'>';		// If the request method is PUT or DELETE, create a hidden input element with the		// request method in it since HTML forms do not support these two methods.		if ($method == 'PUT' or $method == 'DELETE')		{			$html .= PHP_EOL.static::input('hidden', 'REQUEST_METHOD', $method);		}		return $html.PHP_EOL;	}	/**	 * Open a HTML form with a HTTPS action.	 *	 * @param  string  $action	 * @param  string  $method	 * @param  array   $attributes	 * @return string	 */	public static function open_secure($action = null, $method = 'POST', $attributes = array())	{		return static::open($action, $method, $attributes, true);	}	/**	 * Open a HTML form that accepts file uploads.	 *	 * @param  string  $action	 * @param  string  $method	 * @param  array   $attributes	 * @param  bool    $https	 * @return string	 */		public static function open_for_files($action = null, $method = 'POST', $attributes = array(), $https = false)	{		$attributes['enctype'] = 'multipart/form-data';		return static::open($action, $method, $attributes, $https);	}	/**	 * Open a HTML form that accepts file uploads with a HTTPS action.	 *	 * @param  string  $action	 * @param  string  $method	 * @param  array   $attributes	 * @return string	 */		public static function open_secure_for_files($action = null, $method = 'POST', $attributes = array())	{		return static::open_for_files($action, $method, $attributes, true);	}	/**	 * Close a HTML form.	 *	 * @return string	 */	public static function close()	{		return '</form>';	}	/**	 * Generate a hidden field containing the current CSRF token.	 *	 * @return string	 */	public static function token()	{		return static::input('hidden', 'csrf_token', static::raw_token());	}	/**	 * Retrieve the current CSRF token.	 *	 * @return string	 */	public static function raw_token()	{		if (Config::get('session.driver') == '')		{			throw new \Exception('Sessions must be enabled to retrieve a CSRF token.');					}		return Session::get('csrf_token');	}	/**	 * Create a HTML label element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */			public static function label($name, $value, $attributes = array())	{		static::$labels[] = $name;		return '<label for="'.$name.'"'.HTML::attributes($attributes).'>'.HTML::entities($value).'</label>'.PHP_EOL;	}	/**	 * Create a HTML input element.	 *	 * @param  string  $name	 * @param  mixed   $value	 * @param  array   $attributes	 * @return string	 */			public static function input($type, $name, $value = null, $attributes = array())	{		$id = static::id($name, $attributes);		return '<input'.HTML::attributes(array_merge($attributes, compact('type', 'name', 'value', 'id'))).'>'.PHP_EOL;	}	/**	 * Create a HTML text input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */	public static function text($name, $value = null, $attributes = array())	{		return static::input('text', $name, $value, $attributes);	}	/**	 * Create a HTML password input element.	 *	 * @param  string  $name	 * @param  array   $attributes	 * @return string	 */			public static function password($name, $attributes = array())	{		return static::input('password', $name, null, $attributes);	}	/**	 * Create a HTML hidden input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */	public static function hidden($name, $value = null, $attributes = array())	{		return static::input('hidden', $name, $value, $attributes);	}	/**	 * Create a HTML search input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */			public static function search($name, $value = null, $attributes = array())	{		return static::input('search', $name, $value, $attributes);	}	/**	 * Create a HTML email input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */			public static function email($name, $value = null, $attributes = array())	{		return static::input('email', $name, $value, $attributes);	}	/**	 * Create a HTML telephone input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */			public static function telephone($name, $value = null, $attributes = array())	{		return static::input('tel', $name, $value, $attributes);	}	/**	 * Create a HTML URL input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */			public static function url($name, $value = null, $attributes = array())	{		return static::input('url', $name, $value, $attributes);	}	/**	 * Create a HTML number input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */			public static function number($name, $value = null, $attributes = array())	{		return static::input('number', $name, $value, $attributes);	}	/**	 * Create a HTML file input element.	 *	 * @param  string  $name	 * @param  array   $attributes	 * @return string	 */				public static function file($name, $attributes = array())	{		return static::input('file', $name, null, $attributes);	}	/**	 * Create a HTML textarea element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */	public static function textarea($name, $value = '', $attributes = array())	{		$attributes = array_merge($attributes, array('id' => static::id($name, $attributes), 'name' => $name));		if ( ! isset($attributes['rows'])) $attributes['rows'] = 10;		if ( ! isset($attributes['cols'])) $attributes['cols'] = 50;		return '<textarea'.HTML::attributes($attributes).'>'.HTML::entities($value).'</textarea>'.PHP_EOL;	}	/**	 * Create a HTML select element.	 *	 * @param  string  $name	 * @param  array   $options	 * @param  string  $selected	 * @param  array   $attributes	 * @return string	 */		public static function select($name, $options = array(), $selected = null, $attributes = array())	{		$attributes = array_merge($attributes, array('id' => static::id($name, $attributes), 'name' => $name));		$html = array();		foreach ($options as $value => $display)		{			$option_attributes = array('value' => HTML::entities($value), 'selected' => ($value == $selected) ? 'selected' : null);			$html[] = '<option'.HTML::attributes($option_attributes).'>'.HTML::entities($display).'</option>';		}		return '<select'.HTML::attributes($attributes).'>'.implode('', $html).'</select>'.PHP_EOL;	}	/**	 * Create a HTML checkbox input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  bool    $checked	 * @param  array   $attributes	 * @return string	 */	public static function checkbox($name, $value = null, $checked = false, $attributes = array())	{		return static::checkable('checkbox', $name, $value, $checked, $attributes);	}	/**	 * Create a HTML radio button input element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  bool    $checked	 * @param  array   $attributes	 * @return string	 */	public static function radio($name, $value = null, $checked = false, $attributes = array())	{		return static::checkable('radio', $name, $value, $checked, $attributes);	}	/**	 * Create a checkable input element.	 *	 * @param  string  $type	 * @param  string  $name	 * @param  string  $value	 * @param  bool    $checked	 * @param  array   $attributes	 * @return string	 */	private static function checkable($type, $name, $value, $checked, $attributes)	{		$attributes = array_merge($attributes, array('id' => static::id($name, $attributes), 'checked' => ($checked) ? 'checked' : null));		return static::input($type, $name, $value, $attributes);	}	/**	 * Create a HTML submit input element.	 *	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */	public static function submit($value, $attributes = array())	{		return static::input('submit', null, $value, $attributes);	}	/**	 * Create a HTML reset input element.	 *	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */	public static function reset($value, $attributes = array())	{		return static::input('reset', null, $value, $attributes);	}	/**	 * Create a HTML image input element.	 *	 * @param  string  $url	 * @param  array   $attributes	 * @return string	 */	public static function image($url, $name = null, $attributes = array())	{		$attributes['src'] = URL::to_asset($url);		return static::input('image', $name, null, $attributes);	}	/**	 * Create a HTML button element.	 *	 * @param  string  $name	 * @param  string  $value	 * @param  array   $attributes	 * @return string	 */	public static function button($value, $attributes = array())	{		return '<button'.HTML::attributes($attributes).'>'.HTML::entities($value).'</button>'.PHP_EOL;	}	/**	 * Determine the ID attribute for a form element.	 *	 * An explicitly specified ID in the attributes takes first precedence, then	 * the label names will be checked for a label matching the element name.	 *	 * @param  string  $name	 * @param  array   $attributes	 * @return mixed	 */	private static function id($name, $attributes)	{		if (array_key_exists('id', $attributes)) return $attributes['id'];		if (in_array($name, static::$labels)) return $name;	}}
 |