diff options
author | Pascal Kriete <pascal.kriete@ellislab.com> | 2009-07-29 15:46:37 +0200 |
---|---|---|
committer | Pascal Kriete <pascal.kriete@ellislab.com> | 2009-07-29 15:46:37 +0200 |
commit | de8f409e84c4b2c428cba3f2845f2658d3db9b90 (patch) | |
tree | 1bc7d3d9a0835284a78f73e24baf574c32780ede | |
parent | 5bcfd2e83e52155f199058479ac116a136f334a3 (diff) |
Updating the smiley helper to work with more than one field.
Also changing insertion position to be at the cursor and using ids instead of form names.
-rw-r--r-- | system/helpers/smiley_helper.php | 140 | ||||
-rw-r--r-- | user_guide/changelog.html | 2 | ||||
-rw-r--r-- | user_guide/helpers/smiley_helper.html | 43 |
3 files changed, 148 insertions, 37 deletions
diff --git a/system/helpers/smiley_helper.php b/system/helpers/smiley_helper.php index f9a2cf2b0..f085e53b1 100644 --- a/system/helpers/smiley_helper.php +++ b/system/helpers/smiley_helper.php @@ -28,29 +28,91 @@ // ------------------------------------------------------------------------ /** - * JS Insert Smiley + * Smiley Javascript * - * Generates the javascrip function needed to insert smileys into a form field + * Returns the javascript required for the smiley insertion. Optionally takes + * an array of aliases to loosely couple the smiley array to the view. * * @access public - * @param string form name - * @param string field name - * @return string + * @param mixed alias name or array of alias->field_id pairs + * @param string field_id if alias name was passed in + * @return array */ -if ( ! function_exists('js_insert_smiley')) +if ( ! function_exists('smiley_js')) { - function js_insert_smiley($form_name = '', $form_field = '') - { - return <<<EOF -<script type="text/javascript"> - function insert_smiley(smiley) + function smiley_js($alias = '', $field_id = '') { - document.{$form_name}.{$form_field}.value += " " + smiley; - } -</script> + static $do_setup = TRUE; + + $r = ''; + + if ($alias != '' && ! is_array($alias)) + { + $alias = array($alias => $field_id); + } + + if ($do_setup === TRUE) + { + $do_setup = FALSE; + + $m = array(); + + if (is_array($alias)) + { + foreach($alias as $name => $id) + { + $m[] = '"'.$name.'" : "'.$id.'"'; + } + } + + $m = '{'.implode(',', $m).'}'; + + $r .= <<<EOF + + var smiley_map = {$m}; + + function insert_smiley(smiley, field_id) { + var el = document.getElementById(field_id), newStart; + + if ( ! el && smiley_map[field_id]) { + el = document.getElementById(smiley_map[field_id]); + + if ( ! el) + return false; + } + + el.focus(); + smiley = " " + smiley; + + if ('selectionStart' in el) { + newStart = el.selectionStart + smiley.length; + + el.value = el.value.substr(0, el.selectionStart) + + smiley + + el.value.substr(el.selectionEnd, el.value.length); + el.setSelectionRange(newStart, newStart); + } + else if (document.selection) { + document.selection.createRange().text = text; + } + } EOF; + } + else + { + if (is_array($alias)) + { + foreach($alias as $name => $id) + { + $r .= 'smiley_map["'.$name.'"] = "'.$id.'";'."\n"; + } + } + } + + return '<script type="text/javascript" charset="utf-8">'.$r.'</script>'; } } + // ------------------------------------------------------------------------ /** @@ -65,8 +127,15 @@ EOF; */ if ( ! function_exists('get_clickable_smileys')) { - function get_clickable_smileys($image_url = '', $smileys = NULL) + function get_clickable_smileys($image_url, $alias = '', $smileys = NULL) { + // For backward compatibility with js_insert_smiley + + if (is_array($alias)) + { + $smileys = $alias; + } + if ( ! is_array($smileys)) { if (FALSE === ($smileys = _get_smiley_array())) @@ -76,8 +145,8 @@ if ( ! function_exists('get_clickable_smileys')) } // Add a trailing slash to the file path if needed - $image_url = preg_replace("/(.+?)\/*$/", "\\1/", $image_url); - + $image_url = rtrim($image_url, '/').'/'; + $used = array(); foreach ($smileys as $key => $val) { @@ -89,12 +158,12 @@ if ( ! function_exists('get_clickable_smileys')) { continue; } - - $link[] = "<a href=\"javascript:void(0);\" onClick=\"insert_smiley('".$key."')\"><img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" /></a>"; - + + $link[] = "<a href=\"javascript:void(0);\" onClick=\"insert_smiley('".$key."', '".$alias."')\"><img src=\"".$image_url.$smileys[$key][0]."\" width=\"".$smileys[$key][1]."\" height=\"".$smileys[$key][2]."\" alt=\"".$smileys[$key][3]."\" style=\"border:0;\" /></a>"; + $used[$smileys[$key][0]] = TRUE; } - + return $link; } } @@ -170,6 +239,35 @@ if ( ! function_exists('_get_smiley_array')) } } +// ------------------------------------------------------------------------ + +/** + * JS Insert Smiley + * + * Generates the javascript function needed to insert smileys into a form field + * + * DEPRECATED as of version 1.7.2, use smiley_js instead + * + * @access public + * @param string form name + * @param string field name + * @return string + */ +if ( ! function_exists('js_insert_smiley')) +{ + function js_insert_smiley($form_name = '', $form_field = '') + { + return <<<EOF +<script type="text/javascript"> + function insert_smiley(smiley) + { + document.{$form_name}.{$form_field}.value += " " + smiley; + } +</script> +EOF; + } +} + /* End of file smiley_helper.php */ /* Location: ./system/helpers/smiley_helper.php */
\ No newline at end of file diff --git a/user_guide/changelog.html b/user_guide/changelog.html index 1de9effe6..354652fd0 100644 --- a/user_guide/changelog.html +++ b/user_guide/changelog.html @@ -85,6 +85,7 @@ SVN Revision: </p> <li>Modified <kbd>form_prep()</kbd> in the <a href="helpers/form_helper.html">Form helper</a> to keep track of prepped fields to avoid multiple prep/mutation from subsequent calls which can occur when using Form Validation and form helper functions to output form fields.</li> <li>Modified <kbd>directory_map()</kbd> in the <a href="helpers/directory_helper.html">Directory helper</a> to allow the inclusion of hidden files, and to return FALSE on failure to read directory.</li> + <li>Modified the <a href="helpers/smiley_helper.html">Smiley helper</a> to work with multiple fields and insert the smiley at the last known cursor position.</li> </ul> </li> <li>General @@ -110,6 +111,7 @@ SVN Revision: </p> <li>Fixed a bug that would cause PHP errors in XML-RPC data if the PHP data type did not match the specified XML-RPC type.</li> <li>Fixed a bug in the XML-RPC class with parsing dateTime.iso8601 data types.</li> <li>Fixed a case sensitive string replacement in xss_clean()</li> + <li>Fixed a bug in form_textarea() where form data was not prepped correctly.</li> <li>Fixed a bug in form_prep() causing it to not preserve entities in the user's original input when called back into a form element</li> <li>Fixed a bug in _protect_identifiers() where the swap prefix ($swap_pre) was not being observed.</li> <li>Fixed a bug where the 400 status header sent with the 'disallowed URI characters' was not compatible with CGI environments.</li> diff --git a/user_guide/helpers/smiley_helper.html b/user_guide/helpers/smiley_helper.html index 3c88bcf74..8c85cb3f2 100644 --- a/user_guide/helpers/smiley_helper.html +++ b/user_guide/helpers/smiley_helper.html @@ -111,10 +111,10 @@ class Smileys extends Controller { $this->load->helper('smiley'); $this->load->library('table'); - $image_array = get_clickable_smileys('http://example.com/images/smileys/'); - - $col_array = $this->table->make_columns($image_array, 8); - + $image_array = get_clickable_smileys('http://example.com/images/smileys/', 'comments'); + + $col_array = $this->table->make_columns($image_array, 8); + $data['smiley_table'] = $this->table->generate($col_array); $this->load->view('smiley_view', $data); @@ -126,19 +126,18 @@ class Smileys extends Controller { <p>In your <dfn>application/views/</dfn> folder, create a file called <kbd>smiley_view.php</kbd> and place this code in it:</p> - <textarea class="textarea" style="width:100%" cols="50" rows="20"> <html> <head> <title>Smileys</title> -<?php echo js_insert_smiley('blog', 'comments'); ?> +<?php echo smiley_js(); ?> </head> <body> <form name="blog"> -<textarea name="comments" cols="40" rows="4"></textarea> +<textarea name="comments" id="comments" cols="40" rows="4"></textarea> </form> <p>Click to insert a smiley!</p> @@ -150,26 +149,39 @@ class Smileys extends Controller { </textarea> -<p>When you have created the above controller and view, load it by visiting <dfn>http://www.your=site.com/index.php/smileys/</dfn></p> +<p>When you have created the above controller and view, load it by visiting <dfn>http://www.example.com/index.php/smileys/</dfn></p> -<h1>Function Reference</h1> +<h3>Field Aliases</h3> + +<p>When making changes to a view it can be inconvenient to have the field id in the controller. To work around this, +you can give your smiley links a generic name that will be tied to a specific id in your view.</p> +<code>$image_array = get_smiley_links("http://example.com/images/smileys/", "comment_textarea_alias");</code> + +<p>To map the alias to the field id, pass them both into the smiley_js function:</p> +<code>$image_array = smiley_js("comment_textarea_alias", "comments");</code> + + +<h1>Function Reference</h1> <h2>get_clickable_smileys()</h2> <p>Returns an array containing your smiley images wrapped in a clickable link. You must supply the URL to your smiley folder -via the first parameter:</p> +and a field id or field alias.</p> -<code>$image_array = get_clickable_smileys("http://example.com/images/smileys/");</code> +<code>$image_array = get_smiley_links("http://example.com/images/smileys/", "comment");</code> +<p class="important">Note: Usage of this function without the second parameter, in combination with js_insert_smiley has been deprecated.</p> -<h2>js_insert_smiley()</h2> +<h2>smiley_js()</h2> <p>Generates the JavaScript that allows the images to be clicked and inserted into a form field. -The first parameter must contain the name of your form, the second parameter must contain the name of the -form field. This function is designed to be placed into the <head> area of your web page.</p> +If you supplied an alias instead of an id when generating your smiley links, you need to pass the +alias and corresponding form id into the function. +This function is designed to be placed into the <head> area of your web page.</p> -<code><?php echo js_insert_smiley('blog', 'comments'); ?></code> +<code><?php echo smiley_js(); ?></code> +<p class="important">Note: This function replaces js_insert_smiley, which has been deprecated.</p> <h2>parse_smileys()</h2> @@ -178,7 +190,6 @@ form field. This function is designed to be placed into the <head> area of equivalent. The first parameter must contain your string, the second must contain the URL to your smiley folder:</p> <code> - $str = 'Here are some simileys: :-) ;-)'; $str = parse_smileys($str, "http://example.com/images/smileys/"); |