PHPonTrax
[ class tree: PHPonTrax ] [ index: PHPonTrax ] [ all elements ]

Source for file url_helper.php

Documentation is available at url_helper.php

  1. <?php
  2. /**
  3.  *  File containing the UrlHelper class and support functions
  4.  *
  5.  *  (PHP 5)
  6.  *
  7.  *  @package PHPonTrax
  8.  *  @version $Id: url_helper.php 240 2006-08-02 09:21:48Z john $
  9.  *  @copyright (c) 2005 John Peterson
  10.  *
  11.  *   Permission is hereby granted, free of charge, to any person obtaining
  12.  *   a copy of this software and associated documentation files (the
  13.  *   "Software"), to deal in the Software without restriction, including
  14.  *   without limitation the rights to use, copy, modify, merge, publish,
  15.  *   distribute, sublicense, and/or sell copies of the Software, and to
  16.  *   permit persons to whom the Software is furnished to do so, subject to
  17.  *   the following conditions:
  18.  *
  19.  *   The above copyright notice and this permission notice shall be
  20.  *   included in all copies or substantial portions of the Software.
  21.  *
  22.  *   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  23.  *   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  24.  *   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  25.  *   NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
  26.  *   LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
  27.  *   OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  28.  *   WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  29.  */
  30.  
  31. /**
  32.  *  @todo Document this class
  33.  */
  34. class UrlHelper extends Helpers {
  35.  
  36.     /**
  37.      * Creates a link tag of the given +name+ using an URL created by
  38.      * the set of +options+.
  39.      * It's also possible to pass a string instead of an options hash
  40.      * to get a link tag that just points without consideration. If
  41.      * null is passed as a name, the link itself will become the
  42.      * name.
  43.      * The $html_options have a special feature for creating
  44.      * javascript confirm alerts where if you pass ":confirm" => 'Are
  45.      * you sure?',
  46.      * the link will be guarded with a JS popup asking that
  47.      * question. If the user accepts, the link is processed, otherwise
  48.      * not.
  49.      *
  50.      * Example:
  51.      *   link_to("Delete this page", array(":action" => "delete",
  52.      * ":id" => $page->id), array(":confirm" => "Are you sure?"))
  53.      *  @return string 
  54.      *  @uses content_tag()
  55.      *  @uses convert_confirm_option_to_javascript()
  56.      *  @uses url_for()
  57.      */
  58.     function link_to($name$options array()$html_options array()) {
  59.         $html_options =
  60.             $this->convert_confirm_option_to_javascript($html_options);
  61.         if(is_string($options)) {
  62.             $href array("href" => $options);
  63.             if(count($html_options0{
  64.                 $html_options array_merge($html_options$href);
  65.             else {
  66.                 $html_options $href;
  67.             }
  68.             if(!$name{
  69.                 $name $options;
  70.             }
  71.             $html $this->content_tag("a"$name$html_options);
  72.         else {
  73.             $url $this->url_for($options);
  74.             if(!$name{
  75.                 $name $url;
  76.             }
  77.             $href array("href" => $url);
  78.             if(count($html_options0{
  79.                 $html_options array_merge($html_options$href);
  80.             else {
  81.                 $html_options $href;
  82.             }
  83.             $html $this->content_tag("a"$name$html_options);
  84.         }
  85.         return $html;
  86.     }
  87.  
  88.     /**
  89.      *  @todo Document this method
  90.      *  @param string[] Options
  91.      *  @return string 
  92.      */
  93.     function convert_confirm_option_to_javascript($html_options{
  94.         if(array_key_exists('confirm'$html_options)) {
  95.             $html_options['onclick'=
  96.                 "return confirm('".addslashes($html_options['confirm'])."');";
  97.             unset($html_options['confirm']);
  98.         }
  99.         return $html_options;
  100.     }
  101.  
  102.     /**
  103.      *  @todo Document this method
  104.      *  @param mixed[] 
  105.      *  @param mixed[] 
  106.      *  @return mixed[] 
  107.      */
  108.     function convert_boolean_attributes(&$html_options$bool_attrs{
  109.         foreach($bool_attrs as $x{
  110.             if(@array_key_exists($x$html_options)) {
  111.                 $html_options[$x$x;
  112.             }
  113.         }
  114.         return $html_options;
  115.     }
  116.  
  117.     /**
  118.      *  @todo Document this method
  119.      *  @param string 
  120.      *  @param mixed[] 
  121.      *  @param mixed[] 
  122.      *  @return string 
  123.      *  @uses convert_boolean_attributes()
  124.      *  @uses convert_confirm_option_to_javascript()
  125.      *  @uses url_for()
  126.      */
  127.     function button_to($name$options array()$html_options null{
  128.         $html_options (!is_null($html_options$html_options array());
  129.         $this->convert_boolean_attributes($html_optionsarray('disabled'));
  130.         $this->convert_confirm_option_to_javascript($html_options);
  131.         if (is_string($options)) {
  132.             $url $options;
  133.             $name (!is_null($name$name $options);
  134.         else {
  135.             $url url_for($options);
  136.             $name (!is_null($name$name url_for($options));
  137.         }
  138.  
  139.         $html_options array_merge($html_options,
  140.                               array("type" => "submit""value" => $name));
  141.         return "<form method=\"post\" action=\"" .  htmlspecialchars($url)
  142.             . "\" class=\"button-to\"><div>"
  143.             . $this->tag("input"$html_options"</div></form>";
  144.     }
  145.  
  146.     /**
  147.      * This tag is deprecated. Combine the link_to and
  148.      * AssetTagHelper::image_tag yourself instead, like:
  149.      *   link_to(image_tag("rss", array("size" => "30x45"),
  150.      * array("border" => 0)), "http://www.example.com")
  151.      *  @todo Document this method
  152.      */
  153.     function link_image_to($src$options array(),
  154.                            $html_options array()) 
  155.         $image_options array("src" => (ereg("/"$src$src "/images/$src"));
  156.         if (!ereg("."$image_options["src"])) $image_options["src".= ".png";
  157.  
  158.         if (isset($html_options["alt"])) {
  159.             $image_options["alt"$html_options["alt"];
  160.             unset($html_options["alt"]);
  161.         else {
  162.             $image_options["alt"ucfirst(end(explode("/"$src)));
  163.         }
  164.  
  165.         if (isset($html_options["size"])) {
  166.             $image_options["width"]  current(explode("x"$html_options["size"]));
  167.             $image_options["height"end(explode("x"$html_options["size"]));
  168.             unset($html_options["size"]);
  169.         else {
  170.             if(isset($html_options["width"])) {
  171.                 $image_options["width"$html_options["width"];
  172.                 unset($html_options["width"]);            
  173.             elseif(isset($html_options["height"])) {
  174.                 $image_options["height"$html_options["height"];
  175.                 unset($html_options["height"]);            
  176.             }
  177.         
  178.         
  179.         if (isset($html_options["border"])) {
  180.             $image_options["border"$html_options["border"];
  181.             unset($html_options["border"]);
  182.         else {
  183.             $image_options["border"0;        
  184.         }
  185.  
  186.         if (isset($html_options["align"])) {
  187.             $image_options["align"$html_options["align"];
  188.             unset($html_options["align"]);
  189.         }
  190.  
  191.         return $this->link_to($this->tag("img"$image_options)$options$html_options);
  192.     }
  193.  
  194.     /**
  195.      *  Generate URL based on current URL and optional arguments
  196.      *
  197.      *  Output a URL with controller and optional action and id.
  198.      *  The output URL has the same method, host and
  199.      *  <samp>TRAX_URL_PREFIX</samp> as
  200.      *  the current URL.  Controller is either the current controller
  201.      *  or a controller specified in $options.  Action and ID are
  202.      *  optionally specified in $options, or omitted.  The
  203.      *  <samp>':id'</samp> option will be ignored if the <samp>':action'</samp>
  204.      *  option is omitted.
  205.      *  @param mixed[] 
  206.      *   <ul>
  207.      *     <li><b>string:</b><br />
  208.      *       The string value is returned immediately with no
  209.      *       substitutions.</li>
  210.      *     <li><b>array:</b>
  211.      *      <ul>
  212.      *        <li><samp>':controller'=></samp><i>controller value</i></li>
  213.      *        <li><samp>':action'=></samp><i>action value</i></li>
  214.      *        <li><samp>':id'=></samp><i>id value</i></li>
  215.      *      </ul>
  216.      *   </ul>
  217.      *  @return string 
  218.      *  @uses controller_path
  219.      */
  220.     function url_for($options array()) {
  221.         $url_base null;
  222.         $url array();
  223.         $extra_params array();
  224.         if(is_string($options)) {
  225.  
  226.             //  Argument is a string, just return it
  227.             return $options;
  228.  
  229.         elseif(is_array($options)) {
  230.  
  231.             //  Argument is a (possibly empty) array
  232.             //  Start forming URL with this host
  233.             $url_base $_SERVER['HTTP_HOST'];
  234.             if(substr($url_base-1== "/"{
  235.                 # remove the ending slash
  236.                 $url_base substr($url_base0-1);
  237.             }           
  238.  
  239.             //  Method is same as was used by the current URL
  240.             if($_SERVER['SERVER_PORT'== 443{
  241.                 $url_base "https://".$url_base;
  242.             else {
  243.                 $url_base "http://".$url_base;
  244.             }
  245.             //  Insert value of Trax::$url_prefix
  246.             if(!is_null(Trax::$url_prefix)) {
  247.                 $prefix Trax::$url_prefix;
  248.                 if($prefix{0!= "/"{
  249.                     $prefix "/$prefix";
  250.                 }
  251.                 $url_base .= $prefix;
  252.             }
  253.             
  254.             //  Get controller from $options or $controller_path
  255.             if(array_key_exists(":controller"$options)) {
  256.                 if($controller $options[":controller"]{
  257.                     $url[$controller
  258.                 }
  259.             else {
  260.                 $controller $this->controller_path;
  261.                 if(substr($controller01== "/"{
  262.                     # remove the beginning slash
  263.                     $controller substr($controller1);        
  264.                 }
  265.                 $url[$controller;
  266.             }
  267.  
  268.             //  If controller found, get action from $options
  269.             if(count($url)) {
  270.                 if(array_key_exists(":action"$options)) {
  271.                     if($action $options[":action"]{
  272.                         $url[$action;
  273.                     }
  274.                 
  275.             }
  276.  
  277.             //  If controller and action found, get id from $actions
  278.             if(count($url1{
  279.                 if(array_key_exists(":id"$options)) {
  280.                     if(is_object($options[":id"])) {
  281.                         if($id $options[":id"]->id{
  282.                             $url[$id;
  283.                         }
  284.                     else {
  285.                         if($id $options[":id"]{
  286.                             $url[$id;
  287.                         }
  288.                     }
  289.                 }
  290.             }
  291.             
  292.             if(count($options)) {
  293.                 foreach($options as $key => $value{
  294.                     if(!strstr($key":")) {
  295.                         $extra_params[$key$value
  296.                     }       
  297.                 }    
  298.             }
  299.         }
  300.         
  301.         if(count($url&& substr($url_base,-1!= "/"{
  302.             $url_base .= "/";    
  303.         
  304.         return $url_base implode("/"$url)
  305.             . (count($extra_params)
  306.                ? "?".http_build_query($extra_paramsnull);
  307.     }    
  308.  
  309. }
  310.  
  311. /**
  312.  *  Make a new UrlHelper object and call its link_to() method
  313.  *  @uses UrlHelper::link_to()
  314.  */
  315. function link_to($name$options array()$html_options array()) {
  316.     $url_helper new UrlHelper();
  317.     return $url_helper->link_to($name$options$html_options);
  318. }
  319.  
  320. /**
  321.  *  Make a new UrlHelper object and call its link_image_to() method
  322.  *  @uses UrlHelper::link_image_to()
  323.  */
  324. function link_image_to($src$options array()$html_options array()) {
  325.     $url_helper new UrlHelper();
  326.     return $url_helper->link_image_to($src$options$html_options);        
  327. }
  328.  
  329. /**
  330.  *  Make a new UrlHelper object and call its button_to() method
  331.  *  @uses UrlHelper::button_to()
  332.  */
  333. function button_to($name$options array()$html_options null{
  334.     $url_helper new UrlHelper();
  335.     return $url_helper->button_to($name$options$html_options);    
  336. }
  337.  
  338. /**
  339.  *  Make a new UrlHelper object and call its url_for() method
  340.  *  @uses UrlHelper::url_for()
  341.  */
  342. function url_for($options array()) {
  343.     $url_helper new UrlHelper();
  344.     return $url_helper->url_for($options);
  345. }
  346.  
  347. // -- set Emacs parameters --
  348. // Local variables:
  349. // tab-width: 4
  350. // c-basic-offset: 4
  351. // c-hanging-comment-ender-p: nil
  352. // indent-tabs-mode: nil
  353. // End:
  354. ?>

Documentation generated on Mon, 21 May 2007 22:29:29 -0600 by phpDocumentor 1.3.2