Перейти к содержимому


Как не выводить подтаблицу в шаблоне печати, если она пуста?


Сообщений в теме: 7

#1 weranda

    Участник

  • Пользователи
  • PipPip
  • 10 сообщений

Отправлено 20 Сентябрь 2016 - 23:06

Приветствую

Не могу понять как правильно настроить шаблон печати, а именно: в одном шаблоне печати выводятся данные из двух подтаблиц (Товары и Услуги). Одна из этих подтаблиц может быть без записей, т.е. данные могут быть заполнены или в подтаблице Товары или в подтаблице Услуги. Иногда заполняются обе подтаблицы и когда они обе заполнены, то проблем с корректностью вывода данных из двух таблиц на печать нет. Но если одна из них не заполнена данными, к примеру, подтаблица Товары заполнена, а подтаблица Услуги не заполнена, тогда в шаблоне печати выводится только шапка подтаблицы Услуг без наименований и стоимости услуг - это некрасиво.
Подскажите пожалуйста, как осуществить проверку на отсутствие записей в подтаблице Услуг (Товаров) и если записи в ней отсутствуют, то не выводить и ее шапку.

Привожу условный пример на картинке:

					
					<br />
					
				</div>
				
<script type= ipb.global.registerReputation( 'rep_post_31979', { domLikeStripId: 'like_post_31979', app: 'forums', type: 'pid', typeid: '31979' }, parseInt('0') );

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Сентябрь 2016 - 10:09

Используйте условие для вывода подтаблицы.

#3 weranda

    Участник

  • Пользователи
  • PipPip
  • 10 сообщений

Отправлено 21 Сентябрь 2016 - 13:00

Просмотр сообщенияCbCoder (21 Сентябрь 2016 - 10:09) писал:

Используйте условие для вывода подтаблицы.

Я не силен в программировании, но кое что получилось и я не уверен, что это правильно.

Приведу пример.

Главня таблица – это Главная таблица.
Услуги – это подчиненная таблица (не заполнена данными).
Работы – это подчиненная таблица. (заполнена данными).

В подтаблице Услуги есть два поля: Наименование и Стоимость.

Я сформировал код вывода шаблона для таблицы услуг следующим образом:

Шапка таблицы.
{foreach from="{$Услуги}" name="Услуги" item=subtable}{/foreach}
{if {$Услуги.Наименование}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}

Строки таблицы.
{foreach from="{$Услуги}" name="Услуги" item=subtable}
{$Услуги.Наименование}
{$Услуги.Стоимость}
{/foreach}

В первом блоке кода для вывода шапки подтаблицы сами видите какой код использован.
Правильно ли это?
- Мне кажется, что не правильно, но все отрабатывает. Если записей в подтаблице Услуги нет, то и шапка и строки не выводятся, если же записи в подтаблице есть, то записи выводятся.

Во втором блоке кода, вроде, все корректно.

Могли бы вы показать реальный пример в виде кода с проверкой наличия записей в таблице? Мне непонятно, как правильно написать код. Или именно так правильно?

Сообщение отредактировал weranda: 21 Сентябрь 2016 - 13:00


#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Сентябрь 2016 - 15:48

Если "все отрабатывает", то что вас не устраивает? Заведомо "правильного" кода нет, есть лишь разные рабочие реализации. Я бы к примеру поместил в условие весь блок с подтаблицей, а не только шапку, но это не значит что мой вариант "правильнее", ну разве что немного изящнее. Кроме того в условие можно поместить весь массив {$Услуги}, но если вам не требуется выводить строки с пустым наименованием, то ваш вариант даже лучше.

#5 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 21 Сентябрь 2016 - 15:53

Хотя, сейчас только заметил, что у вас условие обернуто в цикл foreach. Это конечно явно избыточный вариант, хотя формально и рабочий. Если вас это беспокоит, то лучше размещать в условие {$Услуги}:

{if {$Услуги}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}

Т.е. в переводе на человеческий это "Если подтаблица Услуги не пуста, то...". Оборачивать в цикл естественно не нужно.

