1. Go to this page and download the library: Download lexal/stepped-form library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
lexal / stepped-form example snippets
use Lexal\SteppedForm\Step\StepInterface;
final class CustomerStep implements StepInterface
{
public function handle(object $entity, mixed $data): object
{
// do some logic here
return $entity; // returns an entity that form will save as step data into the storage
}
}
use Lexal\SteppedForm\Form\Builder\FormBuilderInterface;
use Lexal\SteppedForm\Step\Builder\StepsBuilder;
use Lexal\SteppedForm\Step\Builder\StepsBuilderInterface;
use Lexal\SteppedForm\Step\Steps;
final class CustomBuilder implements FormBuilderInterface
{
public function __construct(private readonly StepsBuilderInterface $builder)
{
}
public function build(object $entity): Steps
{
$this->builder->add('customer', new CustomerStep());
// Some additional steps
return $this->builder->get();
}
}
$builder = new CustomBuilder(new StepsBuilder(/* StepControlInterface */, /* DataControlInterface */));
use Lexal\SteppedForm\Form\Storage\SessionKeyStorageInterface;
final class SessionKeyStorage implements SessionKeyStorageInterface
{
public function get(): ?string
{
// return current active session key (from redis, database, session or any other storage)
return 'main';
}
public function put(string $sessionKey): void
{
// save current form session key
}
}
$sessionKeyStorage = new SessionKeyStorage();
use Lexal\SteppedForm\Form\Storage\StorageInterface;
final class Storage implements StorageInterface
{
public function get(string $key, string $session, mixed $default = null): mixed
{
// get data by key and form session
}
public function put(string $key, string $session, mixed $data): void
{
// save data by key and form session
}
public function clear(string $session): void
{
// clear storage by form session
}
}
$storage = new Storage();
use Lexal\SteppedForm\Form\DataControl;
use Lexal\SteppedForm\Form\StepControl;
use Lexal\SteppedForm\Form\Storage\DataStorage;
use Lexal\SteppedForm\Form\Storage\FormStorage;
$formStorage = new FormStorage($storage, $sessionKeyStorage); // can use any other storage (session, database, redis, etc.)
$stepControl = new StepControl($formStorage);
$dataControl = new DataControl(new DataStorage($formStorage));
use Lexal\SteppedForm\EventDispatcher\EventDispatcherInterface;
final class EventDispatcher implements EventDispatcherInterface
{
public function dispatch(object $event): object
{
// dispatch events here
return $event;
}
}
$dispatcher = new EventDispatcher();
use Lexal\SteppedForm\SteppedForm;
$form = new SteppedForm(
$dataControl,
$stepControl,
$builder,
$dispatcher,
);
/* Starts a new form session */
$form->start(
/* entity that is used as initial form state */,
/* unique session key if you need to split different sessions of one form */,
);
/* Returns a TemplateDefinition of rendered step */
$form->render('key');
/* Handles a step logic and saves a new form state */
$form->handle('key', /* any user submitted data */);
/* Cancels form session */
$form->cancel();
use Lexal\SteppedForm\Step\RenderStepInterface;
use Lexal\SteppedForm\Step\Steps;
use Lexal\SteppedForm\Step\TemplateDefinition;
final class CustomerStep implements RenderStepInterface
{
public function getTemplateDefinition(object $entity, Steps $steps): TemplateDefinition
{
return new TemplateDefinition('customer', ['customer' => $entity]);
}
public function handle(object $entity, mixed $data): object
{
// do some logic here
$entity->name = $data['name'];
$entity->amount = (float)$data['amount'];
return $entity; // return an entity that the form will save as step data into the storage
}
}
use Lexal\SteppedForm\Step\StepInterface;
final class TaxStep implements StepInterface
{
private const TAX_PERCENT = 20;
public function handle(object $entity, mixed $data): object
{
// do some logic here
$entity->tax = $entity->amount * self::TAX_PERCENT;
return $entity; // returns an entity that form will save as step data into the storage
}
}
use Lexal\SteppedForm\Form\Builder\StaticStepsFormBuilder;
use Lexal\SteppedForm\Step\Step;
use Lexal\SteppedForm\Step\Steps;
$steps = new Steps([
new Step('customer', new CustomerStep()),
new Step('broker', new BrokerStep()),
/* some more steps */
]);
$builder = new StaticStepsFormBuilder($steps);
use Lexal\SteppedForm\Form\Builder\FormBuilderInterface;
use Lexal\SteppedForm\Step\Builder\StepsBuilderInterface;
final class CustomBuilder implements FormBuilderInterface
{
public function __construct(private readonly StepsBuilderInterface $builder)
{
}
public function build(object $entity): Steps
{
$this->builder->add('customer', new CustomerStep());
// add step depending on previous user input
if ($entity->createNewBroker) {
$this->builder->add('broker', new BrokerStep());
}
// Some additional steps
return $this->builder->get();
}
}
use Lexal\SteppedForm\Step\RenderStepInterface;
use Lexal\SteppedForm\Step\StepBehaviourInterface;
use Lexal\SteppedForm\Step\Steps;
use Lexal\SteppedForm\Step\TemplateDefinition;
final class CustomerStep implements StepBehaviourInterface
{
public function getTemplateDefinition(object $entity, Steps $steps): TemplateDefinition
{
// render
}
public function handle(object $entity, mixed $data): object
{
// handle
}
public function forgetDataAfterCurrent(object $entity): bool
{
return $entity->code === 'NA'; // remove form data after current step only when code equals to 'NA'
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.