【问题标题】:codeigniter - relational tablecodeigniter - 关系表
【发布时间】:2016-09-30 12:57:42
【问题描述】:

我是第一次使用 codeigniter。我习惯了 MVC,但只有 .net,而不是 PHP。

所以,我有一个表“类别”、一个表“国家”和一个表“类别国家”。假设前两个表只有“id”和“name”,第三个表有“country_id”和“category_id”。一个类别可以分配多个国家/地区。

我已经准备好创建和编辑类别的模型、视图和控制器。

编辑功能

型号:

function get_category_by_id($id)
{
    $query = $this->db->get_where('categories',array('id'=>$id));
    if($query->num_rows()<=0)
    {
        echo 'Invalid category id';die;
    }
    else
    {
        return $query->row();
    }
}

查看:

<form class="form-horizontal" id="addcategory" action="<?php echo site_url('admin/category/updatecategory');?>" method="post">
    <input type="hidden" name="id" value="<?php echo $post->id;?>"/>
    <div class="form-group">
        <label class="col-sm-3 col-md-3 control-label"><?php echo lang_key_admin('name');?>:</label>
        <div class="col-sm-4 col-md-4 controls">
            <input type="text" name="name" value="<?php echo $post->name;?>" placeholder="<?php echo lang_key_admin('type_something');?>" class="form-control input-sm" >
            <?php echo form_error('title'); ?>
        </div>
    </div>
</form>

控制器:

public function edit($id='')
{
    $value['post']  = $this->category_model->get_category_by_id($id);
    $data['title'] = lang_key_admin('edit_category');
    $data['content'] = load_admin_view('categories/editcategory_view',$value,TRUE);
    load_admin_view('template/template_view',$data);        
}

public function updatecategory()
{
    $this->form_validation->set_rules('name', lang_key_admin('name'), 'required');

    if ($this->form_validation->run() == FALSE)
    {
        $id = $this->input->post('id');
        $this->editcategory($id);   
    }
    else
    {
        $id = $this->input->post('id');

        $data                   = array();          
        $data['name']           = $this->input->post('name');           

            $this->category_model->update_category($data,$id);
            $this->session->set_flashdata('msg', '<div class="alert alert-success">'.lang_key_admin('data_updated').'</div>');

        redirect(site_url('admin/category/edit/'.$id));     
    }
}

现在我想向该视图添加一个选择列表(多选),这样我就可以选择要分配给该类别的国家,并将关系存储在第三个表中。我该怎么做?我必须在列表中显示所有国家并能够选择我想要的国家。我还希望已指定的国家/地区在页面加载时显示在列表中。

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    我不是为您编写代码,但会提供一些指导,希望对您有所帮助。

    如果您熟悉 Codeigniter 的 Form Helper.,您的工作会更轻松。特别是,要为表单创建多选字段,请使用助手的 form_multiselect() 函数。

    您将需要两个模型函数来收集两个结果集:一个获取国家/地区的完整列表,第二个获取与您的第三个表中的特定类别匹配的国家 ID 数组(我们将表命名为 crossref )。第一个填充多选,第二个用于指示多选中当前选定的国家/地区集。

    这些结果很容易传递给form_multiselect(),任何表单控件的所有属性(引导类对吗?)也是如此。

    有几种方法可以处理从表单发布的多选。这个tutorial 可能会有所帮助。 (向下滚动多选讨论的方式。)一旦您解析了选定的国家/地区,就需要一个模型函数来插入或更新crossref

    与回答您的问题无关,但我注意到您可能希望考虑的事情。您的模型使用echo,这可以说是对 MVC 最佳实践的突破。一般来说,控制器应该是根据它启动的任何处理的结果来决定显示什么的决定者。所以你的模型应该这样做而不是调用echodie

    function get_category_by_id($id)
    {
        $query = $this->db->get_where('categories',array('id'=>$id));
        return $query->num_rows() > 0) ? $query->row() : NULL;
    }
    

    如果没有结果,这将返回 NULL。然后控制器必须检查并响应模型的返回

    public function edit($id='')
    {
        $category = $this->category_model->get_category_by_id($id);
        if(isset($category))
        {
            $value['post'] = $category;
            $data['title'] = lang_key_admin('edit_category');
            $data['content'] = load_admin_view('categories/editcategory_view',$value,TRUE);
            load_admin_view('template/template_view',$data); 
        }
        else
        {
            //handle the error (an "error" view?)
        }
    }
    

    不要在使用 CodeIgniter 时调用 php 函数 exitdie

    为什么?在控制器完成执行之前,框架不会向浏览器输出任何内容。调用其中任何一个函数都会使框架短路,并且在您的代码中,echo 'Invalid category id'; 发送的消息将不会显示。控制器完成后,CI 也会做一些其他的工作。

    在开发过程中使用exitdie 是可以的,但不能在生产站点中使用。

    【讨论】:

    • 感谢您的提示。他们给我指路了。我会尽快发布解决方案
    猜你喜欢
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2013-02-15
    • 1970-01-01
    • 2015-12-28
    • 2014-05-18
    相关资源
    最近更新 更多