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

Source for file htf_dat_menuitem.phl

Documentation is available at htf_dat_menuitem.phl

  1. <?php
  2. /**
  3.  * htf_dat_menuitemクラス
  4.  *
  5.  * menuitemデータを保持し、各種リンクタグを生成するクラス
  6.  *
  7.  * @package   HtmlTemplateFramework
  8.  * @subpackage data
  9.  * @access     public
  10.  * @author    Yamauchi Shogo <htf@as-prj.com>
  11.  * @version   $Id: htf_dat_menuitem.phl ,v 1.0 $;
  12.  ***/
  13.  
  14. require_once("htf_com_initialize.inc");    //共通初期処理
  15. require_once("htf_tag_element.phl");        //タグ生成クラス
  16.  
  17. /**
  18.  * menuitemデータを保持し、各種リンクタグを生成するクラス
  19.  *
  20.  * コンストラクタに指定されたmenuitemのDOMノードを参照し、
  21.  * htfで取り扱うメニューアイテム情報を保有します。
  22.  * DOMノード上でネストしているmenuitemノードについても子メニューアイテムとして保有します。
  23.  * また、各種リンクタグを生成や、IDやURLでの子メニューアイテムサーチ、
  24.  * ルート情報の取得を行うことができます。
  25.  * <br>
  26.  * 
  27.  * @access  public
  28.  * @author    Yamauchi Shogo <htf@as-prj.com>
  29.  ***/
  30.  
  31.    /**
  32.     * メニューアイテム固有のID(デフォルトは空文字)
  33.     * 
  34.     * @access public
  35.     * @var string 
  36.     */
  37.     var $id;
  38.    /**
  39.     * ラベル名(デフォルトは空文字)
  40.     * 
  41.     * @access public
  42.     * @var string 
  43.     */
  44.     var $label;                //ラベル
  45.       /**
  46.     * 表示するイメージファイルのパス(デフォルトは空文字)
  47.     * また、DOMノードからの生成時、このプロパティ内容にHTFの置換タグがあった場合には、置換されて設定されます。
  48.     * ただし、HTFフレームの置換タグは置換されません。
  49.     * 
  50.     * @access public
  51.     * @var string 
  52.     */
  53.     var $image;                //イメージファイルのパス
  54.       /**
  55.     * スワップするイメージファイルのパス(デフォルトは空文字)
  56.     * また、DOMノードからの生成時、このプロパティ内容にHTFの置換タグがあった場合には、置換されて設定されます。
  57.     * ただし、HTFフレームの置換タグは置換されません。
  58.     * 
  59.     * @access public
  60.     * @var string 
  61.     */
  62.     var $swapimage;            //スワップするイメージファイルのパス
  63.       /**
  64.     * イメージファイルに指定するalt属性値(デフォルトは空文字)
  65.     * 
  66.     * @access public
  67.     * @var string 
  68.     */
  69.     var $alt;                //イメージファイルのalt
  70.       /**
  71.     * イメージファイルに指定するheight属性値(デフォルトは空文字)
  72.     * 
  73.     * @access public
  74.     * @var string 
  75.     */
  76.     var $height;            //イメージファイルの高さ
  77.       /**
  78.     * イメージファイルに指定するwidth属性値(デフォルトは空文字)
  79.     * 
  80.     * @access public
  81.     * @var string 
  82.     */
  83.     var $width;                //イメージファイルの幅
  84.       /**
  85.     * イメージファイルに指定するborder属性値(デフォルトは'0')
  86.     * 
  87.     * @access public
  88.     * @var string 
  89.     */
  90.     var $border;            //イメージファイルのボーダー
  91.       /**
  92.     * リンク先のURL(デフォルトは空文字)
  93.     * また、DOMノードからの生成時、このプロパティ内容にHTFの置換タグがあった場合には、置換されて設定されます。
  94.     * ただし、HTFフレームの置換タグは置換されません。
  95.     * 
  96.     * @access public
  97.     * @var string 
  98.     */
  99.     var $url;                //リンク先URL
  100.       /**
  101.     * アンカーに指定するtarget属性値(デフォルトは空文字)
  102.     * 
  103.     * @access public
  104.     * @var string 
  105.     */
  106.     var $target;            //リンク先target属性
  107.       /**
  108.     * 子メニューアイテム(デフォルトは初期化した配列)
  109.     * 
  110.     * @access public
  111.     * @var array 
  112.     */
  113.     var $arr_menuitem;        //子ノード(menuitem)
  114.  
  115.     
  116.     /**
  117.      * 引数のDOMノードからmenuitemを生成します。引数指定がない場合には
  118.      * 初期化を行います。
  119.     * また、DOMノードからの生成時、このプロパティ内容にHTFの置換タグがあった場合には、置換されて設定されます。
  120.     * ただし、htfフレームの置換タグは置換されません。
  121.      *
  122.      * @access public
  123.      * @param     DomNode    $objnode    DOMのmenuitemノード
  124.      * @return    void 
  125.      ***/
  126.     function htf_dat_menuitem($objnode=NULL{
  127.         //プロパティ初期化
  128.         $this->initialize();
  129.         //DOMノードからプロパティ設定
  130.         $ret $this->set_fromnode($objnode);
  131.         //子ノード(menuitem)の取得
  132.         $ret $this->set_childnodes($objnode);
  133.     }
  134.  
  135.     /**
  136.      * 子メニューアイテムが存在するかどうかを返します。
  137.      *
  138.      * @access public
  139.      * @return    bool    TRUE:子ノードあり FALSE:子ノードなし
  140.      ***/
  141.     function has_child({
  142.         //NULLはfalse
  143.         if (is_null($this->arr_menuitem)) {
  144.             return FALSE;
  145.         }
  146.         //配列以外もfalse
  147.         if (strcasecmp(gettype($this->arr_menuitem)"array")) {
  148.             return FALSE;
  149.         }
  150.         //配列件数がある場合にはtrue
  151.         if (count($this->arr_menuitem1{
  152.             return FALSE;
  153.         else {
  154.             return TRUE;
  155.         }
  156.     }
  157.  
  158.     /**
  159.      * HTMLのアンカータグを作成します。(テキストリンク)
  160.      *
  161.      * @access public
  162.      * @return    string    作成したアンカータグ
  163.      ***/
  164.     function get_textlinktag({
  165.         //タグ要素生成
  166.         $anchor new htf_tag_element("a"TRUEHTF_ITEMCASE_ELEMENT);
  167.         //attribute設定
  168.         $anchor->add_attribute("href"$this->urlHTF_ITEMCASE_ATTRIBUTE);
  169.         if (htf_is_existsval($this->target)) {
  170.             $anchor->add_attribute("target"$this->targetHTF_ITEMCASE_ATTRIBUTE);
  171.         }
  172.         //要素内容追加
  173.         $anchor->add_content($this->label);
  174.         //タグ取得
  175.         $strret $anchor->get_htmltag();
  176.         
  177.         return $strret;
  178.     }
  179.     
  180.     /**
  181.      * HTMLのアンカータグを作成します。(イメージリンク)
  182.      *
  183.      * @access public
  184.      * @return    string    作成したアンカータグ
  185.      ***/
  186.     function get_imagelinktag({
  187.         //タグ要素生成
  188.         $anchor new htf_tag_element("a"TRUEHTF_ITEMCASE_ELEMENT);
  189.         $img new htf_tag_element("img"FALSEHTF_ITEMCASE_ELEMENT);
  190.         //attribute設定
  191.         $anchor->add_attribute("href"$this->urlHTF_ITEMCASE_ATTRIBUTE);
  192.         if (htf_is_existsval($this->target)) {
  193.             $anchor->add_attribute("target"$this->targetHTF_ITEMCASE_ATTRIBUTE);
  194.         }
  195.         $img->add_attribute("src"$this->imageHTF_ITMECASE_ATTRIBUTE);
  196.         if (htf_is_existsval($this->height)) {
  197.             $img->add_attribute("height"$this->heightHTF_ITMECASE_ATTRIBUTE);
  198.         }
  199.         if (htf_is_existsval($this->width)) {
  200.             $img->add_attribute("width"$this->widthHTF_ITMECASE_ATTRIBUTE);
  201.         }
  202.         if (htf_is_existsval($this->alt)) {
  203.             $img->add_attribute("alt"$this->altHTF_ITMECASE_ATTRIBUTE);
  204.         }
  205.         if (htf_is_existsval($this->border)) {
  206.             $img->add_attribute("border"$this->borderHTF_ITMECASE_ATTRIBUTE);
  207.         }
  208.         //要素内容追加
  209.         $anchor->add_content($img);
  210.         //タグ取得
  211.         $strret $anchor->get_htmltag();
  212.         
  213.         return $strret;
  214.     
  215.     }
  216.  
  217.     /**
  218.      * HTMLのアンカータグを作成します。(スワップイメージリンク)
  219.      *
  220.      * @access public
  221.      * @return    string    作成したアンカータグ
  222.      ***/
  223.     function get_swapimagelinktag({
  224.         //タグ要素生成
  225.         $anchor new htf_tag_element("a"TRUEHTF_ITEMCASE_ELEMENT);
  226.         $img new htf_tag_element("img"FALSEHTF_ITEMCASE_ELEMENT);
  227.         //attribute設定
  228.         $strimgname htf_gen_imgname();
  229.         $anchor->add_attribute("href"$this->urlHTF_ITEMCASE_ATTRIBUTE);
  230.         if (htf_is_existsval($this->target)) {
  231.             $anchor->add_attribute("target"$this->targetHTF_ITEMCASE_ATTRIBUTE);
  232.         }
  233.         $anchor->add_attribute("onmouseout",'MM_swapImgRestore();');
  234.         $anchor->add_attribute("onmouseover",'MM_swapImage(\''.$strimgname.'\',\'\',\''.$this->swapimage.'\',1)');
  235.         $img->add_attribute("name"$strimgnameHTF_ITMECASE_ATTRIBUTE);
  236.         $img->add_attribute("src"$this->imageHTF_ITMECASE_ATTRIBUTE);
  237.         if (htf_is_existsval($this->height)) {
  238.             $img->add_attribute("height"$this->heightHTF_ITMECASE_ATTRIBUTE);
  239.         }
  240.         if (htf_is_existsval($this->width)) {
  241.             $img->add_attribute("width"$this->widthHTF_ITMECASE_ATTRIBUTE);
  242.         }
  243.         if (htf_is_existsval($this->alt)) {
  244.             $img->add_attribute("alt"$this->altHTF_ITMECASE_ATTRIBUTE);
  245.         }
  246.         if (htf_is_existsval($this->border)) {
  247.             $img->add_attribute("border"$this->borderHTF_ITMECASE_ATTRIBUTE);
  248.         }
  249.         //要素内容追加
  250.         $anchor->add_content($img);
  251.         //タグ取得
  252.         $strret $anchor->get_htmltag();
  253.         
  254.         return $strret;
  255.     
  256.     }
  257.  
  258.     /**
  259.      * 子ノードを再帰的に引数urlでサーチし、該当するmenuitemまでのルートを返します。
  260.      *
  261.      * @access public
  262.      * @param     string    $url    サーチするURL
  263.      * @return    array             ルートを格納したmenuitem配列
  264.      ***/
  265.     function get_route_by_url($url{
  266.         $arr_nowitem=array();
  267.         $objret $this->search_arr_by_url($url$this->arr_menuitem$arr_nowitem);
  268.         if (!is_null($objret)) {
  269.             return $arr_nowitem;
  270.         else {
  271.             return NULL;
  272.         }
  273.     }
  274.  
  275.     /**
  276.      * 子ノードを再帰的にIDでサーチし、該当するmenuitemまでのルートを返します。
  277.      *
  278.      * @access public
  279.      * @param     string    $ID     サーチするメニューアイテムのID
  280.      * @return    array             ルートを格納したmenuitem配列
  281.      ***/
  282.     function get_route_by_id($ID{
  283.         $arr_nowitem=array();
  284.         $objret $this->search_arr_by_id($ID$this->arr_menuitem$arr_nowitem);
  285.         if (!is_null($objret)) {
  286.             return $arr_nowitem;
  287.         else {
  288.             return NULL;
  289.         }
  290.     }
  291.     
  292.     /**
  293.      * 子ノードを再帰的にurlでサーチし、該当するmenuitemを返します。
  294.      *
  295.      * @access public
  296.      * @param     string    $url    サーチするURL
  297.      * @return    menuitem  サーチ結果
  298.      ***/
  299.     function search_childnodes_by_url($url{
  300.         for ($i=0$i<count($this->arr_menuitem$i++{
  301.             //サーチ中のmenuitemをpush(arr_menuitemはNULLにする)
  302.             $itemwk $this->arr_menuitem[$i];
  303.             //直下の子ノードが該当するか検査
  304.             //print($this->arr_menuitem[$i]->id.":[now search]<br>\n");
  305.             if (htf_comp_property($this->arr_menuitem[$i]->url$url)) {
  306.                 //該当する場合
  307.                 //print($this->arr_menuitem[$i]->id.":[it's me]<br>\n");
  308.                 return $this->arr_menuitem[$i];
  309.             else {
  310.                 //該当しない場合はさらに子の直下menuitem配列をサーチ
  311.                 $childret $this->arr_menuitem[$i]->search_childnodes_by_url($url);
  312.                 if (!is_null($childret)) {
  313.                     return $childret;
  314.                 }
  315.             }
  316.         }
  317.         //print($this->id.":[not found]<br>\n");
  318.         //Not Find
  319.         return NULL;
  320.     }
  321.  
  322.     /**
  323.      * 子ノードを再帰的にidでサーチし、該当するmenuitemを返します。
  324.      *
  325.      * @access public
  326.      * @param     string    $id    サーチするID
  327.      * @return    menuitem  サーチ結果
  328.      ***/
  329.     function search_childnodes_by_id($id{
  330.         for ($i=0$i<count($this->arr_menuitem$i++{
  331.             //サーチ中のmenuitemをpush(arr_menuitemはNULLにする)
  332.             $itemwk $this->arr_menuitem[$i];
  333.             //直下の子ノードが該当するか検査
  334.             if (htf_comp_property($this->arr_menuitem[$i]->id$id)) {
  335.                 //該当する場合
  336.                 return $this->arr_menuitem[$i];
  337.             else {
  338.                 //該当しない場合はさらに子の直下menuitem配列をサーチ
  339.                 $childret $this->arr_menuitem[$i]->search_childnodes_by_id($id);
  340.                 if (!is_null($childret)) {
  341.                     return $childret;
  342.                 }
  343.             }
  344.         }
  345.         //Not Find
  346.         return NULL;
  347.     }
  348.  
  349.     /**
  350.      * 自プロパティを初期化します。
  351.      *
  352.      * @access     private
  353.      * @return    void 
  354.      ***/
  355.     function initialize({
  356.         $this->id="";
  357.         $this->label="";
  358.         $this->image="";
  359.         $this->swapimage="";
  360.         $this->alt="";
  361.         $this->height="";
  362.         $this->width="";
  363.         $this->border="0";
  364.         $this->url="";
  365.         $this->target="";
  366.         $this->arr_menuitem = array();
  367.     }
  368.  
  369.     /**
  370.      * 引数ノードの値を自プロパティに設定します。
  371.      *
  372.      * @access     private
  373.      * @param     DomNode  参照するDOMノード
  374.      * @return    void 
  375.      ***/
  376.     function set_fromnode($objnode=NULL{
  377.         //各プロパティ上書き
  378.         if (is_null($objnode)) {
  379.             $arrattr array();
  380.         else {
  381.             $arrattr $objnode->attributes();
  382.         }
  383.         for ($j=$j<count($arrattr$j++{
  384.             if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_ID$arrattr[$j]->name)) {
  385.                 //id属性
  386.                 $this->id = htf_get_encoded_attr($arrattr[$j]->value);
  387.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_LABEL$arrattr[$j]->name)) {
  388.                 //label属性
  389.                 $this->label = htf_get_encoded_attr($arrattr[$j]->value);
  390.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_IMAGE$arrattr[$j]->name)){
  391.                 //image属性
  392.                 $this->image = htf_replace_definetag(htf_get_encoded_attr($arrattr[$j]->value));
  393.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_SWAPIMAGE$arrattr[$j]->name)){
  394.                 //スワップimage属性
  395.                 $this->swapimage = htf_replace_definetag(htf_get_encoded_attr($arrattr[$j]->value));
  396.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_ALT$arrattr[$j]->name)){
  397.                 //alt属性
  398.                 $this->alt = htf_get_encoded_attr($arrattr[$j]->value);
  399.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_HEIGHT$arrattr[$j]->name)){
  400.                 //height属性
  401.                 $this->height = htf_get_encoded_attr($arrattr[$j]->value);
  402.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_WIDTH$arrattr[$j]->name)){
  403.                 //width属性
  404.                 $this->width = htf_get_encoded_attr($arrattr[$j]->value);
  405.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_BORDER$arrattr[$j]->name)){
  406.                 //border属性
  407.                 $this->border = htf_get_encoded_attr($arrattr[$j]->value);
  408.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_URL$arrattr[$j]->name)){
  409.                 //url属性
  410.                 $this->url = htf_replace_definetag(htf_get_encoded_attr($arrattr[$j]->value));
  411.             else if (htf_comp_xmlattrname(HTF_ATTR_MENUITEM_TARGET$arrattr[$j]->name)){
  412.                 //target属性
  413.                 $this->target = htf_get_encoded_attr($arrattr[$j]->value);
  414.             }
  415.         }
  416.         return;
  417.     }
  418.  
  419.     /**
  420.      * 引数DOMノードの子menuitemノードをarr_menuitemに生成します。
  421.      *
  422.      * @access     private
  423.      * @param     DomNode  参照するDOMノード
  424.      * @return    void 
  425.      ***/
  426.     function set_childnodes($objmgnode=NULL{
  427.         //子ノードを取得
  428.         if (is_null($objmgnode)) {
  429.             $arritem array();
  430.         else {
  431.             $arritem $objmgnode->child_nodes();
  432.         }
  433.         //menuitem配列に設定
  434.         for ($i=0$i<count($arritem$i++{
  435.             if ($arritem[$i]->node_type(!= XML_TEXT_NODE{
  436.                 if (htf_comp_xmlelementname($arritem[$i]->node_name()HTF_MENU_XML_MENUITEM)) {
  437.                     //menuitemタグ内容をクラス配列に取得する
  438.                     $setitem new htf_dat_menuitem($arritem[$i]);
  439.                     array_push($this->arr_menuitem$setitem);
  440.                 }
  441.             }
  442.         }
  443.         return;
  444.     }
  445.  
  446.     /**
  447.      * 指定menuitem配列をurlで検索し、見つかった場合には検索ルートを設定・結果menuitemを返します。
  448.      * 見つからない場合はNULLを返します。
  449.      *
  450.      * @access     private
  451.      * @param     string  $url         検索キーURL
  452.      * @param     string  $arr_search  検索対象配列
  453.      * @param     string  $arr_nowitem 検索ルート格納配列
  454.      * @return    menuitem 検索結果menuitem
  455.      ***/
  456.     function search_arr_by_url($url$arr_search&$arr_nowitem{
  457.         for ($i=0$i<count($arr_search$i++{
  458.             //サーチ中のmenuitemをpush(arr_menuitemはNULLにする)
  459.             $itemwk $arr_search[$i];
  460.             $itemwk->arr_menuitem NULL;
  461.             array_push($arr_nowitem$itemwk);
  462.             //該当するか検査
  463.             if ($arr_search[$i]->has_child()) {
  464.                 //menugroupの場合
  465.                 if (!strcmp($arr_search[$i]->url$url))