[РЕШЕНО] Как изменить класс у тега ul в $tabs

Аватар пользователя Celsoft Celsoft 21 июня 2012 в 16:48

Как изменить класс у тега ul в $tabs.
Вывожу табы так: <?php print render($tabs); ?>
Выводится так: <ul class="tabs primary">...</ul>

Как удалить старые классы у тега ul и присвоить свой класс?

Комментарии

Аватар пользователя Shok211 Shok211 21 июня 2012 в 22:26


<?php
   preg_replace
('/class.*=[\',\"]?(.*+)[\',\"]?/'$class$ul);
?>

Регулярка, ищет класс в переданной строке.
Без кеша лучше не использовать.
Ещё вариант переопределить функцию, кто нибудь ниже напишет.

Аватар пользователя Orion76 Orion76 22 июня 2012 в 23:22

Дык в $tabs должно быть что-то типа $tabs['#attributes']['class]==array('tabs primary','еще-класс','и т.д.')..
Может быть на уровнях пониже..
Меняйте и рендерьте...

Аватар пользователя ser_house ser_house 23 июня 2012 в 4:07

"orion76" wrote:
Дык в $tabs должно быть что-то типа $tabs['#attributes']['class]==array('tabs primary','еще-класс','и т.д.')..

Вот интересно, если эти классы добавляет ТС, стал бы он сюда писать?

render вызывает drupal_render, та, естественно, theme, ну и дальше очевидно, куды это всё ведёт.

Ё-моё, люди, неужели так трудно посмотреть код?

Аватар пользователя Orion76 Orion76 23 июня 2012 в 12:50

"ser_house" wrote:
Вот интересно, если эти классы добавляет ТС, стал бы он сюда писать?

Не соображу.. Вы о чем?

Аватар пользователя ser_house ser_house 23 июня 2012 в 16:16

Я о том, что Ваши слова о $tabs в контексте вопроса

"Celsoft" wrote:
Как удалить старые классы у тега ul и присвоить свой класс?
звучат так, будто ТС сам формирует атрибуты. В этом случае задавать вопрос не имеет смысла, не так ли?

Или мне показалось, и Вы просто дали буквальный совет, который, Вы уж простите, не несет никакой полезной информации как для ТС, так и для возможных читателей?

ЗЫ Ничего личного )

Аватар пользователя Orion76 Orion76 24 июня 2012 в 10:09

"ser_house" wrote:
звучат так, будто ТС сам формирует атрибуты.

Наверное я немного не понят..
Дело в том, что в семерке рендеринг html из спец.массива, содержащего параметры элемента страницы, обычно производиться в шаблоне(как вы сами заметили - render(что-то))...
т.е. все параметры элемента в шаблоне еще доступны для редактирования,
но правильнее, конечно, их редактировать в хуке preprocess шаблона..

Я просто предложил найти нужный элемент, и изменить его параметр ['#attributes']['class']..

Я не спорю... ваш вариант тоже имеет право на жизнь... а какой выбрать.. пусть решает ТС или
тот,кто найдет в этом топике решение своей проблемы...

Аватар пользователя ser_house ser_house 24 июня 2012 в 13:29

"orion76" wrote:
Дело в том, что в семерке рендеринг html из спец.массива, содержащего параметры элемента страницы

Согласен с Вами. Однако классы, как видно на этом примере, не всегда присваиваются через #attributes, ибо это происходит, как Вы правильно заметили
"orion76" wrote:
обычно
В данном (и многих других) случае классы присваиваются непосредственно в функции темизации. Более того, поскольку это так, никакие препроцессы не помогут. В самом деле, каким образом template_preprocess поможет изменить классы у вот такого вот ul:

function theme_menu_local_tasks(&$variables) {
  $output = '';

  if (!empty($variables['primary'])) {
    $variables['primary']['#prefix'] = '<h2 class="element-invisible">' . t('Primary tabs') . '</h2>';
    $variables['primary']['#prefix'] .= '<ul class="tabs primary">';
    $variables['primary']['#suffix'] = '</ul>';
    $output .= drupal_render($variables['primary']);
  }
  if (!empty($variables['secondary'])) {
    $variables['secondary']['#prefix'] = '<h2 class="element-invisible">' . t('Secondary tabs') . '</h2>';
    $variables['secondary']['#prefix'] .= '<ul class="tabs secondary">';
    $variables['secondary']['#suffix'] = '</ul>';
    $output .= drupal_render($variables['secondary']);
  }

  return $output;
}

?
Препроцесс помог бы изменить содержимое $variables (в частности — $variables['primary']), но оно (содержимое) всё равно в итоге будет окружено '<ul class="tabs primary">', не так ли?
Таким образом

"orion76" wrote:
ваш вариант тоже имеет право на жизнь...
неверно (хотя, спасибо, конечно), покольку это (я сожалею) — единственный вариант.

Wink

Аватар пользователя Orion76 Orion76 24 июня 2012 в 15:58

Согласен, в данном случае правка параметров в препроцессе не поможет...

"ser_house" wrote:
единственный вариант.

а как же параметр '#pre_render' ? -))
"обрабатывается" в drupal_render ...

