You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

153 lines
3.1 KiB

12 months ago
<?php
/**
* PHP表单生成器
*
* @package FormBuilder
* @author xaboy <xaboy2005@qq.com>
* @version 2.0
* @license MIT
* @link https://github.com/xaboy/form-builder
* @document http://php.form-create.com
*/
namespace FormBuilder;
use FormBuilder\Annotation\AnnotationReader;
use FormBuilder\Contract\ConfigInterface;
use FormBuilder\Contract\FormHandleInterface;
/**
* 表单生成类
*
* Class FormHandle
* @package FormBuilder
*/
abstract class FormHandle implements FormHandleInterface
{
protected $action = '';
protected $method = 'POST';
protected $title;
protected $formContentType;
protected $headers = [];
protected $fieldTitles = [];
protected $except = [];
protected $scene;
/**
* 表单 UI
*
* @return mixed
*/
abstract public function ui();
final public function getExcept()
{
return $this->except;
}
/**
* 获取表单数据
* @return array
*/
protected function getFormData()
{
return [];
}
public function scene($scene = null)
{
if (!is_null($scene)) $this->scene = $scene;
return $this->scene;
}
/**
* 获取表单配置
*
* @return mixed|array|ConfigInterface
*/
protected function getFormConfig()
{
return;
}
public function getFieldTitle($field)
{
return isset($this->fieldTitles[$field]) ? $this->fieldTitles[$field] : null;
}
/**
* 获取表单组件
*
* @return array
* @throws \ReflectionException
*/
protected function getFormRule()
{
$render = new AnnotationReader($this);
return $render->render();
}
/**
* 创建表单
*
* @return Form
* @throws \ReflectionException
*/
protected function createForm()
{
$ui = lcfirst($this->ui());
return call_user_func_array(['FormBuilder\\Form', $ui], $this->getParams());
}
/**
* @return array
* @throws \ReflectionException
*/
protected function getParams()
{
$params = [$this->action, $this->getFormRule()];
$config = $this->getFormConfig();
if (is_array($config) || $config instanceof ConfigInterface)
$params[] = $config;
return $params;
}
/**
* 获取表单
*
* @return Form
* @throws \ReflectionException
*/
public function form()
{
if ($this->scene && method_exists($this, $this->scene . 'Scene'))
$this->{$this->scene . 'Scene'}();
$form = $this->createForm()->setMethod($this->method);
if (!is_null($this->title)) $form->setTitle($this->title)->headers($this->headers);
$formData = $this->getFormData();
if (is_array($formData)) $form->formData($formData);
if ($this->formContentType) $form->setFormContentType($this->formContentType);
$config = $this->getFormConfig();
if ($config) $form->setConfig($config);
return $form;
}
/**
* @return string
* @throws \ReflectionException
*/
public function view()
{
return $this->form()->view();
}
}