Я реализую сайт с CodeIgniter 3, и я использую HTML помощник который прекрасно работает для того, что мне нужно. У меня есть следующие массивы для моего 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); ?>
Результат выглядит следующим образом (раздел о нас открыт для примера):
<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>
Единственный вопрос, который у меня есть, есть ли способ передать условие активной ссылки на <li>
элемент. Я использую Zurb Foundation 5 и по умолчанию он добавляет class="active"
к <li>
элемент, поэтому я хочу использовать CSS по умолчанию.
Не без переопределения по умолчанию _list
вспомогательная функция. На линия 145 в исходном коде для HTML Helper вы можете увидеть, что<литий>’жестко запрограммирован и не принимает дополнительных аргументов:
$out .= str_repeat(' ', $depth + 2).'<li>';
Возможно, я бы просто установил активный класс, используя jQuery или JavaScript, но вы также можете переопределить вспомогательные функции по умолчанию для создания списков (см. Расширение помощников).
Вы должны создать 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";
}
}
Теперь вы можете использовать конфигурацию netx для функции ul ()
$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 не отображаются в списке