7. Типы страниц. Делаем свой Twitter

Рубрика: Лекции
Понедельник, 27 октября 2008 г.
Просмотров: 596

В MaxSite CMS типы страниц используются для дополнительной группировки различных записей. Обратите внимание, что типы страниц и типы данных это разные вещи. Тип данных определяется на основе URL. Тип страниц же задается только для записей.

Давайте разберем типы страниц на примере WordPress. smile Как известно в WordPress можно создавать записи двух типов: записи, которые выводятся в ленте на главной (собственно сам блог) и постоянные страницы, которые не выводятся в лентах. Идея состояла в том, что постоянные страницы должны выводиться в редких частных случаях. Поскольку WordPress блоговый «движок», то такие страницы позволяют выводить какую-то статичную информацию, например: «О сайте», «Контакты» и т.п.

В отличие от постоянных страниц, обычным записям можно присваивать рубрики, метки и т.д. Остается загадкой, почему разработчики WordPress ввели все эти искусственные ограничения, поскольку технически никакой разницы между типами нет. К тому же поддержка постоянных страниц в WordPress сделана очень плохо. Впрочем, об этом я неоднократно писал на своем блоге.

В MaxSite CMS я, естественно, учел ограничения WordPress и сразу сделал так, чтобы все записи были равнозначны. Стандартно в системе есть два типа страниц: blog и static. Думаю, вы поняли, что blog - это аналог записей, а static - постоянных страниц в WordPress'е.

Типы страницы позволяют группировать записи. В какой-то мере это «плоский» аналог рубрик. Возьмем к примеру главную страницу. Мы знаем, что на ней выводятся только blog-записи (тип по-умолчанию).

В параметрах функции mso_get_pages() можно явно указать тип страниц, например static:

  1.  'type' => 'static'

В этом случае функция вернет записи только типа static. Если же указать:

  1.  'type' => false

то функция вернет записи всех типов.

Кстати, обратите внимание, что в отличие от WordPress, в MaxSite CMS слово «запись» имеет отношение к любой странице, поскольку понятия «постоянная страница» просто не существует.

То есть в принципе тип страниц можно использовать для тех записей, которые не требуют сложного деления на рубрики. Ну например на сайте вы захотите сделать что-то вроде twitter'а: вывод коротких заметок, реплик. Пускать такие записи на главную страницe вы не хотите. Можно, конечно сделать в виде рубрики, но тогда придется следить за ней. Использование типа страниц самый оптимальный вариант.

Для начала сделаем новый тип страниц (Основные -> Типы страниц), например «twitter».

Обратите внимание, что пока удалить созданные типы страниц нельзя. По идеологическим соображениям. smile Впрочем, в будущих версиях я думаю, решу этот вопрос.

Выводить наш twitter проще всего в сайдбаре. Соответственно располагаем виджет «last_pages_widget» (Последние записи). Если у вас уже есть такой виджет, то добавьте через пробел номер. После сохранения, переключаемся на виджеты и в настройках указываем заголовок, например «Мой twitter», тип страниц «twitter», а также формат вывода «%DATE%<br/>%TITLE%<br/>%TEXT%».

После этого создадим новую страницу и укажем её тип «twitter». Рубрики и все остальное можно не указывать.

Вот, собственно и всё. Наш twitter готов! smile

У вас как и прежде осталась возможность указывать метки, рубрики и т.п, то есть все теже возможности как и для любых страниц. Например на этом сайте для Центра помощи, помимо типа страниц «help» я указываю и рубрику. Это позволяет создать дополнительную навигацию.

Теперь давайте рассмотрим более сложный вариант: вывод нашего twitter на отдельной странице по адресу http://сайт/twitter

Как вы помните по предыдущим лекциям, в этом варианте у нас должен быть тип данных «twitter» (первый сегмент). Если на сайте не используется короткая ссылка (slug) «twitter», то мы можем в шаблоне анализировать этот сегмент и, соответственно, подключать его файл.

  1.  ...
  2.  if (mso_segment(1)=='twitter') require('type/twitter.php');
  3.  ...

Более надежный вариант - это создание файла типа в контролере. В этом варианте будет явно определен тип и его можно получить с помощью is_type(). Давайте разберем именно его.

Вначале скопируем файл controllers/contact.php как twitter.php в том же каталоге. Откроем его и изменим единственную строчку, чтобы получилось так:

  1.  $this->_view_i('twitter');

После этого в шаблонном index.php добавим условие, по которому будем подключать файл для вывода twitter-записей.

  1.  ...
  2.  elseif ( is_type('twitter') ) require('type/twitter.php');
  3.  ...

