РЕШЕНО! убрать строки в табличной вьюхе если поле не имеет значение

28 мая 2012 в 10:57
Аватар пользователя iNFerNo iNFerNo 0 65

Как убрать строку (поле и его значение) из табличной вьюхи если значение поля не имеет никакого значение (или имеет не требуемое значение).

Комментарии

Я делал это в views-view-table.tpl.php.

Просто в php сначала обрабатываешь массив $rows, а потом стандартный код темизации.

ПС: На сколько мне известно, более простого решения нет (

28 мая 2012 в 11:07

Да, кстати я об этом не подумал ))

Я скрывал наоборот столбцы, а с помощью фильтра действительно скрывается стока.

28 мая 2012 в 11:19

это как так можно сделать фильтр на значение? что бы потом поле (заголовок поля) и это значение не выводилось во вьюхе...

28 мая 2012 в 11:23

хмм, фильтр по полю ноды: если значение больше 0, например.
То к этой ноде вообще вьюха не будет обращаться соответственно и выводить в таблице ее не будет.

28 мая 2012 в 11:25

В разделе фильтров кнопка "+", выбрать поле, указать значение, для всех полей кроме таксономии можно указать кустомное значение, по крайней мере так в 7рке.

28 мая 2012 в 11:27

"divined" wrote:

хмм, фильтр по полю ноды: если значение больше 0, например.
То к этой ноде вообще вьюха не будет обращаться соответственно и выводить в таблице ее не будет.


да

28 мая 2012 в 11:27

убрать то нужно 1 строку с этим полем из всей вьюхи остальное оставить...

варианта с шаблонами и 2 вьюхами больше нет?

например в пхп чонить прописать... в аргументе вьюхи по nid НОДЫ, ТАм проверка по пхп есть... в разделе если аргумент не верен то...

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

---

хотя это то же все не то...

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

28 мая 2012 в 11:32

"divined" wrote:

А зачем 2 вьюхи? Что вас не устраивает сделать 2 вида в 1 вьюхе?

ну я это и имею виду. что два вида.

28 мая 2012 в 11:32

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

28 мая 2012 в 11:44

Я имею ноду с полями. Хочу собрать кастомную ноду и все поля вывести в табличке. При этом если значения у поля нет или значение имеет не требуемое значение поля, то вывод этого поля исключить из вида вьюхи. ну или скрыть... пока что получаться значение скрывать, а нужно всю строку или столбец...

видимо это через темизацию вьюхи надо условие прописывать и исключать из вывода поле...

вот хотелось бы понять как это сделать...

а то иногда приходиться по 10 видов делать для каждой роли свой вид (но мне кажеться можно в темизации задать условия и обойтись одним видом... )

28 мая 2012 в 11:48

"divined" wrote:
Вам же подсказали поставить фильтр, это нечто типа аргумента только значение вбиваете вы а вставляется в адрес. Попробуйте, и не надо как вы говорите несколько вьюх, хотя как я уже говорил, вы хотя бы скажите что хотите получить.

это вся вьюха уйдет... мне кажется.

28 мая 2012 в 11:49

Вы с помощью вьюхи хотите темизировать 1 ноду????

У вас отвращение к tpl файлам или несварение когда их используете? Они ведь специально для этого предназначены.

Если вы будете вьюхи использовать не по назначению вы убьете свой сайт.

28 мая 2012 в 11:52

Вьюха предназначена только чтобы выводить определенный список полей отфильтрованного набора содержимого.

Вся красота и тип отображения делается в tpl файлах.

Настройка вывода ноды делается в tpl файлах.
Все таблички и прочая чушь рисуются в tpl файлах.

28 мая 2012 в 11:54

через виевс как то проще... и быстрее разве нет?

конечно все это можно отрисовать в шаблоне типа материала.

вот ссылка http://agatawar.ru/catalog/link/4519.html

необходимо убрать строку - HD качество изображения со значение нет *

это чекбокс (нет/да) , когда нет - не хочется выводить это поле вообще...

28 мая 2012 в 11:59

Нет, нет и нет так делать нельзя.

Это абсурдно темизировать ноду через views. Скорость загрузки вашей страницы более 10сек, это вам ни о чем не говорит?

28 мая 2012 в 12:03

я то все понимаю что грузят. но хочется разобраться и уметь это делать.
такая скорость загрузки и у нод где нет приатаченых вьюх.

28 мая 2012 в 12:06

"divined" wrote:
Скорость загрузки вашей страницы более 10сек, это вам ни о чем не говорит?

у меня ксти 2,8 сек грузиться нода.

28 мая 2012 в 12:08

2,8 это после кэширования.

Удалите кэш в друпале, удалите кэш в браузере и попробуйте снова =).

Скорость загрузки:
108.2 KB (0 KB из кеша) 11.19s (onload: 9.9s)

28 мая 2012 в 12:26

когда через вьюху она сразу все строки красит (зеброй).

а если я буду ручками в шаблоне. откуда я узнаю какая строка должна быть... цвета зебры........

28 мая 2012 в 13:14

откройте шаблон views-view-table.tpl.php

там все написано и как раскрасить и как вообще вывести таблицей массив.

А вообще зебра дело тривиальное:

1. делаем цикл по всем строкам
2. проверяем строка четная или нет
- четная выводим <tr class="even">
- нечетная выводим <tr class="odd">
3. цикл по всем полям
4. выводим <td></td>
5. завершаем цикл по полям
6. выводим </tr>
7. завершаем цикл по строкам

Здесь вам и зебра и принцип темизации данных в таблицу.

28 мая 2012 в 13:23

так я в ноде тупо хтмл таблицы нарисовал и туда поля от ноды... поэтому пост выше наверное не подойдет. нужно таблицу в ноде как то по другому выводить...

28 мая 2012 в 13:26

"iNFerNo" wrote:
когда через вьюху она сразу все строки красит (зеброй).

а если я буду ручками в шаблоне. откуда я узнаю какая строка должна быть... цвета зебры........


у друпала есть переменная $zebra для этих целей

28 мая 2012 в 13:29

вы неправы
не у друпала, а у полей есть такая переменная, причем эта переменная доступна не во всех щаблонах.

Если вы вручную нарисовали тем проще, добавьте тэгам tr попеременно классы odd и even.
Это и есть классы зебры.

28 мая 2012 в 13:44

"divined" wrote:

вы неправы
не у друпала, а у полей есть такая переменная, причем эта переменная доступна не во всех щаблонах.

Если вы вручную нарисовали тем проще, добавьте тэгам tr попеременно классы odd и even.
Это и есть классы зебры.


простите мою безграмотность, коллега, работать с друпалом начал полгода назад, использую API около месяца.

28 мая 2012 в 13:47

так я еще раз повторюсь что. некоторые поля могут быть а могут не быть в этой таблице... поэтому могут быть случаи

типа

odd
even
odd
odd
even

28 мая 2012 в 13:48

"iNFerNo" wrote:
так я еще раз повторюсь что. некоторые поля могут быть а могут не быть в это таблице... поэтому могут быть случай

типа

odd
even
odd
odd
even


если вручную выводить классы, то такой ситуации возникнуть не может.

28 мая 2012 в 13:50

вы не правы. вот хтмлка таблицы с вручную заведенными классами

  <table>
<tbody>
<tr class="even">
<th> Категория </th>
<td> <?php      print  $node->field_type_arch[0]['value'];      ?>      </td>
</tr>
<tr class="odd">
<th> URL для закачки </th>
<td>
<?php print $node->field_download_link[0]['view'] . ' (' . $node->field_name_of_file_hosting[0]['value'] . ')'; ?>
</td>
</tr>
<tr class="even">
<th> Размер файла </th>
<td> <?php      print  $node->field_size_of_the_file[0]['value'];       ?>  Мб </td>
</tr>

<?php if ($node->field_capabilities_vip[0]['value']): ?>
<tr class="odd">
<th> Качество изображения </th>
<td> <?php      

print  t('HD');         ?>  </td>
</tr>
<?php endif; ?>  

<?php if ($node->field_advises_project[0]['value']): ?>

<tr class="even">
<th> Оценка записи </th>
<td> <?php      print  $node->field_advises_project[0]['view'];         ?>  </td>
</tr>
    <?php endif; ?>  

</tbody>
</table>

если все поля присутствуют то все ок. если какого то поля нет то получается дырка в зебре и повторы классов...

28 мая 2012 в 13:56

