Moving model and field information into view

git-svn-id: https://svn.cakephp.org/repo/branches/1.2.x.x@3443 3807eeeb-6ff5-0310-8944-8be069107fe0
This commit is contained in:
nate 2006-08-30 16:23:24 +00:00
parent cb87dfc71d
commit e812204ebc
5 changed files with 438 additions and 350 deletions

View file

@ -60,6 +60,285 @@ class Helper extends Object {
} }
return $cakeConfig; return $cakeConfig;
} }
/**
* Finds URL for specified action.
*
* Returns an URL pointing to a combination of controller and action. Param
* $url can be:
* + Empty - the method will find adress to actuall controller/action.
* + '/' - the method will find base URL of application.
* + A combination of controller/action - the method will find url for it.
*
* @param mixed $url Cake-relative URL, like "/products/edit/92" or "/presidents/elect/4"
* or an array specifying any of the following: 'controller', 'action',
* and/or 'plugin', in addition to named arguments (keyed array elements),
* and standard URL arguments (indexed array elements)
* @param boolean $full If true, the full base URL will be prepended to the result
* @return string Full translated URL with base path.
*/
function url($url = null, $full = false) {
$base = strip_plugin($this->base, $this->plugin);
$extension = null;
if (is_array($url) && !empty($url)) {
if (!isset($url['action'])) {
$url['action'] = $this->params['action'];
}
if (!isset($url['controller'])) {
$url['controller'] = $this->params['controller'];
}
if (!isset($url['plugin'])) {
$url['plugin'] = $this->plugin;
}
if (isset($url['ext'])) {
$extension = '.' . $url['ext'];
}
if (defined('CAKE_ADMIN') && !isset($url[CAKE_ADMIN]) && isset($this->params['admin'])) {
$url[CAKE_ADMIN] = $this->params['admin'];
}
$named = $args = array();
$keys = array_keys($url);
$count = count($keys);
for ($i = 0; $i < $count; $i++) {
if (is_numeric($keys[$i])) {
$args[] = $url[$keys[$i]];
} else {
if (!in_array($keys[$i], array('action', 'controller', 'plugin', 'ext'))) {
$named[] = array($keys[$i], $url[$keys[$i]]);
}
}
}
$combined = '';
if ($this->namedArgs) {
if ($this->namedArgs === true) {
$sep = $this->argSeparator;
} elseif (is_array($this->namedArgs)) {
$sep = '/';
}
$count = count($named);
for ($i = 0; $i < $count; $i++) {
$named[$i] = join($this->argSeparator, $named[$i]);
}
if (defined('CAKE_ADMIN') && isset($named[CAKE_ADMIN])) {
unset($named[CAKE_ADMIN]);
}
$combined = join('/', $named);
}
$urlOut = array_filter(array($url['plugin'], $url['controller'], $url['action'], join('/', array_filter($args)), $combined));
if (defined('CAKE_ADMIN') && isset($url[CAKE_ADMIN]) && $url[CAKE_ADMIN]) {
array_unshift($urlOut, CAKE_ADMIN);
}
$output = $base . '/' . join('/', $urlOut);
} else {
if (((strpos($url, '://')) || (strpos($url, 'javascript:') === 0) || (strpos($url, 'mailto:') === 0)) || $url == '#') {
return $this->output($url);
}
if (empty($url)) {
return $this->here;
} elseif($url{0} == '/') {
$output = $base . $url;
} else {
$output = $base . '/' . strtolower($this->params['controller']) . '/' . $url;
}
}
if ($full) {
$output = FULL_BASE_URL . $output;
}
return $this->output($output . $extension);
}
/**
* Returns a space-delimited string with items of the $options array. If a
* key of $options array happens to be one of:
* + 'compact'
* + 'checked'
* + 'declare'
* + 'readonly'
* + 'disabled'
* + 'selected'
* + 'defer'
* + 'ismap'
* + 'nohref'
* + 'noshade'
* + 'nowrap'
* + 'multiple'
* + 'noresize'
*
* And its value is one of:
* + 1
* + true
* + 'true'
*
* Then the value will be reset to be identical with key's name.
* If the value is not one of these 3, the parameter is not output.
*
* @param array $options Array of options.
* @param array $exclude Array of options to be excluded.
* @param string $insertBefore String to be inserted before options.
* @param string $insertAfter String to be inserted ater options.
* @return string
*/
function _parseAttributes($options, $exclude = null, $insertBefore = ' ', $insertAfter = null) {
$minimizedAttributes = array('compact', 'checked', 'declare', 'readonly', 'disabled', 'selected', 'defer', 'ismap', 'nohref', 'noshade', 'nowrap', 'multiple', 'noresize');
if (!is_array($exclude)) {
$exclude = array();
}
if (is_array($options)) {
$out = array();
foreach($options as $key => $value) {
if (!in_array($key, $exclude)) {
if (in_array($key, $minimizedAttributes) && ($value === 1 || $value === true || $value === 'true' || in_array($value, $minimizedAttributes))) {
$value = $key;
} elseif(in_array($key, $minimizedAttributes)) {
continue;
}
$out[] = "{$key}=\"{$value}\"";
}
}
$out = join(' ', $out);
return $out ? $insertBefore . $out . $insertAfter : null;
} else {
return $options ? $insertBefore . $options . $insertAfter : null;
}
}
/**
* @deprecated Name changed to '_parseAttributes'. Version 0.9.2.
* @see HtmlHelper::_parseAttributes()
* @param array $options Array of options.
* @param array $exclude Array of options to be excluded.
* @param string $insertBefore String to be inserted before options.
* @param string $insertAfter String to be inserted ater options.
* @return string
*/
function parseHtmlOptions($options, $exclude = null, $insertBefore = ' ', $insertAfter = null) {
if (!is_array($exclude)) {
$exclude = array();
}
if (is_array($options)) {
$out = array();
foreach($options as $k => $v) {
if (!in_array($k, $exclude)) {
$out[] = "{$k}=\"{$v}\"";
}
}
$out = join(' ', $out);
return $out ? $insertBefore . $out . $insertAfter : null;
} else {
return $options ? $insertBefore . $options . $insertAfter : null;
}
}
/**
* Sets this helper's model and field properties to the slash-separated value-pair in $tagValue.
*
* @param string $tagValue A field name, like "Modelname/fieldname"
*/
function setFormTag($tagValue) {
return list($this->view->model, $this->view->field) = explode("/", $tagValue);
}
/**
* Enter description here...
*
* @return string
*/
function model() {
return $this->view->model;
}
/**
* Enter description here...
*
* @return string
*/
function field() {
return $this->view->field;
}
/**
* Returns false if given FORM field has no errors. Otherwise it returns the constant set in the array Model->validationErrors.
*
* @param string $model Model name as string
* @param string $field Fieldname as string
* @return boolean True on errors.
*/
function tagIsInvalid($model = null, $field = null) {
if ($model == null) {
$model = $this->model();
}
if ($field == null) {
$field = $this->field();
}
return empty($this->validationErrors[$model][$field]) ? 0 : $this->validationErrors[$model][$field];
}
/**
* Generates a DOM ID for the selected element, if one is not set.
*
* @param array $options
* @param string $id
* @return array
*/
function domId($options = array(), $id = 'id') {
if (!isset($options[$id])) {
$options[$id] = $this->model() . Inflector::camelize($this->field());
}
return $options;
}
/**
* Gets the data for the current tag
*
* @param array $options
* @param string $key
* @return array
*/
function __value($options = array(), $field = null, $key = 'value') {
if (is_string($options)) {
$field = $options;
$options = 0;
}
if ($field != null) {
$this->setFormTag($field);
}
if (is_array($options) && isset($options[$key])) {
return $options;
}
$result = null;
if (isset($this->params['data'][$this->model()][$this->field()])) {
$result = h($this->params['data'][$this->model()][$this->field()]);
} elseif(isset($this->data[$this->model()][$this->field()])) {
$result = h($this->data[$this->model()][$this->field()]);
}
if ($options !== 0) {
$options[$key] = $result;
return $options;
} else {
return $result;
}
}
/**
* Adds the given class to the element options
*
* @param array $options
* @param string $class
* @param string $key
* @return array
*/
function addClass($options = array(), $class = null, $key = 'class') {
if (isset($options[$key]) && trim($options[$key]) != '') {
$options[$key] .= ' ' . $class;
} else {
$options[$key] = $class;
}
return $options;
}
/** /**
* Returns a string generated by a helper method * Returns a string generated by a helper method
* *

View file

@ -249,7 +249,7 @@ class AjaxHelper extends Helper {
$func = "new Ajax.Request("; $func = "new Ajax.Request(";
} }
$func .= "'" . $this->Html->url(isset($options['url']) ? $options['url'] : "") . "'"; $func .= "'" . $this->url(isset($options['url']) ? $options['url'] : "") . "'";
$func .= ", " . $this->__optionsForAjax($options) . ")"; $func .= ", " . $this->__optionsForAjax($options) . ")";
if (isset($options['before'])) { if (isset($options['before'])) {
@ -495,7 +495,7 @@ class AjaxHelper extends Helper {
return ''; return '';
} }
} }
$attr = $this->Html->_parseAttributes(am($options, array('id' => $id))); $attr = $this->_parseAttributes(am($options, array('id' => $id)));
return $this->output(sprintf($this->tags['blockstart'], $attr)); return $this->output(sprintf($this->tags['blockstart'], $attr));
} }
/** /**
@ -611,7 +611,7 @@ class AjaxHelper extends Helper {
* @link http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor * @link http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
*/ */
function editor($id, $url, $options = array()) { function editor($id, $url, $options = array()) {
$url = $this->Html->url($url); $url = $this->url($url);
$options['ajaxOptions'] = $this->__optionsForAjax($options); $options['ajaxOptions'] = $this->__optionsForAjax($options);
foreach($this->ajaxOptions as $opt) { foreach($this->ajaxOptions as $opt) {

View file

@ -66,7 +66,7 @@ class FormHelper extends Helper {
* @return string An formatted opening FORM tag. * @return string An formatted opening FORM tag.
*/ */
function create($target = null, $type = 'post', $htmlAttributes = null) { function create($target = null, $type = 'post', $htmlAttributes = null) {
$htmlAttributes['action'] = $this->Html->url($target); $htmlAttributes['action'] = $this->url($target);
$htmlAttributes['method'] = low($type) == 'get' ? 'get' : 'post'; $htmlAttributes['method'] = low($type) == 'get' ? 'get' : 'post';
$type == 'file' ? $htmlAttributes['enctype'] = 'multipart/form-data' : null; $type == 'file' ? $htmlAttributes['enctype'] = 'multipart/form-data' : null;
$token = ''; $token = '';
@ -85,9 +85,9 @@ class FormHelper extends Helper {
*/ */
function isFieldError($field) { function isFieldError($field) {
$error = 1; $error = 1;
$this->Html->setFormTag($field); $this->setFormTag($field);
if ($error == $this->Html->tagIsInvalid($this->Html->model, $this->Html->field)) { if ($error == $this->Html->tagIsInvalid()) {
return true; return true;
} else { } else {
return false; return false;
@ -106,11 +106,85 @@ class FormHelper extends Helper {
* @param string $text Text that will appear in the label field. * @param string $text Text that will appear in the label field.
* @return string The formatted LABEL element * @return string The formatted LABEL element
*/ */
function label($tagName, $text, $attributes = array()) { function label($tagName, $text = null, $attributes = array()) {
if ($text == null) {
if (strpos($tagName, '/') !== false) {
list( , $text) = explode('/', $tagName);
} else {
$text = $tagName;
}
$text = Inflector::humanize($text);
}
if (strpos($tagName, '/') !== false) { if (strpos($tagName, '/') !== false) {
$tagName = Inflector::camelize(r('/', '_', $tagName)); $tagName = Inflector::camelize(r('/', '_', $tagName));
} }
return $this->output(sprintf($this->tags['label'], $tagName, $this->Html->_parseAttributes($attributes), $text)); return $this->output(sprintf($this->tags['label'], $tagName, $this->_parseAttributes($attributes), $text));
}
/**
* Generates a form input element complete with label and wrapper div
*
* @param string $tagName This should be "Modelname/fieldname"
* @param array $options
* @return string
*/
function input($tagName, $options = array()) {
if (!isset($options['type'])) {
if (isset($options['options'])) {
$options['type'] = 'select';
} else {
$options['type'] = 'text';
}
}
$wrap = true;
if (isset($options['wrap'])) {
$wrap = $options['wrap'];
unset($options['wrap']);
}
$divOptions = array();
if (!isset($options['class']) || empty($options['class'])) {
$divOptions['class'] = 'input';
} else {
$divOptions['class'] = $options['class'];
}
$label = null;
if (isset($options['label'])) {
$label = $options['label'];
unset($options['label']);
}
$out = $this->label($tagName, $label);
$error = null;
if (isset($options['error'])) {
$error = $options['error'];
unset($options['error']);
}
switch ($options['type']) {
case 'text':
$out .= $this->text($tagName);
break;
case 'file':
$out .= $this->Html->file($tagName);
break;
case 'select':
$list = $options['options'];
$empty = (isset($options['empty']) ? $options['empty'] : '');
unset($options['options'], $options['empty']);
$out .= $this->select($tagName, $list, null, $options, $empty);
break;
}
if ($error != null) {
$out .= $this->Html->tagErrorMsg($tagName, $error);
}
if ($wrap) {
$out = $this->Html->div($divOptions['class'], $out);
}
return $this->output($out);
} }
/** /**
* @deprecated * @deprecated
@ -119,11 +193,7 @@ class FormHelper extends Helper {
return sprintf(TAG_DIV, $class, $text); return sprintf(TAG_DIV, $class, $text);
} }
/** /**
* Returns a formatted P tag with class for HTML FORMs. * @deprecated
*
* @param string $class CSS class name of the p element.
* @param string $text Text that will appear inside the p element.
* @return string The formatted P element
*/ */
function pTag($class, $text) { function pTag($class, $text) {
return sprintf(TAG_P_CLASS, $class, $text); return sprintf(TAG_P_CLASS, $class, $text);
@ -136,29 +206,17 @@ class FormHelper extends Helper {
* @return string An HTML text input element * @return string An HTML text input element
*/ */
function text($fieldName, $htmlAttributes = null) { function text($fieldName, $htmlAttributes = null) {
$this->Html->setFormTag($fieldName); $htmlAttributes = $this->__value($htmlAttributes, $fieldName);
$htmlAttributes = $this->domId($htmlAttributes);
if (!isset($htmlAttributes['value'])) {
$htmlAttributes['value'] = $this->Html->tagValue($fieldName);
}
if (!isset($htmlAttributes['type'])) { if (!isset($htmlAttributes['type'])) {
$htmlAttributes['type'] = 'text'; $htmlAttributes['type'] = 'text';
} }
if (!isset($htmlAttributes['id'])) { if ($this->tagIsInvalid()) {
$htmlAttributes['id'] = $this->Html->model . Inflector::camelize($this->Html->field); $htmlAttributes = $this->Html->addClass($htmlAttributes, 'form_error');
} }
return $this->output(sprintf($this->tags['input'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
if ($this->Html->tagIsInvalid($this->Html->model, $this->Html->field)) {
if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "") {
$htmlAttributes['class'] .= ' form_error';
} else {
$htmlAttributes['class'] = 'form_error';
}
}
return sprintf($this->tags['input'], $this->Html->model, $this->Html->field, $this->Html->_parseAttributes($htmlAttributes, null, ' ', ' '));
} }
/** /**
* Creates a textarea widget. * Creates a textarea widget.
@ -173,16 +231,10 @@ class FormHelper extends Helper {
$value = $htmlAttributes['value']; $value = $htmlAttributes['value'];
unset($htmlAttributes['value']); unset($htmlAttributes['value']);
} }
if (!isset($htmlAttributes['id'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['id'] = $this->Html->model . Inflector::camelize($this->Html->field);
}
if ($this->Html->tagIsInvalid($this->Html->model, $this->Html->field)) { if ($this->tagIsInvalid()) {
if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "") { $htmlAttributes = $this->Html->addClass($htmlAttributes, 'form_error');
$htmlAttributes['class'] .= ' form_error';
} else {
$htmlAttributes['class'] = 'form_error';
}
} }
return $this->output(sprintf($this->tags['textarea'], $this->Html->model, $this->Html->field, $this->Html->_parseAttributes($htmlAttributes, null, ' '), $value)); return $this->output(sprintf($this->tags['textarea'], $this->Html->model, $this->Html->field, $this->Html->_parseAttributes($htmlAttributes, null, ' '), $value));
} }
@ -229,7 +281,7 @@ class FormHelper extends Helper {
} else { } else {
$url = $this->webroot . $this->themeWeb . IMAGES_URL . $path; $url = $this->webroot . $this->themeWeb . IMAGES_URL . $path;
} }
return sprintf($this->tags['submitimage'], $url, $this->_parseAttributes($htmlAttributes, null, '', ' ')); return $this->output(sprintf($this->tags['submitimage'], $url, $this->_parseAttributes($htmlAttributes, null, '', ' ')));
} }
/** /**
* Returns a formatted SELECT element. * Returns a formatted SELECT element.
@ -244,29 +296,23 @@ class FormHelper extends Helper {
* @return string Formatted SELECT element * @return string Formatted SELECT element
*/ */
function select($fieldName, $options = array(), $selected = null, $attributes = array(), $showEmpty = '') { function select($fieldName, $options = array(), $selected = null, $attributes = array(), $showEmpty = '') {
$this->Html->setFormTag($fieldName); $this->setFormTag($fieldName);
$attributes = $this->domId($attributes);
if ($this->Html->tagIsInvalid($this->Html->model, $this->Html->field)) { if ($this->tagIsInvalid()) {
if (isset($attributes['class']) && trim($attributes['class']) != '') { $htmlAttributes = $this->Html->addClass($htmlAttributes, 'form_error');
$attributes['class'] .= ' form_error';
} else {
$attributes['class'] = 'form_error';
}
}
if (!isset($attributes['id'])) {
$attributes['id'] = $this->Html->model . Inflector::camelize($this->Html->field);
} }
if (!isset($selected)) { if (!isset($selected)) {
$selected = $this->Html->tagValue($fieldName); $selected = $this->__value($fieldName);
} }
if (isset($attributes) && array_key_exists("multiple", $attributes)) { if (isset($attributes) && array_key_exists("multiple", $attributes)) {
$select[] = sprintf($this->tags['selectmultiplestart'], $this->Html->model, $this->Html->field, $this->Html->parseHtmlOptions($attributes)); $tag = $this->tags['selectmultiplestart'];
} else { } else {
$select[] = sprintf($this->tags['selectstart'], $this->Html->model, $this->Html->field, $this->Html->parseHtmlOptions($attributes)); $tag = $this->tags['selectstart'];
} }
$select[] = sprintf($tag, $this->model(), $this->field(), $this->Html->parseHtmlOptions($attributes));
if ($showEmpty !== null && $showEmpty !== false) { if ($showEmpty !== null && $showEmpty !== false) {
$keys = array_keys($options); $keys = array_keys($options);
@ -342,7 +388,7 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError = $this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass = sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
@ -370,7 +416,7 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError = $this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass = sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
@ -399,7 +445,7 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError = $this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass = sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
@ -428,7 +474,7 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError = $this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass = sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
@ -464,7 +510,7 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError = $this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass = sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
@ -498,7 +544,7 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError = $this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass = sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
@ -529,8 +575,8 @@ class FormHelper extends Helper {
$strError = ""; $strError = "";
if ($this->isFieldError($tagName)) { if ($this->isFieldError($tagName)) {
$strError=$this->pTag('error', $errorMsg); $strError = $this->Html->para('error', $errorMsg);
$divClass=sprintf("%s error", $divClass); $divClass = sprintf("%s error", $divClass);
} }
$divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str); $divTagInside = sprintf("%s %s %s", $strError, $strLabel, $str);
return $this->divTag($divClass, $divTagInside); return $this->divTag($divClass, $divTagInside);

View file

@ -70,18 +70,6 @@ class HtmlHelper extends Helper {
* @var array * @var array
*/ */
var $data = null; var $data = null;
/**
* Name of model this helper is attached to.
*
* @var string
*/
var $model = null;
/**
* Enter description here...
*
* @var string
*/
var $field = null;
/**#@-*/ /**#@-*/
/************************************************************************* /*************************************************************************
* Private variables * Private variables
@ -185,97 +173,6 @@ class HtmlHelper extends Helper {
function charset($charset = 'UTF-8') { function charset($charset = 'UTF-8') {
return $this->output(sprintf($this->tags['charset'], $charset)); return $this->output(sprintf($this->tags['charset'], $charset));
} }
/**
* Finds URL for specified action.
*
* Returns an URL pointing to a combination of controller and action. Param
* $url can be:
* + Empty - the method will find adress to actuall controller/action.
* + '/' - the method will find base URL of application.
* + A combination of controller/action - the method will find url for it.
*
* @param mixed $url Cake-relative URL, like "/products/edit/92" or "/presidents/elect/4"
* or an array specifying any of the following: 'controller', 'action',
* and/or 'plugin', in addition to named arguments (keyed array elements),
* and standard URL arguments (indexed array elements)
* @param boolean $full If true, the full base URL will be prepended to the result
* @return string Full translated URL with base path.
*/
function url($url = null, $full = false) {
$base = strip_plugin($this->base, $this->plugin);
$extension = null;
if (is_array($url) && !empty($url)) {
if (!isset($url['action'])) {
$url['action'] = $this->params['action'];
}
if (!isset($url['controller'])) {
$url['controller'] = $this->params['controller'];
}
if (!isset($url['plugin'])) {
$url['plugin'] = $this->plugin;
}
if (isset($url['ext'])) {
$extension = '.' . $url['ext'];
}
if (defined('CAKE_ADMIN') && !isset($url[CAKE_ADMIN]) && isset($this->params['admin'])) {
$url[CAKE_ADMIN] = $this->params['admin'];
}
$named = $args = array();
$keys = array_keys($url);
$count = count($keys);
for ($i = 0; $i < $count; $i++) {
if (is_numeric($keys[$i])) {
$args[] = $url[$keys[$i]];
} else {
if (!in_array($keys[$i], array('action', 'controller', 'plugin', 'ext'))) {
$named[] = array($keys[$i], $url[$keys[$i]]);
}
}
}
$combined = '';
if ($this->namedArgs) {
if ($this->namedArgs === true) {
$sep = $this->argSeparator;
} elseif (is_array($this->namedArgs)) {
$sep = '/';
}
$count = count($named);
for ($i = 0; $i < $count; $i++) {
$named[$i] = join($this->argSeparator, $named[$i]);
}
if (defined('CAKE_ADMIN') && isset($named[CAKE_ADMIN])) {
unset($named[CAKE_ADMIN]);
}
$combined = join('/', $named);
}
$urlOut = array_filter(array($url['plugin'], $url['controller'], $url['action'], join('/', array_filter($args)), $combined));
if (defined('CAKE_ADMIN') && isset($url[CAKE_ADMIN]) && $url[CAKE_ADMIN]) {
array_unshift($urlOut, CAKE_ADMIN);
}
$output = $base . '/' . join('/', $urlOut);
} else {
if (((strpos($url, '://')) || (strpos($url, 'javascript:') === 0) || (strpos($url, 'mailto:') === 0)) || $url == '#') {
return $this->output($url);
}
if (empty($url)) {
return $this->here;
} elseif($url{0} == '/') {
$output = $base . $url;
} else {
$output = $base . '/' . strtolower($this->params['controller']) . '/' . $url;
}
}
if ($full) {
$output = FULL_BASE_URL . $output;
}
return $this->output($output . $extension);
}
/** /**
* Creates an HTML link. * Creates an HTML link.
* *
@ -351,22 +248,12 @@ class HtmlHelper extends Helper {
* @return string * @return string
*/ */
function password($fieldName, $htmlAttributes = null) { function password($fieldName, $htmlAttributes = null) {
$this->setFormTag($fieldName); $htmlAttributes = $this->__value($htmlAttributes, $fieldName);
if (!isset($htmlAttributes['value'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['value'] = $this->tagValue($fieldName); if ($this->tagIsInvalid()) {
$htmlAttributes = $this->addClass($htmlAttributes, 'form_error');
} }
if (!isset($htmlAttributes['id'])) { return $this->output(sprintf($this->tags['password'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
$htmlAttributes['id'] = $this->model . Inflector::camelize($this->field);
}
if ($this->tagIsInvalid($this->model, $this->field)) {
if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "") {
$htmlAttributes['class'] .= ' form_error';
} else {
$htmlAttributes['class'] = 'form_error';
}
}
return $this->output(sprintf($this->tags['password'], $this->model, $this->field, $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
} }
/** /**
* Creates a textarea widget. * Creates a textarea widget.
@ -375,25 +262,20 @@ class HtmlHelper extends Helper {
* @param array $htmlAttributes Array of HTML attributes. * @param array $htmlAttributes Array of HTML attributes.
* @return string * @return string
*/ */
function textarea($fieldName, $htmlAttributes = null) { function textarea($fieldName, $htmlAttributes = array()) {
$this->setFormTag($fieldName); $htmlAttributes = $this->__value($htmlAttributes, $fieldName);
$value = $this->tagValue($fieldName);
if (!empty($htmlAttributes['value'])) { $value = null;
if (isset($htmlAttributes['value']) && !empty($htmlAttributes['value'])) {
$value = $htmlAttributes['value']; $value = $htmlAttributes['value'];
unset($htmlAttributes['value']); unset($htmlAttributes['value']);
} }
if (!isset($htmlAttributes['id'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['id'] = $this->model . Inflector::camelize($this->field);
}
if ($this->tagIsInvalid($this->model, $this->field)) { if ($this->tagIsInvalid()) {
if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "") { $htmlAttributes = $this->addClass($htmlAttributes, 'form_error');
$htmlAttributes['class'] .= ' form_error';
} else {
$htmlAttributes['class'] = 'form_error';
}
} }
return $this->output(sprintf($this->tags['textarea'], $this->model, $this->field, $this->_parseAttributes($htmlAttributes, null, ' '), $value)); return $this->output(sprintf($this->tags['textarea'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, ' '), $value));
} }
/** /**
* Creates a checkbox widget. * Creates a checkbox widget.
@ -422,18 +304,17 @@ class HtmlHelper extends Helper {
$notCheckedValue = -1; $notCheckedValue = -1;
} }
} else { } else {
$model = new $this->model; $model = $this->model();
$model = new $model;
$db =& ConnectionManager::getDataSource($model->useDbConfig); $db =& ConnectionManager::getDataSource($model->useDbConfig);
$value = $db->boolean($value); $value = $db->boolean($value);
$htmlAttributes['checked'] = $value ? 'checked' : null; $htmlAttributes['checked'] = $value ? 'checked' : null;
$htmlAttributes['value'] = 1; $htmlAttributes['value'] = 1;
} }
} }
if (!isset($htmlAttributes['id'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['id'] = $this->model . Inflector::camelize($this->field);
}
$output = $this->hidden($fieldName, array('value' => $notCheckedValue, 'id' => $htmlAttributes['id'] . '_'), true); $output = $this->hidden($fieldName, array('value' => $notCheckedValue, 'id' => $htmlAttributes['id'] . '_'), true);
$output .= sprintf($this->tags['checkbox'], $this->model, $this->field, $this->_parseAttributes($htmlAttributes, null, '', ' ')); $output .= sprintf($this->tags['checkbox'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, '', ' '));
return $this->output($output); return $this->output($output);
} }
/** /**
@ -446,10 +327,8 @@ class HtmlHelper extends Helper {
function file($fieldName, $htmlAttributes = null) { function file($fieldName, $htmlAttributes = null) {
if (strpos($fieldName, '/')) { if (strpos($fieldName, '/')) {
$this->setFormTag($fieldName); $this->setFormTag($fieldName);
if (!isset($htmlAttributes['id'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['id'] = $this->model . Inflector::camelize($this->field); return $this->output(sprintf($this->tags['file'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, '', ' ')));
}
return $this->output(sprintf($this->tags['file'], $this->model, $this->field, $this->_parseAttributes($htmlAttributes, null, '', ' ')));
} }
return $this->output(sprintf($this->tags['file_no_model'], $fieldName, $this->_parseAttributes($htmlAttributes, null, '', ' '))); return $this->output(sprintf($this->tags['file_no_model'], $fieldName, $this->_parseAttributes($htmlAttributes, null, '', ' ')));
} }
@ -482,15 +361,10 @@ class HtmlHelper extends Helper {
* @param array $htmlAttributes Array of HTML attributes. * @param array $htmlAttributes Array of HTML attributes.
* @return string * @return string
*/ */
function hidden($fieldName, $htmlAttributes = null) { function hidden($fieldName, $htmlAttributes = array()) {
$this->setFormTag($fieldName); $htmlAttributes = $this->__value($htmlAttributes, $fieldName);
if (!isset($htmlAttributes['value'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['value'] = $this->tagValue($fieldName); return $this->output(sprintf($this->tags['hidden'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
}
if (!isset($htmlAttributes['id'])) {
$htmlAttributes['id'] = $this->model . Inflector::camelize($this->field);
}
return $this->output(sprintf($this->tags['hidden'], $this->model, $this->field, $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
} }
/** /**
* Creates a formatted IMG element. * Creates a formatted IMG element.
@ -519,27 +393,17 @@ class HtmlHelper extends Helper {
* @return string * @return string
*/ */
function input($fieldName, $htmlAttributes = null) { function input($fieldName, $htmlAttributes = null) {
$this->setFormTag($fieldName); $htmlAttributes = $this->__value($htmlAttributes, $fieldName);
if (!isset($htmlAttributes['value'])) { $htmlAttributes = $this->domId($htmlAttributes);
$htmlAttributes['value'] = $this->tagValue($fieldName);
}
if (!isset($htmlAttributes['type'])) { if (!isset($htmlAttributes['type'])) {
$htmlAttributes['type'] = 'text'; $htmlAttributes['type'] = 'text';
} }
if (!isset($htmlAttributes['id'])) { if ($this->tagIsInvalid()) {
$htmlAttributes['id'] = $this->model . Inflector::camelize($this->field); $htmlAttributes = $this->addClass($htmlAttributes, 'form_error');
} }
return $this->output(sprintf($this->tags['input'], $this->model(), $this->field(), $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
if ($this->tagIsInvalid($this->model, $this->field)) {
if (isset($htmlAttributes['class']) && trim($htmlAttributes['class']) != "") {
$htmlAttributes['class'] .= ' form_error';
} else {
$htmlAttributes['class'] = 'form_error';
}
}
return $this->output(sprintf($this->tags['input'], $this->model, $this->field, $this->_parseAttributes($htmlAttributes, null, ' ', ' ')));
} }
/** /**
* Creates a set of radio widgets. * Creates a set of radio widgets.
@ -561,7 +425,7 @@ class HtmlHelper extends Helper {
$optValue == $value ? $optionsHere['checked'] = 'checked' : null; $optValue == $value ? $optionsHere['checked'] = 'checked' : null;
$parsedOptions = $this->parseHtmlOptions(array_merge($htmlAttributes, $optionsHere), null, '', ' '); $parsedOptions = $this->parseHtmlOptions(array_merge($htmlAttributes, $optionsHere), null, '', ' ');
$individualTagName = "{$this->field}_{$optValue}"; $individualTagName = "{$this->field}_{$optValue}";
$out[] = sprintf($this->tags['radio'], $this->model, $this->field, $individualTagName, $parsedOptions, $optTitle); $out[] = sprintf($this->tags['radio'], $this->model(), $this->field(), $individualTagName, $parsedOptions, $optTitle);
} }
$out = join($inbetween, $out); $out = join($inbetween, $out);
@ -580,7 +444,6 @@ class HtmlHelper extends Helper {
foreach($names as $arg) { foreach($names as $arg) {
$out[] = sprintf($this->tags['tableheader'], $this->parseHtmlOptions($thOptions), $arg); $out[] = sprintf($this->tags['tableheader'], $this->parseHtmlOptions($thOptions), $arg);
} }
$data = sprintf($this->tags['tablerow'], $this->parseHtmlOptions($trOptions), join(' ', $out)); $data = sprintf($this->tags['tablerow'], $this->parseHtmlOptions($trOptions), join(' ', $out));
return $this->output($data); return $this->output($data);
} }
@ -618,23 +481,13 @@ class HtmlHelper extends Helper {
*/ */
function tagValue($fieldName) { function tagValue($fieldName) {
$this->setFormTag($fieldName); $this->setFormTag($fieldName);
if (isset($this->params['data'][$this->model][$this->field])) { if (isset($this->params['data'][$this->model()][$this->field()])) {
return h($this->params['data'][$this->model][$this->field]); return h($this->params['data'][$this->model()][$this->field()]);
} elseif(isset($this->data[$this->model][$this->field])) { } elseif(isset($this->data[$this->model()][$this->field()])) {
return h($this->data[$this->model][$this->field]); return h($this->data[$this->model()][$this->field()]);
} }
return false; return false;
} }
/**
* Returns false if given FORM field has no errors. Otherwise it returns the constant set in the array Model->validationErrors.
*
* @param string $model Model name as string
* @param string $field Fieldname as string
* @return boolean True on errors.
*/
function tagIsInvalid($model, $field) {
return empty($this->validationErrors[$model][$field]) ? 0 : $this->validationErrors[$model][$field];
}
/** /**
* Returns number of errors in a submitted FORM. * Returns number of errors in a submitted FORM.
* *
@ -672,115 +525,16 @@ class HtmlHelper extends Helper {
function tagErrorMsg($field, $text) { function tagErrorMsg($field, $text) {
$error = 1; $error = 1;
$this->setFormTag($field); $this->setFormTag($field);
if ($error == $this->tagIsInvalid($this->model, $this->field)) { if ($error == $this->tagIsInvalid()) {
return sprintf('<div class="error_message">%s</div>', is_array($text) ? (empty($text[$error - 1]) ? 'Error in field' : $text[$error - 1]) : $text); return sprintf('<div class="error_message">%s</div>', is_array($text) ? (empty($text[$error - 1]) ? 'Error in field' : $text[$error - 1]) : $text);
} else { } else {
return null; return null;
} }
} }
/**
* Sets this helper's model and field properties to the slash-separated value-pair in $tagValue.
*
* @param string $tagValue A field name, like "Modelname/fieldname"
*/
function setFormTag($tagValue) {
return list($this->model, $this->field) = explode("/", $tagValue);
}
/**#@-*/
/*************************************************************************
* Private methods
*************************************************************************/
/**#@+
* @access private
*/
/**
* Returns a space-delimited string with items of the $options array. If a
* key of $options array happens to be one of:
* + 'compact'
* + 'checked'
* + 'declare'
* + 'readonly'
* + 'disabled'
* + 'selected'
* + 'defer'
* + 'ismap'
* + 'nohref'
* + 'noshade'
* + 'nowrap'
* + 'multiple'
* + 'noresize'
*
* And its value is one of:
* + 1
* + true
* + 'true'
*
* Then the value will be reset to be identical with key's name.
* If the value is not one of these 3, the parameter is not output.
*
* @param array $options Array of options.
* @param array $exclude Array of options to be excluded.
* @param string $insertBefore String to be inserted before options.
* @param string $insertAfter String to be inserted ater options.
* @return string
*/
function _parseAttributes($options, $exclude = null, $insertBefore = ' ', $insertAfter = null) {
$minimizedAttributes = array('compact', 'checked', 'declare', 'readonly', 'disabled', 'selected', 'defer', 'ismap', 'nohref', 'noshade', 'nowrap', 'multiple', 'noresize');
if (!is_array($exclude)) {
$exclude = array();
}
if (is_array($options)) {
$out = array();
foreach($options as $key => $value) {
if (!in_array($key, $exclude)) {
if (in_array($key, $minimizedAttributes) && ($value === 1 || $value === true || $value === 'true' || in_array($value, $minimizedAttributes))) {
$value = $key;
} elseif(in_array($key, $minimizedAttributes)) {
continue;
}
$out[] = "{$key}=\"{$value}\"";
}
}
$out = join(' ', $out);
return $out ? $insertBefore . $out . $insertAfter : null;
} else {
return $options ? $insertBefore . $options . $insertAfter : null;
}
}
/**#@-*/ /**#@-*/
/************************************************************************* /*************************************************************************
* Renamed methods * Renamed methods
*************************************************************************/ *************************************************************************/
/**
* @deprecated Name changed to '_parseAttributes'. Version 0.9.2.
* @see HtmlHelper::_parseAttributes()
* @param array $options Array of options.
* @param array $exclude Array of options to be excluded.
* @param string $insertBefore String to be inserted before options.
* @param string $insertAfter String to be inserted ater options.
* @return string
*/
function parseHtmlOptions($options, $exclude = null, $insertBefore = ' ', $insertAfter = null) {
if (!is_array($exclude)) {
$exclude = array();
}
if (is_array($options)) {
$out = array();
foreach($options as $k => $v) {
if (!in_array($k, $exclude)) {
$out[] = "{$k}=\"{$v}\"";
}
}
$out = join(' ', $out);
return $out ? $insertBefore . $out . $insertAfter : null;
} else {
return $options ? $insertBefore . $options . $insertAfter : null;
}
}
/** /**
* Returns a formatted SELECT element. * Returns a formatted SELECT element.
* *
@ -794,16 +548,14 @@ class HtmlHelper extends Helper {
*/ */
function selectTag($fieldName, $optionElements, $selected = null, $selectAttr = null, $optionAttr = null, $showEmpty = true) { function selectTag($fieldName, $optionElements, $selected = null, $selectAttr = null, $optionAttr = null, $showEmpty = true) {
$this->setFormTag($fieldName); $this->setFormTag($fieldName);
if ($this->tagIsInvalid($this->model, $this->field)) { if ($this->tagIsInvalid()) {
if (isset($selectAttr['class']) && trim($selectAttr['class']) != "") { if (isset($selectAttr['class']) && trim($selectAttr['class']) != "") {
$selectAttr['class'] .= ' form_error'; $selectAttr['class'] .= ' form_error';
} else { } else {
$selectAttr['class'] = 'form_error'; $selectAttr['class'] = 'form_error';
} }
} }
if (!isset($selectAttr['id'])) { $selectAttr = $this->domId($selectAttr);
$selectAttr['id'] = $this->model . Inflector::camelize($this->field);
}
if (!is_array($optionElements)) { if (!is_array($optionElements)) {
return null; return null;
@ -814,9 +566,9 @@ class HtmlHelper extends Helper {
} }
if (isset($selectAttr) && array_key_exists("multiple", $selectAttr)) { if (isset($selectAttr) && array_key_exists("multiple", $selectAttr)) {
$select[] = sprintf($this->tags['selectmultiplestart'], $this->model, $this->field, $this->parseHtmlOptions($selectAttr)); $select[] = sprintf($this->tags['selectmultiplestart'], $this->model(), $this->field(), $this->parseHtmlOptions($selectAttr));
} else { } else {
$select[] = sprintf($this->tags['selectstart'], $this->model, $this->field, $this->parseHtmlOptions($selectAttr)); $select[] = sprintf($this->tags['selectstart'], $this->model(), $this->field(), $this->parseHtmlOptions($selectAttr));
} }
if ($showEmpty == true) { if ($showEmpty == true) {

View file

@ -71,7 +71,18 @@ class View extends Object{
* @access public * @access public
*/ */
var $action = null; var $action = null;
/**
* Name of current model this view context is attached to
*
* @var string
*/
var $model = null;
/**
* Name of current model field this view context is attached to
*
* @var string
*/
var $field = null;
/** /**
* An array of names of models the particular controller wants to use. * An array of names of models the particular controller wants to use.
* *