Обратите внимание, что мы явно указываем путь к каталогу «type», поскольку в дефолтном шаблоне его нет. Соответственно нужно его создать в вашем шаблоне. В него поместим файл twitter.php вот такого содержания:

  1.  <?php
  2.  mso_head_meta('title', 'Мой Twitter'); // meta title страницы
  3.   
  4.  # начальная часть шаблона
  5.  require(getinfo('template_dir') . 'main-start.php');
  6.   
  7.  # параметры для получения страниц
  8.  $par = array( 'type' => 'twitter', 'custom_type'=>'home', 'limit' => 10);
  9.  $pages = mso_get_pages($par, $pagination); // получили страницы
  10.   
  11.  if ($pages)
  12.  {
  13.      echo '<div>';
  14.      foreach ($pages as $page)  // выводим в цикле
  15.      {
  16.          extract($page);
  17.         
  18.          mso_page_title($page_slug, $page_title, '<h1>', '</h1>', false);
  19.          mso_page_date($page_date_publish, array('format' => 'd/m/Y H:i:s'),
  20.                      '<p><em>', '</em></p>');
  21.          if ($page_content)
  22.          {
  23.              echo '<div class="page_content">';
  24.              mso_page_content($page_content);
  25.              echo '</div>';
  26.          }
  27.      }
  28.      echo '</div>';
  29.  }
  30.  # конечная часть шаблона
  31.  require(getinfo('template_dir') . 'main-end.php');
  32.     
  33.  ?>

Как видите код очень простой и по комментариям всё понятно. Остановлюсь только на двух моментах.

В параметрах для получения страниц мы указываем

  1.  'type' => 'twitter'
  2.  и
  3.  'custom_type'=>'home'

Первый указывает на тип страниц, а второй указывает на тип данных. В нашем случае мы выводим записи как на главной, то есть «home». Если бы нам нужно вывести одиночную запись, то «custom_type» следует установить «page».

На самом деле у mso_get_pages() очень много параметров, но для нашего случая достаточно только этих. Технически, параметр «custom_type» указывает на то, как будет формироваться SQL-запрос.

Второй момент - это false в mso_page_title(). Этот параметр указывает нужно ли формировать ссылку на заголовке записи. В нашем случае это не требуется, поэтому и стоит false. Если же вам нужен переход на страницу записи, то укажите true.

В целом мы можем на этом остановиться, но мне бы хотелось еще немного попрограммировать wink и я предлагаю немного модифицировать вывод с тем, чтобы было как на настоящем Twitter'е. В частности в нем только первая запись выводится крупно, а остальные мелко.

Чтобы этого добиться мы просто введем счетчик, который будем увеличивать на единицу. Вот измененный кусок кода.

  1.  ...
  2.  if ($pages)
  3.  {
  4.      echo '<div>';
  5.      $count = 1; // счетчик
  6.      foreach ($pages as $page)  // выводим в цикле
  7.      {
  8.          extract($page);
  9.         
  10.          if ($count == 1)
  11.          {
  12.              mso_page_title($page_slug, $page_title, '<h1>', '</h1>', false);
  13.              mso_page_date($page_date_publish, array('format' => 'd/m/Y H:i:s'),
  14.                  '<p><em>', '</em></p>');
  15.              if ($page_content)
  16.              {
  17.                  echo '<div class="page_content">';
  18.                  mso_page_content($page_content);
  19.                  echo '</div>';
  20.              }
  21.          }
  22.          else
  23.          {
  24.              echo '<div class="page_content">';
  25.              mso_page_title($page_slug, $page_title, '', '', false);
  26.              mso_page_date($page_date_publish, array('format' => 'd/m/Y H:i:s'),
  27.                  ' - <em>', '</em>');
  28.              if ($page_content) mso_page_content($page_content);
  29.              echo '</div>';
  30.          }
  31.          $count++; // увеличили счетчик на 1
  32.      }
  33.      echo '</div>';
  34.  }
  35.  ...

Отличие только в том, что мы по другому формируем вывод для первой страницы.

При желании вы можете добавить вывод строки пагинации, но мне кажется, что это уже лишнее.

Еще такой момент. Поскольку в настоящем твитере используется только одно поле для текста, а у нас два, то на мой взгляд лучше всё-таки писать текст как текст, а заголовок как заголовок. В крайнем случае, можно убрать mso_page_title(). Просто когда вы будете делать длинные тексты в заголовках, то нужно будет следить и за короткой ссылкой, иначе она может оказаться очень длинной и это может привести к ошибкам: длина url имееет ограничения.

google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru