valor; } $this->valor = number_format($valor, 0, ',', '.'); } public function setPublicacion(\DateTime $fecha) { $this->publicacion = implode(' ', [ $fecha->day, 'de', ucwords($fecha->locale('es')->isoFormat('MMMM')) . ',', $fecha->year ]); } public function getPublicacion() { return Carbon::parse($this->publicacion); } public function destacado(bool $destacado = null) { if ($destacado === null) { if ($this->destacado === null) { $destacados = $this->factory->get('destacados.json'); $this->destacado = (array_search($this->id, $destacados) !== false); } return $this->destacado; } $this->destacado = $destacado; } protected $image_folder; public function setImageFolder(string $folder) { $this->image_folder = implode(DIRECTORY_SEPARATOR, [ $folder, 'assets', 'images', mb_strtolower($this->nombre) ]); } protected $imagenes; public function imagenes() { if ($this->imagenes === null) { $folder = $this->image_folder; $this->imagenes = []; if (!file_exists($folder)) { return $this->imagenes; } $files = new \DirectoryIterator($folder); foreach ($files as $file) { if ($file->isDir()) { continue; } $this->imagenes []= $file->getFilename(); } sort($this->imagenes); } return $this->imagenes; } public function addImagen($file) { if (!file_exists($this->image_folder)) { mkdir($this->image_folder); } $filename = implode(DIRECTORY_SEPARATOR, [ $this->image_folder, $file->getClientFilename() ]); $file->moveTo($filename); if ($this->imagenes === null) { $this->imagenes = []; } $this->imagenes []= $file->getClientFilename(); return file_exists($filename); } public function deleteImagen(string $file) { $filename = implode(DIRECTORY_SEPARATOR, [ $this->image_folder, $file ]); if (!file_exists($filename)) { return false; } $status = unlink($filename); if (count(scandir($this->image_folder)) == 2) { rmdir($this->image_folder); } return $status; } protected $imagen; public function imagen() { if ($this->imagen === null) { $this->imagen = 'default.jpg'; $img = $this->imagenes(); if (count($img) > 0) { $this->imagen = implode('/', [mb_strtolower($this->nombre), $img[0]]); } } return $this->imagen; } public function map($data): Model { $this->id = $data->id ?? null; $this->nombre = $data->nombre; $this->segmento = $data->segmento; $this->valor = $data->valor; $this->direccion = new Direccion(); $this->direccion->map($data); $this->destacado((isset($data->destacado) and $data->destacado == 'on') ? true : false); $this->descripcion = $data->descripcion; $this->publicacion = $data->publicacion; foreach ($this->properties as $property) { $this->$property = $data->$property ?? ''; } return $this; } public function __get(string $name) { if (method_exists($this, $name)) { return $this->$name(); } if (!property_exists($this, $name) and array_search($name, $this->properties) === false) { throw new \InvalidArgumentException($name . ' no es una propiedad de ' . get_called_class()); } return $this->$name; } public function __set(string $name, $value) { if (!property_exists($this, $name) and array_search($name, $this->properties) === false) { throw new \InvalidArgumentException($name . ' no es una propiedad de ' . get_called_class()); } $this->$name = $value; } public function jsonSerialize() { $arr = [ 'id' => $this->id, 'nombre' => $this->nombre, 'segmento' => $this->segmento, 'valor' => $this->valor, 'destacado' => $this->destacado, 'descripcion' => $this->descripcion, 'publicacion' => $this->publicacion ]; foreach ($this->properties as $property) { $arr[$property] = $this->$property; } $arr = array_merge($arr, $this->direccion->jsonSerialize()); return $arr; } public function save() { $this->changeDestacado(); return parent::save(); } public function delete() { $filename = implode(DIRECTORY_SEPARATOR, [ $this->factory->getFolder(), 'destacados.json' ]); $destacados = json_decode(trim(file_get_contents($filename))); foreach ($destacados as $i => $id) { if ($id == $this->id) { unset($destacados[$i]); } } sort($destacados); file_put_contents($filename, json_encode($destacados)); foreach ($this->imagenes() as $imagen) { $this->deleteImagen($imagen); } return parent::delete(); } public function changeDestacado() { $filename = implode(DIRECTORY_SEPARATOR, [ $this->factory->getFolder(), 'destacados.json' ]); $destacados = json_decode(trim(file_get_contents($filename))); $changed = false; if (!$this->destacado()) { foreach ($destacados as $i => $id) { if ($id == $this->id) { unset($destacados[$i]); $changed = true; break; } } } else { $found = false; foreach ($destacados as $i => $id) { if ($id == $this->id) { $found = true; break; } } if (!$found) { $destacados []= $this->id; $changed = true; } } if ($changed) { sort($destacados); file_put_contents($filename, json_encode($destacados)); } } public function getProperties(): array { $properties = []; foreach ($this->properties as $property) { $p = (object) [ 'label' => ucwords($property), 'name' => $property ]; $properties []= $p; } return $properties; } }