Flexo CMS — для небольших и средних сайтов

J
На сайте с 28.06.2011
Offline
83
#31
vold57:
Хотелось бы еще иметь хороший функционал новостей с возможностью добавлять блок новостей в нужную мне часть страницы. При создании и редактировании новости должны быть два поля - одно для полного текста, другое для анонса.

Хотел бы уже перевести на Flexo CMS один из своих сайтов и в связи с этим есть еще вопрос о том, когда будет работать отложенная публикация и когда все же будет реализован плагин для «кастомных» URL? Не хотелось бы адрес страницы слишком сильно растягивать и иметь в нем много слешей.

Для вывода новостей можно реализовать небольшой сниппет, назвать его, например, news_block.

Код сниппета news_block:

<?php
$page = (isset($page) && is_object($page) ? $page: $this);
$limit = isset($limit) ? $limit: null;
?>

<ul class="news">
<?php foreach ($page->children(array('where' => 'page.published_on <= NOW()', 'limit' => $limit)) as $child): ?>
<li>
<h3><?php echo $child->link(); ?></h3>
<div class="news-content">
<?php echo $child->content('short'); ?>
</div>
</li>
<?php endforeach; ?>
</ul>

UPD. Немножко подправил сниппет — исправил параметры. По умолчанию, если не указан параметр limit, будут выводиться все новости; и если не указан параметр page — будет считаться, что текущая страница на которой вставлен сниппет и есть раздел «Новости».

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

Допустим, у вас есть раздел с названием «Новости», и полем slug «новости» соответственно (Flexo CMS по умолчанию поддерживает кириллические адреса), конечно вы можете использовать slug «news».

Допустим, у каждой страницы из раздела «Новости» есть части: body и short.

Допустим, в корневой странице имеется часть sidebar, которая используется в шаблоне и отображает сайдбар, подключается <?php echo $this->content('sidebar', true); ?>

Открываем корневую страницу, добавляем следующий код в часть sidebar:

<h2>Последние новости</h2>

<?php $this->includeSnippet('news_block', array('page' => $this->find('новости'), 'limit' => 3)); ?>

UPD. Небольшое замечание по поводу вставки данного кода в часть sidebar. Необходимо сначала отключить визуальный редактор у части sidebar. «Шестеренка» напротив sidebar → Фильтр → Установить «– отсутствует–».

Еще стоит обратить внимание на параметр $this->find('новости'). Если вы при создании раздела «Новости» используете уникальный slug, например, «news», то необходимо заменить 'новости' на 'news' → $this->find('news').

Все, теперь, если все сделано правильно, на страницах должны появиться новости.

Сниппет должен сгенерировать следующий код:

<ul class="news">
<li>
<h3><a href="...">New article with pending 2</a></h3>
<div class="news-content">
<p>Pending article short description 2.</p>
</div>
</li>
<li>
<h3><a href="...">New article with pending 1</a></h3>
<div class="news-content">
<p>Pending article short description 1.</p>
</div>
</li>
<li>
<h3><a href="...">GoogleServe 2011: Giving back around the world</a></h3>
<div class="news-content">
<p>Over the last month, more than 7,700 Googlers helped serve their communities across 400 different projects as part of GoogleServe, an employee-driven initiative organized almost entirely by volunteers. Through partnerships with nonprofits, schools and local governments, Googlers from 119 cities in 36 countries helped communities in need with projects ranging from educating youth about online bullying to cleaning up local rivers and parks.&nbsp;</p>
</div>
</li>
</ul>

Параметры сниппета news_block:

  • page — сюда нужно передавать объект страницы. Можно передавать $this, а можно $this->find( string $URI ).
  • limit — можно не указывать. Параметр отвечает за количество выводимых на страницах новостей. По умолчанию будет выводиться 3 последних. По умолчанию будут выводиться все новости.

Теперь приятная новость. Сниппет не будет выводить те новости, у которых статус «Ожидает». Это видно из параметров выборки страниц-потомков:

$page->children(array('where' => 'page.published_on <= NOW()', 'limit' => $limit))

Кстати, достаточно удобно использовать при выборке потомков небольшие SQL вставки в параметрах. Зная структуру таблицы page, можно манипулировать выводом данных из этой таблицы.

Можно немножко расширить сниппет и использовать плагин Page images для вывода новостей с изображениями. Если необходима такая функциональность — опишу подробней.

UPD. По поводу «катстомных» адресов для страниц — в ближайшее время сделаю плагин. В пределах недели.

vold57
На сайте с 01.10.2007
Offline
261
#32

