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

时间:2013-07-07 12:12:45

标签: forms codeigniter routes action

我有一个视图,其中有一个管理产品的表单(添加新产品或-if 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; ?>

1 个答案:

答案 0 :(得分:1)

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

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

来自Codeigniter Docs

  

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

编辑:

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

首先,isset()仅返回boolean,因此您不需要类型检查“=== 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(关注点分离),您需要准备控制器中的所有数据(例如,模型都有自己的任务)并通过处理后的数据到视图中,而不是在视图本身中部分生成数据。