Как поставить breadcrumbs в интернет-магазине с тысячей товаров? Понятно же, что каждый товар в меню не будешь прописывать, иначе меню раздуется. cck поля в breadcrumbs можно прописывать? Но уровень вложенности всегда разный...
hansel breadcrumbs позволяет почти любую логику формирования крошек задать.
Как главный апологет модуля Hansel должен заметить: этот модуль на хер не нужен чтобы понять, как в нём накликать более-менее сложную логику, нужно понимать, так сказать, азы программирования. Это значит, что юзер, способный пользоваться Гансиком, в принципе способен реализовать то же самое кодом. А код кастомных хлебных крошек в Друпале настолько прост, что время его написания сравнимо с временем настройки Гансика. Лично проверял не раз
Вместо is_numeric() лучше для id пользоваться ctype_digit().
arg возвращает строку правильно ?
$id = arg(1); // "43" - правильно?
ctype_digit($id); // TRUE
is_numeric($id); // TRUE
и даже если в $id окажется не string "43" а integer 43 ,то
ctype_digit($id); // FALSE
is_numeric($id); // TRUE
так что же лучше?
Действительно.
is_numeric("4.3"); //TRUE;
is_numeric("1.234E56"); //TRUE;
is_numeric ("0xff"); //TRUE
А если в $id был бы каким-то образом integer, его проверять не нужно было бы.
Вроде сто лет уже как на орге это обсуждалось и в доках рекомендация юзать ctype_digit() висит. Удивляешь меня
Вроде сто лет уже как на орге это обсуждалось и в доках рекомендация юзать ctype_digit() висит.
да видел я все это , но в жизни никогда не сталкивался с проблемами использывания is_numeric
а вот если какой-нибудь любитель приведения типов (а таких я в жизни встречал) приведет $id к integer то его проверка не сработает
$id = (int)arg(1); if(ctype_digit($id))// условие не выполняется
а вот если какой-нибудь любитель приведения типов (а таких я в жизни встречал) приведет $id к integer то его проверка не сработает
$id = (int)arg(1); if(ctype_digit($id))// условие не выполняется
А если ты заменишь ctype_digit на is_numeric, то - сюрприз - всегда будет возвращаться TRUE
Потому что строки без чисел в начале вычисляются как 0, а строки с числами в начале - как эти числа. Напимер, "12 злобных обезьян" при касте в инт возвратит 12.
Кроме того, это же ты пишешь код проверки arg(), то есть это полность up to you, приводить его к инту предварительно, или нет
Комментарии
https://drupal.org/project/custom_breadcrumbs и подобные модули
если структура каталога сделана с помощью taxonomy то модуль taxonomy_breadcrumb, он выведет хлебные крошки на всех терминах и товарах
[module=path_breadcrumbs] есть, спасибо Spleshka.
читать: http://drupalace.ru/reshenie-problem-s-hlebnymi-kroshkami-v-drupal-7-raz...
умоляю, включайте мозг перед публикациями)
А какая связь между меню и хлебными крошками? А если предложенные модули не подойдут-можно самому код написать под самую закрученную таксономию и cck.
Можно.
hansel breadcrumbs позволяет почти любую логику формирования крошек задать.
Как главный апологет модуля Hansel должен заметить: этот модуль на хер не нужен чтобы понять, как в нём накликать более-менее сложную логику, нужно понимать, так сказать, азы программирования. Это значит, что юзер, способный пользоваться Гансиком, в принципе способен реализовать то же самое кодом. А код кастомных хлебных крошек в Друпале настолько прост, что время его написания сравнимо с временем настройки Гансика. Лично проверял не раз
Приходите на Drupal Meetup, если вы из Питера. Буду рассказывать КАК
Во-первых, используйте taxonomy breadcrumb
во-вторых вставьте в шаблон template.php
<?php/****** breadcrumb *******/
function NameOfTheme_breadcrumb($variables) {
$breadcrumb = $variables['breadcrumb'];
if (arg(0) == 'node') {
if (is_numeric(arg(1))) {
$node = node_load(arg(1));
/* if ($node->type == 'product') {
$terms = taxonomy_get_parents_all($node->field_referances_tax['und'][0]['tid']);
$terms = array_reverse($terms);
foreach ($terms as $term) {
$breadcrumb[] = '<a href="/'. drupal_get_path_alias('taxonomy/term/'. $term->tid) .'">'. $term->name .'</a>';
}
} */
if (!drupal_is_front_page()) {
$breadcrumb[] = $node->title;
}
}
}
if (arg(0) == 'taxonomy') {
if (is_numeric(arg(2))) {
$term = taxonomy_term_load(arg(2));
$breadcrumb[] = $term->name;
}
}
$output = implode('<i> » </i>', $breadcrumb);
return $output;
}?>
Где NameOfTheme - название вашей темы.
Я использую этот подход на всех сайтах, будь там хоть 1000 страниц, материалов, хоть 10000. Везде работает.
Вместо is_numeric() лучше для id пользоваться ctype_digit().
arg возвращает строку правильно ?
$id = arg(1); // "43" - правильно?
ctype_digit($id); // TRUE
is_numeric($id); // TRUE
и даже если в $id окажется не string "43" а integer 43 ,то
ctype_digit($id); // FALSE
is_numeric($id); // TRUE
так что же лучше?
Действительно.
is_numeric("4.3"); //TRUE;
is_numeric("1.234E56"); //TRUE;
is_numeric ("0xff"); //TRUE
А если в $id был бы каким-то образом integer, его проверять не нужно было бы.
Вроде сто лет уже как на орге это обсуждалось и в доках рекомендация юзать ctype_digit() висит. Удивляешь меня
да видел я все это , но в жизни никогда не сталкивался с проблемами использывания is_numeric
а вот если какой-нибудь любитель приведения типов (а таких я в жизни встречал) приведет $id к integer то его проверка не сработает
if (ctype_digit($id)) // условие не выполняется
А если ты заменишь ctype_digit на is_numeric, то - сюрприз - всегда будет возвращаться TRUE
Потому что строки без чисел в начале вычисляются как 0, а строки с числами в начале - как эти числа. Напимер, "12 злобных обезьян" при касте в инт возвратит 12.
Кроме того, это же ты пишешь код проверки arg(), то есть это полность up to you, приводить его к инту предварительно, или нет
Когда же custom breadcrumbs выйдет из альфы, а taxonomy breadcrumbs из дэва..
ну так пхп он такой:)так то и /node/12злобныхобезьян откроет node/12
в д8 есть валидация аргументов в роутинге
user.routing.yml
user.view:
path: '/user/{user}'
defaults:
_entity_view: 'user.full'
_title_callback: 'Drupal\user\Controller\UserController::userTitle'
requirements:
user: \d+
_entity_access: 'user.view'
/node/12злобныхобезьян отдаст 404
Да я про то, что если кастовать id в int, то нет смысла вообще нумерик проверять, это просто код неверный. А если не кастовать, то - ctype_digit
А если надо ноду загрузить, то можно вообще не проверять ничего, делать menu_get_object() и все дела.