我目前正在使用php中的表单构建器帮助程序类,其中包含添加各种类型字段的静态方法(addTextfield(),addBooleanField()等),目的是为每个对象使用一个模板类型,无论我是添加新对象还是编辑现有对象。
FormBuilder的相关部分基本上是这样做的:
class Team {
public $id;
public $name;
public $city;
}
这里有一个虚拟类作为例子
$team
因此,在编辑现有团队时,我会有一个<div>
<span>Team Name</span>
<?php FormBuilder::addTextField("name", (isset($team) ? $team->name: "")); ?>
</div>
<div>
<span>City</span>
<?php FormBuilder::addTextField("city", (isset($team) ? $team->city: "")); ?>
</div>
变量来传递当前值。如果我要添加一个新团队,显然这些值不会被设置,并且$ team不会存在。我正努力寻找一种传递当前价值的有效方法。我到目前为止唯一成功的方法是:
isset($item) ? $item->prop : ""
其中一些表单会变得非常大,因此为每个表单添加$defaults
并不理想。
还可以选择在模板的开头定义&$default_value
数组,具体取决于项目是否存在,但这又会留下一些错误空间
创建Team类的虚拟实例并不是一个选项,因为如果在数据库中找不到有效的实例,则对象会抛出错误。
我尝试将方法中的参数更改为{{1}},但这会阻止我直接传入值,偶尔我需要这样做。
我觉得我可能会问太多的代码,但目的是尽可能少地重复这些代码。
任何帮助将不胜感激!
答案 0 :(得分:0)
以下内容如何:
addTextFieldFromEntity($name, $entity = null, $entityField = null)
然后:
<?php FormBuilder::addTextFieldFromEntity("name", $team, "name"); ?>
或更复杂的事情:
class EntityWrapper
{
private $entity;
public static function init($entity)
{
return new EntityWrapper($entity);
}
public function __construct($entity)
{
$this->entity = $entity;
}
public function __get($name)
{
if (!is_null($this->entity)) {
return '';
}
return $this->entity->$name;
}
}
然后:
<?php FormBuilder::addTextField("name", EntityWrapper::init($team)->name); ?>
答案 1 :(得分:0)
如何使用https://en.wikipedia.org/wiki/Null_object_pattern? 让它返回空值。如果是新团队,则改为传递该空对象。