ладно... 1:1 - ничья-))

Аватар пользователя ser_house ser_house 24 июня 2012 в 16:22

"orion76" wrote:
а как же параметр '#pre_render' ? -))

То есть делаем:

function template_preprocess_menu_local_tasks(&$variables) {
  //бла-бла-бла
  if (!isset($variables['primary']['#pre_render'])) {
    $variables['primary']['#pre_render'] = array();
  }

  array_unshift($variables['primary']['#pre_render'], 'del_facking_css');
  //бла-бла-бла
}

function del_facking_css($element) {
  $element['#prefix'] = '<h2 class="element-invisible">' . t('Primary tabs') . '</h2>';
  $element['#prefix'] .= '<ul class="best-tabs-class">';
  return $element;
}

Хм. Если я правильно воспроизвел ЭТО, то да, с единственным я, пожалуй, погорячился. Деваться некуда — согласен на

"orion76" wrote:
1:1 - ничья-))

P.S.:
Всё-таки мне кажется, что этот вариант (безусловно, имеющий право на жизнь) чересчур, учитывая простоту изменения theme (не удержался... ;))

Аватар пользователя Orion76 Orion76 24 июня 2012 в 17:47

Дык мыж не извлекаем из него значение, а присваиваем... Значит станет isset...

Аватар пользователя ser_house ser_house 24 июня 2012 в 19:17

OK, с «единственным» я был не прав, но кто для данного случая выберет #pre_render? У Оккама, наверно, от гроба одни щепки остались...

"Celsoft" wrote:
В плане производительности.

"orion76" wrote:
Разница nano-мала -))

Э-э-э нет Wink Писать лишнюю функцию (да с нуля) с повышенным риском ошибиться (а значит — дополнительные исследования) производительность снижает. Небольшое изменение уже готового кода производительность повышает.

Естественно, имеется в виду реальная производительность, т.е. производительность труда. Остальная производительность — от inza лешего.

Аватар пользователя ser_house ser_house 24 июня 2012 в 23:45

Ну ё-моё, orion76, ДВЕ функции, рискуем ошибиться в названии функций, названии аргумента, логике ))

Против этого: скопировать функцию, изменить название (можно ошибиться) и просто исправить уже готовый код. Могу поспорить, что операции копипаста выполняются быстрее, чем написание дополнительного кода Wink

И опять же, начальный уровень знаний (либо отсутствие таковых), что, кстати, характерно для большинства вопрошающих здесь однозначно склоняет к более простому варианту (помнится, простота чья-та там родственница))

Во-о-о-т... 2:1, не?)

Аватар пользователя nikola2 nikola2 19 октября 2012 в 13:56

ser_house везет же Вам. А мне чего то orion76 не помогает. Не знаю по какой причине. Мы проплатили ему деньги месяц назад. А скрипт, который он сделал не работает. И он больше не подходит не на письма, не на мобильник. Мы готов даже добавить скинуться на пиво, можно, бельгийское но хочется что бы orion76 выполнил обязательство или хотя бы уделил нам внимание тоже. Хотя бы скоментировал бы код. Готовы дать заплатить за посредничество. Простите за офтоп