С блоком новостей все отлично получилось. Спасибо.

Теперь бы еще поиск по сайту сделать.

Аудит сайтов - главная часть это тщательная ручная работа, а не отчеты сервисов и программ (https://vold57.com/audit). Продвижение сайтов (https://vold57.com/seo)
J
На сайте с 28.06.2011
Offline
83
#33
vold57:
С блоком новостей все отлично получилось. Спасибо.
Теперь бы еще поиск по сайту сделать.

Пока нет специального плагина для поиска по сайту. Можно использовать пользовательский поиск Google.

Наработки по плагину поиска еще остались от Frog CMS, поэтому старый плагин будет адаптирован под Flexo. Поэтому советую набраться терпения. ;)

Если поиск необходим просто здесь и сейчас, то можно воспользоваться сниппетом, который называю, «ленивый поиск», код сниппета:

<?php

if (!function_exists('snippet_sitesearch'))
{
function snippet_sitesearch($page, $query)
{
$out = '';

$childs = $page->children();

if (count($childs) > 0)
{
foreach ($childs as $child)
{
if (stristr($child->title(), $query))
{
$out .= '<li><strong>' . $child->link($child->breadcrumb) . '</strong></li>';
}

$out .= snippet_sitesearch($child, $query);
}
}

$out = str_replace('<li><li>', '<li>', $out);
$out = str_replace('</li></li>', '</li>', $out);

return $out;
}
}

$query = (isset($_POST['query']) ? $_POST['query']: null);
$results = ($query !== null ? snippet_sitesearch($this->parent(0), $query): false);

?>

<form id="searchForm" method="post">
<p id="searchQuery"><input id="searchQueryField" type="text" name="query" value="<?php if ($query !== null) echo($query); ?>" /></p>
<p id="searchSubmit"><input id="searchSubmitButton" type="submit" value="Найти" /></p>
</form>

<?php if ($results !== false): ?>

<div id="searchResults">
<p>Результаты поиска для: «<strong><?php echo $query; ?></strong>»:</p>

<?php if ($results != null): ?>
<ol>
<?php echo $results; ?>
</ol>
<?php else: ?>
<p>Совпадений не обнаружено.</p>
<?php endif; ?>
</div>

<?php endif; ?>

Как использовать этот сниппет:

  • Создать сниппет sitesearch
  • Создать страницу «Поиск», вставить сниппет в часть body, код <?php $this->includeSnippet('sitesearch'); ?>

Примечание: На странице поиска перед вставкой кода для пункта (2) необходимо сначала выключить WYSIWYG-редактор Tinymce (шестеренка напротив части body).

Недостатки этого сниппета:

  • Низкая производительность
  • Поиск только по заголовкам страниц

Код для оформления формы поиска с других страниц сайта:

Если страница «Поиск» имеет slug «search», то нам необходим следующий код:

<form id="searchForm" method="post" action="<?php echo get_url('search'); ?>">
<p id="searchQuery"><input id="searchQueryField" type="text" name="query" /></p>
<p id="searchSubmit"><input id="searchSubmitButton" type="submit" value="Найти" /></p>
</form>
vold57
На сайте с 01.10.2007
Offline
261
#34

При работе с новостями обнаружились некоторые недостатки.

1. В блоке новостей дата и время добавления новости отображается правильно - 07/31/11 22:20:34 PM, а вот на странице новостей, на которой выводятся анонсы новостей показывает - 07/31/11 00:00:00 AM. И так для всех новостей. Время добавления - 00:00:00 AM.

2. В снипете анонсов по умолчанию стоит $limit = isset($limit) ? $limit: null; В этом случае на странице выводятся анонсы всех новостей. Если прописать, например - $limit = isset($limit) ? $limit: 8;, то будет выводится 8 анонсов. В обоих случаях создается только одна страница новостей. Оба варианта не годятся. Нужно, чтобы CMS при достижении лиммита создавала новые страницы для вывода новостей. Для $limit: null; тоже нужно предусмотреть значение по умолчанию, например 10.

3. Оформление анонсов на странице новостей берется из дизайна блоков новостей. Нужно, чтобы на анонсов можно было внешний вид настраивать отдельно.

P.S. Сейчас заметил, что дата и время добавления у всех новостей в блоке новостей одно и то же - 07/31/11 22:20:34 PM, хотя добавлял сегодня.

J
На сайте с 28.06.2011
Offline
83
#35
vold57:
При работе с новостями обнаружились некоторые недостатки.

