/** * @param string $label * @param \Cake\View\Helper\HtmlHelper $htmlHelper * * In order to make a trail of breadcrumbs we must: * 1. Emit any number of trail elements, in a view, using $htmlHelper->addCrumb(). * 2. Emit the beginning of the trail in a layout, using $thmlHelper->getCrumbs(). * 3. addCrumbs and getCrumbs provide the necessary information so that when the time * comes to actually render the trail, the Cake software can do this. * * The problem with this plan is that some views can be reached via more than one path. * How can the view know which path led to it? The basic answer is to save a path * in the session, with each step towards a particular view, and use that path to * generate the trail using a suitable number of invocations of addCrumb. Each view's * url is added to the session trail, as well as a suitable label to be used in the trail. */ public function makeTrail($label, $htmlHelper) { // 1. Read the present trail or init if none. $sessionVar = 'breadcrumbs'; //$this->request->session()->delete($sessionVar); $sessionCrumbs = $this->request->session()->read($sessionVar); if (is_null($sessionCrumbs)) { $sessionCrumbs = []; } // 2. Get the present url and parse into a parameter array $requestUrl = $this->request->url; $requestUrlParams = \Cake\Routing\Router::parse($requestUrl); // 3. Build a new trail array by looking for the existing // url in the existing trail array. This effectively removes // any elements of the existing trail array, that are after the // present url. $newArray = []; foreach ($sessionCrumbs as $key => $crumb) { if ($key == $requestUrl) { break; } else { $newArray[$key] = $crumb; } } // 3.1 Whether this is new or the last item matched, add it here $newArray[$requestUrl] = ['label' => $label, 'params' => $requestUrlParams]; // 4. Save the trail to the session $this->request->session()->write($sessionVar, $newArray); // 5. Now add the crumbs the ordinary way foreach ($newArray as $key => $crumb) { if ($key == $requestUrl) { break; } // no crumb for this url $htmlHelper->addCrumb($crumb['label'], $crumb['params']); } }