/**
* Get the group of elements regarding given item.
* Two kind of item :
* - Device* feed by a link to the attached item (Computer, Printer ...)
* - Computer, Printer ...: feed by the "global" properties of the CommonDevice
* Then feed with the specificities of the Item_Device elements
* In cas of $item is an instance, then $options contains the type of the item (Computer,
* Printer ...).
*
* @param $item
* @param $table
* @param $options array
* @param $delete_all_column (default NULL)
* @param $common_column
* @param $specific_column
* @param $delete_column (default NULL)
* @param $dynamic_column
**/
function getTableGroup(CommonDBTM $item, HTMLTableMain $table, array $options, HTMLTableSuperHeader $delete_all_column = NULL, HTMLTableSuperHeader $common_column, HTMLTableSuperHeader $specific_column, HTMLTableSuperHeader $delete_column = NULL, $dynamic_column)
{
global $DB;
$is_device = $item instanceof CommonDevice;
if ($is_device) {
$peer_type = $options['itemtype'];
if (empty($peer_type)) {
$column_label = __('Dissociated devices');
$group_name = 'None';
} else {
$column_label = $peer_type::getTypeName(Session::getPluralNumber());
$group_name = $peer_type;
}
$table_group = $table->createGroup($group_name, '');
$peer_column = $table_group->addHeader('item', $column_label, $common_column, NULL);
if (!empty($peer_type)) {
//TRANS : %1$s is the type of the device
// %2$s is the type of the item
// %3$s is the name of the item (used for headings of a list),
$itemtype_nav_title = sprintf(__('%1$s of %2$s: %3$s'), $peer_type::getTypeName(Session::getPluralNumber()), $item->getTypeName(1), $item->getName());
$peer_column->setItemType($peer_type, $itemtype_nav_title);
}
} else {
$peer_type = $this->getDeviceType();
$table_group = $table->createGroup($peer_type, '');
//TRANS : %1$s is the type of the device
// %2$s is the type of the item
// %3$s is the name of the item (used for headings of a list),
$options['itemtype_title'] = sprintf(__('%1$s of %2$s: %3$s'), $peer_type::getTypeName(Session::getPluralNumber()), $item->getTypeName(1), $item->getName());
$peer_type::getHTMLTableHeader($item->getType(), $table_group, $common_column, NULL, $options);
}
$specificity_columns = array();
$link_column = $table_group->addHeader('spec_link', '', $specific_column);
$spec_column = $link_column;
foreach ($this->getSpecificities() as $field => $attributs) {
$spec_column = $table_group->addHeader('spec_' . $field, $attributs['long name'], $specific_column, $spec_column);
$specificity_columns[$field] = $spec_column;
}
$infocom_column = $table_group->addHeader('infocom', Infocom::getTypeName(Session::getPluralNumber()), $specific_column, $spec_column);
$document_column = $table_group->addHeader('document', Document::getTypeName(Session::getPluralNumber()), $specific_column, $spec_column);
if ($item->isDynamic()) {
$dynamics_column = $table_group->addHeader('one', ' ', $dynamic_column, $spec_column);
$previous_column = $dynamics_column;
} else {
$previous_column = $spec_column;
}
if ($options['canedit']) {
$group_checkbox_tag = empty($peer_type) ? '__' : $peer_type;
$content = Html::getCheckbox(array('criterion' => array('tag_for_massive' => $group_checkbox_tag)));
$delete_one = $table_group->addHeader('one', $content, $delete_column, $previous_column);
}
if ($is_device) {
$fk = 'items_id';
// Entity restrict
$leftjoin = '';
$where = "";
if (!empty($peer_type)) {
$leftjoin = "LEFT JOIN `" . getTableForItemType($peer_type) . "`\n ON (`" . $this->getTable() . "`.`items_id` = `" . getTableForItemType($peer_type) . "`.`id`\n AND `" . $this->getTable() . "`.`itemtype` = '{$peer_type}')";
$where = getEntitiesRestrictRequest(" AND", getTableForItemType($peer_type));
}
$query = "SELECT `" . $this->getTable() . "`.*\n FROM `" . $this->getTable() . "`\n {$leftjoin}\n WHERE `" . $this->getDeviceForeignKey() . "` = '" . $item->getID() . "'\n AND `" . $this->getTable() . "`.`itemtype` = '{$peer_type}'\n AND `" . $this->getTable() . "`.`is_deleted` = '0'\n {$where}\n ORDER BY `" . $this->getTable() . "`.`itemtype`, `" . $this->getTable() . "`.`{$fk}`";
} else {
$fk = $this->getDeviceForeignKey();
$query = "SELECT *\n FROM `" . $this->getTable() . "`\n WHERE `itemtype` = '" . $item->getType() . "'\n AND `items_id` = '" . $item->getID() . "'\n AND `is_deleted` = '0'\n ORDER BY {$fk}";
}
if (!empty($peer_type)) {
$peer = new $peer_type();
$peer->getEmpty();
} else {
$peer = NULL;
}
foreach ($DB->request($query) as $link) {
Session::addToNavigateListItems(static::getType(), $link["id"]);
$this->getFromDB($link['id']);
if (is_null($peer) || $link[$fk] != $peer->getID()) {
if ($peer instanceof CommonDBTM) {
$peer->getFromDB($link[$fk]);
}
$current_row = $table_group->createRow();
$peer_group = $peer_type . '_' . $link[$fk] . '_' . mt_rand();
$current_row->setHTMLID($peer_group);
if ($options['canedit']) {
$cell_value = Html::getCheckAllAsCheckbox($peer_group);
$current_row->addCell($delete_all_column, $cell_value);
}
if ($is_device) {
$cell = $current_row->addCell($peer_column, $peer ? $peer->getLink() : __('None'), NULL, $peer);
if (is_null($peer)) {
$cell->setHTMLClass('center');
}
} else {
$peer->getHTMLTableCellForItem($current_row, $item, NULL, $options);
}
}
if (Session::haveRight('device', UPDATE)) {
$mode = __s('Update');
} else {
$mode = __s('View');
}
$spec_cell = $current_row->addCell($link_column, "<a href='" . $this->getLinkURL() . "'>{$mode}</a>");
foreach ($this->getSpecificities() as $field => $attributs) {
if (!empty($link[$field])) {
$content = $link[$field];
} else {
$content = '';
}
$spec_cell = $current_row->addCell($specificity_columns[$field], $content, $spec_cell);
}
if (countElementsInTable('glpi_infocoms', "`itemtype`='" . $this->getType() . "' AND\n `items_id`='" . $link['id'] . "'")) {
$content = array(array('function' => 'Infocom::showDisplayLink', 'parameters' => array($this->getType(), $link['id'])));
} else {
$content = '';
}
$current_row->addCell($infocom_column, $content, $spec_cell);
$content = array();
// The order is to be sure that specific documents appear first
$query = "SELECT `documents_id`\n FROM `glpi_documents_items`\n WHERE (`itemtype` = '" . $this->getType() . "' AND `items_id` = '" . $link['id'] . "')\n OR (`itemtype` = '" . $this->getDeviceType() . "'\n AND `items_id` = '" . $link[$this->getDeviceForeignKey()] . "')\n ORDER BY `itemtype` = '" . $this->getDeviceType() . "'";
$document = new Document();
foreach ($DB->request($query) as $document_link) {
if ($document->can($document_link['documents_id'], READ)) {
$content[] = $document->getLink();
}
}
$content = implode('<br>', $content);
$current_row->addCell($document_column, $content, $spec_cell);
if ($item->isDynamic()) {
$previous_cell = $current_row->addCell($dynamics_column, Dropdown::getYesNo($link['is_dynamic']), $spec_cell);
} else {
$previous_cell = $spec_cell;
}
if ($options['canedit']) {
$cell_value = Html::getMassiveActionCheckBox($this->getType(), $link['id'], array('massive_tags' => $group_checkbox_tag));
$current_row->addCell($delete_one, $cell_value, $previous_cell);
}
}
}