1. В блоке новостей дата и время добавления новости отображается правильно - 07/31/11 22:20:34 PM, а вот на странице новостей, на которой выводятся анонсы новостей показывает - 07/31/11 00:00:00 AM. И так для всех новостей. Время добавления - 00:00:00 AM.

2. В снипете анонсов по умолчанию стоит $limit = isset($limit) ? $limit: null; В этом случае на странице выводятся анонсы всех новостей. Если прописать, например - $limit = isset($limit) ? $limit: 8;, то будет выводится 8 анонсов. В обоих случаях создается только одна страница новостей. Оба варианта не годятся. Нужно, чтобы CMS при достижении лиммита создавала новые страницы для вывода новостей. Для $limit: null; тоже нужно предусмотреть значение по умолчанию, например 10.

3. Оформление анонсов на странице новостей берется из дизайна блоков новостей. Нужно, чтобы на анонсов можно было внешний вид настраивать отдельно.

P.S. Сейчас заметил, что дата и время добавления у всех новостей в блоке новостей одно и то же - 07/31/11 22:20:34 PM, хотя добавлял сегодня.

> 1.

Я подозреваю, что новости у вас выводятся подобным сниппетом (код сниппета заведомо не верный):

<?php foreach ($this->find('news')->children() as $page): ?>

<?php echo $this->date(); ?>
<?php endforeach; ?>

В данном случае выводится дата страницы на которой располагается сниппет <?php echo $this->date(); ?>, вам же необходимо выводить дату новости, то есть павильно писать <?php echo $page->date(); ?>.

Правильный код сниппета:

<?php foreach ($this->find('news')->children() as $page): ?>

<?php echo $page->date(); ?>
<?php endforeach; ?>

> 2.

Да, это недостаток сниппета. Чуть позже приведу более универсальный пример.

Запустил сайт http://flexo.up.dn.ua/ где расположена документация, расширения. По мере возможностей будет пополнятся новыми разделами.

Если есть вопросы или пожелания, письма направляйте на flexo@up.dn.ua

R
На сайте с 13.06.2009
Offline
47
#36
jmas:

@melkozaur, система распространяется по лицензии GPL v3. Flexo CMS можно считать бесплатной для разработки коммерческих проектов на базе этой системы.

Она же ведь не совсем свободная. И подразумевает под собой открытость исходников всего того, что было на ней сделано. Т.е. если вы скажем реализовали какое-то интересное расширение и не хотели им делится то, вам придется это сделать.

P.S. Возможно я ошибаюсь т.к. я все-таки не спец по лицензиям.

J
На сайте с 28.06.2011
Offline
83
#37
recrut:
Она же ведь не совсем свободная. И подразумевает под собой открытость исходников всего того, что было на ней сделано. Т.е. если вы скажем реализовали какое-то интересное расширение и не хотели им делится то, вам придется это сделать.

P.S. Возможно я ошибаюсь т.к. я все-таки не спец по лицензиям.

Компоненты или плагины могут быть лицензированы под другими лицензиями, в том числе и коммерческими, т.к. авторы системы не разрабатывали эти плагины так ведь? Или я ошибаюсь? 🙄

Кстати большое спасибо всем, кто поддерживает, хоть даже виртуальными плюсами! :)

R
На сайте с 13.06.2009
Offline
47
#38
jmas:
Компоненты или плагины могут быть лицензированы под другими лицензиями, в том числе и коммерческими, т.к. авторы системы не разрабатывали эти плагины так ведь? Или я ошибаюсь? 🙄

По моему ошибаетесь. Лицензия GPL запрещает использование других лицензий. Т.е. все что связано с вашей CMS должно быть под GPL, а это подразумевает открытость кода. А вот BSD и MIT уже идут полностью свободными.

J
На сайте с 28.06.2011
Offline
83
#39
recrut:
По моему ошибаетесь. Лицензия GPL запрещает использование других лицензий. Т.е. все что связано с вашей CMS должно быть под GPL, а это подразумевает открытость кода. А вот BSD и MIT уже идут полностью свободными.

Спасибо, буду заниматься этим вопросом подробней.

UPD. Вот пока нашел некоторую информацию по теме:

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

NVIDIA обошла GPL в драйверах для Линукса, назвав свой код «библиотекой» и написав открытую прослойку для этой «библиотеки». :) Забавно…

Ayavryk
На сайте с 11.10.2003
Offline
209
#40
jmas:
принять решение: пользоваться или нет.

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

Даже если CMS очень и очень хорошая.

Тынгыр, мынгыр, комсомол (http://erum.ru). Ехари, ехари, (жалобно) аяврик. /народная тунгусская песня/

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий