<?php
 
/*
 
* Class that abstracts URL;
 
* It can easily make URL's for dynamic scripts and also protects ur URL from "junk".
 
* With the word 'junk' i mean the situation when u add same variables with different values 
 
* on the different parts of the scripts.
 
* 
 
* Example of use:
 
*     $action = new URL();
 
*     $action->addVal("form_submitted","1");
 
*     echo $action->Build();
 
* This will print ur current URL with new variable called form_submitted and equal to 1.
 
* If u want link to the URL u can i.e. do this:
 
*     $newspage = new URL();
 
*     $newspage->addVal("module","news");
 
*     echo $newspage->A();
 
* 
 
* Changelog
 
* 14 march: 
 
*     + added Clear() method
 
*     + fixed error in Build() method
 
*     + comments to methods are added
 
*/
 
 
 
class URL
 
{
 
  var $Text;
 
  var $Scheme;
 
  var $Host;
 
  var $Port;
 
  var $Path;
 
  var $Query;
 
  var $Fragment;
 
  var $Dynamic;  // TRUE if URL have GET vars
 
  var $Valid;
 
  var $Args = array();
 
  var $Cache; // cached previous build of URL
 
  /**
 
   * URL::URL()
 
   * 
 
   * @param mixed $Text U can specify URL that different from current 
 
   * @return void
 
   **/
 
  function URL($Text = FALSE)
 
  {
 
    global $HTTP_SERVER_VARS;
 
    if ( $Text )
 
       $this->Text = $Text;
 
    else
 
        $this->Text = "http://".$HTTP_SERVER_VARS["HTTP_HOST"].$HTTP_SERVER_VARS["REQUEST_URI"];
 
    if ( $this->parseURL() )
 
       $this->Valid = TRUE;
 
    else
 
       $this->Valid = FALSE;
 
  }
 
  /**
 
   * URL::parseURL()
 
   * This method is private, it parses URL on the parts.
 
   * @return boolean URL is right or not;
 
   **/
 
  function parseURL()
 
  {
 
           $tmp = parse_url( $this->Text );
 
 
           if ( isSet($tmp["scheme"]) )
 
              $this->Scheme = $tmp["scheme"];
 
           else
 
               return (FALSE);
 
 
           if ( isSet($tmp["host"]) )
 
              $this->Host = $tmp["host"];
 
           else
 
               return (FALSE);
 
 
           if ( isSet($tmp["path"]) )
 
              $this->Path = $tmp["path"];
 
           else
 
               return(FALSE);
 
        
 
           if ( isSet($tmp["query"]) )
 
              $this->Query  = $tmp["query"];
 
 
           if ( isSet($tmp["fragment"]) )
 
              $this->Fragment = $tmp["fragment"];
 
    
 
           if ( isSet($tmp["port"]) )
 
              $this->Port = $tmp["port"];
 
       
 
           unset($tmp);
 
 
            if ( isSet($this->Query) )
 
               $this->Dynamic = TRUE;
 
            else
 
                $this->Dynamic = FALSE;
 
        
 
            if ( $this->Dynamic )
 
            {
 
               $temp = explode("&",$this->Query);
 
               $i = 0;
 
               while ( list($key, $val) = each ($temp) )
 
               {
 
                     $tmp = explode("=",$val);
 
                     $this->Args[$tmp[0]] = $tmp[1];
 
                     $i++;
 
               }
 
            }
 
            return (TRUE);
 
  }
 
  /**
 
   * URL::dropVal()
 
   * Drops a key from URL.
 
   * @param mixed $key A key of value to drop.
 
   * @return string URL if ok or echo about error.
 
   **/
 
  function dropVal($key)
 
  {
 
    if ( isSet($this->Args[$key]) )
 
       $this->Args[$key] = NULL;
 
    else
 
        echo "Key not found.";
 
    return $this->Build();
 
  }
 
  /**
 
   * URL::Clear()
 
   * Clears previous URL and let u work with another.
 
   * @param string $Text This can be used to work with specific URL, not the current one.
 
   * @return void
 
   **/
 
  function Clear()
 
  {
 
      $this->URL();
 
    empty($this->Args);
 
  }
 
  /**
 
   * URL::getVal()
 
   * Gets a value from URL. (Even that values that are from 
 
   * @param $key
 
   * @return mixed key if everything is OK, or echo'es that key is not found.
 
   **/
 
  function getVal ($key)
 
  {
 
    if ( isSet($this->Args[$key]) )
 
       return $this->Args[$key];
 
    else
 
        echo "Key not found.";
 
  }
 
  
 
  /**
 
   * URL::addVal()
 
   * Adds a key to URL.
 
   * @param mixed $key A key to add.
 
   * @param mixed $value Value of the key
 
   * @return string URL
 
   **/
 
  function addVal ($key, $value)
 
  {
 
    if ( !isSet($this->Args[$key]) )
 
       $this->Args[$key] = $value;
 
    else
 
        echo "Key already exists.";
 
    return $this->Build();
 
  }
 
  
 
  /**
 
   * URL::setVal()
 
   * 
 
   * @param mixed $key Key name for parameter.
 
   * @param mixed $value Value for parameter.
 
   * @param boolean $create Create new key if not exists.
 
   * @return Echo if key not found and builded URL if everything ok.
 
   **/
 
  function setVal ($key, $value, $create=FALSE)
 
  {
 
    if ( isSet($this->Args[$key]) or $create == TRUE)
 
       $this->Args[$key] = $value;
 
    else
 
        echo "Key not found.";
 
    return $this->Build();
 
  }
 
  
 
  /**
 
   * URL::is_Set()
 
   * Checks if key is set in the URL.
 
   * @param mixed $key 
 
   * @return boolean  
 
   **/
 
  function is_Set ($key)
 
  {
 
    if ( isSet($this->Args[$key]) )
 
       return TRUE;
 
    else
 
        return FALSE;
 
  }
 
  
 
  /**
 
   * URL::Build()
 
   * This is can be used to build a URL.
 
   * @param boolean $full Set to TRUE if u want full URL (with hostname etc)
 
   * @return string URL
 
   **/
 
  function Build ($full = FALSE)
 
  {
 
    $url = "";
 
    if ($full)
 
    {
 
      $url = $this->Scheme."://";
 
      $url .= $this->Host;
 
      if ( isSet($this->Port) )
 
         $url .= ":".$this->Port;
 
    }
 
    $url .= $this->Path;
 
    $i = 0;
 
    foreach ( $this->Args as $key => $value )
 
    {
 
          if ( $i == 0 ) $url .= "?";
 
          if ( !is_Null($value) )
 
          {
 
             $url .= $key."=".$value."&";
 
          }
 
          $i=1;
 
    } 
 
    if ( $i > 0 )
 
       {
 
         $url = substr_replace($url, '', -1);
 
       }
 
    if ( isSet($this->Fragment) )
 
       $url .= "#".$this->Fragment;
 
    $this->Cache = $url;
 
    return $url;
 
  }
 
  /**
 
   * URL::A()
 
   * Returns builded URL with <A> tags
 
   * @param string $name Name of link, it will be like this: <A HREF=...>$name</A>
 
   * @param boolean $full Set to TRUE if u want full URL (with hostname etc)
 
   * @return string URL with tags
 
   **/
 
  function A($name = FALSE, $full = FALSE)
 
  {
 
    $url = $this->Build($full);
 
    if ( !$name )
 
       $name = $url;
 
    return "<A HREF=".$url.">".$name."</A>";
 
  }
 
}
 
?>
 
 
 |