我是PHP的新手,我希望有人可以帮我确定创建可重用视图的最佳方法。我所拥有的是一个用于添加或编辑数据的表单。因此,视图将是相同的,除非在编辑时将填充表单字段。
所以我正在创建一个带有2个参数的HTML帮助器。第一个是表单数据(如果有任何{edit}),第二个将是bool,标记这是插入还是编辑(更改表单操作)。
我的问题是......如果表单用于添加数据而不包含数据,我应该如何处理第一个参数?可选参数?
编辑 -
我使用CodeIgnitor作为我的MVC框架。这就是那些形式函数被继承的东西.. fyi
谢谢..
<?php
if(!defined('BASEPATH') ) exit('No direct script access allowed');
if(!function_exists('WorkOrderForm'))
{
function WorkOrderForm($array = array('$query'),$edit)
{
$formHtml = "";
$attributes = array('class'=>'order','id'=>'orderForm');
if($edit)
{
$formHtml += form_open('order/update',$attributes);
}
else
{
$formHtml += form_open('order/add',$attributes);
}
$formHtml += form_input('name',$query[0]->name);
$formHtml += form_textarea('name',$query[0]->description);
$dropOptions = array('nstarted'=>'Not Started','complete'=>'Done','started'=>'In Progress');
$formHtml += form_dropdown('status',$dropOptions,$query[0]->status);
$formHtml += form_input('name',$query[0]->startDate);
$formHtml += form_input('name',$query[0]->endDate);
$formHtml += form_close();
return $formHtml;
}
}
?>
答案 0 :(得分:3)
E.g。
控制器:
public function add()
{
$data['method'] = 'add';
$data['form_data'] = $this->some_model->get_something();
$this->load->view('reusable_view', $data);
}
public function edit($id)
{
$data['method'] = 'edit';
$data['form_data'] = $this->some_model->get_something($id);
$this->load->view('reusable_view', $data);
}
查看:
<form method="post" action="my_controller/" . <?php echo $method; ?>>
<input type="text" value="<?php if ( isset($form_data['something']) ) {echo $form_data['something'];} " />
</form>
我认为没有理由在控制器中填充表单,因为这不是MVC的工作方式。使用帮助器来填充表单也很奇怪,我想你已经略微忽略了Codeigniter的工作原理。
答案 1 :(得分:0)
首先,默认参数应该在右边。我会将其默认为'false'或NULL。
function WorkOrderForm($edit, $array = false)
然后可能检查$ array是否为true,并将所有$ query [0]设置为NULL?所以......就像......
if(!$array) {
$query[0]->name = $query[0]->description = $query[0]->status = null;
}
可能有更直接的方法,但这是一种方式。
答案 2 :(得分:0)
首先,如果您将查询作为数组发送给辅助函数,则没有理由将其转换为另一个数组。即$array = array('$query')
应该只是$query
,这样您就可以访问这样的属性:$query->name
而不是$query[0]->name
。其次,如果您没有编辑表单条目,则$query
将为空,因此您可以将其用作返回内容的触发器(空白表单或填充表单):
function WorkOrderForm($query)
{
if($query!='')
{
//$formHTML=populated form
} else {
//$formHTML=empty form
}
return $formHTML;
}
好?但是,有一个问题......你帮助器中的代码将无法正常工作。您正在使用算术运算符+=
来(假设)连接表单数据。这样做是尝试将1
添加到一个字符串,该字符串将始终等于0
。您正在寻找的是.=
运营商;这将连接表格,如预期的那样。但是,这使您无法控制表单的外观(因为它会将所有表单元素并排放置 - 不太漂亮)。你可以做的不是将它们连在一起,push
将它们连接成一个数组,然后逐个回显表单元素:
if($query!=''){
$form_array=array();
array_push($form_array,form_open('order/update',$attributes));
array_push($form_array,form_input('name',$query->name));
array_push($form_array,form_textarea('name',$query->description));
$dropOptions = array('nstarted'=>'Not Started','complete'=>'Done','started'=>'In Progress');
array_push($form_array,form_dropdown('status',$dropOptions,$query->status));
array_push($form_array,form_input('name',$query->startDate));
array_push($form_array,form_input('name',$query->endDate));
array_push($form_array,form_close());
}else{
$form_array=array();
array_push($form_array,form_open('order/add',$attributes));
array_push($form_array,form_open('order/update'));
array_push($form_array,form_input('name'));
array_push($form_array,form_textarea('name'));
$dropOptions = array('nstarted'=>'Not Started','complete'=>'Done','started'=>'In Progress');
array_push($form_array,form_dropdown('status',$dropOptions));
array_push($form_array,form_input('name'));
array_push($form_array,form_input('name'));
array_push($form_array,form_close());
}
return $form_array;
然后呈现表单元素,遍历返回的$ form_array数组:
$form_data='';//blank for new item, or data to populate form with to edit an item
$form_el = WorkOrderForm($form_data);
foreach($form_el as $key=>$val){
echo $val.'<br>';//I just added a <br> here so each form element will be on a new line; change to fit your needs
}
希望这会有所帮助......