如何从PHP循环和XML生成的菜单中删除管道符号

时间:2013-12-31 13:08:36

标签: php xml loops

想知道是否有人可以帮助我。

我正在使用PHP循环生成ELEVAT(提升)和AUTHOR(授权基本用户)的菜单选项,该循环访问XML文件集,以便secure = 0或1,如下所示:

<menuitem>
<itemname>Edit Event</itemname>
<itemfilename>editevent.php</itemfilename>
<itemfilepath>scripts</itemfilepath>
<secure>0</secure>
</menuitem>
<menuitem>
<itemname>Archive</itemname>
<itemfilename>eventsarchive.php</itemfilename>
<itemfilepath>scripts</itemfilepath>
<secure>1</secure>
</menuitem>

0 =授权的基本用户和1 =提升的用户

考虑到我有这么多菜单链接,我有2行用于提升用户,我试图输出到浏览器,以便第一行页面链接的最后一个菜单项不打印管道。

到目前为止,我已经设法让最后一个链接后没有管道的基本用户登录但是我不能在我的生活中找出如何删除|从提升用户登录的第一行链接的最后一个链接。

这是我的PHP函数:

function pagemenu($pageFile)
{
    # Open the DB connection
    $sql      = dbconnect();
    $linkPath = getlinkpath($pageFile);
    # The $pageFile value is the file name of the calling page
    # Set the path to the menu source file
    $xmlsrc = $linkPath . 'xml/menulist.xml';
    # Load the menu source file into a SimpleXML object
    if (!$menulist = simplexml_load_file($xmlsrc)) {
        # Print an error message if the source file does not load
        print 'Unable to load the XML source file';
    } # Process the menulist.xml file
    else {
        # Set a counter for the menu items
        $itemCount = 1;
        # Find the folder path of the calling page
        foreach ($menulist as $menu) {
            if ($menu->itemfilename == $pageFile) {
                $linkPath = $menu->itemfilepath;
            } else {
                $linkPath = '';
            }
        }
        # Scroll through all the menu items and build the menu
        print '<div class="menubar">' . PHP_EOL;
        foreach ($menulist as $menu) {
            # If the menu item is the current page don't display a link
            if ($menu->itemfilename == $pageFile) {
                # Don't print a pipe before the first menu item
                if ($itemCount != 1) {
                    print ' | ';
                }
                print $menu->itemname;
            } # Display a link for all the other menu items
            else {
                # Construct the link path to the menu item file
                # A link to the index file
                if ($menu->itemfilepath == 'root') {
                    $thisLink = '../' . $menu->itemfilename;
                } # A link to a file in the same folder
                elseif ($menu->itemfilepath == $linkPath) {
                    $thisLink = $menu->itemfilename;
                } elseif ($pageFile == 'index.php' and $menu->itemfilepath != $linkPath) {
                    $thisLink = $menu->itemfilepath . '/' . $menu->itemfilename;
                } # A link to a file in a different folder
                elseif ($menu->itemfilepath != $linkPath) {
                    $thisLink = '../' . $menu->itemfilepath . '/' . $menu->itemfilename;
                }
                # Create the connection to the mysql database and handle error if there is one
                $query    = mysqli_query(
                    $sql, "SELECT user_type_id FROM user_details WHERE user_id =     '$_SESSION[validUser]'"
                );
                $usertype = mysqli_fetch_assoc($query);
                # Don't print a pipe before the first menu item
                if ($usertype['user_type_id'] == "ELEVAT") {
                    if ($itemCount != 1) {
                        # Tried the following added to the above line without success
                        # && ($itemCount !=11))
                        print ' | ';
                    }
                } else {
                    if (($itemCount != 1) && ($itemCount != 5) && ($itemCount != 6) && ($itemCount != 7)
                        && ($itemCount != 8)
                        && ($itemCount != 9)
                        && ($itemCount != 10)
                        && ($itemCount != 11)
                        && ($itemCount != 12)
                        && ($itemCount != 13)
                        && ($itemCount != 14)
                        && ($itemCount != 15)
                        && ($itemCount != 16)
                        && ($itemCount != 17)
                    ) {
                        print ' | ';
                    }
                }
                # Display the menu item as a link
                if ($menu->secure == 1) {
                    if ($usertype['user_type_id'] == "ELEVAT") {
                        print '<a href="' . $thisLink . '">' . $menu->itemname . '</a>';
                    }
                } else {
                    print '<a href="' . $thisLink . '">' . $menu->itemname . '</a>';
                }
            }
            # Increment the menu item counter
            $itemCount++;
        }
    }
    print '</div>' . PHP_EOL;

    return;
    # Close the DB connection
    mysqli_close($sql);
}

1 个答案:

答案 0 :(得分:0)

  

这样第一行页面链接的最后一个菜单项不会打印管道。

这是一个常见问题。您需要知道最后一个元素何时存在。您可以通过缓存执行此操作,以便了解元素是否是最后一个元素(与CachingIterator::hasNext()比较,或者count()如果您正在使用数组)。

在您的情况下,最简单的方法是创建一个xpath表达式,从您感兴趣的菜单中提取所有这些条目。

这是当前页面的第一个,第二个是您在那里的用户组(安全0/1)。

http://php.net/simplexml.examples-basic介绍了如何做到这一点。

完成后,SimpleXMLElement::xpath()方法会为您提供一个数组,您可以迭代输出菜单。然后,您可以使用基于count()的条件或进行数组迭代并对其进行缓存,以使用CachingIterator::hasNext()方法找出您是否在最后一行。

$entries = $xml->xpath($query);
$entries = new CachingIterator(new ArrayIterator($entries));
foreach ($entries as $entry) 
{
    $menutItem = menu_item_create_from_xml($entry);
    menu_item_output($menutItem, $entries->hasNext());
                                 # ^^^ tell the menu output function whether or 
                                 #     not this is the last element of the menu
}