Конструирование шаблонов
[http://www.wikizamki.org/links.htm]
(Новая страница: «==Определение нескольких заполненных параметров в шаблоне == Товарисчи, вопрос по конструи…»)
Текущая версия на 06:22, 22 ноября 2009
Определение нескольких заполненных параметров в шаблоне
Товарисчи, вопрос по конструированию шаблонов. Скажем, есть у меня табличка (а-ля карточка персоналии), из которой надо сделать шаблон:
Заголовок | |
---|---|
Подзаголовок1 | |
Параметр1 | Значение1 |
Параметр2 | Значение2 |
Подзаголовок2 | |
Параметр3 | Значение3 |
Параметр4 | Значение4 |
Но! Фишка в том, что все параметры, кроме заголовка, необязательны. То есть если, скажем, Параметр1, Параметр 2 или оба они определены, то плашка Подзаголовок1 должна рисоваться, а если не определено ни одного из них, то не должна. И вот с этим-то у меня, товарисчи, затык. Сейчас я использую извратнейшую в своём роде конструкцию, которая смотрит заполнение параметров, через ifexpr вычисляет логическое выражение (один из, оба или ни одного), определяет одну строку, если что-то заполнено, и другую, если не заполнено, и потом в зависимости от этой строки рисует часть таблички:
{{#ifeq: {{#ifexpr: {{ #ifeq: {{{Параметр1|}}} | |0| 1 }} or {{ #ifeq: {{{Параметр2|}}} | |0| 1 }} |true|false }} | true | <!-- если хоть что-нибудь из параметров заполнено, будем рисовать плашку --> {{!}}- {{!}} align="center" {{!}} '''Подзаголовок1''' {{Чередующиеся строки таблицы |чс=background:#f0f0f0; | {{#if: {{{Параметр1|}}} | {{!}} '''Параметр1''' {{!!}} {{{Параметр1}}} }} | {{#if: {{{Параметр2|}}} | {{!}} '''Параметр2''' {{!!}} {{{Параметр2}}} }} }} }}
И всё бы хорошо, но если таких конструкций в шаблоне две и больше, а ни одного параметра для них не заполнено, то в последней ячейке таблицы откуда-то вылезают br-ы (<p><br/></p>). Число br-ов равно числу конструкций, у которых нет заполненных параметров, минус 1. На тестовой странице можно увидеть проблемный случай (в качестве шаблона включается страница Участник:Ari/Temp3). Что требуется: во-первых, если кто-нибудь знает, как можно обойти извратный способ определения того, заполнен ли хоть один из нужных параметров, то напишите. Если нет, то хотя бы как переделать его так, чтобы пустые строки перестали вылезать. — Ari✓ 15:33, 16 ноября 2009 (UTC)
- Насчёт вылезания пустых строк не знаю, но что касается непустых параметров, почему бы просто не написать
{{#if: {{{Параметр1|}}} {{{Параметр2|}}} | (хотя бы один параметр непустой) }}
- — AlexSm 16:06, 16 ноября 2009 (UTC)
- О, спасибо за совет. Конструкция упростилась. Я не знал, что if может принимать несколько параметров. Опытным путём, кстати, было установлено, откуда вылезают пустые строки: оказывается, виновата новая строка после шаблона Шаблон:Tl (внизу в коде это место отмечено). Эта самая строка, видимо, воспринимается парсером как действительно требуемая. И если первый переход он игнорирует, то второй считает, видимо, чем-то вроде пустой строки между двумя абзацами, и ставит там честный br. Это объясняет, почему проблема вылезает только если под двумя или более плашками не заполнено ни одного параметра (а если «пустых» плашек меньше, то её нет), но хорошо бы теперь узнать, как переписать этот код, чтобы избавиться от пустых строк. Просто сливать код в одну строчку, оказывается, не выход: пустые строки исчезают, но парсер таблиц выдаёт нечто перекособряченное.
Код с отмеченными проблемными местами | |
---|---|
{{#if: {{{Параметр1|}}} {{{Параметр2|}}} | {{!}}- <!-- ВОТ ЗДЕСЬ ПЕРЕВОД СТРОКИ СЧИТАЕТСЯ ПЕРВЫМ '\n'--> {{!}} align="center" colspan="2" style="background-color:Cyan;" {{!}} '''Подзаголовок1''' {{Чередующиеся строки таблицы |чс=background:#f0f0f0; | {{#if: {{{Параметр1|}}} | {{!}} '''Параметр1''' {{!!}} {{{Параметр1}}} }} | {{#if: {{{Параметр2|}}} | {{!}} '''Параметр2''' {{!!}} {{{Параметр2}}} }} }} }} {{#if: {{{Параметр3|}}} {{{Параметр4|}}} | {{!}}- <!-- А ВОТ ЗДЕСЬ - ВТОРЫМ '\n'--> {{!}} align="center" colspan="2" style="background-color:Cyan;" {{!}} '''Подзаголовок2''' {{Чередующиеся строки таблицы |чс=background:#f0f0f0; | {{#if: {{{Параметр3|}}} | {{!}} '''Параметр3''' {{!!}} {{{Параметр3}}} }} | {{#if: {{{Параметр4|}}} | {{!}} '''Параметр4''' {{!!}} {{{Параметр4}}} }} }} }} |
- Выше - это не «несколько параметров» if, а просто добавление одного текста сразу после другого. А таблицы можно задавать и как
<table><tr>...
, и в сложных шаблонах иногда так и делают. — AlexSm 22:04, 16 ноября 2009 (UTC)
- Выше - это не «несколько параметров» if, а просто добавление одного текста сразу после другого. А таблицы можно задавать и как
- добавление одного текста сразу после другого - иными словами, if проверяет не параметр вызывающего шаблона, а просто текст, поэтому можно написать, к примеру, так: {{#if: текст|1|0}} и эта конструкция всегда будет выдавать 1, поскольку if получает не пустую строку "текст". table - можно, но по возможности этого следует избегать. Насчёт же нескольких пустых строк, я не знаю точной причины, но предполагал, что парсер считает каждую пару |-|- как одну, но узкую по высоте строку. Борюсь же я с этим с помощью включения |- внутрь условных скобок (пример), причём какая-то байда, но if не очень любит |- в начала блока (пришлось сдвигать в конец):
<source lang="text">
</source>
- Почему это пришлось делать, я до конца не разобрался, но этот вариант работает на ура (пример использования). PS: Взгялнув на ваш код, вижу, что вы влетели в ту же яму, что и я, пытаясь поставить |- в начале блока в if. -- AVBtalk 06:27, 17 ноября 2009 (UTC)
- пару |-|- как одну, но узкую по высоте строку - с парами |-|- не получилось, но если между ними |, то именно так и получается:
|
|
- Слегка отредактировал код шаблона Участник:Ari/Temp3. Посмотрите, может так лучше?--Bandar Lego 07:25, 17 ноября 2009 (UTC)
- О, совет AVB помог — со сдвинутыми в конец блока if палками он его хавает нормально, и даже примеры не косячатся. Bandar Lego — увы, если бы всё было так просто, я бы и сам додумался. :-) То есть лишняя строка исчезала, но плашки он начинал рисовать от балды и как-то в шахматном порядке. В общем, палки в конце ифов рулят. Всем спасибо, проблема решена. — Ari✓ 10:10, 17 ноября 2009 (UTC)
- Странно, почему Вы не захотели упростить
{{#if: {{{заголовок|}}} | '''{{{заголовок}}}''' | '''{{PAGENAME}}'''}}
до'''{{{заголовок|{{PAGENAME}}}}}'''
...--Bandar Lego 10:39, 17 ноября 2009 (UTC)- А вы взгляните повнимательнее. Там в ифе, в конце, стоит Шаблон:Tl, который нельзя запихать в начало следующего ифа. А в упрощённый код не получается вставит Шаблон:Tl (ну или я не знаю, как это сделать). А впрочем, заголовок всё равно будет чем-нибудь заполнен, так что, возможно и имеет смысл написать упрощённый код, а Шаблон:Tl поставить уже после него. — Ari✓ 10:46, 17 ноября 2009 (UTC)
- Странно, почему Вы не захотели упростить
- О, совет AVB помог — со сдвинутыми в конец блока if палками он его хавает нормально, и даже примеры не косячатся. Bandar Lego — увы, если бы всё было так просто, я бы и сам додумался. :-) То есть лишняя строка исчезала, но плашки он начинал рисовать от балды и как-то в шахматном порядке. В общем, палки в конце ифов рулят. Всем спасибо, проблема решена. — Ari✓ 10:10, 17 ноября 2009 (UTC)
- упростить - обращаю ваше внимание, что
{{{заголовок|{{PAGENAME}}}}}
НЕ идентично конструкции с if. Дело в том, что вариант{{{param|alternate}}}
будет выдавать alternate ТОЛЬКО в случае, если параметр НЕОПРЕДЕЛЁН, а кроме неопределённости параметр может быть ПУСТЫМ (строка нулевой длины). В то время как if (и только if) позволяет обработать в том числе и пустое значение. Подробнее: ВП:Механизм шаблонов#Неопределённые и пустые параметры. PS: К сожалению, мне неизвестен вариант, как можно короче, нежели через if, условно обрабатывать пустые параметры так, как это делается для неопределённых параметров. -- AVBtalk 11:02, 17 ноября 2009 (UTC)
- упростить - обращаю ваше внимание, что