[Решено(через шаблон)]Передать значение в переменную views

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

Аватар пользователя foreach foreach 30 октября 2013 в 4:45

Добрый день

Ранее уже спрашивал.

Спрошу еще раз.

Во views есть функция template_preprocess_views_view_grid, находится она в theme.inc

Если добавить часть кода которая закомментирована, то все работает как задумывалось.
Этот вариант лишь для проверки работоспособности.

Данные которые нужны, получаю из модуля commerce_price_savings_formatter

В итоге для каждого товара создается класс "цена снижена" или "без изменений".

function template_preprocess_views_view_grid(&$vars) {
  $view     = $vars['view'];
  $result   = $view->result;
  $options  = $view->style_plugin->options;
  $handler  = $view->style_plugin;
  $default_row_class = isset($options['default_row_class']) ? $options['default_row_class'] : TRUE;
  $row_class_special = isset($options['row_class_special']) ? $options['row_class_special'] : TRUE;

  $columns  = $options['columns'];

  $rows = array();
  $row_indexes = array();

  if ($options['alignment'] == 'horizontal') {
    $row = array();
    $col_count = 0;
    $row_count = 0;
    $count = 0;
    foreach ($vars['rows'] as $row_index => $item) {
      $count++;
      $row[] = $item;
      $row_indexes[$row_count][$col_count] = $row_index;
      $col_count++;
      if ($count % $columns == 0) {
        $rows[] = $row;
        $row = array();
        $col_count = 0;
        $row_count++;
      }
    }
    if ($row) {
      // Fill up the last line only if it's configured, but this is default.
      if (!empty($handler->options['fill_single_line']) && count($rows)) {
        for ($i = 0; $i < ($columns - $col_count); $i++) {
          $row[] = '';
        }
      }
      $rows[] = $row;
    }
  }
  else {
    $num_rows = floor(count($vars['rows']) / $columns);
    // The remainders are the 'odd' columns that are slightly longer.
    $remainders = count($vars['rows']) % $columns;
    $row = 0;
    $col = 0;
    foreach ($vars['rows'] as $count => $item) {
      $rows[$row][$col] = $item;
      $row_indexes[$row][$col] = $count;
      $row++;

      if (!$remainders && $row == $num_rows) {
        $row = 0;
        $col++;
      }
      elseif ($remainders && $row == $num_rows + 1) {
        $row = 0;
        $col++;
        $remainders--;
      }
    }
    for ($i = 0; $i < count($rows[0]); $i++) {
      // This should be string so that's okay Smile
      if (!isset($rows[count($rows) - 1][$i])) {
        $rows[count($rows) - 1][$i] = '';
      }
    }
  }

  // Apply the row classes
  foreach ($rows as $row_number => $row) {
    $row_classes = array();
    if ($default_row_class) {
      $row_classes[] =  'row-' . ($row_number + 1);
    }
    if ($row_class_special) {
      if ($row_number == 0) {
        $row_classes[] =  'row-first';
      }
      if (count($rows) == ($row_number + 1)) {
        $row_classes[] =  'row-last';
      }
    }
    $vars['row_classes'][$row_number] = implode(' ', $row_classes);
    foreach ($rows[$row_number] as $column_number => $item) {
      $column_classes = array();
      if ($default_row_class) {
        $column_classes[] = 'col-'. ($column_number + 1);
      }
      if ($row_class_special) {
        if ($column_number == 0) {
          $column_classes[] = 'col-first';
        }
        elseif (count($rows[$row_number]) == ($column_number + 1)) {
          $column_classes[] = 'col-last';
        }
      }
      if (isset($row_indexes[$row_number][$column_number]) && $column_class = $view->style_plugin->get_row_class($row_indexes[$row_number][$column_number])) {
        $column_classes[] = $column_class;
      }

//      foreach ($result as $key => $value) {
//        if ($key == $column_number) {
//          $column_classes[] = $result[$key]->field_commerce_price[0]['rendered']['#price_direction'];
//        }
//      }

      $vars['column_classes'][$row_number][$column_number] = implode(' ', $column_classes);
    }
  }
  $vars['rows'] = $rows;
  $vars['class'] = 'views-view-grid cols-' . $columns;

  // Add the summary to the list if set.
  if (!empty($handler->options['summary'])) {
    $vars['attributes_array'] = array('summary' => filter_xss_admin($handler->options['summary']));
  }

  // Add the caption to the list if set.
  if (!empty($handler->options['caption'])) {
    $vars['caption'] = filter_xss_admin($handler->options['caption']);
  }
  else {
    $vars['caption'] = '';
  }
}

