2 if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
3 /*********************************************************************************
4 * SugarCRM Community Edition is a customer relationship management program developed by
5 * SugarCRM, Inc. Copyright (C) 2004-2012 SugarCRM Inc.
7 * This program is free software; you can redistribute it and/or modify it under
8 * the terms of the GNU Affero General Public License version 3 as published by the
9 * Free Software Foundation with the addition of the following permission added
10 * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
11 * IN WHICH THE COPYRIGHT IS OWNED BY SUGARCRM, SUGARCRM DISCLAIMS THE WARRANTY
12 * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
14 * This program is distributed in the hope that it will be useful, but WITHOUT
15 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
16 * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
19 * You should have received a copy of the GNU Affero General Public License along with
20 * this program; if not, see http://www.gnu.org/licenses or write to the Free
21 * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
24 * You can contact SugarCRM, Inc. headquarters at 10050 North Wolfe Road,
25 * SW2-130, Cupertino, CA 95014, USA. or at email address contact@sugarcrm.com.
27 * The interactive user interfaces in modified source and object code versions
28 * of this program must display Appropriate Legal Notices, as required under
29 * Section 5 of the GNU Affero General Public License version 3.
31 * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
32 * these Appropriate Legal Notices must retain the display of the "Powered by
33 * SugarCRM" logo. If the display of the logo is not reasonably feasible for
34 * technical reasons, the Appropriate Legal Notices must display the words
35 * "Powered by SugarCRM".
36 ********************************************************************************/
46 * This is a Smarty plugin to create a multi-level menu using nasted ul lists.
47 * The generated structure looks like this.
51 * <ul $submenuHtmlOptions>
52 * <li $itemOptions></li>
55 * <ul $submenuHtmlOptions>
56 * <li $itemOptions></li>
67 * @param $params array - look up the bellow example
69 * @return string - generated HTML code
72 * smarty_function_sugar_menu(array(
73 * 'id' => $string, //id property that is applied in root UL
76 * 'html' => $html_string, //html container that renders in the LI tag
77 * 'items' => array(), //nasted ul lists
80 * 'htmlOptions' => attributes that is applied in root UL, such as class, or align.
81 * 'itemOptions' => attributes that is applied in LI items, such as class, or align.
82 * 'submenuHtmlOptions' => attributes that is applied in child UL, such as class, or align.
86 * * @author Justin Park (jpark@sugarcrm.com)
88 function smarty_function_sugar_menu($params, &$smarty)
90 $root_options = array(
91 "id" => array_key_exists('id', $params) ? $params['id'] : ""
93 if(array_key_exists('htmlOptions', $params)) {
94 foreach($params['htmlOptions'] as $attr => $value) {
95 $root_options[$attr] = $value;
98 $output = open_tag("ul", $root_options);
99 foreach($params['items'] as $item) {
100 if(strpos($item['html'], "</") === 0) {
101 $output .= $item['html'];
104 $output .= open_tag('li', !empty($params['itemOptions']) ? $params['itemOptions'] : array()).$item['html'];
105 if(isset($item['items']) && count($item['items'])) {
106 $output .= smarty_function_sugar_menu(array(
107 'items' => $item['items'],
108 'htmlOptions' => !empty($params['submenuHtmlOptions']) ? $params['submenuHtmlOptions'] : array()
117 function open_tag($tagName, $params = array(), $self_closing = false) {
120 $self_closing_tag = ($self_closing) ? "/" : "";
122 return "<{$tagName}{$self_closing_tag}>";
124 foreach($params as $attr => $value) {
126 $options .= $attr.'="'.$value.'" ';
128 return "<{$tagName} {$options}{$self_closing_tag}>";
131 function parse_html_tag($code) {
137 $quote_encoded = false;
141 $start_pos = strpos($code, ' ') ? strpos($code, ' ') : strpos($code, $TAG_END);
142 if(substr($code, 0, 1) != $TAG_BEGIN || $start_pos === false) {
145 $tag = substr($code, 1, $start_pos - 1);
146 $closing_tag = '</'.$tag;
147 $end_pos = strpos($code, $closing_tag, $start_pos + 1);
151 if($end_pos === false) {
152 $output['self_closing'] = true;
153 $end_pos = (substr($code, -2) == '/>') ? -2 : -1;
154 $code = substr($code, $start_pos + 1, $end_pos);
156 $output['self_closing'] = false;
157 $code = substr($code, $start_pos + 1, $end_pos - $start_pos - 1);
159 for($i = 0; $i < strlen($code) ; $i ++) {
161 if($char == $SINGLE_QUOTE || $char == $DOUBLE_QUOTE) {
162 if(empty($quote_type)) {
163 $quote_encoded = true;
165 } else if ($quote_type == $char) {
167 $string = implode('', $cache);
168 if(empty($var_name)) {
170 } else if($var_assign) {
171 $output[$var_name] = $string;
178 $quote_encoded = false;
180 array_push($cache, $char);
182 } else if ( !$quote_encoded && $char == ' ' ) {
184 $string = implode('', $cache);
185 if(empty($var_name)) {
187 } else if($var_assign) {
188 $output[$var_name] = $string;
191 $quote_encoded = false;
195 } else if ( !$quote_encoded && $char == $ASSIGN_SIGN ) {
196 if(!empty($var_name)) {
197 $output[$var_name] = '';
199 $string = implode('', $cache);
203 } else if ( !$quote_encoded && $char == $TAG_END ) {
206 array_push($cache, $char);
209 if($output['self_closing'] === false) {
210 $output['container'] = substr($code, $i + 1);