За последние 24 часа нас посетили 49162 программиста и 1807 роботов. Сейчас ищут 903 программиста ...

Создаю глоссарий терминов. Нужна помощь.

Тема в разделе "PHP для новичков", создана пользователем SkyKiller, 3 ноя 2011.

  1. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    Приветствую всех уважаемых завсегдатаев данного форума! :)

    На этапе модернизации своего сайта столкнулся с проблемой динамического создания глоссария терминов. Хотелось бы попросить помощи у знающих, ибо сам я пока эту проблему не осилил. Итак, что мы имеем:

    1. Есть таблица кулинарных терминов. Пример записи:
    Код (Text):
    1.  
    2. id | letter | rusletter | title     | text
    3. ----------------------------------------------------------------------
    4. 1  | v      | в         | Виноград  | <...описание винограда...>
    5. 2  | zh     | ж         | Желатин   | <...описание желатина...>
    Всего записей в таблице терминов - 329. Само собой, что выбрать их из базы и вывести последовательно - не проблема. Что я и делаю:
    Этот список уже отсортирован так, как мне надо. Он был получен следующим запросом:
    [sql]SELECT `id`, `letter`, `rusletter`, `title` FROM `glossary` ORDER BY `rusletter`, `title` ASC[/sql]

    Задача состоит в следующем:
    1. Выбрать эти данные из базы в массив (ну, не делать же отдельные запросы в базу по каждой букве? :) )
    2. Вывести их вертикально в 3 колонки (без таблиц, на div-ах), колонки должны быть примерно равной высоты (+/- 1-2 строки)
    3. Подписать букву перед терминами, начинающимися со следующей буквы

    В идеале, что хотелось бы получить:
    Причём, выведено это должно быть в 3 колонки примерно одинаковой высоты (здешнее форматирование bbcode не позволяет мне так нарисовать).

    Примечание: формат пермалинка на глоссарий у меня следующий: 'glossary/zh/2/'
    То есть, /glossary/<letter-из-базы>/<id-из-базы>/'
    Поэтому, в двумерный массив придётся запихивать все элементы, кроме текста (значения) термина.

    Если кто-то уже делал подобную задачу - буду благодарен за пример кода, по которому смогу разобраться. В принципе, готов заплатить за грамотный и понятный (и, главное - рабочий!) код.

    Спасибо!
     
  2. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    PHP:
    1. <?php
    2. // ...
    3. $columns = 3;
    4. $sql = 'SELECT `id`, `letter`, `rusletter`, `title` FROM `glossary` ORDER BY `rusletter`, `title` ASC';
    5. $res = mysql_query($sql) or mysql_error($sql . '<br />' . mysql_error());
    6. $glossary = array();
    7. if(mysql_num_rows($res) > 0) {
    8.     while($row = mysql_fetch_assoc($res))
    9.         $glossary[] = $row;
    10. }
    11. $total = count($glossary);
    12. $inColumn = (int) ceil($total / $columns);
    13. ?>
    14. <html>
    15.     <head>
    16.         <meta http-equiv="Content-type" content="text/html; charset=Windows-1251" />
    17.         <title>Кулинарные штуки всякие</title>
    18.     </head>
    19.     <body>
    20. <?php
    21. $prev = '';
    22. for($i = 0; $i < $columns; $i++) {
    23.     $first = true;
    24. ?>
    25.         <div style="float: left;">
    26. <?php
    27.     $start = $inColumn * $i;
    28.     $stop = ($i === ($columns - 1)) ? $total : ($start + $inColumn);
    29.     for($n = $start; $n < $stop; $n++) {
    30.         if($glossary[$n]['rusletter'] !== $prev) {
    31.             $prev = $glossary[$n]['rusletter'];
    32.             if(!$first)
    33.                 echo('<br />');
    34. ?>
    35.             <b><?php echo($glossary[$n]['rusletter']); ?></b><br />
    36. <?php
    37.         }
    38.         $first = false;
    39. ?>
    40.             <a href="glossary/<?php echo($glossary[$n]['letter']); ?>/<?php echo($glossary[$n]['id']); ?>/"><?php echo($glossary[$n]['title']); ?></a><br />
    41. <?php
    42.     }
    43. ?>
    44.         </div>
    45. <?php
    46. }
    47. ?>
    48.     </body>
    49. </html>
    Посмотри, может устроит.
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    sobachnik
    Ну и манера у тебя =)
     
  4. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    igordata
    ?
    Ты про кашу из html и php?
    Мне так вполне даже удобно. Здесь просто подсветка всё-таки ещё не супер. В том же NotePad++ я сразу чётко вижу, где php, где html. Если SkyKiller захочет - отформатирует как ему удобнее.
    Так я обычно пишу в каких-то мелких "сайтиках с фончиками". Если что-то покрупнее - обычно использую xTemplate.
     
  5. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ой какие вы все замороченые. =) я прсто в эхо вывожу. Ладно забей =)
     
  6. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Добавлю ещё, почему я часто так пишу. Если это смотреть в Notepad++, то он подсветит как html, так и php. Одно подсветит по своим правилам, другое по своим. Если использовать просто echo, то html подсвечен не будет, всё будет просто сереньким (строка текста в кавычках). А так и подсветка html (теги, атрибуты, значения) и для каждого тега, у которого есть пара - очень быстро эту пару найти можно. Если всё в echo, то парные теги тоже не будут подсвечиваться и находиться.
     
  7. SkyKiller

    SkyKiller Активный пользователь

    С нами с:
    1 ноя 2007
    Сообщения:
    166
    Симпатии:
    0
    Адрес:
    Новосибирск
    sobachnik, выражаю свою огромную благодарность за помощь! :) Всё прекрасно работает, спасибо!