PHP. Нужна помощь.

Avatar
На сайте с 18.05.2003
Offline
168
2902

есть кусок кода, формирующий ленту новостей:


IncludeTemplateLangFile(__FILE__);

$ID = (isset($ID) ? $ID : $_REQUEST["ID"]);
$IBLOCK_TYPE = (isset($IBLOCK_TYPE) ? $IBLOCK_TYPE : "news");
if($IBLOCK_TYPE=="-")
$IBLOCK_TYPE = "";

$NEWS_COUNT = (strlen($NEWS_COUNT)>0 ? intval($NEWS_COUNT) : "20");

$SORT_BY1 = (isset($SORT_BY1) ? $SORT_BY1 : "ACTIVE_FROM");
$SORT_ORDER1 = (isset($SORT_ORDER1) ? $SORT_ORDER1 : "DESC");
$SORT_BY2 = (isset($SORT_BY2) ? $SORT_BY2 : "SORT");
$SORT_ORDER2 = (isset($SORT_ORDER2) ? $SORT_ORDER2 : "ASC");

$SORT = Array($SORT_BY1=>$SORT_ORDER1, $SORT_BY2=>$SORT_ORDER2);

$CACHE_TIME = intval($CACHE_TIME);
$CACHE_ID = SITE_ID."|".$APPLICATION->GetCurPage()."|".md5(serialize($arParams))."|".$USER->GetGroups();

$APPLICATION->SetTitle(GetMessage("T_NEWS_NEWS_TITLE"));

$cache = new CPHPCache;
if($cache->InitCache($CACHE_TIME, $CACHE_ID))
{
$vars = $cache->GetVars();
$APPLICATION->SetTitle($vars["NAME"]);
$APPLICATION->AddChainItem($vars["NAME"]);
if(CModule::IncludeModule("iblock"))
CIBlock::ShowPanel($ID, 0, 0, $vars["IBLOCK_TYPE_ID"]);
$cache->Output();
}
else
{
if(CModule::IncludeModule("iblock") && ($arIBlock = GetIBlock($ID, $IBLOCK_TYPE))):
$APPLICATION->SetTitle($arIBlock["NAME"]);
$APPLICATION->AddChainItem($arIBlock["NAME"]);
CIBlock::ShowPanel($ID, 0, 0, $arIBlock["IBLOCK_TYPE_ID"]);
$cache->StartDataCache();
$items = GetIBlockElementList($ID, false, $SORT, $NEWS_COUNT);
$items->NavPrint(GetMessage("T_NEWS_NEWS_NAVIG"));
?>
<table cellpadding="0" cellspacing="10" border="0"><?
while($obItem = $items->GetNextElement()):
$arItem = $obItem->GetFields();
//$arProp = $obItem->GetProperties();
?>
<tr><td>
<font class="text">
<?echo ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "hspace='5' vspace='5' align='left' border='0'", $arItem["DETAIL_PAGE_URL"]);?>
<?if(strlen($arItem["DATE_ACTIVE_FROM"])>0):?><font class="newsdata"><?echo $arItem["DATE_ACTIVE_FROM"]?><br></font><?endif?><a href="<?echo $arItem["DETAIL_PAGE_URL"]?>"><b><?echo $arItem["NAME"]?></b></a><br>
<?echo $arItem["PREVIEW_TEXT"];?>
</font>
</td></tr>
<?
endwhile;
?></table>
<?
$items->NavPrint(GetMessage("T_NEWS_NEWS_NAVIG"));
$vars = Array("NAME"=>$arIBlock["NAME"]);
$cache->EndDataCache($vars);
else:
ShowError(GetMessage("T_NEWS_NEWS_NA"));
endif;
}
?>

Вопрос: как сделать, чтоб в таблице строки с новостями чередовались (фон). Также, как на этом форуме сообщения с разным фоном чередуются (белый/серый)

Вопрос2: можно ли как-то сделать, чтоб новости выводились не одним столбцом и кучей строк (в таблице), а двумя столбцами. И чтобы они в шахматном порядке фон имели?

