Хлебные крошки на больших сайтах. Как?

Главные вкладки

Аватар пользователя digital_sword digital_sword 9 октября 2013 в 7:13

Как поставить breadcrumbs в интернет-магазине с тысячей товаров? Понятно же, что каждый товар в меню не будешь прописывать, иначе меню раздуется. cck поля в breadcrumbs можно прописывать? Но уровень вложенности всегда разный...

Комментарии

Аватар пользователя multpix multpix 9 октября 2013 в 9:51

[module=path_breadcrumbs] есть, спасибо Spleshka.
читать: http://drupalace.ru/reshenie-problem-s-hlebnymi-kroshkami-v-drupal-7-raz...

"digital_sword" wrote:
Понятно же, что каждый товар в меню не будешь прописывать, иначе меню раздуется

умоляю, включайте мозг перед публикациями)

Аватар пользователя Chyvakoff Chyvakoff 9 октября 2013 в 10:01

А какая связь между меню и хлебными крошками? А если предложенные модули не подойдут-можно самому код написать под самую закрученную таксономию и cck.

Аватар пользователя sergeybelya sergeybelya 9 октября 2013 в 10:01

Chyvakoff wrote:
А какая связь между меню и хлебными крошками? А если предложенные модули не подойдут-можно самому код написать под самую закрученную таксономию и cck.

Можно.

Аватар пользователя graker graker 9 октября 2013 в 17:28

Advin wrote:
hansel breadcrumbs позволяет почти любую логику формирования крошек задать.

Как главный апологет модуля Hansel должен заметить: этот модуль на хер не нужен Smile чтобы понять, как в нём накликать более-менее сложную логику, нужно понимать, так сказать, азы программирования. Это значит, что юзер, способный пользоваться Гансиком, в принципе способен реализовать то же самое кодом. А код кастомных хлебных крошек в Друпале настолько прост, что время его написания сравнимо с временем настройки Гансика. Лично проверял не раз Smile

Аватар пользователя scrobot scrobot 9 октября 2013 в 23:21

Во-первых, используйте 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. Везде работает.

Аватар пользователя drupby drupby 10 октября 2013 в 5:43

"graker" wrote:
Вместо 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
так что же лучше?

Аватар пользователя graker graker 10 октября 2013 в 8:18

Действительно.
is_numeric("4.3"); //TRUE;
is_numeric("1.234E56"); //TRUE;
is_numeric ("0xff"); //TRUE
А если в $id был бы каким-то образом integer, его проверять не нужно было бы.

Вроде сто лет уже как на орге это обсуждалось и в доках рекомендация юзать ctype_digit() висит. Удивляешь меня Smile

Аватар пользователя drupby drupby 10 октября 2013 в 8:53

"graker" wrote:
Вроде сто лет уже как на орге это обсуждалось и в доках рекомендация юзать ctype_digit() висит.

да видел я все это , но в жизни никогда не сталкивался с проблемами использывания is_numeric
а вот если какой-нибудь любитель приведения типов (а таких я в жизни встречал) приведет $id к integer то его проверка не сработает

$id = (int)arg(1);
if (ctype_digit($id)) // условие не выполняется
Аватар пользователя graker graker 10 октября 2013 в 12:20

drupby wrote:
а вот если какой-нибудь любитель приведения типов (а таких я в жизни встречал) приведет $id к integer то его проверка не сработает

$id = (int)arg(1);
if (ctype_digit($id)) // условие не выполняется


А если ты заменишь ctype_digit на is_numeric, то - сюрприз - всегда будет возвращаться TRUE Smile
Потому что строки без чисел в начале вычисляются как 0, а строки с числами в начале - как эти числа. Напимер, "12 злобных обезьян" при касте в инт возвратит 12.

Кроме того, это же ты пишешь код проверки arg(), то есть это полность up to you, приводить его к инту предварительно, или нет Wink

Аватар пользователя drupby drupby 10 октября 2013 в 13:25

"graker" wrote:
Потому что строки без чисел в начале вычисляются как 0, а строки с числами в начале - как эти числа.

ну так пхп он такой:)так то и /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

Аватар пользователя graker graker 10 октября 2013 в 14:44

drupby][quote="graker" wrote:
ну так пхп он такой:)так то и /node/12злобныхобезьян откроет node/12

Да я про то, что если кастовать id в int, то нет смысла вообще нумерик проверять, это просто код неверный. А если не кастовать, то - ctype_digit Smile

А если надо ноду загрузить, то можно вообще не проверять ничего, делать menu_get_object() и все дела.