【问题标题】:Codeigniter application designCodeigniter 应用程序设计
【发布时间】:2010-01-26 06:46:53
【问题描述】:

我有几个关于 CI 应用程序设计的问题。

问。在创建新表单并使用 CI 的 form_helper 时,我在控制器中创建数组并将其传递给 view/form_input() 方法。我应该在控制器、视图还是单独的文件中执行此操作?

问。在我的控制器中,我为表单创建了一个方法,即 new_user(),在我的 view/form_open() 中,我在控制器中指定了一个不同的方法来处理操作(即 add(), edit(), delete() ..etc) & 该方法处理验证。这是我喜欢的方式;但是,如果验证失败,我在传递数据时遇到了很多困难。有什么建议吗?

问。我有一两个实例,当我执行表单验证时,我需要针对两个 $_POST 变量进行验证。一个例子是,在验证时,我需要查询数据库以确定输入的业务是否已经存在(基于业务名称和邮政编码),然后重定向回视图并保留帖子变量。到目前为止,我还没有找到一种方法来创建自定义回调函数来执行此操作,因为您只能传入一个参数。我能够让它工作的唯一方法是如果验证通过,然后我执行数据库检查,如果业务存在,我将 $_post 放入 session/flashdata 并使用重定向再次加载视图。定义 form_input 属性的数组调用 set_value ,它是为数组中的每条记录提取 flashdata 的地方。

