Дерево сайта:
jurnalu.ru/assets/images/tree.jpg
Опишу два шаблона, которые используются на 99% страницах сайта.
В первом шаблоне (
www.jurnalu.ru/online-reading/comicsonline/) выводятся документы из раздела манги или комиксов по порядку поступления, выводится 50 последних опубликованных номеров на страницу. Справа строится меню, в котором перечислены все комиксы(манга), опубликованные на сайте. В шаблоне всего два вызова сниппетов, все остальное статический текст и 2 чанка.
Снипет, который отвечает за вывод 50 документов:
<?php
// proverayem nomer stranicu
$page = $_GET['p'];
$pattern = '/[^0-9]+/';
if ($page == "" || preg_match($pattern, $page) || $page == 0)$page = 1;
// opredilyayem roditeley, po kotorum budem delat vuborky
$sql = "SELECT id
FROM `jurnalu_site_content`
WHERE parent = 210 AND deleted = 0 AND published = 1
ORDER BY id";
$result = $modx->db->query($sql);
$string = "";
while ($row = $modx->db->getRow($result))
{
$string .= "'".$row['id']."',";
}
$len = strlen($string);
$string = substr($string, 0, $len-1);
// delayem vuborky vseh opublikovanuh dokymentov, roditeley kotoruh mu opredelili v predudyschem zaprose
$sql = "SELECT id
FROM `jurnalu_site_content`
WHERE parent in (".$string.") AND deleted = 0 AND published = 1
ORDER BY id";
$result = $modx->db->query($sql);
$r = mysql_num_rows($result);
$pagelimit = 50; // kolichestvo nomerov na stranicy
$max = ceil($r/$pagelimit);
if ($page > $max)
$page = $max;
// Padginaciya ----------------------------------------------------------------
$linkPage = '<div id="pageNumber"><div id="InPageNumber">';
$Pplus1 = $page+1;
$Pplus2 = $page+2;
$Pplus3 = $page+3;
$Pminus1 = $page-1;
$Pminus2 = $page-2;
$Pminus3 = $page-3;
//start
if ($page == 1 && $max != 1){
if ($max < 8){
$linkPage .= '<b>1</b> <a href="/online-reading/comicsonline/2"><img src="/assets/templates/first/images/s2.gif" /></a> ';
for ($i = 2; $i <= $max; $i++){
$linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a> ';
}
}else{
$linkPage .= '<b>1</b> <a href="/online-reading/comicsonline/2"><img src="/assets/templates/first/images/s2.gif" /></a>
<a href="/online-reading/comicsonline/2">2</a> <a href="/online-reading/comicsonline/3">3</a> <a href="/online-reading/comicsonline/4">4</a> . . . <a href="/online-reading/comicsonline/'.$max.'">'.$max.'</a>';
}
// end
} elseif ($page == $max && $max != 1){
if ($max < 8){
for ($i = 1; $i < $page; $i++){
$linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a>';
}
$linkPage .= ' <a href="/online-reading/comicsonline/'.$Pminus1.'"><img src="/assets/templates/first/images/s1.gif" /></a> <b>'.$page.'</b>';
}else{
$linkPage .= '<a href="/online-reading/comicsonline/1">1</a> . . . <a href="/online-reading/comicsonline/'.$Pminus3.'">'.$Pminus3.'</a> <a href="/online-reading/comicsonline/'.$Pminus2.'">'.$Pminus2.'</a>
<a href="/online-reading/comicsonline/'.$Pminus1.'">'.$Pminus1.'</a> <a href="/online-reading/comicsonline/'.$Pminus1.'">
<img src="/assets/templates/first/images/s1.gif" /></a> <b>'.$page.'</b>';
}
// in center
} elseif ($page != 1 && $page != $max){
if ($page > 7){
$linkPage .= '<a href="/online-reading/comicsonline/1">1</a> . . . <a href="/online-reading/comicsonline/'.$Pminus3.'">'.$Pminus3.'</a> <a href="/online-reading/comicsonline/'.$Pminus2.'">'.$Pminus2.'</a>
<a href="/online-reading/comicsonline/'.$Pminus1.'">'.$Pminus1.'</a>';
}else{
for ($i = 1; $i < $page; $i++){
$linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a> ';
}
}
$linkPage .= ' <a href="/online-reading/comicsonline/'.$Pminus1.'"><img src="/assets/templates/first/images/s1.gif" /></a> <b>'.$page.'</b>
<a href="/online-reading/comicsonline/'.$Pplus1.'"><img src="/assets/templates/first/images/s2.gif" /></a> ';
if (($max-$page) > 7){
$linkPage .= '<a href="/online-reading/comicsonline/'.$Pplus1.'">'.$Pplus1.'</a> <a href="/online-reading/comicsonline/'.$Pplus2.'">'.$Pplus2.'</a>
<a href="/online-reading/comicsonline/'.$Pplus3.'">'.$Pplus3.'</a> . . . <a href="/online-reading/comicsonline'.$max.'">'.$max.'</a>';
}else{
for ($i = $page+1; $i <= $max; $i++){
$linkPage .= '<a href="/online-reading/comicsonline/'.$i.'">'.$i.'</a>';
}
}
}
$linkPage .= '</div></div>';
if ($max == 1)
$linkPage = "";
// vuvodim navigaciyu
echo $linkPage;
echo '<div id="blockOnline">';
// ------ delayem vuborky nomerov, ishodya is nomera stranici ---------
$page = ($page-1)*$pagelimit;
$sql = "SELECT site.id, site.alias, site.pagetitle, site.publishedon, parent.alias as parentAlias, parent.pagetitle as parentPagetitle
FROM `jurnalu_site_content` site
LEFT OUTER JOIN jurnalu_site_content parent ON site.parent = parent.id
WHERE site.parent IN (".$string.") AND site.deleted = 0 AND site.published = 1
GROUP BY site.id
ORDER BY site.createdon DESC
LIMIT ".$page.",".$pagelimit.";";
$result = $modx->db->query($sql);
while ($row = $modx->db->getRow($result))
{
echo "
<div id=\"OneInputOR\">
<div id=\"OneInputORpro\">
<div id=\"ORPictureManga\">
<a href=\"/online-reading/comicsonline/".$row['parentAlias']."/".$row['alias']."\"><img src=\"/assets/images/ForManga/".$row['parentAlias'].".jpg\" /></a>
</div>
<div id=\"OneInputORtext\">
<div id=\"OneInputORname\">
<h1><a href=\"/online-reading/comicsonline/".$row['parentAlias']."\">".$row['parentPagetitle']."</a></h1>
</div>
<div id=\"OneInputORdetail\">
<div id=\"OneInputORdetailPro\">
<div id=\"left\">
<b><a href=\"/online-reading/comicsonline/".$row['parentAlias']."/".$row['alias']."\">".$row['pagetitle']."</a></b>
</div>
<div id=\"right\">
<b>".date("d.m.Y", $row['publishedon'])."</b>
</div>
</div>
</div>
</div>
</div>
</div>
";
}
// vuvodim navigaciyu
echo $linkPage;
echo '</div><div id="clear10"></div>';
?>
Снипет, который выводит правое мню:
<?php
echo '<div class="menuGeneral"><ul>';
$sql = "SELECT id, pagetitle, alias
FROM `jurnalu_site_content`
WHERE parent = 210 AND deleted = 0 AND published = 1
ORDER BY pagetitle";
$result = $modx->db->query($sql);
while($row = $modx->db->getRow( $result ) ){
if($row['id']==$id){
echo '<li><a class="active" href="/online-reading/comicsonline/'.$row['alias'].'">'.$row['pagetitle'].'</a></li>';
}else
echo '<li><a href="/online-reading/comicsonline/'.$row['alias'].'">'.$row['pagetitle'].'</a></li>';
}
echo '</ul></div>';
?>
Во втором шаблоне (
http://www.jurnalu.ru/online-reading/comicsonline/newultimates/newultimates002) выводится список всех глав через select, а ниже отображается одна из страниц номера. Рисунки берутся из другого сайта, поэтому адрес сайта, расширение рисунков и количество страниц я вытягиваю через TV параметры. В этом шаблоне вызываются 3 сниппета:
Первый сниппет генерирует header
<?php
$sql = 'SELECT site.pagetitle, parent.pagetitle as parenttitle
FROM `jurnalu_site_content` site
LEFT OUTER JOIN `jurnalu_site_content` parent ON site.parent = parent.id
WHERE site.id = '. $id;
$result = $modx->db->query($sql);
$row = $modx->db->getRow( $result );
echo '<title>Comics Online | '.$row['parenttitle'].' | '.$row['pagetitle'].' | read comics online </title>
<meta content="Read comics '.$row['parenttitle'].' - '.$row['pagetitle'].' online." name="description"/>
<meta content="Comics,online,read,'.$row['parenttitle'].','.$row['pagetitle']." name="keywords"/>';
?>
Второй сниппет выводит хлебные крошки:
<?php
$sql = "SELECT site.pagetitle, parent.pagetitle as parenttitle, parent.alias as parentalias
FROM `jurnalu_site_content` site
LEFT OUTER JOIN `jurnalu_site_content` parent ON site.parent = parent.id
WHERE site.id = ".$id;
$result = $modx->db->query($sql);
$row = $modx->db->getRow( $result );
echo '<a href="/">General</a> ->
<a href="/online-reading/">Online</a> ->
<a href="/online-reading/comicsonline/">Comics</a> ->
<a href="/online-reading/comicsonline/'.$row['parentalias'].'">'.$row['parenttitle'].'</a> ->
'.$row['pagetitle'];
?>
И третий сниппет выводит одну страницу номера:
<?php
$page = $_GET['p'];
$parent = $_GET['pr'];
$nexttom = '';
$nextlink = '';
// polychaem vse neobhodimue dannue po nomery
$sql = "SELECT general.pagetitle as pagetitle, general.alias as alias, general.longtitle as longtitle, parent.id as parent,
parent.pagetitle as parentName, parent.alias as parentAlias, lastpage.value as lastpage, mySiteForFile.value as mysite,
SiteForFile.value as site, extension.value as extension
FROM `jurnalu_site_content` general
INNER JOIN `jurnalu_site_content` parent ON parent.id = general.parent
LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` lastpage ON lastpage.contentid = $id AND lastpage.tmplvarid = 17
LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` mySiteForFile ON mySiteForFile.contentid = $id AND mySiteForFile.tmplvarid = 22
LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` SiteForFile ON SiteForFile.contentid = general.parent AND SiteForFile.tmplvarid = 22
LEFT OUTER JOIN `jurnalu_site_tmplvar_contentvalues` extension ON extension.contentid = $id AND extension.tmplvarid = 18
WHERE general.id = $id";
$result = $modx->db->query($sql);
$row = $modx->db->getRow( $result ) ;
if($page > $row['lastpage']) $page = $row['lastpage'];
if($page < 1) $page = 1;
if($row['mysite'] == '') {
$site = $row['site'];
}else $site = $row['mysite'];
$text = '
<div id="ORGeneral">
<div id="ORgeneralPro">
<div id="ORstartFon">
</div>
<div id="ORhead">
<div id="ORtopText">
<div id="ORleftText">
<b>Comics online</b>
</div>';
$text .= '</div>
<div id="ORname">
<h2>'.$row['parentName'].'</h2>
</div>
<div id="ORglada">
'.$row['pagetitle'].'
</div>
<div id="ORchoise">
<select onchange="window.location=\'http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/\'+this.value+\'/1\'">';
// delaem SQL zapros, v kotorom polychaem vse nomera dannogo komiksa i vstavlaem v select
$sql = "SELECT id, pagetitle, alias
FROM `jurnalu_site_content`
WHERE parent = ".$row['parent']." AND deleted = 0 AND published = 1
ORDER BY publishedon DESC";
$result = $modx->db->query($sql);
while($row2 = $modx->db->getRow( $result ) ){
if ($row2['id'] == $id){
$text .= '<option selected="" value="'.$row2['alias'].'">'.$row2['pagetitle'].'</option>';
$nexttom = $prew;
}else{
$text .= '<option value="'.$row2['alias'].'">'.$row2['pagetitle'].'</option>';
}
$prew = $row2['alias'];
}
// insert in html code our variables
$text .= '</select>
</div>
<div id="ORspace">
</div>
</div>
<div id="ORpereplet">
</div>
<div id="ORpage">
<div id="ORspace"></div>
<div id="right" style="margin:0 20px 0 0; width:100%; text-align:right;">';
$text .= '<a href="http://'.$site.'/'.$row['parentAlias'].'/'.$row['longtitle'].'/'.$page.'.'.$row['extension'].'" rel="shadowbox">';
$text .= '<img src="/assets/templates/first/images/zoom.jpg" alt="" /></a>
</div>';
$textPage = '<div id="left" style="text-align:center; width:750px;">';
if($page != 1) $textPage .= '<a href="http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$row['alias'].'/'.($page - 1).'">
<img src="/assets/templates/first/images/prew.jpg" alt="" /></a>';
$textPage .= ' <select onchange="window.location=\'http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$row['alias'].'/\'+this.value+\'\'">';
for($i=1;$i<=$row['lastpage'];$i++){
if($i == $page){
$textPage .=' <option selected="" value="'.$i.'">- '.$i.' -</option>';
}else $textPage .=' <option value="'.$i.'">- '.$i.' -</option>';
}
$textPage .='</select>';
if($page != $row['lastpage']){
$textPage .= $nextlink = '<a href="http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$row['alias'].'/'.($page + 1).'">';
$textPage .= '<img src="/assets/templates/first/images/next.jpg" alt="" /></a>';
}elseif($nexttom != ''){
$textPage .= $nextlink = '<a href="http://www.jurnalu.ru/online-reading/comicsonline/'.$row['parentAlias'].'/'.$nexttom.'/1" >';
$textPage .= '<img src="/assets/templates/first/images/next.jpg" alt="" /></a>';}
$textPage .= '</div>';
$text .= $textPage;
$text .= '<div id="ORspace"></div><center>'.$nextlink.'
<img width="650" src="http://'.$site.'/'.$row['parentAlias'].'/'.$row['longtitle'].'/'.$page.'.'.$row['extension'].'" alt="" />';
if($nextlink !='') $text .= '</a>';
$text .= '</center><div id="ORspace"></div>';
$text .= $textPage;
$text .= '</div>
<div id="ORpagedown">
</div>
</div>
</div>';
echo $text;
?>
Буду рад любой критике или советам по оптимизации.