<?php /** * @package Warp Theme Framework * @author YOOtheme http://www.yootheme.com * @copyright Copyright (C) YOOtheme GmbH * @license http://www.gnu.org/licenses/gpl.html GNU/GPL */ namespace Warp\Menu; /** * Navbar menu renderer. */ class Navbar { /** * Process menu * * @param object $module * @param object $element * @return object */ public function process($module, $element) { $element->first('ul:first')->attr('class', 'uk-navbar-nav'); foreach ($element->find('ul.level2') as $ul) { // get parent li $li = $ul->parent(); // get columns $columns = (int) $li->attr('data-menu-columns'); if ($columns > 1) { $i = 0; $column = -1; $children = $ul->children('li'); if ($children->length > $columns) { $remainder = $children->length % $columns; $colrows = ($children->length - $remainder) / $columns; } else { $remainder = 0; $colrows = 1; } foreach ($children as $child) { if ($i-- == 0) { $i = $remainder-- > 0 ? $colrows : $colrows - 1; $column++; } if ($li->children('ul')->length == $column) { $li->append('<ul class="level2"></ul>'); } if ($column > 0) { $li->children('ul')->item($column)->append($child); } } $columns = $column + 1; } else { $columns = 1; } // get width $width = (int) $li->attr('data-menu-columnwidth'); $style = $width > 0 ? sprintf(' style="min-width: %spx; max-width: %spx; width:%spx;"', $columns * $width, $columns * $width, $width) : null; // append dropdown divs $li->append(sprintf('<div class="uk-dropdown uk-dropdown-navbar uk-dropdown-width-%d"%s><div class="uk-grid uk-dropdown-grid"></div></div>', $columns, $style)); $div = $li->first('div.uk-dropdown div.uk-grid'); foreach ($li->children('ul') as $i => $u) { $u->addClass("uk-nav uk-nav-navbar"); $div->append(sprintf('<div class="uk-width-1-%d"></div>', $columns))->children('div')->item($i)->append($u); } } // dropdown settings $dropdown = str_replace('"', '\'', json_encode(array_merge( array("preventflip" => "y"), isset($module->nav_settings['dropdown']) ? (array)$module->nav_settings['dropdown'] : array() ))); foreach ($element->find('li.level1') as $li) { // add attributes, if element has dropdown if ($li->children('div.uk-dropdown')->length) { $li->attr("data-uk-dropdown", $dropdown); $li->attr("aria-haspopup", "true"); $li->attr("aria-expanded", "false"); } if ($li->attr('data-menu-subtitle')) { $li->first("a")->addClass('uk-navbar-nav-subtitle'); } } foreach($element->find("ul.level3") as $list) { $list->addClass("uk-nav-sub"); } return $element; } }