• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Решено Формулы скрытия и datasource

  • Автор темы motogarri
  • Дата начала
M

motogarri

Привет. Помогите плс разобаться.
На странице имеется датасорс и панель с несколькими репит-контролами. Репиты отображают наборы полей из документа, типа:
FirstName_1, LastName_1, MiddleName_1
FirstName_2, LastName_2, MiddleName_2
. . . . . . . . . . .
FirstName_15, LastName_15, MiddleName_15

В документе нет поля, которое показало бы сколько имён присутствует в таблице, значит нужно вычислять самому
JavaScript:
var n = 0;
for (var i = 1; i <= 16; i++) {
	if(datasource1.hasItem("FirstName_" + i) || datasource1.hasItem("LastName_" + i) || datasource1.hasItem("MiddleName_" + i)){
		var fname = datasource1.getItemValueString("FirstName_" + i);
		var lname = datasource1.getItemValueString("LastName_" + i);
		var mname = datasource1.getItemValueString("MiddleName_" + i);
		if(lname + fname + mname != "") n += 1;
	}
}
return n;
Получается этот цикл нужно выполнять на вычислении количества строк репита и в формуле скрытия таблицы в которую помещён репит.

Наверняка же можно вычислить количество строк только один раз на каком-нибудь событии датасорса и передать через viewScope? Только вот на какое бы событие датасорса я бы ни вешал вычисление, либо 'datasource1' not found, либо страница уже прорисовалась и скрытие не сработало.
 
Последнее редактирование:

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
у репитера есть метод getRowCount()
А вопрос отсеивания пустых записей решается на уровне datasource

А чтоб подсказать куда надо вешать обработку - нужно знать цель задачи.
 
M

motogarri

Цель - отобразить xp:table в которой есть репит-контрол. То-есть мне надо скрывать всю таблицу, если репит пустой. Если на таблице вычислять условие скрытия вот так: getComponent("repeat1").getRowCount() > 0 ? true : false , то получается 'getComponent()' is null. Хотя поле в ячейке таблицы отображает количество строк в репите верно.
 
M

motogarri

Наверное потому что репит дочерний элемент по отношению к таблице, не знаю. Потому хотел сначала посчитать количество строк в датасорсе и передать его в репит.
 
M

motogarri

Таблицу я использую для заголовков к данным в репите. Может я вообще не так делаю? Может как-то по другому можно?
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 940
609
BIT
210
Если на таблице вычислять условие скрытия вот так
когда вычислять, может еще сам контрол не сформирован, в этом месте процесса
[DOUBLEPOST=1441807771,1441807652][/DOUBLEPOST]смотрим https://codeby.net/threads/39346/#post-257826 lifecycle - очень полезная БД для понимания (и описание в ТМ)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Ну как вариант - можно получить коллекцию по виду и посмотреть сколько строк в результате
 
M

motogarri

Всё, допёрло до меня. Там оказывается можно вот такую штуку вставить:
HTML:
<xp:this.facets>
	<xp:text disableTheme="true" xp:key="header" escape="false">
		Таблица с заголовками
	</xp:text>
</xp:this.facets>
Тогда таблица станет дочерней к репит-контролу и все будет нормально скрываться:
HTML:
<xp:this.rendered><![CDATA[${javascript:
	this.getRowCount() > 1 ? true : false}]]>
</xp:this.rendered>
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всё, допёрло до меня. Там оказывается можно вот такую штуку вставить:
HTML:
<xp:this.facets>
	<xp:text disableTheme="true" xp:key="header" escape="false">
		Таблица с заголовками
	</xp:text>
</xp:this.facets>
Тогда таблица станет дочерней к репит-контролу и все будет нормально скрываться:
HTML:
<xp:this.rendered><![CDATA[${javascript:
	this.getRowCount() > 1 ? true : false}]]>
</xp:this.rendered>
не понял.... ты в репитер вставил таблицу?
 
M

motogarri

HTML:
<xp:repeat id="repeat3" first="1" indexVar="index" style="margin-top:5px">
	<xp:this.facets>
		<xp:text disableTheme="true" xp:key="header" escape="false">
			<xp:table style="width:100%">
				<xp:tr>
					<xp:td style="color:rgb(0,0,128);font-weight:bold">
						Заголовок
					</xp:td>
				</xp:tr>
			</xp:table>
		</xp:text>
</xp:this.facets>
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Немного не правильно. Это в каждой строке репитера будет рисоваться таблица.
И будут проблемы с изменением ширины столбцов. В разных строках репитера ширина одного и того же столбца может отличаться.
Лучше сделать так

HTML:
 <xp:table>
	<xp:tr>
		<xp:td>Заголовок1</xp:td>
		<xp:td>Заголовок2</xp:td>
	</xp:tr>
	<xp:repeat id="repeat1" rows="30" value="#{view1}">
		<xp:tr>
			<xp:td></xp:td>
			<xp:td></xp:td>
		</xp:tr>
	</xp:repeat>
</xp:table>
 
Последнее редактирование модератором:
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!