$data['name'] = array(
    'name'     => 'name',
    'id'       =>  'name',
    'value'    =>   set_value('name', $this->session->flashdata('name')),
    'maxlength'   =>  '200',
    'size'     =>  '79',
    'class'    =>  'text'

我意识到这真的取决于偏好;但是,我真的很想深入了解我可以预料到的陷阱以及其他人如何设计他们的应用程序。我已经下载了示例应用程序并进行了大量搜索,但我真的没有找到太多讨论。非常感谢任何建议。

谢谢!

【问题讨论】:

    标签: php model-view-controller codeigniter coding-style


    【解决方案1】:

    我将分享我使用 CI 的方法

    1. 我创建的控制器尽可能纤薄。控制器主作业只会通过URI_GET_POST获取参数。然后控制器将所需的参数传递给模型,并得到结果。之后,将加载视图文件并传递视图所需的所有变量。
    2. 与数据库、电子邮件发送等相关的所有流程逻辑都在模型中处理。模型将获取参数,进行查询,如果需要,处理查询结果,然后返回一个数组、结果集、布尔值或整数。获取返回值的控制器直接将其传递给视图,无需对其进行重新处理。
    3. 在视图中,它将处理变量以显示它。将有循环显示数据列表,从数组中获取列字段然后将其显示为表单默认值等。视图和模型通常成对开发,因为视图中所有需要的字段必须由模型中的查询提供.

    Controller 中唯一的“胖”处理是 form_validation。我已经在你的另一个问题中回答了,我是如何编写 form_validation 规则以及如何使用它的。

    以下是我对上述问题的回答:

    问。在创建新表单和您的 使用我正在创建的 CI 的 form_helper 控制器中的数组并传递 它到 view/form_input() 方法。 我应该在 控制器、视图或单独的 文件?

    我很少使用 form_helper。这是因为我的大部分观点来自设计师同行或客户提供的 HTML 文件。我只使用form_dropdown,因为它允许我将选项作为数组传递,而不是foreach。对于另一个表单元素,我只使用模板文件中提供的那个。

    问。在我的控制器中,我创建了一个方法 对于我的表单 即 new_user() 并在 我的视图/form_open() 我指定了一个 我的控制器中的不同方法 处理动作(即 add(), edit(), delete() ..etc) 和那个方法 处理验证。这是 我喜欢的方式;但是,我有一个 传递数据有很多困难 如果验证失败。任何 建议?

    当我创建我的应用程序时,我通常在控制器中只有 2 个主要方法。 admin 用于显示列表和处理删除,form 用于显示和处理添加和编辑。让我举一个产品模块的例子。

    我将拥有使用这些方法的产品控制器:

    class Product extends MY_Controller {
    
      function index()
      {
        //for front page, display list of product
      }
    
      function detail()
      {
        //for front page, display single product detail
        //product id is passed as 3rd URI segment
        $id = intval($this->uri->rsegment(3));
      }
    
      function admin()
      {
        //for admin, display product list
        //receive id in _POST then do delete
        //after delete, do redirect to self, best practise
      }
    
      function form()
      {
        //for admin, handle add and edit
        $id = intval($this->uri->rsegment(3));
        //if id given and product detail data can be loaded, then it in 'edit' mode
        //else it in 'add' mode
        //after validation success, and insert/update success, redirect to product/admin
      }
    
    }
    

    使用这种方法,我可以避免重复代码,并且可以使所有代码始终保持最新。几乎所有的添加和编辑都具有相同的视图和表单字段。如果添加和编辑表单不同(例如编辑用户,不允许更改用户名),通过将$mode 变量设置为addedit,我可以输入简单的if 并显示正确的表单,验证规则,并调用适当的模型方法。

    问。我有一两个例子,当 我执行我需要的表单验证 针对两个 $_POST 变量进行验证。 一个例子是,在验证时我 需要查询数据库 确定输入的业务是否 已经存在(基于业务 名称和邮政编码)然后重定向回来 查看并保留帖子 变量。到目前为止我还不能 找到一种方法来创建自定义 回调函数这样做是因为 你只能传入一个参数。 我能够做到的唯一方法 让这个工作是如果验证 通过,然后我执行数据库 检查,如果业务存在,我把 session/flashdata 中的 $_post 和 使用重定向再次加载视图。 定义 form_input 的数组 属性调用 set_value 是 它为每个提取闪存数据的位置 记录在数组中。

    您可以create your own validation rules。要传递多个参数,您可以打开文件system/libraries/Form_validation.php,然后查看function matches($str, $field) 代码。您的回调可以有多个参数,function matches($str, $field) 代码将向您展示如何读取和使用第二个参数。

    我希望这将有助于您学习和使用 CI。等待您的出色网络应用程序;)

    【讨论】:

      【解决方案2】:

      问。创建新表单并使用 CI 的 form_helper 时,我在控制器中创建数组并将其传递给 view/form_input() 方法。我应该在控制器、视图还是单独的文件中执行此操作?

      A. Form_Helper 应始终在“视图”中使用。

      问。在我的控制器中,我为我的表单创建了一个方法 ,即 new_user(),在我的 view/form_open() 中,我在我的控制器中指定了一个不同的方法来处理操作(即 add(), edit(), delete() ..etc) & 该方法处理验证。这是我喜欢的方式;但是,如果验证失败,我在传递数据时遇到了很多困难。有什么建议吗?

      A.我的方法是直接 add/edit() 到 save();,在 save() 方法中,如果其他情况,我都会这样做。

      问。我有一两个实例,当我执行表单验证时,我需要针对两个 $_POST 变量进行验证。一个例子是,在验证时,我需要查询数据库以确定输入的业务是否已经存在(基于业务名称和邮政编码),然后重定向回视图并保留帖子变量。到目前为止,我还没有找到一种方法来创建自定义回调函数来执行此操作,因为您只能传入一个参数。我能够让它工作的唯一方法是如果验证通过,然后我执行数据库检查,如果业务存在,我将 $_post 放入 session/flashdata 并使用重定向再次加载视图。定义 form_input 属性的数组调用 set_value ,它是为数组中的每条记录拉取 flashdata 的地方。

      A.我建议你使用 $this->input->post 使用 $_POST 的瞬间,因为如果你启用 CI 将帮助你过滤 XSS。 PHP 不支持 is_POST 像 .NET,我所做的是使用文本框作为参考

      if(isset($_POST('txt_Name')))
      {
      
      }
      **or**
      if($this->input->post('txt_Name'))
      {
      
      }
      

      希望我的回答能帮到你。

      【讨论】:

      • if($this->input->post('field) !== FALSE) 是一样的。
      猜你喜欢
      • 2011-03-20
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多