Skip to content
Snippets Groups Projects
Select Git revision
  • 828d194d296d840a935240cc8de0aece5e393c3a
  • master default protected
  • fix/deprecated_functions
  • devel
  • feat/translations
  • feat/upgrade_to_pro_url
  • feat/lang
  • bugfix/require-interface
  • bugfix/require-once-error
  • feature/activation-hooks
  • feature/template-loader
  • feature/template-renderer
  • feature/plugin-activation
  • feature/hookable-object
  • feature/builder-pattern
  • 2.1.2
  • 2.1.1
  • 2.1.0
  • 2.0.0
  • 2.0.0-beta1
  • 1.4.4
  • 1.4.3
  • 1.4.2
  • 1.4.1
  • 1.4
  • 1.3.3
  • 1.3.2
  • 1.3.1
  • 1.3.0
  • 1.2.0
  • 1.1
  • 1.0
32 results

phpunit-unit.xml

Blame
  • FormWithFields.php 4.72 KiB
    <?php
    
    namespace WPDesk\Forms\Form;
    
    use Psr\Container\ContainerInterface;
    use WPDesk\Forms\ContainerForm;
    use WPDesk\Forms\Field;
    use WPDesk\Forms\FieldProvider;
    use WPDesk\Forms\Form;
    use WPDesk\Persistence\Adapter\ArrayContainer;
    use WPDesk\Persistence\ElementNotExistsException;
    use WPDesk\Persistence\PersistentContainer;
    use WPDesk\View\Renderer\Renderer;
    
    class FormWithFields implements Form, ContainerForm, FieldProvider {
    	/**
    	 * Unique form_id.
    	 *
    	 * @var string
    	 */
    	protected $form_id = 'form';
    	/**
    	 * Updated data.
    	 *
    	 * @var array
    	 */
    	private $updated_data;
    	/**
    	 * Form fields.
    	 *
    	 * @var Field[]
    	 */
    	private $fields;
    
    	/**
    	 * FormWithFields constructor.
    	 *
    	 * @param array $fields Form fields.
    	 * @param string $form_id Unique form id.
    	 */
    	public function __construct( array $fields, $form_id = 'form' ) {
    		$this->fields       = $fields;
    		$this->form_id      = $form_id;
    		$this->updated_data = null;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function is_submitted() {
    		return null !== $this->updated_data;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function add_field( Field $field ) {
    		$this->fields[] = $field;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function is_active() {
    		return true;
    	}
    
    	/**
    	 * Add more fields to form.
    	 *
    	 * @param Field[] $fields Field to add to form.
    	 */
    	public function add_fields( array $fields ) {
    		array_map( [ $this, 'add_field' ], $fields );
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function is_valid() {
    		foreach ( $this->fields as $field ) {
    			$field_value     = isset( $this->updated_data[ $field->get_name() ] ) ? $this->updated_data[ $field->get_name() ] : null;
    			$field_validator = $field->get_validator();
    			if ( ! $field_validator->is_valid( $field_value ) ) {
    				return false;
    			}
    		}
    
    		return true;
    	}
    
    	/**
    	 * Add array to update data.
    	 *
    	 * @param array|ContainerInterface $request new data to update.
    	 */
    	public function handle_request( $request = array() ) {
    		if ( $this->updated_data === null ) {
    			$this->updated_data = [];
    		}
    		foreach ( $this->fields as $field ) {
    			$data_key = $field->get_name();
    			if ( isset( $request[ $data_key ] ) ) {
    				$this->updated_data[ $data_key ] = $field->get_sanitizer()->sanitize( $request[ $data_key ] );
    			}
    		}
    	}
    
    	/**
    	 * Data could be saved in some place. Use this method to transmit them to form.
    	 *
    	 * @param array|ContainerInterface $data Data consistent with Form and ContainerForm interface.
    	 */
    	public function set_data( $data ) {
    		if ( is_array( $data ) ) {
    			$data = new ArrayContainer( $data );
    		}
    		foreach ( $this->fields as $field ) {
    			$data_key = $field->get_name();
    			if ( $data->has( $data_key ) ) {
    				try {
    					$this->updated_data[ $data_key ] = $data->get( $data_key );
    				} catch ( ElementNotExistsException $e ) {
    					$this->updated_data[ $data_key ] = false;
    				}
    			}
    		}
    	}
    
    	/**
    	 * Renders only fields without form.
    	 *
    	 * @param Renderer $renderer
    	 *
    	 * @return string
    	 */
    	public function render_fields( Renderer $renderer ) {
    		$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',
    				[
    					'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(),
    					'template_name' => $field->get_template_name(),
    				] );
    		}
    
    		return $content;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function render_form( Renderer $renderer ) {
    		$content = $renderer->render( 'form-start', [
    			'method' => 'POST',
    			'action' => '',
    		] );
    		$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();
    			if ( ! isset( $this->updated_data[ $data_key ] ) ) {
    				$container->set( $data_key, $field->get_default_value() );
    			} else {
    				$container->set( $data_key, $this->updated_data[ $data_key ] );
    			}
    		}
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function get_data() {
    		$data = $this->updated_data;
    
    		foreach ( $this->get_fields() as $field ) {
    			$data_key = $field->get_name();
    			if ( ! isset( $data[ $data_key ] ) ) {
    				$data[ $data_key ] = $field->get_default_value();
    			}
    		}
    
    		return $data;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function get_fields() {
    		return $this->fields;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function get_form_id() {
    		return $this->form_id;
    	}
    
    	/**
    	 * @inheritDoc
    	 */
    	public function get_normalized_data() {
    		return $this->get_data();
    	}
    }