【问题标题】:CodeIgniter form_open() action not working correctlyCodeIgniter form_open() 操作无法正常工作
【发布时间】:2013-07-07 12:12:44
【问题描述】:

我有一个视图,其中有一个管理产品的表单(添加新产品或 - 如果通过了 id - 编辑现有产品)。如果传递了一个id,那么表单动作应该是例如'admin/product/manage/5',如果没有传递id,那么它应该是这样的'admin/product/manage'。

<?php echo form_open('admin/product/manage/{optional product id}', array('class' => 'ajax-form')); ?>

我也创建了这条路线:

$route['admin/product/manage'] = "admin/product/manage";
$route['admin/product/manage/(:num)'] = "admin/product/manage/$1";

我怎样才能使我的表单动作正常工作?是否有可能以某种方式将路线放入动作中??

这是我的控制器:

public function manage($id = NULL){

    //fetch a single product to edit or create a new one
    if (isset($id) === true) {
        $data['prod'] = $this->product_model->get($id);
        $data['vers'] = $this->product_version_model->get_by('product_id',$id);
    } else {
        $data['prod'] = $this->product_model->make_new();// this returns $product->product_name = ''; in order to be empty the input field and not throughing errors
    }

    $this->product_model->save_product();
    $this->product_version_model->save_version();

    // load the view
    $this->layout->view('admin/products/manage', $data);
}

这是我的看法:

<?php echo form_open('admin/product/manage', array('class' => 'ajax-form')); ?>
<p>
    <label for="product_name">Product *</label>
    <input type="text" name="product_name" value="<?php echo set_value('product_name', $prod->product_name); ?>" />
    <?php echo form_error('product_name'); ?>
</p>
<?php echo form_close() . PHP_EOL; ?>

【问题讨论】:

    标签: forms codeigniter routes action


    【解决方案1】:

    您需要按重要性顺序声明两条可能的路线,因此:

    $route['admin/product'] = "admin/product/manage";
    $route['admin/product/(:num)'] = "admin/product/manage/$1";
    

    来自Codeigniter Docs

    路由将按照它们定义的顺序运行。较高的路线总是优先于较低的路线。

    编辑:

    根据您对问题所做的更改,我可以说以下内容:

    首先 isset() 仅返回布尔值,因此您不需要类型检查“=== true”。 isset($id) 就足够了。

    为了将表单操作设置为 id,您需要将其包含在隐藏字段或操作本身中。

    例如:

    $action_id = (isset($id) ? '/'.$id : ''); // Using ternary operators here
    echo form_open('admin/product/manage'.$action_id, array('class' => 'ajax-form'));
    

    并将 id 添加到控制器中的视图数据中:

    $data['id'] = $id;
    

    附带说明: 为了遵守 SoC(关注点分离),您需要在控制器中准备所有数据(例如,模型都有自己的任务)并通过将处理后的数据发送到视图,而不是在视图本身中部分生成数据。

    【讨论】:

    • 我已经尝试过了,但它对我来说似乎不正确。尽管我的 URL 具有“admin/product/manage/3”,但当我查看源代码时,表单操作并未采用 id。表单操作仍然看起来像这样 'admin/product/manage'
    • 请通过提供您的视图或控制器的代码示例来更新您的答案(无论您在哪里处理路由数据)。
    • @Lykos 根据您的更改扩展了我的答案。
    • 是的,你说得对,虽然我用了一些不同的方法。在我的 make_new() 函数中,我已经像这样初始化了我的产品 ID $product->product_id = null;并返回它。因此,如果没有 id 通过,则该操作有效。如果一个 id 传递它也包括 id。无论如何感谢您的帮助!
    • @Lykos 不客气 :-) Codeigniter 是我进入 PHP 框架世界的入口,很高兴能提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 2013-04-29
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    相关资源
    最近更新 更多