CodeIgniter面包屑:同一最终页面不同路径的实现问题
嘿,我用过这个CodeIgniter面包屑库,刚好能解决你的问题!核心思路就是根据不同的访问路径/来源动态生成面包屑链,而不是把面包屑写死在页面里。下面给你几种可行的方案,都是基于你用的这个库来实现的:
方案1:通过路由参数区分路径(最推荐)
先给猫页面配置不同的路由规则,让不同的访问路径指向同一个控制器方法,然后通过URI片段判断要生成哪条面包屑链。
首先修改路由文件:
// application/config/routes.php $route['cute-animals/cat'] = 'animals/cat'; $route['cute-pets/cat'] = 'animals/cat'; $route['people/people-types/cat'] = 'animals/cat';
然后在animals控制器的cat方法里,根据当前URI的分段动态构建面包屑:
public function cat() { $this->load->library('breadcrumbs'); // 获取当前URI的所有分段 $segments = $this->uri->segment_array(); // 根据不同的分段组合生成对应面包屑 if ($segments[1] == 'cute-animals') { $this->breadcrumbs->push('首页', '/'); $this->breadcrumbs->push('可爱动物', site_url('cute-animals')); $this->breadcrumbs->push('猫', current_url()); } elseif ($segments[1] == 'cute-pets') { $this->breadcrumbs->push('首页', '/'); $this->breadcrumbs->push('可爱宠物', site_url('cute-pets')); $this->breadcrumbs->push('猫', current_url()); } elseif ($segments[1] == 'people') { $this->breadcrumbs->push('首页', '/'); $this->breadcrumbs->push('人物', site_url('people')); $this->breadcrumbs->push('人物类型', site_url('people/people-types')); $this->breadcrumbs->push('猫', current_url()); } // 把面包屑传递给视图渲染 $data['breadcrumbs'] = $this->breadcrumbs->show(); $this->load->view('cat_view', $data); }
这个方案最稳妥,因为路由已经明确了访问路径,通过URI分段就能准确判断用户是从哪个入口进来的。
方案2:通过URL查询参数传递路径标识
如果不想修改路由,可以在访问猫页面时带上一个标识参数,比如/cat?from=cute_animals,然后在控制器里根据这个参数生成对应面包屑。
控制器代码示例:
public function cat() { $this->load->library('breadcrumbs'); // 获取URL里的来源标识参数 $from = $this->input->get('from'); // 先添加首页 $this->breadcrumbs->push('首页', '/'); // 根据标识添加中间层级 switch($from) { case 'cute_animals': $this->breadcrumbs->push('可爱动物', site_url('cute-animals')); break; case 'cute_pets': $this->breadcrumbs->push('可爱宠物', site_url('cute-pets')); break; case 'people_types': $this->breadcrumbs->push('人物', site_url('people')); $this->breadcrumbs->push('人物类型', site_url('people/people-types')); break; default: // 没有标识时的默认面包屑,比如直接显示首页->猫 break; } // 添加当前页 $this->breadcrumbs->push('猫', current_url()); $data['breadcrumbs'] = $this->breadcrumbs->show(); $this->load->view('cat_view', $data); }
使用时,从不同页面跳转到猫页面的链接要带上参数,比如:
<!-- 从可爱动物页面跳转的链接 --> <a href="<?php echo site_url('cat?from=cute_animals'); ?>">查看猫</a>
方案3:通过来源页判断(应急可用,不太推荐)
如果不想改路由也不想加参数,可以尝试通过请求的来源页(HTTP_REFERER)来判断,但这个方法不太可靠——有些浏览器或隐私设置会屏蔽Referer头,导致获取不到。
示例代码:
public function cat() { $this->load->library('breadcrumbs'); $referer = $this->input->server('HTTP_REFERER'); $this->breadcrumbs->push('首页', '/'); // 根据来源页包含的关键词判断路径 if (strpos($referer, 'cute-animals') !== false) { $this->breadcrumbs->push('可爱动物', site_url('cute-animals')); } elseif (strpos($referer, 'cute-pets') !== false) { $this->breadcrumbs->push('可爱宠物', site_url('cute-pets')); } elseif (strpos($referer, 'people-types') !== false) { $this->breadcrumbs->push('人物', site_url('people')); $this->breadcrumbs->push('人物类型', site_url('people/people-types')); } $this->breadcrumbs->push('猫', current_url()); $data['breadcrumbs'] = $this->breadcrumbs->show(); $this->load->view('cat_view', $data); }
注:如果你的PHP版本是8+,可以用str_contains($referer, 'xxx')代替strpos,更直观。
小优化:把面包屑逻辑封装成Helper
如果多个页面都需要类似的动态面包屑,可以把生成逻辑封装成Helper,避免控制器代码臃肿:
// application/helpers/breadcrumbs_helper.php if (!function_exists('generate_cat_breadcrumbs')) { function generate_cat_breadcrumbs($from) { $CI =& get_instance(); $CI->load->library('breadcrumbs'); $CI->breadcrumbs->push('首页', '/'); switch($from) { case 'cute_animals': $CI->breadcrumbs->push('可爱动物', site_url('cute-animals')); break; case 'cute_pets': $CI->breadcrumbs->push('可爱宠物', site_url('cute-pets')); break; case 'people_types': $CI->breadcrumbs->push('人物', site_url('people')); $CI->breadcrumbs->push('人物类型', site_url('people/people-types')); break; } $CI->breadcrumbs->push('猫', current_url()); return $CI->breadcrumbs->show(); } }
然后在控制器里直接调用:
public function cat() { $this->load->helper('breadcrumbs'); $from = $this->uri->segment(1); // 或者获取get参数 $data['breadcrumbs'] = generate_cat_breadcrumbs($from); $this->load->view('cat_view', $data); }
内容的提问来源于stack exchange,提问作者Toy shiro
相关产品推荐
相关产品推荐

