【问题标题】:HTML Helper - Reusable View - PHPHTML Helper - 可重用视图 - PHP
【发布时间】:2011-03-17 05:52:58
【问题描述】:

我是 PHP 新手,我希望有人可以帮助我确定创建可重用视图的最佳方法是什么。我所拥有的是一个用于添加或编辑数据的表单。因此,除了在 Edit 的情况下将填充表单字段之外,视图将是相同的。

所以我正在创建一个带有 2 个参数的 HTML 助手。第一个是表单数据(如果有{edit}),第二个是一个布尔值,用于标记这是插入还是编辑(以更改表单操作)。

我的问题是......如果表单用于添加数据并因此不包含数据,我应该如何处理第一个参数?可选参数?

编辑--

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

【问题讨论】:

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


    【解决方案1】:

    首先,默认参数应该在右边。我会默认它为'false'或NULL。

    function WorkOrderForm($edit, $array = false)
    

    然后可能检查 $array 是否不正确,并将所有 $query[0] 设置为 NULL?所以像......

          if(!$array) { 
             $query[0]->name = $query[0]->description = $query[0]->status = null; 
          }
    

    可能有更直接的方法,但这是一种方法。

    【讨论】:

      【解决方案2】:

      首先,如果您将查询作为数组发送到辅助函数,则没有理由将其转换为另一个数组。即$array = array('$query') 应该只是$query 这样您就可以访问这样的属性:$query-&gt;name 而不是$query[0]-&gt;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
      }
      

      希望这会有所帮助...

      【讨论】:

        【解决方案3】:

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

        例如

        控制器:

        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 的工作原理。

        【讨论】:

        • 使用 array_push 的方法是可怕的,没有任何意义。视图是为这些任务提供的,因此请使用它们。
        • 这是我相信的正确答案。很遗憾,如果你不是一个冲洗袋,你就无法回答这个问题。我不是 PHP 开发人员,更不是 CI PHP 开发人员。这将解释这个幼稚的问题。
        猜你喜欢
        • 2012-10-18
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 2011-08-09
        • 1970-01-01
        • 2011-02-14
        • 2013-03-23
        • 1970-01-01
        相关资源
        最近更新 更多