F
На сайте с 12.09.2003
Offline
120
#1

вот на первый вопрос ответ

на второй - ломает разбираться откуда какие данные в цикле беруться, надо переделывать все


IncludeTemplateLangFile(__FILE__);

$ID = (isset($ID) ? $ID : $_REQUEST["ID"]);
$IBLOCK_TYPE = (isset($IBLOCK_TYPE) ? $IBLOCK_TYPE : "news");
if($IBLOCK_TYPE=="-")
$IBLOCK_TYPE = "";

$NEWS_COUNT = (strlen($NEWS_COUNT)>0 ? intval($NEWS_COUNT) : "20");

$SORT_BY1 = (isset($SORT_BY1) ? $SORT_BY1 : "ACTIVE_FROM");
$SORT_ORDER1 = (isset($SORT_ORDER1) ? $SORT_ORDER1 : "DESC");
$SORT_BY2 = (isset($SORT_BY2) ? $SORT_BY2 : "SORT");
$SORT_ORDER2 = (isset($SORT_ORDER2) ? $SORT_ORDER2 : "ASC");

$SORT = Array($SORT_BY1=>$SORT_ORDER1, $SORT_BY2=>$SORT_ORDER2);

$CACHE_TIME = intval($CACHE_TIME);
$CACHE_ID = SITE_ID."|".$APPLICATION->GetCurPage()."|".md5(serialize($arParams))."|".$USER->GetGroups();

$APPLICATION->SetTitle(GetMessage("T_NEWS_NEWS_TITLE"));

$cache = new CPHPCache;
if($cache->InitCache($CACHE_TIME, $CACHE_ID))
{
$vars = $cache->GetVars();
$APPLICATION->SetTitle($vars["NAME"]);
$APPLICATION->AddChainItem($vars["NAME"]);
if(CModule::IncludeModule("iblock"))
CIBlock::ShowPanel($ID, 0, 0, $vars["IBLOCK_TYPE_ID"]);
$cache->Output();
}
else
{
if(CModule::IncludeModule("iblock") && ($arIBlock = GetIBlock($ID, $IBLOCK_TYPE))):
$APPLICATION->SetTitle($arIBlock["NAME"]);
$APPLICATION->AddChainItem($arIBlock["NAME"]);
CIBlock::ShowPanel($ID, 0, 0, $arIBlock["IBLOCK_TYPE_ID"]);
$cache->StartDataCache();
$items = GetIBlockElementList($ID, false, $SORT, $NEWS_COUNT);
$items->NavPrint(GetMessage("T_NEWS_NEWS_NAVIG"));
?>
<table cellpadding="0" cellspacing="10" border="0"><?
while($obItem = $items->GetNextElement()):
$arItem = $obItem->GetFields();
//$arProp = $obItem->GetProperties();
$a = 1;
?>
<tr<?
if($a % 2) echo " bgcolor=\"Black\"";
else echo " bgcolor=\"White\"";
?>><td>
<font class="text">
<?echo ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "hspace='5' vspace='5' align='left' border='0'", $arItem["DETAIL_PAGE_URL"]);?>
<?if(strlen($arItem["DATE_ACTIVE_FROM"])>0):?><font class="newsdata"><?echo $arItem["DATE_ACTIVE_FROM"]?><br></font><?endif?><a href="<?echo $arItem["DETAIL_PAGE_URL"]?>"><b><?echo $arItem["NAME"]?></b></a><br>
<?echo $arItem["PREVIEW_TEXT"];?>
</font>
</td></tr>
<?
$a++;
endwhile;
?></table>
<?
$items->NavPrint(GetMessage("T_NEWS_NEWS_NAVIG"));
$vars = Array("NAME"=>$arIBlock["NAME"]);
$cache->EndDataCache($vars);
else:
ShowError(GetMessage("T_NEWS_NEWS_NA"));
endif;
}
?>
F
На сайте с 12.09.2003
Offline
120
#2

