'',
'vue' => '',
//iview 版本 2.14.3
'iview-css' => '',
'iview' => '',
//form-create 版本 1.4.5
'form-create' => '',
'city-data' => '',
'city-area-data' => ''
];
/**
* 加载 jquery
*
* @var bool
*/
protected $linkJq = true;
/**
* 加载 vue
*
* @var bool
*/
protected $linkVue = true;
/**
* 加载 iview
*
* @var bool
*/
protected $linkIview = true;
/**
* @var string
*/
protected $successScript = '';
/**
* 网页标题
*
* @var string
*/
protected $title = 'formBuilder';
/**
* 提交地址
*
* @var string
*/
protected $action = '';
/**
* 表单id
*
* @var string
*/
protected $id = '';
/**
* 提交方式
*
* @var string
*/
protected $method = 'post';
protected $resetBtn = false;
protected $submitBtn = true;
/**
* 表单配置
*
* @var array|mixed
*/
protected $config = [
'form' => [
'inline' => false,
'labelPosition' => 'right',
'labelWidth' => 125,
'showMessage' => true,
'autocomplete' => 'off'
],
'row' => []
];
/**
* Form constructor.
*
* @param string $action 提交地址
* @param array $components 组件
*/
public function __construct($action = '', array $components = [])
{
$this->components($components);
$this->action = $action;
}
public static function json()
{
return new Json();
}
/**
* @param bool $linkJq
*/
public function setLinkJq($linkJq)
{
$this->linkJq = (bool)$linkJq;
}
/**
* @param bool $linkVue
*/
public function setLinkVue($linkVue)
{
$this->linkVue = (bool)$linkVue;
}
/**
* @param bool $linkIview
*/
public function setLinkIview($linkIview)
{
$this->linkIview = (bool)$linkIview;
}
/**
* @return bool
*/
public function isLoadCityData()
{
return $this->loadCityData;
}
/**
* @return bool
*/
public function isLoadCityAreaData()
{
return $this->loadCityAreaData;
}
/**
* @param array $components
* @return $this
*/
public function components(array $components = [])
{
foreach ($components as $component) {
$this->append($component);
}
return $this;
}
/**
* @param Row $row
* @return $this
*/
public function formRow(Row $row)
{
$this->config['row'] = $row->build();
return $this;
}
/**
* @param FormStyle $formStyle
* @return $this
*/
public function formStyle(FormStyle $formStyle)
{
$this->config['form'] = $formStyle->build();
return $this;
}
/**
* @return string
*/
public function getSuccessScript()
{
return $this->successScript;
}
/**
* 表单提交后成功执行的js地址
* formCreate.formSuccess(formData,$f)
*
* @param string $successScript
* @return $this
*/
public function setSuccessScript($successScript)
{
$this->successScript = $successScript;
return $this;
}
/**
* @return string
*/
public function getId()
{
return $this->id;
}
/**
* @param string $id
* @return $this
*/
public function setId($id)
{
$this->id = $id;
return $this;
}
/**
* @return string
*/
public function getAction()
{
return $this->action;
}
/**
* 提交地址
*
* @param string $action
* @return $this
*/
public function setAction($action)
{
$this->action = $action;
return $this;
}
/**
* @return string
*/
public function getMethod()
{
return $this->method;
}
/**
* @param string $key
* @return array|mixed|null
*/
public function getConfig($key = '')
{
if ($key == '')
return $this->config;
else
return isset($this->config[$key]) ? $this->config[$key] : null;
}
/**
* 提交方式
*
* @param string $method
* @return $this
*/
public function setMethod($method)
{
$this->method = $method;
return $this;
}
/**
* 标题
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* @param string $title
* @return $this
*/
public function setTitle($title)
{
$this->title = $title;
return $this;
}
/**
* 追加组件
*
* @param FormComponentDriver $component
* @return $this
*/
public function append(FormComponentDriver $component)
{
$field = $component->getField();
if (!isset($this->components[$field]))
$this->fields[] = $field;
$this->components[$field] = $component;
$this->checkLoadData($component);
return $this;
}
/**
* 开头插入组件
*
* @param FormComponentDriver $component
* @return $this
*/
public function prepend(FormComponentDriver $component)
{
$field = $component->getField();
if (!isset($this->components[$field]))
array_unshift($this->fields, $field);
$this->components[$field] = $component;
$this->checkLoadData($component);
return $this;
}
/**
* 是否需要引入省市区数据
*
* @param FormComponentDriver $component
*/
protected function checkLoadData(FormComponentDriver $component)
{
if (
$component instanceof Cascader
&& ($this->loadCityData == false || $this->loadCityAreaData == false)
) {
$type = $component->getType();
if ($type == Cascader::TYPE_CITY)
$this->loadCityData = true;
else if ($type == Cascader::TYPE_CITY_AREA)
$this->loadCityAreaData = true;
}
}
/**
* 获得表单规则
*
* @return array
* @throws FormBuilderException
*/
public function getRules()
{
$rules = [];
$fields = [];
foreach ($this->fields as $field) {
$component = $this->components[$field];
if (!($component instanceof FormComponentDriver))
continue;
$field = $component->getField();
if (in_array($field, $fields))
throw new FormBuilderException($field . '字段已重复,请保证组件 field 无重复');
$fields[] = $field;
$rule = $component->build();
if (!$component instanceof Hidden)
$rule['validate'] = array_merge(isset($rule['validate']) ? $rule['validate'] : [], $component->validate()->build());
$rules[] = $rule;
}
return $rules;
}
/**
* 获取表单视图
*
* @return string
*/
public function view()
{
ob_start();
$form = $this;
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR . 'form.php';
$html = ob_get_clean();
return $html;
}
/**
* 获取表单生成器所需全部js
*
* @return array
*/
public function script()
{
return $this->script;
}
/**
* 获取生成表单的js代码
*
* @return string
*/
public function formScript()
{
ob_start();
$form = $this;
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'view' . DIRECTORY_SEPARATOR . 'formScript.php';
$script = ob_get_clean();
return $script;
}
/**
* 获取表单生成器所需js
*
* @return array
*/
public function getScript()
{
$_script = $this->script;
$script = [
$_script['form-create']
];
if ($this->loadCityAreaData == true)
$script[] = $_script['city-area-data'];
if ($this->loadCityData == true)
$script[] = $_script['city-data'];
if ($this->linkJq)
$script[] = $_script['jq'];
if ($this->linkIview) {
$script[] = $_script['iview'];
$script[] = $_script['iview-css'];
}
if ($this->linkVue)
$script[] = $_script['vue'];
return array_reverse($script);
}
/**
* 是否隐藏提交按钮(默认显示)
*
* @param bool $isShow
* @return Form
*/
public function hiddenSubmitBtn($isShow = false)
{
$this->submitBtn = !(bool)$isShow;
return $this;
}
/**
* 是否隐藏重置按钮(默认隐藏)
*
* @param bool $isShow
* @return Form
*/
public function hiddenResetBtn($isShow = false)
{
$this->resetBtn = !(bool)$isShow;
return $this;
}
/**
* @return bool
*/
public function isResetBtn()
{
return $this->resetBtn;
}
/**
* @return bool
*/
public function isSubmitBtn()
{
return $this->submitBtn;
}
/**
* 生成表单快捷方法
*
* @param string $action
* @param array $components
* @return Form
*/
public static function create($action, array $components = [])
{
return new self($action, $components);
}
}