oc-server3/htdocs/lib2/menu.class.php

260 lines
8.4 KiB
PHP

<?php
/***************************************************************************
* For license information see doc/license.txt
*
* Unicode Reminder メモ
***************************************************************************/
require_once($GLOBALS['container']->get('ocde.config')->getBaseDir() . '/lib2/translate.inc.php');
$menu = new Menu();
class Menu
{
const AUTH_LEVEL_ALL = 0;
const AUTH_LEVEL_ADMIN = 2;
const MNU_ROOT = 0;
private $nSelectedItem = 0;
private $sMenuFilename = '';
public function __construct()
{
global $opt;
$this->sMenuFilename = $GLOBALS['container']->get('ocde.config')->getBaseDir() . '/cache2/menu-' . $opt['template']['locale'] . '.inc.php';
if (!file_exists($this->sMenuFilename)) {
$this->CreateCacheFile();
}
require_once($this->sMenuFilename);
}
public function CreateCacheFile()
{
global $opt, $translate;
$f = fopen($this->sMenuFilename, 'w');
fwrite($f, "<?php\n");
fwrite($f, 'global $menuitem;' . "\n");
fwrite($f, "\n");
$rsDefines = sqlf("SELECT `id`, `id_string` FROM `sys_menu`");
while ($rDefine = sql_fetch_assoc($rsDefines)) {
fwrite($f, 'if (!defined(\'' . addslashes($rDefine['id_string']) . '\')) define(\'' . addslashes($rDefine['id_string']) . '\', ' . $rDefine['id'] . ");\n");
}
sql_free_result($rsDefines);
fwrite($f, "\n");
$aMenu = array();
$nPos = 0;
$rsSubmenu = sqlf("SELECT `id` FROM `sys_menu` WHERE `parent`=0 ORDER BY `parent` ASC, `position` ASC");
while ($rSubmenu = sql_fetch_assoc($rsSubmenu)) {
$aMenu[self::MNU_ROOT]['subitems'][$nPos] = $rSubmenu['id'];
$nPos++;
}
sql_free_result($rsSubmenu);
fwrite($f, "\n");
$rs = sqlf('SELECT `item`.`id`, `item`.`title`, `item`.`menustring`, `item`.`access`, `item`.`href`, `item`.`visible`, `item`.`parent` AS `parentid`, `item`.`color` AS `color` FROM `sys_menu` AS `item` LEFT JOIN `sys_menu` AS `parentitem` ON `item`.`parent`=`parentitem`.`id`');
while ($r = sql_fetch_assoc($rs)) {
$aMenu[$r['id']]['title'] = $translate->t($r['title'], '', basename(__FILE__), __LINE__);
$aMenu[$r['id']]['menustring'] = $translate->t($r['menustring'], '', basename(__FILE__), __LINE__);
$aMenu[$r['id']]['authlevel'] = ($r['access']==0) ? self::AUTH_LEVEL_ALL : self::AUTH_LEVEL_ADMIN;
if (substr($r['href'], 0, 1) == '!') {
$aMenu[$r['id']]['href'] = substr($r['href'], 1);
$aMenu[$r['id']]['target'] = 'target="_blank"';
} else {
$aMenu[$r['id']]['href'] = $r['href'];
$aMenu[$r['id']]['target'] = '';
}
$aMenu[$r['id']]['visible'] = $r['visible'];
$aMenu[$r['id']]['sublevel'] = $this->pGetMenuSublevel($r['id']);
if ($r['parentid'] != 0) {
$aMenu[$r['id']]['parent'] = $r['parentid'];
}
if ($r['color'] != null) {
$aMenu[$r['id']]['color'] = $r['color'];
}
$nPos = 0;
$rsSubmenu = sqlf("SELECT `id` FROM `sys_menu` WHERE `parent`='&1' ORDER BY `parent` ASC, `position` ASC", $r['id']);
while ($rSubmenu = sql_fetch_assoc($rsSubmenu)) {
$aMenu[$r['id']]['subitems'][$nPos] = $rSubmenu['id'];
$nPos++;
}
sql_free_result($rsSubmenu);
}
sql_free_result($rs);
fwrite($f, '$menuitem = unserialize("' . str_replace('"', '\\"', serialize($aMenu)) . '");' . "\n");
fwrite($f, "?>");
fclose($f);
}
public function clearCache()
{
$dir = $GLOBALS['container']->get('ocde.config')->getBaseDir() . '/cache2/';
if ($dh = opendir($dir)) {
while (($file = readdir($dh)) !== false) {
if (filetype($dir . $file) == 'file') {
if (preg_match('/^menu-[a-z]{2,2}.inc.php/', $file)) {
unlink($dir . $file);
}
}
}
closedir($dh);
}
}
public function pGetMenuSublevel($id)
{
$parent = sqlf_value("SELECT `parent` FROM `sys_menu` WHERE `id`='&1'", 0, $id);
if ($parent != 0) {
return $this->pGetMenuSublevel($parent) + 1;
}
return 0;
}
public function SetSelectItem($item)
{
$this->nSelectedItem = $item;
}
public function GetSelectItem($item)
{
return $this->nSelectedItem;
}
public function GetBreadcrumb()
{
global $menuitem;
$retval = array();
$retval[] = $menuitem[$this->nSelectedItem];
$nCurItem = $this->nSelectedItem;
while ($nCurItem != self::MNU_ROOT) {
if (isset($menuitem[$nCurItem]['parent'])) {
$nCurItem = $menuitem[$nCurItem]['parent'];
$retval[] = $menuitem[$nCurItem];
} else {
$nCurItem = self::MNU_ROOT;
}
}
return array_reverse($retval);
}
public function GetTopMenu()
{
global $menuitem;
$ids = $this->GetSelectedMenuIds();
$retval = array();
foreach ($menuitem[self::MNU_ROOT]['subitems'] as $item) {
if (($menuitem[$item]['authlevel'] != self::AUTH_LEVEL_ADMIN || $GLOBALS['container']->get('ocde.login')->hasAdminPriv()) && ($menuitem[$item]['visible'] == 1 || ($menuitem[$item]['visible'] == 2 && !$GLOBALS['container']->get('ocde.login')->logged_in()))) {
$thisitem = $menuitem[$item];
$thisitem['selected'] = isset($ids[$item]);
$retval[] = $thisitem;
}
}
return $retval;
}
public function GetSubMenu()
{
global $menuitem;
$ids = $this->GetSelectedMenuIds();
$topmenu = array_pop($ids);
if (isset($menuitem[$topmenu]['parent']) && $menuitem[$topmenu]['parent'] != self::MNU_ROOT) {
die('internal error Menu::GetSelectedMenuIds');
}
$ids[$topmenu] = $topmenu;
$retval = array();
if ($topmenu != self::MNU_ROOT) {
$this->pAppendSubMenu($topmenu, $ids, $retval);
}
return $retval;
}
public function pAppendSubMenu($menuid, $ids, &$items)
{
global $menuitem;
if (isset($menuitem[$menuid]['subitems'])) {
foreach ($menuitem[$menuid]['subitems'] as $item) {
if (($menuitem[$item]['authlevel'] != self::AUTH_LEVEL_ADMIN || $GLOBALS['container']->get('ocde.login')->hasAdminPriv()) && ($menuitem[$item]['visible'] == 1 || ($menuitem[$item]['visible'] == 2 && !$GLOBALS['container']->get('ocde.login')->logged_in()))) {
$thisitem = $menuitem[$item];
$thisitem['selected'] = isset($ids[$item]);
$items[] = $thisitem;
$this->pAppendSubMenu($item, $ids, $items);
}
}
}
}
public function GetSelectedMenuIds()
{
global $menuitem;
$retval = array();
$retval[$this->nSelectedItem] = $this->nSelectedItem;
$nCurItem = $this->nSelectedItem;
while ($nCurItem != self::MNU_ROOT) {
if (isset($menuitem[$nCurItem]['parent'])) {
$nCurItem = $menuitem[$nCurItem]['parent'];
$retval[$nCurItem] = $nCurItem;
} else {
$nCurItem = self::MNU_ROOT;
}
}
return $retval;
}
public function getMenuColor()
{
global $menuitem;
$nCurItem = $this->nSelectedItem;
while (!isset($menuitem[$nCurItem]['color']) && $nCurItem != self::MNU_ROOT) {
if (isset($menuitem[$nCurItem]['parent'])) {
$nCurItem = $menuitem[$nCurItem]['parent'];
} else {
$nCurItem = self::MNU_ROOT;
}
}
if (isset($menuitem[$nCurItem]['color'])) {
return $menuitem[$nCurItem]['color'];
} else {
return '';
}
}
public function GetMenuTitle()
{
global $menuitem;
if (isset($menuitem[$this->nSelectedItem])) {
return isset($menuitem[$this->nSelectedItem]['title']) ? $menuitem[$this->nSelectedItem]['title'] : '';
} else {
return '';
}
}
}