#6 weranda

    Участник

  • Пользователи
  • PipPip
  • 10 сообщений

Отправлено 21 Сентябрь 2016 - 21:19

Просмотр сообщенияCbCoder (21 Сентябрь 2016 - 15:53) писал:

Хотя, сейчас только заметил, что у вас условие обернуто в цикл foreach. Это конечно явно избыточный вариант, хотя формально и рабочий. Если вас это беспокоит, то лучше размещать в условие {$Услуги}:

{if {$Услуги}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}

Т.е. в переводе на человеческий это "Если подтаблица Услуги не пуста, то...". Оборачивать в цикл естественно не нужно.




Этот вариант пробовал самым первым, но он не срабатывает. Чтобы не быть голословным, проведем эксперимент на демонстрационной конфигурации сайта.

В базе есть таблица Заявки. Открываем первую попавшуюся запись в этой таблице. Видим внутри вложенную таблицу Работа по заявке. Идем в настройки шаблонов печати таблицы Заявок и создаем новый шаблон. Результат работы созданного шаблона с различными вариантами кода.


Первый вариант.
{if {$Работа по заявке}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}
Результат: Syntax Error in template "string:" on line 1 "{if {$Работа по заявке}}" - Unexpected "�", expected one of: "{" , "identifier"


Первый вариант в одну строку:
{if {$Работа по заявке}}<div>Здесь вывод шапки подтаблицы Услуги</div>{/if}
Результат: Syntax Error in template "string:" on line 1 "{if {$Работа по заявке}}<div>Здесь вывод шапки подтаблицы Услуги</div>{/if}" - Unexpected "�", expected one of: "{" , "identifier"


Второй вариант:
{if {$Работа по заявке.Действие}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}
Результат: результат отсутствует, сообщение в блоке DIV не выводится.


Третий вариант:
{foreach from="{$Работа по заявке}" name="Работа по заявке" item=subtable}{/foreach}
{if {$Работа по заявке}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}
Результат: Syntax Error in template "string:" on line 2 "{if {$Работа по заявке}}" - Unexpected "�", expected one of: "{" , "identifier"


Четвертый вариант:
{foreach from="{$Работа по заявке}" name="Работа по заявке" item=subtable}{/foreach}
{if {$Работа по заявке.Действие}}
<div>Здесь вывод шапки подтаблицы Услуги</div>
{/if}
Результат: все работает

Код не копировал, писал вручную. Ошибки из-за скрытых символов нет. Писал в том числе и в одну строку.
Если быть точным, то ваш вариант срабатывает, но только для данных, размещенных в родительской таблице, а для подчиненных таблиц не срабатывает.

Есть идеи?

Сообщение отредактировал weranda: 21 Сентябрь 2016 - 21:21


#7 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 22 Сентябрь 2016 - 09:49

Да, извиняюсь, немного ввел в заблуждение, не все так просто. Но тем не менее способ есть. Вместо {if {$Услуги}} необходимо писать {if $subtable111}, где вместо 111 необходимо прописать id подтаблицы, причем именно подтаблицы как элемента, а не таблицы, на основе которой она создана. Его можно посмотреть в адресной строке, если зайти в свойства этой самой подтаблицы (см. скриншот)

Прикрепленное изображение: screen.png

#8 weranda

    Участник

  • Пользователи
  • PipPip
  • 10 сообщений

Отправлено 22 Сентябрь 2016 - 10:20

Просмотр сообщенияCbCoder (22 Сентябрь 2016 - 09:49) писал:

Да, извиняюсь, немного ввел в заблуждение, не все так просто. Но тем не менее способ есть. Вместо {if {$Услуги}} необходимо писать {if $subtable111}, где вместо 111 необходимо прописать id подтаблицы, причем именно подтаблицы как элемента, а не таблицы, на основе которой она создана. Его можно посмотреть в адресной строке, если зайти в свойства этой самой подтаблицы (см. скриншот)

Прикрепленный файл screen.png

Спасибо за помощь. Все работает. Успехов!





Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных