grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026. -------------------------------------------------------------------------- */ /** @file * @brief */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } /** * Common GLPI object **/ class CommonGLPI { /// GLPI Item type cache : set dynamically calling getType protected $type = -1; /// Display list on Navigation Header protected $displaylist = true; /// Show Debug public $showdebug = false; /// Tab orientation : horizontal or vertical public $taborientation = 'horizontal'; /// Need to get item to show tab public $get_item_to_display_tab = false; static protected $othertabs = array(); /** * Return the localized name of the current Type * Should be overloaded in each new class * * @return string **/ static function getTypeName($nb=0) { return __('General'); } /** * Return the type of the object : class name * * @return string **/ static function getType() { return get_called_class(); } /** * Register tab on an objet * * @since version 0.83 * * @param $typeform string object class name to add tab on form * @param $typetab string object class name which manage the tab **/ static function registerStandardTab($typeform, $typetab) { if (isset(self::$othertabs[$typeform])) { self::$othertabs[$typeform][] = $typetab; } else { self::$othertabs[$typeform] = array($typetab); } } /** * Get the array of Tab managed by other types * Getter for plugin (ex PDF) to access protected property * * @since version 0.83 * * @param $typeform string object class name to add tab on form * * @return array of types **/ static function getOtherTabs($typeform) { if (isset(self::$othertabs[$typeform])) { return self::$othertabs[$typeform]; } return array(); } /** * Define tabs to display * * NB : Only called for existing object * * @param $options array * - withtemplate is a template view ? * * @return array containing the onglets **/ function defineTabs($options=array()) { $ong = array(); $this->addDefaultFormTab($ong); return $ong; } /** * return all the tabs for current object * * @since version 0.83 * * @param $options array * - withtemplate is a template view ? * * @return array containing the onglets **/ final function defineAllTabs($options=array()) { global $CFG_GLPI; $onglets = array(); // Tabs known by the object if ($this->isNewItem()) { $this->addDefaultFormTab($onglets); } else { $onglets = $this->defineTabs($options); } // Object with class with 'addtabon' attribute if (isset(self::$othertabs[$this->getType()]) && !$this->isNewItem()) { foreach (self::$othertabs[$this->getType()] as $typetab) { $this->addStandardTab($typetab, $onglets, $options); } } $class = $this->getType(); if (($_SESSION['glpi_use_mode'] == Session::DEBUG_MODE) && (!$this->isNewItem() || $this->showdebug) && (method_exists($class, 'showDebug') || InfoCom::canApplyOn($class) || in_array($class, $CFG_GLPI["reservation_types"]))) { $onglets[-2] = __('Debug'); } // // Single tab // if (empty($onglets)) { // $onglets['empty'] = $this->getTypeName(1); // } return $onglets; } /** * Add standard define tab * * @param $itemtype itemtype link to the tab * @param &$ong array defined tab array * @param $options array of options (for withtemplate) * * @return $this **/ function addStandardTab($itemtype, array &$ong, array $options) { $withtemplate = 0; if (isset($options['withtemplate'])) { $withtemplate = $options['withtemplate']; } switch ($itemtype) { default : if (!is_integer($itemtype) && ($obj = getItemForItemtype($itemtype))) { $titles = $obj->getTabNameForItem($this, $withtemplate); if (!is_array($titles)) { $titles = array(1 => $titles); } foreach ($titles as $key => $val) { if (!empty($val)) { $ong[$itemtype.'$'.$key] = $val; } } } break; } return $this; } /** * @since version 0.85 * * @param $ong array * * @return $this **/ function addDefaultFormTab(array &$ong) { global $CFG_GLPI; if (self::isLayoutExcludedPage() || !self::isLayoutWithMain() || !method_exists($this, "showForm")) { $ong[$this->getType().'$main'] = $this->getTypeName(1); } return $this; } /** * get menu content * * @since version 0.85 * * @return array for menu **/ static function getMenuContent() { $menu = array(); $type = static::getType(); $item = new $type(); $forbidden = $type::getForbiddenActionsForMenu(); $debug = false; if ($item instanceof CommonDBTM) { if ($type::canView()) { $menu['title'] = static::getMenuName(); $menu['shortcut'] = static::getMenuShorcut(); $menu['page'] = static::getSearchURL(false); $menu['links']['search'] = static::getSearchURL(false); if (!in_array('add', $forbidden) && $type::canCreate()) { if ($item->maybeTemplate()) { $menu['links']['add'] = '/front/setup.templates.php?'.'itemtype='.$type. '&add=1'; if (!in_array('template', $forbidden)) { $menu['links']['template'] = '/front/setup.templates.php?'.'itemtype='.$type. '&add=0'; } } else { $menu['links']['add'] = static::getFormURL(false); } } if ($data = static::getAdditionalMenuLinks()) { $menu['links'] += $data; } } } else { if (!method_exists($type, 'canView') || $item->canView()) { $menu['title'] = static::getMenuName(); $menu['shortcut'] = static::getMenuShorcut(); $menu['page'] = static::getSearchURL(false); $menu['links']['search'] = static::getSearchURL(false); } } if ($data = static::getAdditionalMenuOptions()) { $menu['options'] = $data; } if ($data = static::getAdditionalMenuContent()) { $newmenu[strtolower($type)] = $menu; // Force overwrite existing menu foreach ($data as $key => $val) { $newmenu[$key] = $val; } $newmenu['is_multi_entries'] = true; $menu = $newmenu; } if (count($menu)) { return $menu; } return false; } /** * get additional menu content * * @since version 0.85 * * @return array for menu **/ static function getAdditionalMenuContent() { return false; } /** * Get forbidden actions for menu : may be add / template * * @since version 0.85 * * @return array of forbidden actions **/ static function getForbiddenActionsForMenu() { return array(); } /** * Get additional menu options * * @since version 0.85 * * @return array of additional options **/ static function getAdditionalMenuOptions() { return false; } /** * Get additional menu links * * @since version 0.85 * * @return array of additional options **/ static function getAdditionalMenuLinks() { return false; } /** * Get menu shortcut * * @since version 0.85 * * @return character menu shortcut key **/ static function getMenuShorcut() { return ''; } /** * Get menu name * * @since version 0.85 * * @return character menu shortcut key **/ static function getMenuName() { return static::getTypeName(Session::getPluralNumber()); } /** * Get Tab Name used for itemtype * * NB : Only called for existing object * Must check right on what will be displayed + template * * @since version 0.83 * * @param $item CommonDBTM object for which the tab need to be displayed * @param $withtemplate boolean is a template object ? (default 0) * * @return string tab name **/ function getTabNameForItem(CommonGLPI $item, $withtemplate=0) { return ''; } /** * show Tab content * * @since version 0.83 * * @param $item CommonGLPI object for which the tab need to be displayed * @param $tabnum integer tab number (default 1) * @param $withtemplate boolean is a template object ? (default 0) * * @return true **/ static function displayTabContentForItem(CommonGLPI $item, $tabnum=1, $withtemplate=0) { return false; } /** * display standard tab contents * * @param $item CommonGLPI object for which the tab need to be displayed * @param $tab string tab name * @param $withtemplate boolean is a template object ? (default 0) * @param $options array additional options to pass * * @return true **/ static function displayStandardTab(CommonGLPI $item, $tab, $withtemplate=0, $options=array()) { switch ($tab) { // All tab case -1 : // get tabs and loop over $ong = $item->defineAllTabs(array('withtemplate' => $withtemplate)); if (!self::isLayoutExcludedPage() && self::isLayoutWithMain()) { //on classical and vertical split; the main tab is always displayed array_shift($ong); } if (count($ong)) { foreach ($ong as $key => $val) { if ($key != 'empty') { echo "
$val
"; self::displayStandardTab($item, $key, $withtemplate, $options); } } } return true; case -2 : $item->showDebugInfo(); return true; default : $data = explode('$',$tab); $itemtype = $data[0]; // Default set $tabnum = 1; if (isset($data[1])) { $tabnum = $data[1]; } $options['withtemplate'] = $withtemplate; if ($tabnum == 'main') { Plugin::doHook('pre_show_item', array('item' => $item, 'options' => &$options)); $ret = $item->showForm($item->getID(), $options); Plugin::doHook('post_show_item', array('item' => $item, 'options' => $options)); return $ret; } if (!is_integer($itemtype) && ($itemtype != 'empty') && ($obj = getItemForItemtype($itemtype))) { $options['tabnum'] = $tabnum; $options['itemtype'] = $itemtype; Plugin::doHook('pre_show_tab', array( 'item' => $item, 'options' => &$options)); $ret = $obj->displayTabContentForItem($item, $tabnum, $withtemplate); Plugin::doHook('post_show_tab', array('item' => $item, 'options' => $options)); return $ret; } break; } return false; } /** * create tab text entry * * @param $text string text to display * @param $nb integer number of items (default 0) * * @return array containing the onglets **/ static function createTabEntry($text, $nb=0) { if ($nb) { //TRANS: %1$s is the name of the tab, $2$d is number of items in the tab between () $text = sprintf(__('%1$s %2$s'), $text, "$nb"); } return $text; } /** * Redirect to the list page from which the item was selected * Default to the search engine for the type **/ function redirectToList() { global $CFG_GLPI; if (isset($_GET['withtemplate']) && !empty($_GET['withtemplate'])) { Html::redirect($CFG_GLPI["root_doc"]."/front/setup.templates.php?add=0&itemtype=". $this->getType()); } else if (isset($_SESSION['glpilisturl'][$this->getType()]) && !empty($_SESSION['glpilisturl'][$this->getType()])) { Html::redirect($_SESSION['glpilisturl'][$this->getType()]); } else { Html::redirect($this->getSearchURL()); } } /** * is the current object a new one - Always false here (virtual Objet) * * @since version 0.83 * * @return boolean **/ function isNewItem() { return false; } /** * is the current object a new one - Always true here (virtual Objet) * * @since version 0.84 * * @return boolean **/ static function isNewID($ID) { return true; } /** * Get the search page URL for the current classe * * @param $full path or relative one (true by default) **/ static function getTabsURL($full=true) { return Toolbox::getItemTypeTabsURL(get_called_class(), $full); } /** * Get the search page URL for the current class * * @param $full path or relative one (true by default) **/ static function getSearchURL($full=true) { return Toolbox::getItemTypeSearchURL(get_called_class(), $full); } /** * Get the form page URL for the current class * * @param $full path or relative one (true by default) **/ static function getFormURL($full=true) { return Toolbox::getItemTypeFormURL(get_called_class(), $full); } /** * Get the form page URL for the current class and point to a specific ID * * @param $id (default 0) * @param $full path or relative one (true by default) * * @since version 0.90 **/ static function getFormURLWithID($id=0, $full=true) { $itemtype = get_called_class(); $link = $itemtype::getFormURL($full); $link .= (strpos($link,'?') ? '&':'?').'id=' . $id; return $link; } /** * @since version 0.90 * * @param $options array * * @return boolean **/ function showPrimaryForm($options=array()) { if (!method_exists($this, "showForm")) { return false; } $ong = $this->defineAllTabs(); $class = "main_form"; if (count($ong) == 0) { $class .= " no_tab"; } if (!isset($_GET['id']) || (($_GET['id'] <= 0) && !$this instanceof Entity )) { $class .= " create_form"; } else { $class .= " modify_form"; } echo "
"; echo "
"; Plugin::doHook('pre_show_item', array('item' => $this, 'options' => &$options)); $this->showForm($options['id'], $options); Plugin::doHook('post_show_item', array('item' => $this, 'options' => $options)); echo "
"; echo "
"; } /** * Add div to display form's tabs * * @param $options array **/ function addDivForTabs($options=array()) { $this->showTabsContent($options); } /** * Show header of forms : navigation headers * * @param $options array of parameters to add to URLs and ajax * - withtemplate is a template view ? * * @return Nothing () **/ function showTabs($options=array()) { $this->showNavigationHeaderOld($options); } /** * Show tabs content * * @since version 0.85 * * @param $options array of parameters to add to URLs and ajax * - withtemplate is a template view ? * * @return Nothing () **/ function showTabsContent($options=array()) { global $CFG_GLPI; // for objects not in table like central if (isset($this->fields['id'])) { $ID = $this->fields['id']; } else { if (isset($options['id'])) { $ID = $options['id']; } else { $ID = 0; } } $target = $_SERVER['PHP_SELF']; $extraparamhtml = ""; $extraparam = ""; $withtemplate = ""; if (is_array($options) && count($options)) { if (isset($options['withtemplate'])) { $withtemplate = $options['withtemplate']; } $cleaned_options = $options; if (isset($cleaned_options['id'])) { unset($cleaned_options['id']); } if (isset($cleaned_options['stock_image'])) { unset($cleaned_options['stock_image']); } $extraparamhtml = "&".Toolbox::append_params($cleaned_options,'&'); $extraparam = "&".Toolbox::append_params($cleaned_options); } echo "
"; echo "
"; $current_tab = 0; $onglets = $this->defineAllTabs($options); $display_all = true; if (isset($onglets['no_all_tab'])) { $display_all = false; unset($onglets['no_all_tab']); } if (count($onglets)) { $tabpage = $this->getTabsURL(); $tabs = array(); foreach ($onglets as $key => $val ) { $tabs[$key] = array('title' => $val, 'url' => $tabpage, 'params' => "_target=$target&_itemtype=".$this->getType(). "&_glpi_tab=$key&id=$ID$extraparamhtml"); } // Not all tab for templates and if only 1 tab if ($display_all && empty($withtemplate) && (count($tabs) > 1)) { $tabs[-1] = array('title' => __('All'), 'url' => $tabpage, 'params' => "_target=$target&_itemtype=".$this->getType(). "&_glpi_tab=-1&id=$ID$extraparamhtml"); } Ajax::createTabs('tabspanel', 'tabcontent', $tabs, $this->getType(), $ID, $this->taborientation); } echo "
"; } /** * Show tabs * * @param $options array of parameters to add to URLs and ajax * - withtemplate is a template view ? * * @return Nothing () **/ function showNavigationHeader($options=array()) { global $CFG_GLPI; // for objects not in table like central if (isset($this->fields['id'])) { $ID = $this->fields['id']; } else { if (isset($options['id'])) { $ID = $options['id']; } else { $ID = 0; } } $target = $_SERVER['PHP_SELF']; $extraparamhtml = ""; $extraparam = ""; $withtemplate = ""; if (is_array($options) && count($options)) { $cleanoptions = $options; if (isset($options['withtemplate'])) { $withtemplate = $options['withtemplate']; unset($cleanoptions['withtemplate']); } foreach ($cleanoptions as $key => $val) { // Do not include id options if (($key[0] == '_') || ($key == 'id')) { unset($cleanoptions[$key]); } } $extraparamhtml = "&".Toolbox::append_params($cleanoptions,'&'); $extraparam = "&".Toolbox::append_params($cleanoptions); } if (empty($withtemplate) && !$this->isNewID($ID) && $this->getType() && $this->displaylist) { $glpilistitems =& $_SESSION['glpilistitems'][$this->getType()]; $glpilisttitle =& $_SESSION['glpilisttitle'][$this->getType()]; $glpilisturl =& $_SESSION['glpilisturl'][$this->getType()]; if (empty($glpilisturl)) { $glpilisturl = $this->getSearchURL(); } // echo "