.
* ---------------------------------------------------------------------
*/
if (!defined('GLPI_ROOT')) {
die("Sorry. You can't access this file directly");
}
/**
* CommonDevice Class
* for Device*class
*/
abstract class CommonDevice extends CommonDropdown {
static $rightname = 'device';
public $can_be_translated = false;
// From CommonDBTM
public $dohistory = true;
static function getTypeName($nb = 0) {
return _n('Component', 'Components', $nb);
}
/**
* Get all the kind of devices available inside the system.
*
* @since 0.85
*
* @return array of the types of CommonDevice available
**/
static function getDeviceTypes() {
global $CFG_GLPI;
return $CFG_GLPI['device_types'];
}
/**
* Get the assiociated item_device associated with this device
* This method can be override, for instance by the plugin
*
* @since 0.85
* @since 9.3 added the $devicetype parameter
*
* @param string $devicetype class name of device type, defaults to called class name
*
* @return array of the types of CommonDevice available
**/
static function getItem_DeviceType($devicetype = null) {
if (null === $devicetype) {
$devicetype = get_called_class();
}
if ($plug = isPluginItemType($devicetype)) {
return 'Plugin'.$plug['plugin'].'Item_'.$plug['class'];
}
return "Item_$devicetype";
}
/**
* @see CommonGLPI::getMenuContent()
*
* @since 0.85
**/
static function getMenuContent() {
$menu = [];
if (self::canView()) {
$menu['title'] = static::getTypeName(Session::getPluralNumber());
$menu['page'] = '/front/devices.php';
$menu['icon'] = self::getIcon();
$dps = Dropdown::getDeviceItemTypes();
foreach ($dps as $tab) {
foreach ($tab as $key => $val) {
if ($tmp = getItemForItemtype($key)) {
$menu['options'][$key]['title'] = $val;
$menu['options'][$key]['page'] = $tmp->getSearchURL(false);
$menu['options'][$key]['links']['search'] = $tmp->getSearchURL(false);
if ($tmp->canCreate()) {
$menu['options'][$key]['links']['add'] = $tmp->getFormURL(false);
}
if ($itemClass = getItemForItemtype(self::getItem_DeviceType($key))) {
$itemTypeName = sprintf(__('%1$s items'), $key::getTypeName(1));
$listLabel = ''
. '' . $itemTypeName . '';
$menu['options'][$key]['links'][$listLabel] = $itemClass->getSearchURL(false);
}
}
}
}
}
if (count($menu)) {
return $menu;
}
return false;
}
/**
* @since 0.85
* @see CommonDropdown::displaySpecificTypeField()
**/
function displaySpecificTypeField($ID, $field = []) {
switch ($field['type']) {
case 'registeredIDChooser' :
RegisteredID::showChildsForItemForm($this, '_registeredID');
break;
}
}
function getAdditionalFields() {
return [['name' => 'manufacturers_id',
'label' => Manufacturer::getTypeName(1),
'type' => 'dropdownValue']];
}
/**
* Can I change recursive flag to false
* check if there is "linked" object in another entity
*
* Overloaded from CommonDBTM
*
* @since 0.85
*
* @return boolean
**/
function canUnrecurs() {
global $DB;
$ID = $this->fields['id'];
if (($ID < 0)
|| !$this->fields['is_recursive']) {
return true;
}
if (!parent::canUnrecurs()) {
return false;
}
$entities = getAncestorsOf("glpi_entities", $this->fields['entities_id']);
$entities[] = $this->fields['entities_id'];
// RELATION : device -> item_device -> item
$linktype = static::getItem_DeviceType();
$linktable = getTableForItemType($linktype);
$result = $DB->request(
[
'SELECT' => [
'itemtype',
new QueryExpression('GROUP_CONCAT(DISTINCT ' . DBmysql::quoteName('items_id') . ') AS ids'),
],
'FROM' => $linktable,
'WHERE' => [
$this->getForeignKeyField() => $ID,
],
'GROUPBY' => [
'itemtype',
]
]
);
foreach ($result as $data) {
if (!empty($data["itemtype"])) {
$itemtable = getTableForItemType($data["itemtype"]);
if ($item = getItemForItemtype($data["itemtype"])) {
// For each itemtype which are entity dependant
if ($item->isEntityAssign()) {
if (countElementsInTable($itemtable, ['id' => $data["ids"],
'NOT' => ['entities_id' => $entities ]]) > 0) {
return false;
}
}
}
}
}
return true;
}
function rawSearchOptions() {
$tab = [];
$tab[] = [
'id' => 'common',
'name' => __('Characteristics')
];
$tab[] = [
'id' => '1',
'table' => $this->getTable(),
'field' => 'designation',
'name' => __('Name'),
'datatype' => 'itemlink',
'massiveaction' => false,
'autocomplete' => true,
];
$tab[] = [
'id' => '2',
'table' => $this->getTable(),
'field' => 'id',
'name' => __('ID'),
'datatype' => 'number',
'massiveaction' => false
];
$tab[] = [
'id' => '23',
'table' => 'glpi_manufacturers',
'field' => 'name',
'name' => Manufacturer::getTypeName(1),
'datatype' => 'dropdown'
];
$tab[] = [
'id' => '16',
'table' => $this->getTable(),
'field' => 'comment',
'name' => __('Comments'),
'datatype' => 'text'
];
$tab[] = [
'id' => '19',
'table' => $this->getTable(),
'field' => 'date_mod',
'name' => __('Last update'),
'datatype' => 'datetime',
'massiveaction' => false
];
$tab[] = [
'id' => '121',
'table' => $this->getTable(),
'field' => 'date_creation',
'name' => __('Creation date'),
'datatype' => 'datetime',
'massiveaction' => false
];
$tab[] = [
'id' => '80',
'table' => 'glpi_entities',
'field' => 'completename',
'name' => Entity::getTypeName(1),
'datatype' => 'dropdown'
];
return $tab;
}
function title() {
Dropdown::showItemTypeMenu(_n('Component', 'Components', Session::getPluralNumber()),
Dropdown::getDeviceItemTypes(), $this->getSearchURL());
}
function displayHeader() {
Html::header($this->getTypeName(1), '', "config", "commondevice", get_class($this));
}
/**
* @since 0.84
*
* @see CommonDBTM::getNameField
*
* @return string
**/
static function getNameField() {
return 'designation';
}
/**
* @since 0.84
* get the HTMLTable Header for the current device according to the type of the item that
* is requesting
*
* @param $itemtype string the type of the item
* @param $base HTMLTableBase object:the element on which adding the header
* (ie.: HTMLTableMain or HTMLTableGroup)
* @param $super HTMLTableSuperHeader object: the super header
* (in case of adding to HTMLTableGroup) (default NULL)
* @param $father HTMLTableHeader object: the father of the current headers
* (default NULL)
* @param $options array parameter such as restriction
*
* @return HTMLTableHeader
**/
static function getHTMLTableHeader($itemtype, HTMLTableBase $base,
HTMLTableSuperHeader $super = null,
HTMLTableHeader $father = null, array $options = []) {
$this_type = get_called_class();
if (isset($options['dont_display'][$this_type])) {
return $father;
}
if (static::canView()) {
$content = "" . static::getTypeName(1) . "";
} else {
$content = static::getTypeName(1);
}
$linktype = static::getItem_DeviceType();
if (in_array($itemtype, $linktype::itemAffinity()) || in_array('*', $linktype::itemAffinity())) {
$column = $base->addHeader('device', $content, $super, $father);
$column->setItemType($this_type,
isset($options['itemtype_title']) ? $options['itemtype_title'] : '');
} else {
$column = $father;
}
return $column;
}
/**
* @since 0.84
*
* @warning note the difference between getHTMLTableCellForItem and getHTMLTableCellsForItem
*
* @param $row HTMLTableRow object
* @param $item CommonDBTM object (default NULL)
* @param $father HTMLTableCell object (default NULL)
* @param $options array
**/
function getHTMLTableCellForItem(HTMLTableRow $row = null, CommonDBTM $item = null,
HTMLTableCell $father = null, array $options = []) {
$this_type = $this->getType();
if (isset($options['dont_display'][$this_type])) {
return $father;
}
if (static::canView()) {
$content = $this->getLink();
} else {
$content = $this->getName();
}
if ($options['canedit']) {
$field_name = 'quantity_'.$this->getType().'_'.$this->getID();
$content .= " " . __s('Add') . "";
$content .= "
";
$content .= __('Add')." ";
$content = [$content,
['function' => 'Dropdown::showNumber',
'parameters' => [$field_name, ['value' => 0,
'min' => 0,
'max' => 10]]],
""];
}
$linktype = static::getItem_DeviceType();
if (in_array($item->getType(), $linktype::itemAffinity()) || in_array('*', $linktype::itemAffinity())) {
$cell = $row->addCell($row->getHeaderByName('common', 'device'),
$content, $father, $this);
} else {
$cell = $father;
}
return $cell;
}
/**
* Import a device is not exists
*
* @param $input array of datas
*
* @return integer ID of existing or new Device
**/
function import(array $input) {
global $DB;
if (!isset($input['designation']) || empty($input['designation'])) {
return 0;
}
$where = [];
$a_criteria = $this->getImportCriteria();
foreach ($a_criteria as $field => $compare) {
if (isset($input[$field])) {
$compare = explode(':', $compare);
switch ($compare[0]) {
case 'equal':
$where[$field] = $input[$field];
break;
case 'delta':
$where[] = [
[$field => ['>', ((int) $input[$field] - (int) $compare[1])]],
[$field => ['<', ((int) $input[$field] + (int) $compare[1])]]
];
break;
}
}
}
$iterator = $DB->request([
'SELECT' => ['id'],
'FROM' => $this->getTable(),
'WHERE' => $where
]);
if (count($iterator) > 0) {
$line = $iterator->next();
return $line['id'];
}
return $this->add($input);
}
/**
* Criteria used for import function
*
* @since 0.84
**/
function getImportCriteria() {
return ['designation' => 'equal',
'manufacturers_id' => 'equal'];
}
/**
* @see CommonDropdown::defineTabs()
*
* @since 0.85
*/
function defineTabs($options = []) {
$ong = [];
$this->addDefaultFormTab($ong);
$this->addImpactTab($ong, $options);
$this->addStandardTab(static::getItem_DeviceType(), $ong, $options);
$this->addStandardTab('Document_Item', $ong, $options);
$this->addStandardTab('Log', $ong, $options);
return $ong;
}
/**
* @since 0.85
**/
function post_workOnItem() {
if ((isset($this->input['_registeredID']))
&& (is_array($this->input['_registeredID']))) {
$input = ['itemtype' => $this->getType(),
'items_id' => $this->getID()];
foreach ($this->input['_registeredID'] as $id => $registered_id) {
$id_object = new RegisteredID();
$input['name'] = $registered_id;
if (isset($this->input['_registeredID_type'][$id])) {
$input['device_type'] = $this->input['_registeredID_type'][$id];
} else {
$input['device_type'] = '';
}
//$input['device_type'] = '';
if ($id < 0) {
if (!empty($registered_id)) {
$id_object->add($input);
}
} else {
if (!empty($registered_id)) {
$input['id'] = $id;
$id_object->update($input);
unset($input['id']);
} else {
$id_object->delete(['id' => $id]);
}
}
}
unset($this->input['_registeredID']);
}
}
/**
* @since 0.85
* @see CommonDBTM::post_addItem()
**/
function post_addItem() {
$this->post_workOnItem();
parent::post_addItem();
}
/**
* @since 0.85
* @see CommonDBTM::post_updateItem()
**/
function post_updateItem($history = 1) {
$this->post_workOnItem();
parent::post_updateItem($history);
}
static function getFormURL($full = true) {
global $CFG_GLPI;
$dir = ($full ? $CFG_GLPI['root_doc'] : '');
$itemtype = get_called_class();
$link = "$dir/front/device.form.php?itemtype=$itemtype";
return $link;
}
static function getSearchURL($full = true) {
global $CFG_GLPI;
$dir = ($full ? $CFG_GLPI['root_doc'] : '');
$itemtype = get_called_class();
$link = "$dir/front/device.php?itemtype=$itemtype";
return $link;
}
static function getIcon() {
return "far fa-square";
}
}