Как вынести это в свою функцию ?

Не получается переопределить.

Комментарии

Аватар пользователя sg85 sg85 30 октября 2013 в 5:42

это обычная функция препроцессинга, можно переопределить в template.php Вашей темы, например, просто заменив template из названия функции на имя Вашей темы, работать будет в случае с отображением в виде grid(сетка) после очистки кеша, однако будет срабатывать для всех представлений с плагином grid без исключения, потому имеет смысл добавить немного логики, что бы Ваш код срабатывал только для определенного представления или представлений.

Кроме того, в Вашем случае можно обойтись без переопределения препроцесса шаблона, т.е. необходимую логику можно реализовать и в самом шаблоне, т.к. все данные, которые Вы дополнительно обрабатываете, попадают в него.

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

Спасибо за интерес )

Просто заменить имя не достаточно.

Я пробовал скопировать содержимое функции без комментариев в свою функцию.
имя-моей-темы-или-модуля_preprocess_views_view_grid

Но оказалось что вместо результатов получаю array.
Это происходило внутри первого td.
Причем значение передавалось и нужный класс у td был.

Разобраться не хватило опыта.

Но очевидно что копировать не правильно.

Что касается ваших пояснений, я в курсе что нужно задать дополнительно условие проверки.

Идея с шаблоном уже рассматривалась.
Сейчас постараюсь достать сохраненные результаты.
Это было первое место которое заметил при поиске.

Аватар пользователя foreach foreach 30 октября 2013 в 11:23

sg85

Все получилось.

Спасибо что дали направление мысли Smile

Как-то не очень очевидно вышло, хоть и рассматривал данный вариант в первую очередь.

Думал правильнее делать это до передачи в шаблон.

Тут xandeadx писал другой способ, но я так и не понял, хотя просидел с ним несколько часов.

Видел аналогичные примеры, не много конечно.

Там можно изменить порядок выполнения функций или я не правильно понял мысль ?

Да и кстати, само решение через шаблон:

<?php

/**
 * @file
 * Default simple view template to display a rows in a grid.
 *
 * - $rows contains a nested array of rows. Each row contains an array of
 *   columns.
 *
 * @ingroup views_templates
 */

?>
<?php if (!empty($title)) : ?>
  <h3><?php print $title; ?></h3>
<?php endif; ?>
<table class="<?php print $class; ?>"<?php print $attributes; ?>>
  <?php if (!empty($caption)) : ?>
    <caption><?php print $caption; ?></caption>
  <?php endif; ?>

  <tbody>

  <?php foreach ($rows as $row_number => $columns): ?>

    <tr <?php if ($row_classes[$row_number]) { print 'class="' . $row_classes[$row_number] . '"';  } ?>>
      <?php foreach ($columns as $column_number => $item): ?>
        <td <?php if ($column_classes[$row_number][$column_number]) { print 'class="' . $column_classes[$row_number][$column_number] . ' '; } ?><?php foreach ($view->result as $key => $value): ?><?php ($key == $column_number) ? print $view->result[$key]->field_commerce_price[0]['rendered']['#price_direction'] . '"' : ''; ?><?php  endforeach; ?>>
          <?php print $item; ?>
        </td>
      <?php  endforeach; ?>
    </tr>
  <?php endforeach; ?>
  </tbody>
</table>

Аватар пользователя sg85 sg85 30 октября 2013 в 12:49

решение андеда для Вашего случая избыточно, нет смысла писать плагин ради 1-2х представлений. А ситуация с препроцессингом обычно используется если надо повлиять на все шаблоны сразу(верно не только для views).

"foreach" wrote:
Там можно изменить порядок выполнения функций или я не правильно понял мысль ?

вот про это не понял

ах да, что-то я затупил, hook_preproccess_HOOK это обычный хук, т.е. он не переопределяется, а вызывается дополнительно, т.е. достаточно обработать уже подготовленные в template_preproccess_* данные.