CodeIgniter 3 html helper ul 函数,如何将参数传递给 li 的
CodeIgniter 3 html helper ul function, how to pass parameters to li's
我正在使用 CodeIgniter 3 实现一个站点,我使用的是 HTML helper,它可以很好地满足我的需要。我的 UL
有以下数组
$links = array(
anchor(index_page(),"Home",(uri_string() == "" ? array('class' => 'active') : '')),
anchor("about-us","About Us",(uri_string() == "about-us" ? array('class' => 'active') : '')),
anchor("customers","Customers",(uri_string() == "customers" ? array('class' => 'active') : '')),
anchor("policy","Policy",(uri_string() == "policy" ? array('class' => 'active') : '')),
anchor("contact","Contact",(uri_string() == "contact" ? array('class' => 'active') : ''))
);
$attributes_normal = array(
'id' => 'main_menu'
);
所以,在拥有这些数组之后,我像这样初始化我的 ul:
<?php echo ul($links, $attributes_normal); ?>
结果如下(about us section open for example):
<ul id="main_menu">
<li><a href="http://mysitesurl/">Home</a></li>
<li><a href="http://mysitesurl/about-us" class="active">About Us</a></li>
<li><a href="http://mysitesurl/customers">Customers</a></li>
<li><a href="http://mysitesurl/policy">Policy</a></li>
<li><a href="http://mysitesurl/contact">Contact</a></li>
</ul>
我唯一的问题是,有什么方法可以将活动的 link 条件传递给 <li>
元素。我正在使用 Zurb Foundation 5,默认情况下它将 class="active"
添加到 <li>
元素,所以我想使用默认的 CSS.
不重写默认的 _list
辅助函数。在 line 145 的 HTML Helper 源代码中,您可以看到“
”是硬编码的,不接受其他参数:
$out .= str_repeat(' ', $depth + 2).'<li>';
我可能只使用 jQuery 或 JavaScript 设置活动 class,但您也可以选择覆盖生成列表的默认辅助函数(参见 Extending Helpers).
您必须在 application/helpers 路径中创建 MY_html_helper.php
if ( ! function_exists('_list'))
{
/**
* Generates the list
*
* Generates an HTML ordered list from an single or multi-dimensional array.
*
* @param string
* @param mixed
* @param mixed
* @param int
* @param string
* @param string
* @return string
*/
function _list($type = 'ul', $list = array(), $attributes = '', $depth = 0, $outer = '__outer', $inner = '__inner' )
{
// If an array wasn't submitted there's nothing to do...
if ( ! is_array($list))
{
return $list;
}
// Set the indentation based on the depth
$out = str_repeat(' ', $depth)
// Write the opening list tag
.'<'.$type._stringify_attributes($attributes).">\n";
// Cycle through the list elements. If an array is
// encountered we will recursively call _list()
static $_last_list_item = '';
foreach ($list as $key => $val)
{
$_last_list_item = $key;
if ( $key !== $outer && $key !== $inner) {
$out .= str_repeat(' ', $depth + 2) . '<li ' . (is_array($val) && array_key_exists($outer, $val) ? _stringify_attributes($val[$outer]) : '') . '>';
if (!is_array($val)) {
$out .= $val;
} else {
$out .= $_last_list_item . "\n" . _list($type, $val, (array_key_exists($inner, $val) ? $val[$inner] : ''), $depth + 4) . str_repeat(' ', $depth + 2);
}
$out .= "</li>\n";
}
}
// Set the indentation for the closing tag and apply it
return $out.str_repeat(' ', $depth).'</'.$type.">\n";
}
}
现在您可以使用 ul() 函数的 netx 配置
$links = array(
'Access Control' => array(
'Users' => array(
'__outer' => array(
//Here you have the config for 'User' option 'li'
'class' => 'active some-class',
'id' => 'my-unique-id'
)
),
'Roles',
'Permissions',
'__inner' => array(
//Here you have the config for inner ul (sub-menu)
'class' => 'sub-menu'
),
'__outer' => array(
//Here you have the config for 'Access Control' option 'li'
'class' => 'active'
),
),
);
__inner 和 __outer 选项未出现在列表中
我正在使用 CodeIgniter 3 实现一个站点,我使用的是 HTML helper,它可以很好地满足我的需要。我的 UL
有以下数组$links = array(
anchor(index_page(),"Home",(uri_string() == "" ? array('class' => 'active') : '')),
anchor("about-us","About Us",(uri_string() == "about-us" ? array('class' => 'active') : '')),
anchor("customers","Customers",(uri_string() == "customers" ? array('class' => 'active') : '')),
anchor("policy","Policy",(uri_string() == "policy" ? array('class' => 'active') : '')),
anchor("contact","Contact",(uri_string() == "contact" ? array('class' => 'active') : ''))
);
$attributes_normal = array(
'id' => 'main_menu'
);
所以,在拥有这些数组之后,我像这样初始化我的 ul:
<?php echo ul($links, $attributes_normal); ?>
结果如下(about us section open for example):
<ul id="main_menu">
<li><a href="http://mysitesurl/">Home</a></li>
<li><a href="http://mysitesurl/about-us" class="active">About Us</a></li>
<li><a href="http://mysitesurl/customers">Customers</a></li>
<li><a href="http://mysitesurl/policy">Policy</a></li>
<li><a href="http://mysitesurl/contact">Contact</a></li>
</ul>
我唯一的问题是,有什么方法可以将活动的 link 条件传递给 <li>
元素。我正在使用 Zurb Foundation 5,默认情况下它将 class="active"
添加到 <li>
元素,所以我想使用默认的 CSS.
不重写默认的 _list
辅助函数。在 line 145 的 HTML Helper 源代码中,您可以看到“
$out .= str_repeat(' ', $depth + 2).'<li>';
我可能只使用 jQuery 或 JavaScript 设置活动 class,但您也可以选择覆盖生成列表的默认辅助函数(参见 Extending Helpers).
您必须在 application/helpers 路径中创建 MY_html_helper.php
if ( ! function_exists('_list'))
{
/**
* Generates the list
*
* Generates an HTML ordered list from an single or multi-dimensional array.
*
* @param string
* @param mixed
* @param mixed
* @param int
* @param string
* @param string
* @return string
*/
function _list($type = 'ul', $list = array(), $attributes = '', $depth = 0, $outer = '__outer', $inner = '__inner' )
{
// If an array wasn't submitted there's nothing to do...
if ( ! is_array($list))
{
return $list;
}
// Set the indentation based on the depth
$out = str_repeat(' ', $depth)
// Write the opening list tag
.'<'.$type._stringify_attributes($attributes).">\n";
// Cycle through the list elements. If an array is
// encountered we will recursively call _list()
static $_last_list_item = '';
foreach ($list as $key => $val)
{
$_last_list_item = $key;
if ( $key !== $outer && $key !== $inner) {
$out .= str_repeat(' ', $depth + 2) . '<li ' . (is_array($val) && array_key_exists($outer, $val) ? _stringify_attributes($val[$outer]) : '') . '>';
if (!is_array($val)) {
$out .= $val;
} else {
$out .= $_last_list_item . "\n" . _list($type, $val, (array_key_exists($inner, $val) ? $val[$inner] : ''), $depth + 4) . str_repeat(' ', $depth + 2);
}
$out .= "</li>\n";
}
}
// Set the indentation for the closing tag and apply it
return $out.str_repeat(' ', $depth).'</'.$type.">\n";
}
}
现在您可以使用 ul() 函数的 netx 配置
$links = array(
'Access Control' => array(
'Users' => array(
'__outer' => array(
//Here you have the config for 'User' option 'li'
'class' => 'active some-class',
'id' => 'my-unique-id'
)
),
'Roles',
'Permissions',
'__inner' => array(
//Here you have the config for inner ul (sub-menu)
'class' => 'sub-menu'
),
'__outer' => array(
//Here you have the config for 'Access Control' option 'li'
'class' => 'active'
),
),
);
__inner 和 __outer 选项未出现在列表中