Часто типы страниц путают с типом данных. Стандартно в MaxSite CMS тип данных определяется по URL. Например для рубрик используется префикс category (http://сайт/category/XXX), для меток - tag (http://сайт/tag/XXX), для страниц - page (http://сайт/page/XXX) и т.п.
Тип страниц же задаётся в админ-панели. Изначально присутствует два типа blog и static, но без проблем можно добавить другие типы. Страницы типа blog предназначены для вывода на главной странице и в лентах записей, например рубрики, метки и т.п. Тип static предназначен для тех записей, которые не должны быть выведены в таких лентах. Обычно это некая фиксированная «статичная» страница, например «О себе», «Контакты» и т.п. Доступ к таким страницам осуществляется по прямой ссылке, которые как правило размещают в меню или сайдбаре.
Для обычных блогерских задач типов «blog» и «static» вполне достаточно. В самом простом варианте типы страниц используются для дополнительной группировки. Например с помощью виджета «Последние записи» можно организовать вывод определенного типа. Когда таких записей немного, то они все располагаются в сайдбаре. Если же статей много, то необходимо задать вывод в шаблоне сайта.
Предположим мы хотим на сайте организовать какой-то отдельный тематический раздел (например book). В этом разделе записи будут выводиться обычной лентой (как в рубриках), только в алфавитном порядке.
Для начала сделаем в админ-панели новый тип book. Настройки основные - Типы страниц:
Обратите внимание, что удалить тип страниц нельзя.
Теперь при создании или редактировании записей можно будет выбрать тип book.
Сделаем пару записей для теста с этим типом и, чтобы убедиться в полной работоспособности, разместим виджет последних записей.
Далее в настройках виджета указываем тип страниц.
После этого можно убедиться, что виджет появился в сайдбаре сайта.
Теперь давайте разберёмся как выводить book-записи на отдельной странице. Для этого есть несколько вариантов. Мы остановимся на создании отдельного типа данных - book. То есть наши записи будут выводиться по адресу http://сайт/book. Адрес может быть произвольным - он никак не связан с типом страниц.
Поскольку записи будут выводиться как в рубриках, то скопируем файл type/category.php из default-шаблона в type-каталог своего шаблона. Переименуем файл в book.php. MaxSite CMS автоматически сопоставит book в адресе с файлом book.php.
Если перейти на http://сайт/book, то увидим 404-страницу. Это происходит из-за того, что в файле получается тип данных book - тип данных, который не определен по-умолчанию в системе и для него неизвестен алгоритм получения страниц. Исправляется это очень просто. Открываем файл и находим строчку
... // параметры для получения страниц $par = array( ...
Это массив, в котором следует указать нужные нам параметры.
Добавляем ключи:
... 'custom_type' => 'home', 'type' => 'book', 'order' => 'page_title', 'order_asc' => 'asc', ...
Первый ключ указывает алгоритм, по которому формируются SQL-запросы. У нас обычный вариант, как на главной, поэтому ставим home. Второй - указывает на тип страниц.
Поскольку мы хотим выводить записи по алфавиту, то задаём order (поле сортировки) и order_asc (порядок).
Обновляем страницу и видим, что book-записи прекрасно выводятся.
Правда, поскольку у нас исходный файл от вывода рубрик, то в «наследство» мы получили и некоторые блоки от рубрик. Нет особой сложности в том, чтобы удалить блок «category_show_rss_text». В блоке «category-show-desc» можно вывести какое-то своё описание book-записей. Также нужно будет добавить в mso_head_meta() свои значения для title.
С точки зрения MaxSite CMS между типами страниц нет никакой принципиальной разницы. Всё дело только в том, как организовать их получение и вывод записей. Самый простой - связать по адресу. Получение же страниц - стандартная функция mso_get_pages(), которая присутствует во всех типах данных.
Спасибо за идею статьи Александру Шиллингу! Вы также можете предложить свой вариант.
Комментариев: 24 RSS
1Аноним16-05-2011 17:13
Максим, спасибо за статью!
2AntonOFF31-05-2011 06:46
Во как!
А я на днях думал уже на это тему!
Спасибо, что подсказали.
3Дмитрий25-06-2011 20:11
Но если действовать данным способом,то в сайдбаре все равно ссылка идет http://сайт/page/statya, а не http://сайт/book/statya,то есть получается дублирование страницы, в чем смысла нет
4Аноним26-06-2011 10:46
Потому что для записей в системе используется тип данных page. Если требуется скрыть в адресе page, то для сайдбара нужно предусмотреть свой виджет, где формируются ссылки по своим правилам. Для вывода же конечной страницы достаточно в type_foreach-файле page-mso-get-pages.php указать тип получаемых страниц.
5Аноним01-07-2011 22:43
А у меня не вышло :(
На последнем этапе вместо записей о книгах появляются старые записи. Причём одна запись типа book туда попала... А две других, сделанных ранее, нет. Версия 0.53
6Аноним01-07-2011 22:44
А можно привести полностью блок $par?
7Аноним02-07-2011 08:10
8Аноним02-07-2011 12:15
Наверное я торможу, но никак не соображу, как сделать вывод в несколько колонок, типа http://news.swarog.ru/books/
И ещё, Книга это структурированный объект с полями. Есть ли возможность организовать ввод данных в книгу как заполнение формы, где текст - одно из полей? Куда копать?
9Аноним02-07-2011 18:22
Несколько колонок делается так: вводится счетчик записей и по нечетным это одна колонка, по четным другая. Если вывод табличный, то попарно раскидываем в ячейки одной строки. Если это div'ы, то вначале выводим N/2 записей в одном блоке, остальные во втором.
Проще всего в meta.ini шаблона. Как вариант аля-forms.
10Аноним02-07-2011 18:32
Так у меня даже options.ini не подцепляется, а где искать meta.ini даже и не знаю. В папке шаблона лежат, скопированы из default. Иногда промелькнёт пункт «настройка шаблона» но туда не пускает, и он исчезает сразу :(
Собственно, задача стояла так: на плоских файлах, благо у меня есть самопис для работы с ними, сделать хранилище текущих книг, которые есть в продаже. Их вряд ли будет больше сотни. В DLE я сделал через настраиваемые поля записи, а тут такие есть? И как до них добраться?
11Аноним02-07-2011 18:41
Где промелькнёт? Кто не пускает?
Примеры: meta.ini - default шаблон. Опции - clouds.
12Аноним02-07-2011 19:04
Я сделал шаблон по Вашей инструкции (swarog.ru). Из default скопировал *.ini в папку шаблона. Как я понял, они должны подцепляться автоматически, и это отражается в админке появлением соответствующих пунктов меню. У меня они не подцепились, поэтому пришлось настройку меню перебросить в глобальный ini, что, конечно, некорректно.
Поскольку мне МАХ понравился, пытаюсь подогнать его под свои нужды.
Эх, если б он ещё без мускула работал, на одних файлах... Мечты :)
13Аноним02-07-2011 19:16
Опции - это связка options.php и options.ini. См. Clouds. Meta.ini подхватываются автоматом.
14Аноним02-07-2011 19:36
Спасибо, допёр
15Аноним04-07-2011 11:45
Извините за навязчивость, есть ещё вопросы:
1)Как сформировать ленту для нового класса? По умолчанию выдаёт http://swarog.ru/book//feed, внутри пусто.
2)Внутри файла book.php полно хвостов от category. Как определить, какие из них нужны?
2.1) Наверное, логично, чтобы вместо category_name и др. работать с book_name. А где это определяется?
2.2) Можно ли связать с типом страницы стилевой файл, который подцеплялся бы автоматически?
3) В тексте book.php есть такие строчки:
if ($f = mso_page_foreach('info-top'))
{
require($f); // подключаем кастомный вывод
}
Смысл понятен, а где это кастомный вывод взять? В статье о нем ни слова не нашёл. :(
4) Как сделать, чтобы мета-поля типа book были видны при редактировании только страниц этого типа? Как вариант: как добавить с меню пункт «Создать новую книгу»
Извините за повторные посылки, редактор обрезал текст
16Аноним04-07-2011 13:23
Отвечу чуть позже. Но судя по вашим вопросам вы решили поженить тип страниц и тип данных. Или опять их путаете. Не проще ли было в вашем случае сделать отдельный тип данных и от этого плясать?
17Аноним04-07-2011 14:24
Может и так, я паскалист, для меня весь мир - тип данных :)
18Аноним04-07-2011 17:58
Не класса, а типа данных. Если у вас не объявлен тип данных, подключится стандартный feed-home.php. Следовательно, в своём шаблоне сделайте этот type-файл - он и будет принимать управление выводом. Вся логика подключения в index.php шаблона.
Посмотреть по смыслу.
Вообще-то это поля из базы данных. Вряд ли там есть book_.
Элементарно. В header.php смотрите тип страницы и по условию подключаете нужные стили.
В type_foreach-файле default шаблона. Но вообще это содержимое от объявления type_foreach-файла до конца foreach-цикла.
При создании записи неизвестен её будущий тип, или при редактировании он может смениться. Поэтому meta.ini выводится для всех записей. В принципе было бы интересно подумать как сделать шаблоны для новых страниц, основанных на типах, но там сложность в том, что автору нужно заранее знать тип страницы. Тогда вроде бы можно было делать запись по предусмотренному шаблону.
Правда, пока я не вижу в этом большого смысла.
19Аноним17-08-2011 10:04
чтото не получается подключить(
20Аноним17-08-2011 14:01
вчём именно у вас проблемма?
21Аноним08-05-2012 19:25
Как можно вывести статичный текст в конкретной рубрике?
22Аноним11-10-2013 12:29
Здравствуйте, понадобилось на одном сайте сделать каталог статей. Я решил его создать при помощи типов страниц и типа данных. Вот что я сделал:
1. Создал тип страниц "article".
2. Загрузил в папку type своего шаблона папку "article" с файлами, отвечающими за вывод страниц данного типа. адрес статей имеет вид адрессайта/article/названиестатьи.
Они открываются нормально.
3. Создал по инструкции в этой статье папку "articles", закачал туда папку и файл из shared/type/category, переименовал файл category.php в articles.php.
4. Заменил код по вашей инструкции, но почему-то статьи не выводятся - выводится ошибка 404.
Буду благодарен, если скажите, где ошибка: http://rghost.ru/49306864
Заранее спасибо.
23Аноним11-10-2013 12:42
Значит что-то мешает получить список записей или таких записей нет. Посмотрите другие параметры mso_get_pages(), может что-то не так указали.
24Аноним12-10-2013 15:51
Здравствуйте. Всё правильно, а mso_get_pages в файле articles.php один:
$pages = mso_get_pages($par, $pagination);
в units-файлах вовсе mso_get_pages нет.