<?php namespace WPDesk\Forms\Field\Traits; use WPDesk\Forms\Field; use WPDesk\Forms\Form; /** * Implementation of HTML attributes like id, name, action etc. * * @package WPDesk\Forms\Field\Traits */ trait HtmlAttributes { /** @var array{placeholder: string, name: string, id: string, class: string[]} */ protected $attributes = []; /** * Get list of all attributes except given. * * @param string[] $except * * @return array<string[]|string|bool> */ final public function get_attributes( array $except = [ 'name', 'class' ] ): array { return array_filter( $this->attributes, static function ( $key ) use ( $except ) { return ! in_array( $key, $except, true ); }, ARRAY_FILTER_USE_KEY ); } /** * @param string $name * @param string[]|string|bool $value * * @return Field|Form */ final public function set_attribute( string $name, $value ) { $this->attributes[ $name ] = $value; return $this; } /** * @return HtmlAttributes */ final public function unset_attribute( string $name ) { unset( $this->attributes[ $name ] ); return $this; } final public function is_attribute_set( string $name ): bool { return ! empty( $this->attributes[ $name ] ); } final public function get_attribute( string $name, string $default = null ): string { if ( is_array( $this->attributes[ $name ] ) ) { // Be aware of coercing - if implode returns string(0) '', then return $default value. return implode( ' ', $this->attributes[ $name ] ) ?: $default ?? ''; } return (string) $this->attributes[ $name ] ?? $default ?? ''; } }