全球移民热线 400-123-4567 当进行新闻发布系统开发之际,分类管理属于后台方面极为基础同时又特别繁杂的功能之一了。不少新手于着手实现添加以及修改功能之时,常常会由于传递错误一个参数或者将方法名写错,进而引发整个模块出现报错情况。接下来我们径直切入主题,运用最为通俗易懂的语言剖析拆解这两项核心功能的实现具体细节,助力你避开那些常见的差错。
public function ADD() {
// 加载模板
$this->load->view('category/add');
}
首先,实现添加新闻分类的第一步是在控制器里创建一个ADD方法。其次,这个方法自身并不处理数据。然后,它只负责这样一件事:将添加分类的页面,也就是模板,展示给用户看。最后,当你访问后台的添加分类链接时,调用的可不是别的,正是这个方法。
先准备对应的模板文件,大多数PHP框架都遵循约定大于配置原则,模板存放路径和命名规则通常固定,复制一份系统自带配置模板,保留里面表单标签和输入框,删除用不到示例代码,只留分类名称输入框和提交按钮。
从事实际操作的是doADD方法,当用户于添加页面填入分类名称并点击提交操作之后,表单数据便会被发送至这个方法之中,在此处你需要开展两件事情,其一为核查用户是否输入了内容,以避免空数据被写入,其二是生成一个独一无二的分类ID,通常借助hash函数联合当前时间戳以及随机数来予以生成,以此确保每条分类都具备独立标识。
public function doADD() {
$name = $this->input->post('name');
if (empty($name)) {
$this->session->set_flashdata('error', '分类名称不能为空');
redirect('category/ADD');
}
$id = $this->createID();
$data = [
'id' => $id,
'name' => $name
];
// 将数据写入文件或数据库
$this->category_model->addCategory($data);
redirect('category/index');
}
private function createID() {
return hash('sha256', uniqid());
}
用于修改功能的入口之处是edit方法,此方法跟ADD方法最为显著的不同之处在于,其需要去接收一个参数,该参数也就是你所要修改的那条分类的ID。借助这个ID,此方法从数据库或者文件里头把原始数据读取出来,接着去加载修改模板,与此同时将数据传递给模板。
public function edit($id) {
$category = $this->category_model->getCategoryById($id);
if (!$category) {
$this->session->set_flashdata('error', '新闻分类不存在');
redirect('category/index');
}
$data['info'] = $category;
$this->load->view('category/edit', $data);
}
修改模板的 HTML 代码,它和添加模板差不多,唯一不同的是,分类名称的输入框里要多一个 value 属性,要将从数据库里查出来的原始名称填进去。如此一来,当用户打开修改页面时,看到的并非空白输入框,而是原有的分类名称,在这个基础上做直接修改即可。
方法,用于处理修改提交,通常被叫作editSave,或某个类似的名称。它,同样很是需要接收ID参数,而且,还要去验证这个ID对应产生的数据,是不是存在。要是已经存在,那就运用用户提交的新名称,去覆盖旧有的数据;要是不存在这种数据时,必须马上就要跳转到列表页,并且给出错误提示,以免继续去操作无效的数据。
诸多人员于对添加功能予以测试之际,会遭遇“方法不存在”这般的报错情况,此种状况一般而言是缘由于模板表单里的action属性将地址写错所致。去查验一下那提交按钮所指向的URL究竟是否为doADD此一方法之相关情况,以及该方法名的大小写情形是不是和控制器里所定义的保持一致。
public function doEdit() {
$id = $this->input->post('id');
$name = $this->input->post('name');
if (empty($id) || empty($name)) {
$this->session->set_flashdata('error', '必填项不能为空');
redirect('category/edit/' . $id);
}
$category = $this->category_model->getCategoryById($id);
if (!$category) {
$this->session->set_flashdata('error', '新闻分类不存在');
redirect('category/index');
}
$data = [
'id' => $id,
'name' => $name
];
$this->category_model->updateCategory($data);
redirect('category/index');
}
进行修改分类操作之际,碰到了“数据不存在”这般提示情况,很大概率是在edit方法之中,于那种查询数据的步骤那儿出现了差错。于依据ID去查找数据之后,可千万不要忘却添加一条判断语句,要是没有找寻到数据,此时就径直跳走,而非使得程序持续朝着下方执行空白页面。
修改后的情况里数据没发生变化这般状况常常是最能使人感到令人头疼的。这个时候该着重去查实处理修改的相关方法之中,是不是存有正确接收传来的新数据的情况。能够于方法的起始位置借助打印语句将接收到的POST数据予以输出,从而确认数据传递这一环节不存在问题,接着再去对写入文件抑或数据库的代码展开排查。
搞增加功能的代码的关键之处在于去组装新的数据。假定你从表单那儿收到了那些分类名称,首先得去生成一个仅仅唯独一样而且不会再次有的ID,能够通过md5(time() . rand())迅速达成。接着去把那个ID以及名称合成构造成一个阵列,将其附加到已然存在的分类数据集合当中,最后把整个集合回写到存储文件里。
修改这个功能的代码逻辑,稍微有不同之处,首先依据传来的ID,去找到要修改的那条数据,在数组里的位置,接着使用用户提交的新名称,替换掉旧名称,替换完成之后,把整个数据的数组,重新写入存储文件,如此修改便会生效。
有着两个功能的模板代码存在着颇为显著的差异哎。用于添加模板的表单并不需要去传递ID这个东西,直接提交给doADD进行处理就行。而用于修改模板的表单中必定得有一个隐藏域,它是专门用来存放时下正在修改的分类ID的,如此这般在提交的时候才能够把ID一块儿传递给处理修改的方法。
添加功能的核心目的在于创造新数据,整个进程无需知晓任何既有的数据信息,仅需要用户给出一个新分类名称便可独立达成。然而修改功能必定要依赖现有数据的ID,要是没有这个ID就不清楚要修改哪条数据。
public function ADD() {
$this->load->view('category/add');
}
public function doADD() {
$name = $this->input->post('name');
if (empty($name)) {
$this->session->set_flashdata('error', '分类名称不能为空');
redirect('category/ADD');
}
$id = $this->createID();
$data = [
'id' => $id,
'name' => $name
];
$this->category_model->addCategory($data);
redirect('category/index');
}
就数据处理方式而言,添加功能是于原先数据的基础之上增添一条全新记录,从而使得数组长度增加一个单位。而修改功能是在原有数据的基础之上对某一条记录予以更新,此时数组长度保持不变,仅仅是其中某个元素的值出现了改变。
就用户体验层面来加以观照,添加界面所呈现出来的乃是空白表单的样子,于此情形下用户得从起始之处着手进行输入。而修改界面所展示的却是已然填好了的表单内容这样子,如此一来用户仅需针对既有内容做细小的调整便可。这般非常细微的差值就彰显出了两种操作具备着本质迥异之别呀。
public function edit($id) {
$category = $this->category_model->getCategoryById($id);
if (!$category) {
$this->session->set_flashdata('error', '新闻分类不存在');
redirect('category/index');
}
$data['info'] = $category;
$this->load->view('category/edit', $data);
}
public function doEdit() {
$id = $this->input->post('id');
$name = $this->input->post('name');
if (empty($id) || empty($name)) {
$this->session->set_flashdata('error', '必填项不能为空');
redirect('category/edit/' . $id);
}
$category = $this->category_model->getCategoryById($id);
if (!$category) {
$this->session->set_flashdata('error', '新闻分类不存在');
redirect('category/index');
}
$data = [
'id' => $id,
'name' => $name
];
$this->category_model->updateCategory($data);
redirect('category/index');
}
你于实际开发期间,还碰到过哪些有关分类管理的奇特问题呢?欢迎在评论区留下话语。我会挑选出典型问题,在下期内容里专门予以解答。要是你觉得这篇文章对你存有帮助,不妨点个赞,分享给更多正在学习PHP的友人。