3.5 KiB
form
(FormInterface $form, ? FormContext $formContext = null) : FormHandler
The form()
method will process a form in three steps :
initialize(FormContextInterface $context)
is first called on form processing.validate(FormContextInterface $context) : bool
will execute on POST. If you define a name to the form, it will match the one found in the POST (picea-ui-form[$context->name]
) ; if the form is not the target, it will be skipped. Also, if an error si found within the message list, the method will returnfalse
.execute(FormContextInterface $context)
is the last method to run, which is usually where you save your entity and finilize your messages. The return value is accessible from theformHandler
whichform()
returns.
[PHP] So, using this code:
in /app/controller/user.php
form(new \MyApp\Form\User\Create());
/app/form/create.php
<?php
namespace MyProject\Form;
use MyProject\{ Lib, Entity };
use Picea\Ui\Method\{ FormContextInterface, Message\ErrorMessage };
use Psr\Http\Message\ServerRequestInterface;
use function MyProject\View\{ lang };
class Create implements \Picea\Ui\Method\FormInterface {
public function initialize(FormContextInterface $context) : void
{
$this->user = new Entity\User();
# $context->{varname} will be populated by $_POST data.
$this->user = (string) $context->fullname;
}
public function validate(FormContextInterface $context) : bool
{
if ( strlen($this->user) < 3 ) {
# This won't allow `execute` to run because of the error message.
$context->pushMessage(Lib\Message::generateError(
lang("form.error.provide_fullName")
));
}
return $context->valid();
}
public function execute(FormContextInterface $context) : void
{
# Saving a new user here
Entity\User::repository()->save($this->user);
$context->pushMessage(Lib\Message::generateSuccess(
lang("form.save")
));
}
}
which implements this interface :
interface FormInterface
{
public function initialize(FormContextInterface $context) : void;
public function validate(FormContextInterface $context) : bool;
public function execute(FormContextInterface $context);
}
Would yield the same result such as:
true
true
Trying to access either variable before execute
is called will return null
.
FormContext
object
__construct(ServerRequestInterface $request, ? string $formName = null)
Creating a form context manually allows to define the formName, which is essential if you want to use the Cross-Scripting Request Forgery (CSRF).
It is populated with either $_POST or request's body which is json_decode. A property called files
is also populated from PSR's $request->getUploadedFiles()
.
It's valid() : bool
method called into a form validate()
function is first checking every message which were pushed into, using pushMessage(FormMessage $message)
, and returns false if an error message is found in the list.
Retrieve a form execution status / value
There is two ways to get the execution status (from the execute
return value):
$formContext = new \Picea\Ui\Method\FormContext($request, 'form.user_create');
$form = form(new \MyProject\Form\User\Create(), $formContext);
if ($formContext->formExecuted) {
echo $form->executionStatus;
echo $formContext->formExecutionStatus;
}