. */ namespace Fisharebest\Webtrees\Controller; use Fisharebest\Webtrees\Filter; use Fisharebest\Webtrees\I18N; use Fisharebest\Webtrees\Individual; use Fisharebest\Webtrees\Theme; use stdClass; /** * Base controller for all chart pages */ class ChartController extends PageController { /** @var Individual Who is chart about? */ public $root; /** @var string An error message, in case we cannot construct the chart */ public $error_message; /** @var stdClass personbox dimensions */ private $box; /** * Create the chart controller */ public function __construct() { parent::__construct(); $rootid = Filter::get('rootid', WT_REGEX_XREF); $this->root = Individual::getInstance($rootid, $this->tree()); if (!$this->root) { // Missing root individual? Show the chart for someone. $this->root = $this->getSignificantIndividual(); } if (!$this->root) { http_response_code(404); $this->error_message = I18N::translate('This individual does not exist or you do not have permission to view it.'); } $this->box = new stdClass(); $this->box->width = Theme::theme()->parameter('chart-box-x'); $this->box->height = Theme::theme()->parameter('chart-box-y'); } /** * Get significant information from this page, to allow other pages such as * charts and reports to initialise with the same records * * @return Individual */ public function getSignificantIndividual() { if ($this->root) { return $this->root; } else { return parent::getSignificantIndividual(); } } /** * Find the direct-line ancestors of an individual. Array indexes are SOSA numbers. * * @param int $generations * * @return Individual[] */ public function sosaAncestors($generations) { $ancestors = [ 1 => $this->root, ]; // Subtract one generation, as this algorithm includes parents. $max = pow(2, $generations - 1); for ($i = 1; $i < $max; $i++) { $ancestors[$i * 2] = null; $ancestors[$i * 2 + 1] = null; $person = $ancestors[$i]; if ($person) { $family = $person->getPrimaryChildFamily(); if ($family) { if ($family->getHusband()) { $ancestors[$i * 2] = $family->getHusband(); } if ($family->getWife()) { $ancestors[$i * 2 + 1] = $family->getWife(); } } } } return $ancestors; } /** * Function boxDimensions * * @return stdClass */ public function getBoxDimensions() { return $this->box; } }