тупо в лоб прописать все случаи со своими зебро разметками... но это не айс. мало ли что еще накручу потом. хочеться чтобы таблица сама строилась и зебра сама раставлялась...

28 мая 2012 в 13:55

а вообще мне как то сюда нужно свои поля засунуть

<?php
  // Flip the table.
  $row = array();
  foreach ($rows as $col){
    foreach ($col as $ltr => $value){
      $row[$ltr][] = $value;
    }
  }
  $first = isset($row['title']);
  $element = 'odd';
?>
<table class="<?php print $classes; ?>">
  <?php if (!empty($title)) : ?>
    <caption><?php print $title; ?></caption>
  <?php endif; ?>

  <?php if ($first) : ?>
  <thead>
    <tr class="<?php print $element; ?>">
      <th>
      </th>
      <?php foreach ($row['title'] as $title) : ?>
      <th>
      <?php print $title; ?>
      </th>
      <?php endforeach; ?>
    </tr>
  </thead>
  <?php  
    $first = FALSE;
    endif; //$first
    $element = 'even';
  ?>
  <tbody>
    <?php foreach ($row as $field => $rowname) : ?>
      <?php if ($field != 'title') : ?>
      <tr class="<?php print $element; ?>">
        <th>
          <?php print $header[$field]; ?>
        </th>
      <?php foreach ($rowname as $count => $item): ?>
        <td>
          <?php print $item; ?>
        </td>
      <?php endforeach; ?>
      </tr>
      <?php
        if ($element == 'odd'){
          $element = 'even';
        } else {
          $element = 'odd';
        }
      ?>
      <?php endif; // field != title ?>
    <?php endforeach; ?>
  </tbody>
</table>

28 мая 2012 в 14:00

так есть код

<?php
 $custom_zebra 
true;
 <
table>
 ...
 if (...):
 <
tr>
...
print (
$custom_zebra) ? 'even':'odd';
$custom_zebra = !$custom_zebra;
</
tr>
endif;
...
?>
28 мая 2012 в 14:02
<?php  
$custom_zebra
=true;
<
table>
<
tbody>
<
tr <?php print ($custom_zebra)? 'even':'odd'$custom_zebra= !$custom_zebra?>>
<th> Категория </th>
<td> <?php     print  $node->field_type_arch[0]['value'];     ?>      </td>
</tr>
<tr <?php print ($custom_zebra)? 'even':'odd'$custom_zebra= !$custom_zebra?>>
<th> URL для закачки </th>
<td>
<?php print $node->field_download_link[0]['view'] . ' (' $node->field_name_of_file_hosting[0]['value'] . ')'?>
</td>
</tr>
<tr <?php print ($custom_zebra)? 'even':'odd'$custom_zebra= !$custom_zebra?>>
<th> Размер файла </th>
<td> <?php     print  $node->field_size_of_the_file[0]['value'];     ?>  Мб </td>
</tr>
 
<?php if ($node->field_capabilities_vip[0]['value']): ?>
<tr <?php print ($custom_zebra)? 'even':'odd'$custom_zebra= !$custom_zebra?>>
<th> Качество изображения </th>
<td> <?php     
 
 
print  t('HD'); ?>  </td>
</tr>
<?php endif; ?>   
 
<?php if ($node->field_advises_project[0]['value']): ?>
 
<tr <?php print ($custom_zebra)? 'even':'odd'$custom_zebra= !$custom_zebra?>>
<th> Оценка записи </th>
<td> <?php     print  $node->field_advises_project[0]['view'];     ?>  </td>
</tr>
    <?php endif; ?>   
 
</tbody>
</table>?>
28 мая 2012 в 14:22

"iNFerNo" wrote:

увы выше код вообще ничего не разукрашивает...


Это ваш код, с моей коррекцией вывода классов зебры

28 мая 2012 в 14:29

один момент только. для расширения знаний.

Собрал я вид (для всех пользователей) из полей вывел страницей по желаемому адресу.

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

если да, то где можно пример из практики поглядеть???

29 мая 2012 в 8:31

есть табличный вид вьюхи с полями.

вид доступен всем ролям

но для гостей например нужно убрать видимость именно в это вьюхе одного поля (поле кастомное вьюшное в котором выводиться необходимое)

делать 2 вида ради скрытия поля для гостей не хочется... есть ли еще решение, например через темизацию вида вьюхи

29 мая 2012 в 10:29

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

