clearImagesLabelsDropdownsArrays($this->toArray()), $attributes ); parent::fill($attributes); if (isset($attributes['content'])) { $this->setContent($attributes['content']); } } // cast content public function setContentAttribute($value) { $this->setContent($value); } public function getContentAttribute() { $content = json_decode($this->getRawOriginal('content'), true); return isset($content->header) ? $content->header : $content; } /** * Get Label Template Data * * @return array */ public static function getLabel(): array { return [ 'bigText' => '', 'text' => '', 'fullLine' => false ]; } /** * Get Dropdown Template Data * * @return array */ public static function getDropdown(): array { return [ 'title' => '', 'html' => '' ]; } /** * Set content attribute on model * * @param array $content * @return void */ private function setContent(array $content): void { $attrs = $this->attributes; if (isset($attrs['content'])) { unset($attrs['content']); } $content = $this->serializeContent($content); $this->setRawAttributes(\array_merge_recursive( $attrs, ['content' => $content] )); } /** * Serialize input form request to * a storable string * * @param array $content * @return string */ // phpcs:ignore Generic.Metrics.CyclomaticComplexity.TooHigh private function serializeContent(array $content): string { foreach ($content as $i => $bloc) { foreach ($bloc['content'] as $o => $input) { switch ($input['inputType']->value ?? $input['inputType']['value']) { case InputType::image()->value: $content[$i]['content'][$o]['value'] = Utils::storeImage($input['value'], $this->getTable()); break; case InputType::imageArray()->value: foreach ($input['value'] as $k => $image) { $content[$i]['content'][$o]['value'][$k] = Utils::storeImage($image, $this->getTable()); } break; case InputType::labelArray()->value: foreach ($input['value'] as $k => $label) { $content[$i]['content'][$o]['value'][$k] = \array_replace( static::getLabel(), $content[$i]['content'][$o]['value'][$k] ); } break; case InputType::dropdownArray()->value: foreach ($input['value'] as $k => $label) { $content[$i]['content'][$o]['value'][$k] = \array_replace( static::getDropdown(), $content[$i]['content'][$o]['value'][$k] ); } break; case InputType::boolean()->value: case InputType::text()->value: case InputType::string()->value: break; case InputType::url()->value: Utils::assertNoInternalUrls('content', $input['value']); break; default: throw new \Exception(sprintf( 'Unknown input Type %s', $input['inputType']->label ?? $input['inputType']['label'] )); } } } return json_encode($content); } private function clearImagesLabelsDropdownsArrays(array $page): array { if (isset($page['content'])) { foreach ($page['content'] as &$block) { if (isset($block['content'])) { foreach ($block['content'] as &$input) { if ($input['inputType']['value'] === InputType::imageArray()->value) { $input['value'] = []; } if ($input['inputType']['value'] === InputType::labelArray()->value) { $input['value'] = []; } if ($input['inputType']['value'] === InputType::dropdownArray()->value) { $input['value'] = []; } } } } } return $page; } }