Недавно я потратил кучу времени, чтобы оптимизировать вывод хлебных крошек (breadcrumbs) в одном приложении. Как всегда неожиданно для себя обнаружил что в CakePHP всё уже давно придумано.
Использование хелпера html не часто встречается в русскоязычных блогах. Вместо этого используют разные велосипеды. Они, несомненно хороши, однако я всё-таки склоняюсь к оригинального метода.
Что есть? Есть древовидная структура категорий реализованная при помощи поведения Tree. Если вы не в курсе – очень советую, хорошая штука в которой реализована куча разных методов для управления древовидными структурами.
Для начала получим путь к текущему элементу:
$bread = $this->Category->getpath($parent); $this->set('bread',$bread); |
В данном примере, $parent – элемент от которого мы ищем путь “домой” и передаём найденные элементы в вид.
<?php foreach($bread as $b) { $html->addCrumb(trim($b['Category']['name']),"/URL/".$b['Category']['id']); } ?> <div class='bread'> <?php echo $html->getCrumbs("»");?> </div> |
В данном примере мы сначала проходим по массиву “крошек” и записываем их во внутренний буфер хелпера ($html->addCrumb). Параметры функции такие же как и $html->link: сначала идёт текст, затем ссылка. Как всегда, можно вместо текста написать что угодно: картинку,объект, скрипт и т.д.
После этого содержимое буфера выводится в страницу echo $html->getCrumbs(” ? “). Единственный параметр этого метода – разделитель между “крошками”.
Далее вы можете выводить “крошки” в любом месте страницы, не заполняя буфер снова.
Единственная проблема – отсутствие механизма отчистки буфера. Тут вот пишут как с этим справиться. Вставим этот метод
function clearCrumbs(){ $this->_crumbs = array(); } |
в /cake/lib/view/helpers/html.php к примеру перед этой строчкой
/*** Adds a link to the breadcrumbs array.
И в том месте, где хотите очистить буфер используйте $html->clearCrumbs();


Классная идея – получать путь для хлебных крошек в моделях. Респект.
Спасибо, мне тоже кажется это более идеалогически правильно :) С Наступающим Вас :)
addCrumb($b['Category']['name'],"/URL/".$b['Category']['id']);
}
$html->addCrumb($productName,"");
?>
getCrumbs(" → ");?>
Этот код мне вообще не понятен где он расположен и где его оставщаяся часть????
Прошу прощения, ког порезался. Исправил, смотрите в тексте.
Распологаеться он там, где вы хотите вывести крошки. Я, к примеру, использую в начале вида просмотра продукта (оттого в примере используются категории).