367 lines
11 KiB
PHP
367 lines
11 KiB
PHP
<?php
|
|
/**
|
|
* The model file of common module of ZenTaoPMS.
|
|
*
|
|
* @copyright Copyright 2009-2011 青岛易软天创网络科技有限公司 (QingDao Nature Easy Soft Network Technology Co,LTD www.cnezsoft.com)
|
|
* @license LGPL (http://www.gnu.org/licenses/lgpl.html)
|
|
* @author Chunsheng Wang <chunsheng@cnezsoft.com>
|
|
* @package common
|
|
* @version $Id$
|
|
* @link http://www.zentao.net
|
|
*/
|
|
class commonModel extends model
|
|
{
|
|
/**
|
|
* Start the session.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function startSession()
|
|
{
|
|
session_name($this->config->sessionVar);
|
|
if(isset($_GET[$this->config->sessionVar])) session_id($_GET[$this->config->sessionVar]);
|
|
session_start();
|
|
}
|
|
|
|
/**
|
|
* Set the header info.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function sendHeader()
|
|
{
|
|
header("Content-Type: text/html; Language={$this->config->encoding}");
|
|
header("Cache-control: private");
|
|
}
|
|
|
|
/**
|
|
* Set the commpany.
|
|
*
|
|
* First, search company by the http host. If not found, search by the default domain. Last, use the first as the default.
|
|
* After get the company, save it to session.
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function setCompany()
|
|
{
|
|
$httpHost = $this->server->http_host;
|
|
if(strpos($httpHost, ":"))
|
|
{
|
|
$httpHost = explode(":", $httpHost);
|
|
$httpHost = $httpHost[0];
|
|
}
|
|
|
|
if($this->session->company and $this->session->company->pms == $httpHost)
|
|
{
|
|
$this->app->company = $this->session->company;
|
|
}
|
|
else
|
|
{
|
|
$company = $this->loadModel('company')->getByDomain();
|
|
if(!$company and isset($this->config->default->domain)) $company = $this->company->getByDomain($this->config->default->domain);
|
|
if(!$company) $company = $this->company->getFirst();
|
|
if(!$company) $this->app->error(sprintf($this->lang->error->companyNotFound, $httpHost), __FILE__, __LINE__, $exit = true);
|
|
$this->session->set('company', $company);
|
|
$this->app->company = $company;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set the user info.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function setUser()
|
|
{
|
|
if($this->session->user)
|
|
{
|
|
$this->app->user = $this->session->user;
|
|
}
|
|
elseif($this->app->company->guest)
|
|
{
|
|
$user = new stdClass();
|
|
$user->id = 0;
|
|
$user->account = 'guest';
|
|
$user->realname = 'guest';
|
|
$user->rights = $this->loadModel('user')->authorize('guest');
|
|
$this->session->set('user', $user);
|
|
$this->app->user = $this->session->user;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Juage a method of one module is open or not?
|
|
*
|
|
* @param string $module
|
|
* @param string $method
|
|
* @access public
|
|
* @return bool
|
|
*/
|
|
public function isOpenMethod($module, $method)
|
|
{
|
|
if($module == 'user' and strpos('login|logout|deny', $method) !== false) return true;
|
|
if($module == 'api' and $method == 'getsessionid') return true;
|
|
if($module == 'misc' and $method == 'about') return true;
|
|
if($module == 'help' and $method == 'field') return true;
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Deny access.
|
|
*
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public function deny($module, $method)
|
|
{
|
|
$vars = "module=$module&method=$method";
|
|
if(isset($this->server->http_referer))
|
|
{
|
|
$referer = helper::safe64Encode($this->server->http_referer);
|
|
$vars .= "&referer=$referer";
|
|
}
|
|
$denyLink = helper::createLink('user', 'deny', $vars);
|
|
|
|
/* Fix the bug of IE: use js locate, can't get the referer. */
|
|
if(strpos($this->server->http_user_agent, 'MSIE') !== false)
|
|
{
|
|
echo "<a href='$denyLink' id='denylink' style='display:none'>deny</a>";
|
|
echo "<script language='javascript'>document.getElementById('denylink').click();</script>";
|
|
}
|
|
else
|
|
{
|
|
echo js::locate($denyLink);
|
|
}
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Get the run info.
|
|
*
|
|
* @param mixed $startTime the start time of this execution
|
|
* @access public
|
|
* @return array the run info array.
|
|
*/
|
|
public function getRunInfo($startTime)
|
|
{
|
|
$info['timeUsed'] = round(getTime() - $startTime, 4) * 1000;
|
|
$info['memory'] = round(memory_get_peak_usage() / 1024, 1);
|
|
$info['querys'] = count(dao::$querys);
|
|
return $info;
|
|
}
|
|
|
|
/**
|
|
* Print top bar.
|
|
*
|
|
* @static
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public static function printTopBar()
|
|
{
|
|
global $lang, $app;
|
|
|
|
printf($lang->todayIs, date(DT_DATE3));
|
|
if(isset($app->user)) echo $app->user->realname . ' ';
|
|
if(isset($app->user) and $app->user->account != 'guest')
|
|
{
|
|
echo html::a(helper::createLink('my', 'index'), $lang->myControl);
|
|
echo html::a(helper::createLink('user', 'logout'), $lang->logout);
|
|
}
|
|
else
|
|
{
|
|
echo html::a(helper::createLink('user', 'login'), $lang->login);
|
|
}
|
|
echo html::a(helper::createLink('misc', 'about'), $lang->aboutZenTao, '', "class='about'");
|
|
echo $lang->chinaScrum;
|
|
echo $lang->agileTraining;
|
|
}
|
|
|
|
/**
|
|
* Print the main menu.
|
|
*
|
|
* @param string $moduleName
|
|
* @static
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public static function printMainmenu($moduleName)
|
|
{
|
|
global $app, $lang;
|
|
echo "<ul>\n";
|
|
|
|
/* Set the main main menu. */
|
|
$mainMenu = $moduleName;
|
|
if(isset($lang->menugroup->$moduleName)) $mainMenu = $lang->menugroup->$moduleName;
|
|
|
|
/* Print all main menus. */
|
|
foreach($lang->menu as $menuKey => $menu)
|
|
{
|
|
$active = $menuKey == $mainMenu ? "class='active'" : '';
|
|
list($menuLabel, $module, $method) = explode('|', $menu);
|
|
|
|
if(common::hasPriv($module, $method))
|
|
{
|
|
$link = helper::createLink($module, $method);
|
|
echo "<li $active><nobr><a href='$link' id='menu$menuKey'>$menuLabel</a></nobr></li>\n";
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Print the search box.
|
|
*
|
|
* @static
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public static function printSearchBox()
|
|
{
|
|
global $app, $lang;
|
|
$moduleName = $app->getModuleName();
|
|
$methodName = $app->getMethodName();
|
|
$searchObject = $moduleName;
|
|
|
|
if($moduleName == 'product')
|
|
{
|
|
if($methodName == 'browse') $searchObject = 'story';
|
|
}
|
|
elseif($moduleName == 'project')
|
|
{
|
|
if(strpos('task|story|bug|build', $methodName) !== false) $searchObject = $methodName;
|
|
}
|
|
elseif($moduleName == 'my' or $moduleName == 'user')
|
|
{
|
|
$searchObject = $methodName;
|
|
}
|
|
|
|
echo "<li id='searchbox'>";
|
|
echo html::select('searchType', $lang->searchObjects, $searchObject);
|
|
echo html::input('searchQuery', $lang->searchTips, "onclick=this.value='' onkeydown='if(event.keyCode==13) shortcut()' class='w-60px'");
|
|
echo html::commonButton($lang->go, 'id="objectSwitcher" onclick="shortcut()"');
|
|
echo "</li>";
|
|
echo "</ul>\n";
|
|
}
|
|
|
|
/**
|
|
* Print the module menu.
|
|
*
|
|
* @param string $moduleName
|
|
* @static
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public static function printModuleMenu($moduleName)
|
|
{
|
|
global $lang, $app;
|
|
|
|
if(!isset($lang->$moduleName->menu)) {echo "<ul></ul>"; return;}
|
|
|
|
/* Get the sub menus of the module, and get current module and method. */
|
|
$submenus = $lang->$moduleName->menu;
|
|
$currentModule = $app->getModuleName();
|
|
$currentMethod = $app->getMethodName();
|
|
|
|
/* The beginning of the menu. */
|
|
echo "<ul>\n";
|
|
|
|
/* Cycling to print every sub menus. */
|
|
foreach($submenus as $subMenuKey => $submenu)
|
|
{
|
|
/* Init the these vars. */
|
|
$link = $submenu;
|
|
$subModule = '';
|
|
$alias = '';
|
|
$float = '';
|
|
$active = '';
|
|
$target = '';
|
|
|
|
if(is_array($submenu)) extract($submenu); // If the sub menu is an array, extract it.
|
|
|
|
/* Print the menu. */
|
|
if(strpos($link, '|') === false)
|
|
{
|
|
echo "<li>$link</li>\n";
|
|
}
|
|
else
|
|
{
|
|
$link = explode('|', $link);
|
|
list($label, $module, $method) = $link;
|
|
$vars = isset($link[3]) ? $link[3] : '';
|
|
if(common::hasPriv($module, $method))
|
|
{
|
|
/* Is the currentModule active? */
|
|
if($currentModule == $subModule) $active = 'active';
|
|
if($module == $currentModule and ($method == $currentMethod or strpos($alias, $currentMethod) !== false)) $active = 'active';
|
|
echo "<li class='$float $active'>" . html::a(helper::createLink($module, $method, $vars), $label, $target, "id=submenu$subMenuKey") . "</li>\n";
|
|
}
|
|
}
|
|
}
|
|
echo "</ul>\n";
|
|
}
|
|
|
|
/**
|
|
* Print the bread menu.
|
|
*
|
|
* @param string $moduleName
|
|
* @param string $position
|
|
* @static
|
|
* @access public
|
|
* @return void
|
|
*/
|
|
public static function printBreadMenu($moduleName, $position)
|
|
{
|
|
global $lang;
|
|
$mainMenu = $moduleName;
|
|
if(isset($lang->menugroup->$moduleName)) $mainMenu = $lang->menugroup->$moduleName;
|
|
echo html::a(helper::createLink('my', 'index'), $lang->ZenTaoPMS) . $lang->arrow;
|
|
if($moduleName != 'index')
|
|
{
|
|
list($menuLabel, $module, $method) = explode('|', $lang->menu->$mainMenu);
|
|
echo html::a(helper::createLink($module, $method), $menuLabel);
|
|
}
|
|
else
|
|
{
|
|
echo $lang->index->common;
|
|
}
|
|
if(empty($position)) return;
|
|
echo $lang->arrow;
|
|
foreach($position as $key => $link)
|
|
{
|
|
echo $link;
|
|
if(isset($position[$key + 1])) echo $lang->arrow;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Diff two string. (see phpt)
|
|
*
|
|
* @param string $text1
|
|
* @param string $text2
|
|
* @static
|
|
* @access public
|
|
* @return string
|
|
*/
|
|
public static function diff($text1, $text2)
|
|
{
|
|
$text1 = str_replace(' ', '', trim($text1));
|
|
$text2 = str_replace(' ', '', trim($text2));
|
|
$w = explode("\n", $text1);
|
|
$o = explode("\n", $text2);
|
|
$w1 = array_diff_assoc($w,$o);
|
|
$o1 = array_diff_assoc($o,$w);
|
|
$w2 = array();
|
|
$o2 = array();
|
|
foreach($w1 as $idx => $val) $w2[sprintf("%03d<",$idx)] = sprintf("%03d- ", $idx+1) . "<del>" . trim($val) . "</del>";
|
|
foreach($o1 as $idx => $val) $o2[sprintf("%03d>",$idx)] = sprintf("%03d+ ", $idx+1) . "<ins>" . trim($val) . "</ins>";
|
|
$diff = array_merge($w2, $o2);
|
|
ksort($diff);
|
|
return implode("\n", $diff);
|
|
}
|
|
}
|