29 мая 2012 в 10:32

Да, я думаю можно через темизацию этот вопрос решить.

<?php
  
global $user;
  if (!
in_array('anonymous user'array_values($user->roles))) {
     
//код который отображает поле
  
}
?>

Думаю этого должно хватить. Где происходит темизациия вьюхи я уже говрил.
Могу только добавить:

Если в админке вьюхи вы зайдете в раздел "Настройки стиля->Тема", то можете увидить всевозможные названия файлов, которые вы можете создать в своей теме и переопределить для конкретной вьюхи и даже для конкретного вида и блока файл темизации.

После этого изменения этого файла темизации не затронут другие созданные вами ранее вьюхи )

29 мая 2012 в 10:47

"iNFerNo" wrote:
РхБ пора вместо трепа лучше лишний раз дельный совет давать раз умнее всех, всяко от постов смысла было бы ваших больше.

Тебе советы дельные дают регулярно, но ты не ищешь лёгких путей

29 мая 2012 в 10:55

"divined" wrote:

с темизацией вьюх я дело имел давно уже.

//код который отображает поле

с этим не понятно, что за код и в каком виде его добавлять.

29 мая 2012 в 11:03

Код у вас уже есть в файле темизации.

Я вам привел обертку для кода, который переводится так...
Если пользователь не аноним то:

И потом код вывода поля. Там только нужно будет добавить второе условие на имя поля что скрыть только нужное поле.

29 мая 2012 в 11:06
<?php
  global $user;
  if (!in_array('anonymous user', array_values($user->roles))) {
     //код который отображает поле

<div class="<?php print $classes; ?>">
  <?php if ($admin_links): ?>
    <div class="views-admin-links views-hide">
      <?php print $admin_links; ?>
    </div>
  <?php endif; ?>
  <?php if ($header): ?>
    <div class="view-header">
      <?php print $header; ?>
    </div>
  <?php endif; ?>

  <?php if ($exposed): ?>
    <div class="view-filters">
      <?php print $exposed; ?>
    </div>
  <?php endif; ?>

  <?php if ($attachment_before): ?>
    <div class="attachment attachment-before">
      <?php print $attachment_before; ?>
    </div>
  <?php endif; ?>

    <?php if ($pager): ?>
    <?php print $pager; ?>
  <?php endif; ?>

 
  <?php if ($rows): ?>
    <div class="view-content">
      <?php print $rows; ?>
    </div>
  <?php elseif ($empty): ?>
    <div class="view-empty">
      <?php print $empty; ?>
    </div>
  <?php endif; ?>

  <?php if ($pager): ?>
    <?php print $pager; ?>
  <?php endif; ?>

  <?php if ($attachment_after): ?>
    <div class="attachment attachment-after">
      <?php print $attachment_after; ?>
    </div>
  <?php endif; ?>

  <?php if ($more): ?>
    <?php print $more; ?>
  <?php endif; ?>

  <?php if ($footer): ?>
    <div class="view-footer">
      <?php print $footer; ?>
    </div>
  <?php endif; ?>

  <?php if ($feed_icon): ?>
    <div class="feed-icon">
      <?php print $feed_icon; ?>
    </div>
  <?php endif; ?>

</div><?php /* class view */ ?>

  }
?>

а условие на поле в виде $data->название поля?

29 мая 2012 в 11:09

Ну я думаю надо обернуть только эту часть:

<?php print $rows; ?>

//Посмотрите содержимое переменной $rows там будет видно по чему добавить условие, примерно так как вы написали, но немного по другому.

<?php drupal_set_message("

".print_r($rows,1)."

"); ?>
<?php print $rows; ?>

29 мая 2012 в 11:19

Да и кстати, надо бы это сделать вообще в другом файде, а именно который темизирует саму строку а не весь вид.

29 мая 2012 в 11:20

я это значение $data->node_data_field_noderef_catalog_field_funding_value

взял добавив в виде вьюхи print_r($data)

а как для $rows; так же???

29 мая 2012 в 11:21

Попробуйте сами, я этим не занимался никогда, просто пишу как бы я поступил если бы мне это потребовалось.

<?php drupal_set_message("

".print_r($rows,1)."

"); ?>

Я же написал как правильно и структуировано получать значения массивов в переменных.

29 мая 2012 в 11:49