91 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Lean\Api\Form;
 | 
						|
 | 
						|
use CSLSJ\Lean\Form\Session\EmailContext;
 | 
						|
use Picea\Ui\Method\{ FormContextInterface, };
 | 
						|
 | 
						|
use Ulmus\Attribute\Property\Field;
 | 
						|
use Lean\Api\Attribute\EntityField;
 | 
						|
 | 
						|
use Ulmus\Entity\EntityInterface;
 | 
						|
use Ulmus\Entity\Field\Datetime;
 | 
						|
 | 
						|
abstract class Save implements \Picea\Ui\Method\FormInterface {
 | 
						|
    use FormTrait;
 | 
						|
 | 
						|
    protected string $contextClass;
 | 
						|
 | 
						|
    public function validate(FormContextInterface $context) : bool
 | 
						|
    {
 | 
						|
        # Context is validating inputs
 | 
						|
        return $context->valid($this->getEntity()->isLoaded() ? $this->getEntity() : null);
 | 
						|
    }
 | 
						|
 | 
						|
    public function execute(FormContextInterface $context) : mixed
 | 
						|
    {
 | 
						|
        $entity = $this->getEntity();
 | 
						|
 | 
						|
        if  ($entity->isLoaded()) {
 | 
						|
            if (property_exists($entity, 'updatedAt') && $entity->repository()->generateDatasetDiff($entity) ) {
 | 
						|
                $entity->updatedAt = new Datetime();
 | 
						|
            }
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            if (property_exists($entity, 'createdAt') && empty($entity->createdAt)) {
 | 
						|
                $entity->createdAt = new Datetime();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        try {
 | 
						|
            $this->assignContextToEntity($context);
 | 
						|
 | 
						|
            if ( $saved = $entity::repository()->save($entity) ) {
 | 
						|
                $context->pushMessage($this->message::generateSuccess(
 | 
						|
                    $this->lang('lean.api.form.save.success.entity')
 | 
						|
                ));
 | 
						|
            }
 | 
						|
            else {
 | 
						|
                $context->pushMessage($this->message::generateWarning(
 | 
						|
                    $this->lang('lean.api.form.save.error.entity', [ 'entity' => $this->entity::class ])
 | 
						|
                ));
 | 
						|
            }
 | 
						|
        }
 | 
						|
        catch(\PDOException $ex) {
 | 
						|
            throw new \PDOException($this->lang('lean.api.form.save.error.pdo', [ 'error' => $ex->getMessage() ]));
 | 
						|
        }
 | 
						|
        catch(\Throwable $ex) {
 | 
						|
            throw $ex;
 | 
						|
        }
 | 
						|
 | 
						|
        return $saved;
 | 
						|
    }
 | 
						|
 | 
						|
    protected function assignContextToEntity(FormContextInterface $context) : void
 | 
						|
    {
 | 
						|
        $entity = $this->getEntity();
 | 
						|
 | 
						|
        foreach($entity::resolveEntity()->fieldList() as $key => $property) {
 | 
						|
            $field = $property->getAttribute(Field::class)->object;
 | 
						|
            if (! $field->readonly || ! $entity->isLoaded()) {
 | 
						|
                $apiField = $property->getAttribute(EntityField::class)->object ?? null;
 | 
						|
 | 
						|
                if ($apiField) {
 | 
						|
                    $var = $apiField->field ?: $key;
 | 
						|
 | 
						|
                    if ( property_exists($context, $var) && ( new \ReflectionProperty($context, $var) )->isInitialized($context) ) {
 | 
						|
                        if ($apiField->setterMethod) {
 | 
						|
                            # Use a setter method
 | 
						|
                            call_user_func([ $entity, $apiField->setterMethod ], $context->{$var});
 | 
						|
                        }
 | 
						|
                        else {
 | 
						|
                            # Direct property set
 | 
						|
                            $entity->$key = $context->{$var};
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |