filters = $filters; } public function makeFragments(&$where, &$join, &$args) { if ($this->cache !== false) { $where = $this->cache['where']; $join = $this->cache['join']; $args = $this->cache['args']; return; } /* generate where clause & arguments */ $where = ''; $joins = []; $args = []; if (empty($this->filters)) { $where = ' 1 '; } else { foreach ($this->filters as $filter) { $sep = ($where != '' ? ' AND ' : ''); $where .= $sep . $filter->whereClause($args, $joins); } } $join = implode(' ', array_unique($joins)); $this->cache = compact('where', 'join', 'args'); } public function isNoId44Filter() { $filter = $this->hasFilter('Id44Filter'); return $filter !== false && $filter->argument == 0; } public function filterNonClients() { if (Module::get('runmode') === false || $this->hasFilter('IsClientFilter') !== false) return; $this->cache = false; // Runmode module exists, add filter $this->filters[] = (new IsClientStatisticsFilter())->bind('=', true); } /** * @param string $type filter type (class name) * @return false|DatabaseFilter The filter, false if not found */ public function hasFilter($type) { foreach ($this->filters as $filter) { if ($filter->isClass($type)) { return $filter; } } return false; } /** * @param string $type filter type key/id * @return false|DatabaseFilter The filter, false if not found */ public function hasFilterKey($type) { if (isset($this->filters[$type])) return $this->filters[$type]; return false; } /** * Add a location filter based on the allowed permissions for the given permission. * Returns false if the user doesn't have the given permission for any location. * * @param string $permission permission to use * @return bool false if no permission for any location, true otherwise */ public function setAllowedLocationsFromPermission($permission) { if (!Module::isAvailable('locations')) return true; $locs = User::getAllowedLocations($permission); if (empty($locs)) return false; if (in_array(0, $locs)) { if (!isset($this->filters['permissions'])) return true; unset($this->filters['permissions']); } else { $this->filters['permissions'] = StatisticsFilter::$columns['location']->bind('=', $locs); } $this->cache = false; return true; } /** * @return false|array */ public function getAllowedLocations() { if (isset($this->filters['permissions']->argument) && is_array($this->filters['permissions']->argument)) return $this->filters['permissions']->argument; return false; } }