zone_id ?? 0; } public function getZone(): Zone { return Zone::byId($this->getZoneId()); } public function setZoneId(Zone $zone): void { $this->zone_id = $zone->getId(); } public function getEffectName(): string { return $this->effect_name; } public function setEffectName(string $name): void { $this->effect_name = $name; } public function getEffectParams(): array { if(!isset($this->effect_params) || $this->effect_params === null) return []; if(is_string($this->effect_params)) $this->effect_params = json_decode($this->effect_params, true); return $this->effect_params; } public function setEffectParams(array $params): void { $this->effect_params = $params; } public static function effectClassName(string $name): string { return sprintf(self::CLASS_NAME, $name); } public function getEffectClassName(): string { return self::effectClassName($this->getEffectName()); } public static function effectClass(string $name) { $className = self::effectClassName($name); if(!class_exists($className)) throw new ZoneEffectClassNotFoundException($name); return new $className; } public function getEffectClass(bool $quiet = false) { try { $effect = self::effectClass($this->getEffectName()); $effect->setEffectParams($this->getEffectParams(), $quiet); return $effect; } catch(ZoneEffectClassNotFoundException $ex) { return null; } } public function applyEffect(PageBuilder $builder, bool $quiet = false): void { $effect = $this->getEffectClass($quiet); if($effect !== null) $effect->applyEffect($builder); } public static function byZone(Zone $zone): array { $getEffects = DB::prepare(' SELECT `zone_id`, `effect_name`, `effect_params` FROM `ytkns_zones_effects` WHERE `zone_id` = :zone '); $getEffects->bindValue('zone', $zone->getId()); if(!$getEffects->execute()) return []; $effects = []; while($effect = $getEffects->fetchObject(self::class)) $effects[] = $effect; return $effects; } public function toJson(bool $asString = false) { $effectInfo = [ 'type' => $this->getEffectName(), 'values' => $this->getEffectParams(), ]; if($asString) $effectInfo = json_encode($effectInfo); return $effectInfo; } }