Skip to content
Snippets Groups Projects
Unverified Commit 573bfb70 authored by Bartek Jaskulski's avatar Bartek Jaskulski
Browse files

feat: add strong typing to the package

parent 398bb2eb
No related branches found
No related tags found
3 merge requests!28release: 3.0.0,!23Feature/strong typing pp,!19Add strong typing for 3.0 version
Pipeline #5964 passed
Showing
with 101 additions and 397 deletions
......@@ -2,6 +2,7 @@
namespace WPDesk\Forms\Field;
use WPDesk\Forms\Validator;
use WPDesk\Forms\Validator\NonceValidator;
class NoOnceField extends BasicField {
......@@ -11,11 +12,11 @@ class NoOnceField extends BasicField {
$this->meta['action'] = $action_name;
}
public function get_validator() {
public function get_validator(): Validator {
return new NonceValidator( $this->get_meta_value( 'action' ) );
}
public function get_template_name() {
public function get_template_name(): string {
return 'noonce';
}
}
......@@ -8,7 +8,7 @@ namespace WPDesk\Forms\Field;
* @package WPDesk\Forms
*/
abstract class NoValueField extends BasicField {
public function get_name() {
public function get_name(): string {
return '';
}
}
......@@ -3,11 +3,11 @@
namespace WPDesk\Forms\Field;
class Paragraph extends NoValueField {
public function get_template_name() {
public function get_template_name(): string {
return 'paragraph';
}
public function should_override_form_template() {
public function should_override_form_template(): bool {
return true;
}
}
......@@ -8,7 +8,7 @@ class ProductSelect extends SelectField {
$this->set_multiple();
}
public function get_template_name() {
public function get_template_name(): string {
return 'product-select';
}
}
......@@ -3,7 +3,7 @@
namespace WPDesk\Forms\Field;
class RadioField extends BasicField {
public function get_template_name() {
public function get_template_name(): string {
return 'input-radio';
}
}
......@@ -4,17 +4,18 @@ namespace WPDesk\Forms\Field;
class SelectField extends BasicField {
public function get_template_name() {
public function get_template_name(): string {
return 'select';
}
public function set_options( $options ) {
/** @param string[] $options */
public function set_options( array $options ): self {
$this->meta['possible_values'] = $options;
return $this;
}
public function set_multiple() {
public function set_multiple(): self {
$this->attributes['multiple'] = true;
return $this;
......
......@@ -3,15 +3,15 @@
namespace WPDesk\Forms\Field;
class SubmitField extends NoValueField {
public function get_template_name() {
public function get_template_name(): string {
return 'input-submit';
}
public function get_type() {
public function get_type(): string {
return 'submit';
}
public function should_override_form_template() {
public function should_override_form_template(): bool {
return true;
}
}
......@@ -8,7 +8,7 @@ class TextAreaField extends BasicField {
$this->set_default_value( '' );
}
public function get_template_name() {
public function get_template_name(): string {
return 'textarea';
}
}
......@@ -3,10 +3,7 @@
namespace WPDesk\Forms\Field;
class TimepickerField extends BasicField {
/**
* @inheritDoc
*/
public function get_template_name() {
public function get_template_name(): string {
return 'timepicker';
}
}
......@@ -19,51 +19,39 @@ trait HtmlAttributes {
*
* @return string[]
*/
public function get_attributes( $except = [ 'name', 'type' ] ) {
return array_filter( $this->attributes, function ( $value, $key ) use ( $except ) {
public function get_attributes( array $except = [ 'name', 'type' ] ): array {
return array_filter(
$this->attributes,
static function ( $value, $key ) use ( $except ) {
return ! in_array( $key, $except, true );
}, ARRAY_FILTER_USE_BOTH );
},
ARRAY_FILTER_USE_BOTH
);
}
/**
* @param string $name
* @param string $value
*
* @return $this
*/
public function set_attribute( $name, $value ) {
public function set_attribute( string $name, string $value ): self {
$this->attributes[ $name ] = $value;
return $this;
}
/**
* @param string $name
*
* @return $this
*/
public function unset_attribute( $name ) {
public function unset_attribute( string $name ): self {
unset( $this->attributes[ $name ] );
return $this;
}
/**
* @param string $name
*
* @return bool
*/
public function is_attribute_set( $name ) {
public function is_attribute_set( string $name ): bool {
return isset( $this->attributes[ $name ] );
}
/**
* @param string $name
* @param mixed $default
* @param ?string $default
*
* @return string
*/
public function get_attribute( $name, $default = null ) {
public function get_attribute( string $name, $default = null ): string {
return $this->attributes[ $name ] ?? $default;
}
}
......@@ -9,7 +9,7 @@ class WooSelect extends SelectField {
$this->add_class( 'wc-enhanced-select' );
}
public function get_template_name() {
public function get_template_name(): string {
return 'woo-select';
}
}
......@@ -8,11 +8,11 @@ class WyswigField extends BasicField {
$this->set_default_value( '' );
}
public function get_template_name() {
public function get_template_name(): string {
return 'wyswig';
}
public function should_override_form_template() {
public function should_override_form_template(): bool {
return true;
}
}
......@@ -11,5 +11,5 @@ interface FieldProvider {
*
* @return Field[]
*/
public function get_fields();
public function get_fields(): array;
}
......@@ -2,16 +2,7 @@
namespace WPDesk\Forms;
/**
* @class FieldRenderer
*/
interface FieldRenderer {
/**
* @param FieldProvider $provider
* @param array $fields_data
* @param string $name_prefix
*
* @return string|array String or normalized array
*/
public function render_fields( FieldProvider $provider, array $fields_data, $name_prefix = '' );
/** @return string|array String or normalized array */
public function render_fields( FieldProvider $provider, array $fields_data, string $name_prefix = '' );
}
......@@ -14,8 +14,6 @@ interface FieldsDataReceiver {
/**
* Set values corresponding to fields.
*
* @param ContainerInterface $data
*
* @return void
*/
public function update_fields_data( ContainerInterface $data );
......
......@@ -12,55 +12,51 @@ use WPDesk\View\Renderer\Renderer;
interface Form {
/**
* For some reason you may want to disable a form. Returns false when disabled.
*
* @return bool
*/
public function is_active();
public function is_active(): bool;
/**
* Whether form handle_request method was successfully executed.
*
* @return bool
*/
public function is_submitted();
public function is_submitted(): bool;
/**
* After handle_request or set_data the data in form can be invalid according to field validators.
* Returns false when onle of them says the data is invalid.
*
* @return bool
* Returns false when one of them says the data is invalid.
*/
public function is_valid();
public function is_valid(): bool;
/**
* Add array to update data.
*
* @param array $request New data to update.
*
* @return void
*/
public function handle_request( $request = array() );
public function handle_request( array $request = [] );
/**
* Data could be saved in some place. Use this method to transmit them to form.
*
* @param array $data Data for form.
*
* @return void
*/
public function set_data( $data );
public function set_data( array $data );
/**
* Use to render the form to string.
*
* @param Renderer $renderer Renderer to render form fields and form-templates.
*
* @return string
*/
public function render_form( Renderer $renderer );
public function render_form( Renderer $renderer ): string;
/**
* Get data from form. Use after handle_request or set_data.
*
* @return array
* @return array<int,string>
*/
public function get_data();
public function get_data(): array;
/**
* Get data from form. Use after handle_request or set_data.
......@@ -68,13 +64,11 @@ interface Form {
*
* @return array
*/
public function get_normalized_data();
public function get_normalized_data(): array;
/**
* Form if you ever need to have more than one form at once.
*
* @return string
*/
public function get_form_id();
public function get_form_id(): int;
}
<?php
namespace WPDesk\Forms\Form;
/**
* Old abstraction layer for forms.
*
* @package WPDesk\Forms
*
* @deprecated Use ony for backward compatibility with Forms 1.x
*/
abstract class AbstractForm {
/**
* Unique form_id.
*
* @var string
*/
protected $form_id = 'form';
/**
* Updated data.
*
* @var array
*/
protected $updated_data = array();
/**
* Checks if form should be active.
*
* @return bool
*/
public function is_active() {
return true;
}
/**
* Create form data and return an associative array.
*
* @return array
*/
abstract protected function create_form_data();
/**
* Add array to update data.
*
* @param array $new_data new data to update.
*/
public function update_form_data( array $new_data = array() ) {
$this->updated_data = $new_data;
}
/**
* Merge created and updated data and return associative array. Add to all keys form prefix.
*
* @return array
*/
public function get_form_data() {
return array_merge(
$this->create_form_data(),
$this->updated_data
);
}
/**
* Get prefixed array returns array with prefixed form_id
*
* @return array
*/
public function get_prefixed_form_data() {
$array = $this->get_form_data();
$form_id = $this->get_form_id();
return array_combine(
array_map( function ( $k ) use ( $form_id ) {
return $form_id . '_' . $k;
}, array_keys( $array ) ),
$array
);
}
/**
* return form Id
*
* @return string
*/
public function get_form_id() {
return $this->form_id;
}
}
......@@ -15,91 +15,58 @@ use WPDesk\View\Renderer\Renderer;
class FormWithFields implements Form, ContainerForm, FieldProvider {
use Field\Traits\HtmlAttributes;
/**
* Unique form_id.
*
* @var string
*/
/** @var string Unique form_id. */
protected $form_id = 'form';
/**
* Updated data.
*
* @var array
*/
/** @var array Updated data. */
private $updated_data;
/**
* Form fields.
*
* @var Field[]
*/
/** @var Field[] Form fields. */
private $fields;
/**
* FormWithFields constructor.
*
* @param array $fields Form fields.
* @param string $form_id Unique form id.
* @param Field[] $fields
* @param string $form_id
*/
public function __construct( array $fields, $form_id = 'form' ) {
public function __construct( array $fields, string $form_id = 'form' ) {
$this->fields = $fields;
$this->form_id = $form_id;
$this->updated_data = null;
}
/**
* Set Form action attribute.
*
* @param string $action
*/
public function set_action( $action ) {
/** Set Form action attribute. */
public function set_action( string $action ): self {
$this->attributes['action'] = $action;
return $this;
}
/**
* Set Form method attribute ie. GET/POST.
*
* @param string $method
*/
public function set_method( $method ) {
/** Set Form method attribute ie. GET/POST. */
public function set_method( string $method ): self {
$this->attributes['method'] = $method;
return $this;
}
/**
* @return string
*/
public function get_method() {
return isset( $this->attributes['method'] ) ? $this->attributes['method'] : 'POST';
public function get_method(): string {
return $this->attributes['method'] ?? 'POST';
}
/**
* @return string
*/
public function get_action() {
return isset( $this->attributes['action'] ) ? $this->attributes['action'] : '';
public function get_action(): string {
return $this->attributes['action'] ?? '';
}
/**
* @inheritDoc
*/
public function is_submitted() {
public function is_submitted(): bool {
return null !== $this->updated_data;
}
/**
* @inheritDoc
*/
/** @return void */
public function add_field( Field $field ) {
$this->fields[] = $field;
}
/**
* @inheritDoc
*/
public function is_active() {
public function is_active(): bool {
return true;
}
......@@ -107,17 +74,16 @@ class FormWithFields implements Form, ContainerForm, FieldProvider {
* Add more fields to form.
*
* @param Field[] $fields Field to add to form.
*
* @return void
*/
public function add_fields( array $fields ) {
array_map( [ $this, 'add_field' ], $fields );
}
/**
* @inheritDoc
*/
public function is_valid() {
public function is_valid(): bool {
foreach ( $this->fields as $field ) {
$field_value = isset( $this->updated_data[ $field->get_name() ] ) ? $this->updated_data[ $field->get_name() ] : $field->get_default_value();
$field_value = $this->updated_data[ $field->get_name() ] ?? $field->get_default_value();
$field_validator = $field->get_validator();
if ( ! $field_validator->is_valid( $field_value ) ) {
return false;
......@@ -132,7 +98,7 @@ class FormWithFields implements Form, ContainerForm, FieldProvider {
*
* @param array|ContainerInterface $request new data to update.
*/
public function handle_request( $request = array() ) {
public function handle_request( array $request = [] ) {
if ( $this->updated_data === null ) {
$this->updated_data = [];
}
......@@ -165,48 +131,41 @@ class FormWithFields implements Form, ContainerForm, FieldProvider {
}
}
/**
* Renders only fields without form.
*
* @param Renderer $renderer
*
* @return string
*/
public function render_fields( Renderer $renderer ) {
/** Renders only fields without form. */
public function render_fields( Renderer $renderer ): string {
$content = '';
$fields_data = $this->get_data();
foreach ( $this->get_fields() as $field ) {
$content .= $renderer->render( $field->should_override_form_template() ? $field->get_template_name() : 'form-field',
$content .= $renderer->render(
$field->should_override_form_template() ? $field->get_template_name() : 'form-field',
[
'field' => $field,
'renderer' => $renderer,
'name_prefix' => $this->get_form_id(),
'value' => isset( $fields_data[ $field->get_name() ] ) ? $fields_data[ $field->get_name() ] : $field->get_default_value(),
'value' => $fields_data[ $field->get_name() ] ?? $field->get_default_value(),
'template_name' => $field->get_template_name(),
] );
]
);
}
return $content;
}
/**
* @inheritDoc
*/
public function render_form( Renderer $renderer ) {
$content = $renderer->render( 'form-start', [
public function render_form( Renderer $renderer ): string {
$content = $renderer->render(
'form-start',
[
'form' => $this,
'method' => $this->get_method(), // backward compat
'action' => $this->get_action(), // backward compat
] );
'method' => $this->get_method(), // backward compat.
'action' => $this->get_action(), // backward compat.
]
);
$content .= $this->render_fields( $renderer );
$content .= $renderer->render( 'form-end' );
return $content;
}
/**
* @inheritDoc
*/
public function put_data( PersistentContainer $container ) {
foreach ( $this->get_fields() as $field ) {
$data_key = $field->get_name();
......@@ -223,10 +182,7 @@ class FormWithFields implements Form, ContainerForm, FieldProvider {
}
}
/**
* @inheritDoc
*/
public function get_data() {
public function get_data(): array {
$data = $this->updated_data;
foreach ( $this->get_fields() as $field ) {
......@@ -239,10 +195,7 @@ class FormWithFields implements Form, ContainerForm, FieldProvider {
return $data;
}
/**
* @inheritDoc
*/
public function get_fields() {
public function get_fields(): array {
$fields = $this->fields;
usort(
......@@ -255,17 +208,11 @@ class FormWithFields implements Form, ContainerForm, FieldProvider {
return $fields;
}
/**
* @inheritDoc
*/
public function get_form_id() {
public function get_form_id(): int {
return $this->form_id;
}
/**
* @inheritDoc
*/
public function get_normalized_data() {
public function get_normalized_data(): array {
return $this->get_data();
}
}
<?php
namespace WPDesk\Forms\Form;
use WPDesk\Forms\Form;
/**
* FormsCollection class store AbstractForm instances and merges forms data from all collections
*
* @deprecated Use ony for backward compatibility with Forms 1.x
*
* @package WPDesk\Forms
*/
class FormsCollection {
/**
* AbstractForm array collection.
*
* @var Form[]
*/
protected $forms = array();
/**
* Unique form_id.
*
* @var string
*/
protected $form_id = 'form';
/**
* Updated data.
*
* @var array
*/
protected $updated_data = array();
/**
* Add forms. All keys in this array must be unique, otherwise add_form will throw exception.
*
* @param Form[] $forms
*/
public function add_forms( array $forms = array() ) {
foreach ( $forms as $form_object ) {
$this->add_form( $form_object );
}
}
/**
* Add form. If key is not unique throw exception.
*
* @param Form $form
*
* @throws \OutOfBoundsException
*/
public function add_form( AbstractForm $form ) {
if ( ! $this->is_form_exists( $form->get_form_id() ) ) {
$this->forms[ $form->get_form_id() ] = $form;
} else {
throw new \OutOfBoundsException( 'Form with this key already exists' );
}
}
/**
* Is form exists. Checks if key exists in the array of forms and return bool.
*
* @param string $form_id
*
* @return bool
*/
public function is_form_exists( $form_id ) {
return isset( $this->forms[ (string) $form_id ] );
}
/**
* Get form.
*
* @param string $form_id
*
* @return Form
* @throws \OutOfRangeException
*/
public function get_form( $form_id ) {
if ( $this->is_form_exists( $form_id ) ) {
return $this->forms[ (string) $form_id ];
}
throw new \OutOfRangeException( 'Form with this key not exists' );
}
/**
* Get forms data. This method merge all arrays from forms and return associative array for woocommerce form_fields.
*
* @param bool $prefixed if true add form_id as prefix to form keys
*
* @return array
*/
public function get_forms_data( $prefixed = false ) {
$forms_data = array();
foreach ( $this->forms as $form ) {
if ( ! $form->is_active() ) {
continue;
}
if ( $prefixed ) {
$forms_data = array_merge( $forms_data, $form->get_prefixed_form_data() );
} else {
$forms_data = array_merge( $forms_data, $form->get_form_data() );
}
}
return $forms_data;
}
}
......@@ -12,6 +12,7 @@ use WPDesk\Persistence\PersistentContainer;
* @package WPDesk\Forms
*/
class FieldPersistenceStrategy {
/** @var PersistentContainer */
private $persistence;
......@@ -21,9 +22,6 @@ class FieldPersistenceStrategy {
/**
* Save fields data.
*
* @param FieldProvider $fields_provider
* @param array $data
*/
public function persist_fields( FieldProvider $fields_provider, array $data ) {
foreach ( $fields_provider->get_fields() as $field ) {
......@@ -34,10 +32,8 @@ class FieldPersistenceStrategy {
/**
* Load fields data.
*
* @return array
*/
public function load_fields( FieldProvider $fields_provider ) {
public function load_fields( FieldProvider $fields_provider ): array {
$data = [];
foreach ( $fields_provider->get_fields() as $field ) {
$field_key = $field->get_name();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment