Forms CodeIgniter form_open()操作无法正常工作

Forms CodeIgniter form_open()操作无法正常工作,forms,codeigniter,routes,action,Forms,Codeigniter,Routes,Action,我有一个视图,其中有一个管理产品的表单(添加新产品或-如果id通过-编辑现有产品)。如果传递了一个id,那么表单操作应该是“admin/product/manage/5”,如果没有传递id,那么它应该是这样的“admin/product/manage” <?php echo form_open('admin/product/manage/{optional product id}', array('class' => 'ajax-form')); ?> 我如何使我的表单操作正

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

<?php echo form_open('admin/product/manage/{optional product id}', array('class' => 'ajax-form')); ?>
我如何使我的表单操作正确工作?是否有可能以某种方式将行动纳入路线中

这是我的控制器:

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);
}
$data['id'] = $id;
我的看法是:

<?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; ?>


产品*

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

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

路由将按定义的顺序运行。较高的路线将始终优先于较低的路线

编辑: 根据你对问题所作的修改,我可以说:

首先,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添加到控制器中的视图数据:

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);
}
$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 You's welcome:-)Codeigniter是我进入PHP框架世界的入门之作,所以我很乐意提供帮助。