HTML Helper - 可重用的视图 - PHP

时间:2010-07-17 02:13:28

标签: php model-view-controller codeigniter views html-helper

我是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;
    }
}
?>

3 个答案:

答案 0 :(得分:3)

你在做什么?可重用的视图比这容易得多。只需创建一个视图并将其保存在views文件夹中。添加在添加和编辑数据时都会出现的字段,并在value参数中使用if语句来确定它是否包含数据。

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
}

希望这会有所帮助......