Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Как вывести карту сайта (древовидную) с одного запроса?

Сообщения:  [1-4] 

 
 автор: Valick   (04.02.2012 в 12:24)   письмо автору
 
   для: tAleks   (01.02.2012 в 17:54)
 

Nested Sets
Прочитайте статью о хранении древовидной структуры в БД
Ну а о ущербности видеокурсов Попова лишний раз напоминать не стоит

  Ответить  
 
 автор: nmahkamov   (04.02.2012 в 11:54)   письмо автору
 
   для: tAleks   (01.02.2012 в 17:54)
 

Здравствуйте!
Привожу пример древовидных комментариев. Уровень вложенности не ограничен. Это совсем не отличается от вашего примера. Просто требуется поправить запрос к базе, и вывод в самом шаблоне.
Эти функции я взял из видеоуроков Евгения Попова. Ему огромное спасибо! И вы тоже не забудьте поблагодарить.

Привожу код. Там все строки имеют свои комменты, и по этому объяснения не требуются:


require_once 'db.php'; // Подключаемся к БД

$sql = "
        SELECT id, parent_id, name, comment,
        DATE_FORMAT(date_add, '%d %M %Y %H:%i') as date_add
        FROM comments
";

$query = mysql_query($sql); // Запрашиваем то что нужно

while($row = mysql_fetch_assoc($query))
{
    $data[$row[id]] = $row;
}

/*Функция для создания дерева комментариев  */

function mapTree($dataset) {
    $tree = array(); // Создаем новый массив
    /*
        Проходим в цикле по массиву $dataset, который был передан в качестве аргумента.
        в $id будет попадать уникальный id комментария,
        &$node - обратите внимание, работаем со значением по ссылке!
     */
    foreach ($dataset as $id=>&$node) {
        if (!$node['parent_id']) { // не имеет родителя, т.е. корневой элемент
            $tree[$id] = &$node;
        } else {
          /*
             Иначе это чей-то потомок
             этого потомка переносим в родительский элемент, 
             при этом у родителя внутри элемента создастся массив childs, в котором и будут вложены его потомки
           */
            $dataset[$node['parent_id']]['childs'][$id] = &$node; //
             
        }
    }

    return $tree;
}  


function commentsToTemplate($comment)
{
    /* $comment - массив комментария - имя, дата, коммент, потомки (если есть) */

    /* Включаем буферизацию вывода, чтобы шаблон не вывелся в месте вызова функции.
    */
    ob_start();
      
        // Подключаем шаблон  comment_template.php, который просто таки ждет наш массив $comment ))
        include 'comment_template.php';
    
    $comments_string =  ob_get_contents(); // Получаем содержимое буфера в виде строки
    ob_end_clean(); // очищаем буфер
    
    return $comments_string;
    // Можно применить более короткую запись - return ob_get_clean(); вместо     $comments_string =  ob_get_contents(); ob_end_clean(); return $comments_string;


 function commentsString($data)
     {
        foreach($data as $w) 
        {
        $string .= commentsToTemplate($w);
        }
         
        return $string;
     }   


$data = mapTree($data);
$comments = commentsString($data);
$data = null;



А вот сам код шаблона (comment_template.php):
 <li id="comment<?php echo $comment[id]?>">
    <div class="commentContent">
        <h6><?php echo $comment[name]?> <span><?php echo $comment[date_add]?></span> </h6>
        <div class="comment">
            <?php echo $comment[comment]?>
        </div>
        <a class="reply" href="#comment<?php echo $comment[id]?>">Ответить</a>
    </div>
    <?php if($comment[childs]) { ?>
        <ul id="commentsRoot<?php echo $comment[id]?>">
        <?php echo commentsString($comment[childs]) ?>
        </ul>
    <?php ?>
</li>


Пользуйтесь на здоровье.

  Ответить  
 
 автор: Slo_Nik   (02.02.2012 в 04:55)   письмо автору
 
   для: tAleks   (01.02.2012 в 17:54)
 

посмотрите по ссылке, возможно Вам поможет
тут

  Ответить  
 
 автор: tAleks   (01.02.2012 в 17:54)   письмо автору
 
 

Есть таблица, в которой хранится собственно карта сайта:


CREATE TABLE sitemap(
  id INT(11) NOT NULL AUTO_INCREMENT COMMENT 'Первичный ключ',
  pid INT(11) NOT NULL COMMENT 'id родителя',
  title VARCHAR(255) NOT NULL COMMENT 'Название статьи',
  loc VARCHAR(2048) NOT NULL COMMENT 'URL',
  lastmod DATE DEFAULT NULL COMMENT 'Дата последнего изменения',
  changefreq ENUM('always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never') NOT NULL COMMENT 'Вероятная частота изменения этой страницы',
  priority DECIMAL(2, 1) NOT NULL DEFAULT 0.5 COMMENT 'Приоритетность URL относительно других URL на сайте',
  PRIMARY KEY (id)
)
ENGINE = MYISAM
AUTO_INCREMENT = 1
CHARACTER SET cp1251
COLLATE cp1251_general_ci;


С этой таблицы планируется генерить sitemap.xml для поисковиков, и вывести карту сайта для полозователей.

Как можно сначала сделать один SELECT запрос, а потом сгенерить всю древовидную структуру?

  Ответить  

Сообщения:  [1-4] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования