. * --------------------------------------------------------------------- */ if (!defined('GLPI_ROOT')) { die("Sorry. You can't access this file directly"); } class HTMLTableCellFatherSameRow extends Exception {} class HTMLTableCellFatherCoherentHeader extends Exception {} class HTMLTableCellWithoutFather extends Exception {} /** * @since 0.84 **/ class HTMLTableCell extends HTMLTableEntity { private $row; private $header; private $father; private $sons = []; private $item; // List of rows that have specific attributs private $attributForTheRow = false; /** * @param HTMLTableHeader $row * @param HTMLTableHeader $header * @param string $content see HTMLTableEntity#__construct() * @param HTMLTableCell $father HTMLTableCell object (default NULL) * @param CommonDBTM $item The item associated with the current cell (default NULL) **/ function __construct($row, $header, $content, HTMLTableCell $father = null, CommonDBTM $item = null) { parent::__construct($content); $this->row = $row; $this->header = $header; $this->father = $father; if (!empty($item)) { $this->item = clone $item; } else { $this->item = null; } if (!is_null($this->father)) { if ($this->father->row != $this->row) { throw new HTMLTableCellFatherSameRow(); } if ($this->father->header != $this->header->getFather()) { if (($this->father->header instanceof HTMLTableHeader) && ($this->header->getFather() instanceof HTMLTableHeader)) { throw new HTMLTableCellFatherCoherentHeader($this->header->getFather()->getName() . ' != ' . $this->father->header->getName()); } if ($this->father->header instanceof HTMLTableHeader) { throw new HTMLTableCellFatherCoherentHeader('NULL != '. $this->father->header->getName()); } if ($this->header->getFather() instanceof HTMLTableHeader) { throw new HTMLTableCellFatherCoherentHeader($this->header->getFather()->getName() . ' != NULL'); } throw new HTMLTableCellFatherCoherentHeader('NULL != NULL'); } $this->father->addSon($this, $header); } else if (!is_null($this->header->getFather())) { throw new HTMLTableCellWithoutFather(); } $this->header->checkItemType($this->item); $this->copyAttributsFrom($this->header); if (is_string($content)) { $string = trim($content); $string = str_replace([' ', '
'], '', $string); if (!empty($string)) { $this->header->addCell(); } } else { $this->header->addCell(); } } /** * @param $attributForTheRow **/ function setAttributForTheRow($attributForTheRow) { $this->attributForTheRow = $attributForTheRow; } function getHeader() { return $this->header; } function getItem() { if (!empty($this->item)) { return $this->item; } return false; } /** * @param $son HTMLTableCell object * @param $sons_header HTMLTableHeader object **/ function addSon(HTMLTableCell $son, HTMLTableHeader $sons_header) { if (!isset($this->sons[$sons_header->getName()])) { $this->sons[$sons_header->getName()] = []; } $this->sons[$sons_header->getName()][] = $son; } function getNumberOfLines() { return $this->numberOfLines; } function computeNumberOfLines() { if (!isset($this->numberOfLines)) { $this->numberOfLines = 1; if (count($this->sons) > 0) { foreach ($this->sons as $headered_sons) { $numberOfLinesForHeader = 0; foreach ($headered_sons as $son) { $son->computeNumberOfLines(); $numberOfLinesForHeader += $son->getNumberOfLines(); } if ($this->numberOfLines < $numberOfLinesForHeader) { $this->numberOfLines = $numberOfLinesForHeader; } } } } } /** * @param $value **/ function addToNumberOfLines($value) { $this->numberOfLines += $value; } /** * @param $cells array * @param $totalNumberOflines **/ static function updateCellSteps(array $cells, $totalNumberOflines) { $numberOfLines = 0; foreach ($cells as $cell) { $numberOfLines += $cell->getNumberOfLines(); } $numberEmpty = $totalNumberOflines - $numberOfLines; $step = floor($numberEmpty / (count($cells))); $last = $numberEmpty % (count($cells)); $index = 0; foreach ($cells as $cell) { $cell->addToNumberOfLines($step + ($index < $last ? 1 : 0)); $index ++; } } /** * @param &$start **/ function computeStartEnd(&$start) { if (!isset($this->start)) { if ($this->attributForTheRow !== false) { $this->row->addAttributForLine($start, $this->attributForTheRow); } $this->start = $start; foreach ($this->sons as $sons_by_header) { self::updateCellSteps($sons_by_header, $this->getNumberOfLines()); $son_start = $this->start; foreach ($sons_by_header as $son) { $son->computeStartEnd($son_start); } } $start += $this->numberOfLines; } else { $start = $this->start + $this->numberOfLines; } } /** * @param $index * @param $options array **/ function displayCell($index, array $options = []) { if (($index >= $this->start) && ($index < ($this->start + $this->numberOfLines))) { if ($index == $this->start) { if ($this->item instanceof CommonDBTM) { Session::addToNavigateListItems($this->item->getType(), $this->item->getID()); } echo "\t\t\tnumberOfLines > 1) { echo " rowspan='".$this->numberOfLines."'"; } $this->displayEntityAttributs($options); echo ">"; $this->displayContent(); echo "\n"; } return true; } return false; } }