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 选项未出现在列表中