PHP: Вывод подкатегорий в категории DLE Engine

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

Первым делом Вам нужно создать файл tpl в папке с шаблоном. Назовем его childscat.tpl. Примерное содержимое ниже.

 <div>
    <table width="100%" border="0" cellspacing="0" cellpadding="0" align="center">
        <tr>
     <td>
            <div>[full-link]<img alt="{title}" src="{image}" />[/full-link]</div>
        </td>
    </tr>
    <tr>
    	<td>
            <div>
                <div>[full-link]{title}[/full-link]</div>
                <div>Новостей {newscount}</div>
             </div>
    	</td>
    </tr>
    </table>
</div>   

Шаблон представлен ради примера. Вы должны будете подправить его под свои нужды. Чтобы не описывать список доступных тегов, просто посмотрите код самого модуля, думаю все вопросы сразу отпадут 🙂
Код самого модуля. Файл childs.php который необходимо положить в папку /engine/modules системы DLE.

<?php
if( ! defined( 'DATALIFEENGINE' ) ) {
	die( "Hacking attempt!" );
}

$id = (int)$id;
if(!empty($limit)) {
    $limit = ' LIMIT '.$limit;
}
$template = strip_tags($template);
$order =  empty($order) ? 'ASC' : $order;
$all = empty($all) ? 1 : $all;
$orderf =  empty($orderf) ? 'id' : $orderf;
$dateFormat =  empty($dateFormat) ? 'd.m.Y' : $dateFormat;
if(empty($id)) {
    echo 'No ID';
    return;
}

if(!function_exists('GetAllChilds')) {
  function GetAllChilds(&$result, $cacheFile, $dbObj, $table, $fieldGet, $fieldSearch, $keySearch, $onlyFirstLevel = false)
  {
    $dir = __DIR__.'/../cache/';
    if(!is_dir($dir)) {
      mkdir($dir, 0777);
    }
    $separator = ',';
    $cache = $dir.'gettree_'.$cacheFile.'_'.$keySearch.'_'.($onlyFirstLevel ? '1' : '0');
    $cacheContent = file_exists($cache) ? file_get_contents($cache) : null;
    if($cacheContent !== null) {
        $result = explode($separator, $cacheContent);
        if(time() < $result[0]) {
            array_shift($result);
            return count($result);
        }
    }
    $sql = 'SELECT `'.$fieldGet.'` FROM `'.$table.'` WHERE `'.$fieldSearch.'` = "'.$keySearch.'"';
    $resultQuery = $dbObj->query($sql);
    $level = array();
    while($row = $dbObj->get_row($resultQuery)) { //$resultQuery->fetch_assoc()
        $id = $row[$fieldGet];
        if(!in_array($id, $result)) {
            $level[] = $id;
            $result[] = $id;
        }
    }
    if($onlyFirstLevel !== true) {
        foreach($level as $id) {
            GetAllChilds($result, $cacheFile, $dbObj, $table, $fieldGet, $fieldSearch, $id, false);
        }
    }
    file_put_contents($cache, implode($separator, $result));
    return count($result);
  }
}

$allChilds = array($id);
GetAllChilds($allChilds, 'catchilds', $db, PREFIX."_category", 'id', 'parentid', $id);

$tpl->load_template($template);

$sql = $all == 1
    ? "SELECT c.*, cp.id as parentId, cp.alt_name as parentAlt, cp.name as parentName FROM ".PREFIX."_category c JOIN ".PREFIX."_category cp ON cp.id = c.`parentid` WHERE c.`parentid` = '".$id."' ORDER BY c.`".$orderf."` ".$order.$limit
    : 'SELECT c.*, cp.id as parentId, cp.alt_name as parentAlt, cp.name as parentName FROM '.PREFIX.'_category c JOIN '.PREFIX.'_category cp ON cp.id = c.`parentid` WHERE c.`id` = (SELECT category FROM '.PREFIX.'_post WHERE id = (SELECT MAX(id) FROM '.PREFIX.'_post WHERE category IN ('.implode(',', $allChilds).'))) ORDER BY c.`'.$orderf.'` '.$order.$limit;
//echo $sql;
$result = $db->query($sql);
$db2 = new db;
while($row = $db->get_row($result)) {
    //print_r($row);
    $tpl->set_block("'\\[catlist=".$id."\\](.*?)\\[/catlist\\]'si", "\$1");
    $tpl->set_block("'\\[catlist=\d+\\](.*?)\\[/catlist\\]'si", "");

    $count = $db2->super_query('SELECT COUNT(id) as c FROM '.PREFIX.'_post WHERE category = "'.$row['id'].'"');
    $lastNew = $db2->super_query('SELECT * FROM '.PREFIX.'_post WHERE category = "'.$row['id'].'" ORDER BY date DESC LIMIT 1');

    $full_link = $config['http_home_url'].get_url($row['id']).'/';
    //Список тегов
    $tpl->set('{newscount}', $count['c']);
    $tpl->set('{lastpost-comments-num}', $lastNew ? $lastNew['comm_num'] : 0);
    $tpl->set('{comments-text}', getCommentString($lastNew ? $lastNew['comm_num'] : 0));
    $tpl->set('{lastpost-title}', str_replace(array('\"', "\'"), array('"', "'"), $lastNew['title']));
    $tpl->set('{lastpost-url}', $full_link.$lastNew['id'].'-'.$lastNew['alt_name'].'.html');
    $tpl->set('{lastpost-date}', $lastNew ? date($dateFormat, strtotime($lastNew['date'])) : '');
    $tpl->set('{image}', $row['icon'] == '' ? '/templates/Tail/images/seasone-1.png' : $row['icon']);
    $tpl->set('{title}', $row['name']);
    $tpl->set('{parent-title}', $row['parentName']);
    $tpl->set('{parent-url}', $config['http_home_url'].get_url($row['parentId']).'/');

    $tpl->set( '[full-link]', "<a href=\"" . $full_link . "\">" );
    $tpl->set( '[/full-link]', "</a>" );
    $tpl->compile('categorychilds');
}
$db2->close();
$tpl->clear();
$db->free($result);
echo $tpl->result['categorychilds'];

Теперь чтобы вставить вывод подкатегорий категории в нужном месте Вашего шаблона пропишите код:

{include file="engine/modules/childs.php?id=[ID КАТЕГОРИИ ПРЕДКА]&all=1&template=childscat.tpl&order=DESC"}

Главное, что стоит поменять в данной строчки — это id категории (цифра). Так же Вы можете видеть, что можно указать нужный шаблон, сортировку, а так же еще несколько параметров. Все они инициализируются в начале файла childs.php.

Запись опубликована в рубрике PHP с метками , , , , , , , , . Добавьте в закладки постоянную ссылку.