вру - на второй вопрос есть - чисто хтмль-ное решение

<table border="0" cellspacing="0" cellpadding="0" width="350" style="float:left;margin:3px">

<tr>
<td class="text" align="center" colspan="2">bla</td>
</tr>
</table>

благодаря стилю float:left каждая последующая таблица будет обтекать слева предыдущую, если по ширине они помещаются - соответственно фон в таблице меняется по тому же принципу что я написал выше.

Avatar
На сайте с 18.05.2003
Offline
168
#3

Faster, спасибо. Почему-то не получается.(я в ПХП вообще НОЛЬ полный, говорю сразу и честно)

Наверное в моем куске кода генерируются строки (и соотв. нужно у строк цвета менять), а в Вашем примере - именно таблцы?

нет. Попробовал, все равно не поменялось (tr и td пробовал)

Может нужно добавить условие в строку

<?
if($a % 2) echo " bgcolor=\"Black\"";
else echo " bgcolor=\"White\"";
?>

условие, чтоб "$a % 2" было равно целому числу? (просто предположение)?

[Удален]
#4

Avatar, попробуй в его примере строку $a = 1; перенести в начало скрипта.

Avatar
На сайте с 18.05.2003
Offline
168
#5

Леша, спасибо :) Заработало. А вот со второй частью вопроса чего-то никак не разобраться нафиг :( :( :(

Попробую сам мозгами пошурупить, может прикручу :)

tester999
На сайте с 21.10.2004
Offline
149
#6

<table cellpadding="0" cellspacing="10" border="0"><?

while($obItem = $items->GetNextElement()):

$arItem = $obItem->GetFields();

?>

<tr><td<?

if($a % 2) echo " bgcolor=\"Black\"";

else echo " bgcolor=\"White\"";

?>>

<font class="text">

<?echo ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "hspace='5' vspace='5' align='left' border='0'", $arItem["DETAIL_PAGE_URL"]);?>

<?if(strlen($arItem["DATE_ACTIVE_FROM"])>0):?><font class="newsdata"><?echo $arItem["DATE_ACTIVE_FROM"]?><br></font><?endif?><a href="<?echo $arItem["DETAIL_PAGE_URL"]?>"><b><?echo $arItem["NAME"]?></b></a><br>

<?echo $arItem["PREVIEW_TEXT"];?>

</font>

</td>

<td<?

$obItem = $items->GetNextElement();

$arItem = $obItem->GetFields();

$a++;

if($a % 2) echo " bgcolor=\"Black\"";

else echo " bgcolor=\"White\"";

?>>

<font class="text">

<?echo ShowImage($arItem["PREVIEW_PICTURE"], 100, 100, "hspace='5' vspace='5' align='left' border='0'", $arItem["DETAIL_PAGE_URL"]);?>

<?if(strlen($arItem["DATE_ACTIVE_FROM"])>0):?><font class="newsdata"><?echo $arItem["DATE_ACTIVE_FROM"]?><br></font><?endif?><a href="<?echo $arItem["DETAIL_PAGE_URL"]?>"><b><?echo $arItem["NAME"]?></b></a><br>

<?echo $arItem["PREVIEW_TEXT"];?>

</font>

</td></tr>

<?

$a++;

endwhile;

?></table>

А если так? (Вставить вместо старого table, $а=1 в начале скрипта) ;)

Lisa
На сайте с 31.01.2002
Offline
438
#7

если "$a % 2" добавлять </tr><tr>, иначе - не добавлять, если я правильно поняла вопрос.

В каком-то из вариантов списка элементов в товарном каталоге (встроенном) был вариант с cell++, там количество столбцов определялось произвольно.

	

$cell++;

if($n%$LINE_ELEMENT_COUNT == 0):
$cell = 0;
?>
</tr>
<tr>
<?
endif; // if($n%$LINE_ELEMENT_COUNT == 0):
$n++;

Digital Development (https://ddplanet.ru/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий