jmas

Рейтинг
83
Регистрация
28.06.2011
Разработчик
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

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>
autocalc:
Привет! У меня есть файл php, который по ajax запросу отправляет результат вычислений. Т.к. Этот файл чист от лишней информации, у некоторых юзеров может возникнуть желание вставить его себе на сайт через iframe.
Вопрос: можно ли настроить CHMOD, разрешающий обработку внутри сервера, и запрещающий запросы с внешних серверов?

Можно сделать проверку через JavaScript:


<script language="text/javascrip">
if (location.host != 'www.site.com')
{
location.replace('http://google.com/');
}
</script>

Либо положить в корень сайта .htaccess с параметрами для определенного файла:

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond %{HTTP_REFERER} !^http://mysite.com/.*$ [NC]
RewriteRule ^file.php$ http://google.com/search?q=$0 [L]
</IfModule>

Последний код не проверял.

UPD. Пардон, немножко извиняюсь первый код нужно сделать проверку родительского окна, а не location.host фрейма. Пишем так:


<script language="text/javascrip">
if (window.parent != undefined && window.parent.location.host != 'www.site.com')
{
window.parent.location.replace('http://google.com/'); /*здесь можно схитрить и подставить главную своего сайта*/
}
</script>

То есть если люди будут устанавливать ваш HTML файл в IFRAME на своем сайте — посетителей будет перенаправлять на ваш. ;)

-= Serafim =-:
Вы можете сделать их с расширением php.


Это Ваши домыслы и только. Бан сайтов вяжете с "трастом" и тянете сюда еще и IP.

Предположение лишь. Не судите строго.

-= Serafim =-:
Откуда Вам это известно?

Предположил, когда гугл убил все сайты из индекса на .CO.UK (на этой площадке было слишком много дорвеев и фейков). Если поразмыслить логически, то должен существовать механизм траста к определенным площадкам, исходя из размещенного на них контента.

Veditos:
Ну IP никак не смогут остаться теми же. А чем это может грозить?


Я не знаю как называется эта тема WP. Помоему она платная.

А какой ещё софт кроме Teleport Pro можно использовать для этого?

Насколько мне известно, гугл смотрит историю изменения IP адресов сайта, поэтому различным площадкам он может присваивать свой траст что ли. Поэтому если вы разместите сайт на площадке, где траст к ней меньше, чем на той что было — это может как то спровоцировать гугл. Я бы лучше посоветовал использовать тот же хостинг на котором располагались старые сайты, либо использовать нормальный хостинг, где мало «черных» и «серых» сайтов на одном IP.

Veditos:
Привет уважаемые участники форума. Если ошибся топиком, то прошу извинить, но вопрос всё же больше по Гуглу.

Неделю назад купил 11 MFA сайтов с трафиком и доходом в Google Adsense за немалую сумму. Сайты на Wordpress на английском, простые не более 5 страниц.
Продавец из США (общаемся на инглише) по началу отвечал в Скайпе, в течение нескольких дней передал мне домены на акк Godaddy. Дальше стал меня как бы игнорить, и не отвечать на на вопросы, или отвечать раз в 2 дня.
Выяснилось, что этот дятел НЕ ЗНАЕТ КАК передать мне базы данных и файлы Wordpress, да и большого желания сделать видимо у него нет. Затратив большие усилия я объяснил ему как сдампить Wordpress базы. Также удалось получить zip архив одного сайта, архив оказался битый.

Сейчас не знаю, что лучше сделать. Если бы он меня просто кинул, тут бы было ясно.

Вопрос: Домены у меня есть. Можно ли взять и просто скопировать сайты каким-нибудь
Teleport Pro и вставить свой код Adsense? Не последует пессимизации со стороны гугла?

Я думаю, что если просто спарсить контент 1 в 1 с точно такой же не тронутой разметкой, то гугл даже не заподозрит подмены, если конечно IP останутся теми же.

Телепорт кажется как то коверкает HTML-структуру (я не уверен на 100%), что нехорошо.

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:
Спасибо. В терпении отвечать на вопросы вам не откажешь :)

Вы не поверите, но отвечать на вопросы по системе доставляет мне удовольствие, поэтому не стесняйтесь — спрашивайте.

vold57:
jmas, на примере, который вы привели как использовать «Добавить часть страницы», я увидел полезность этой возможности. В то время как подобные задачи, в некоторых других CMS я решал с помощью разных шаблонов, во Flexo CMS решается удобно в рамках одного шаблона.
Покажите также на примере как можно использовать «Добавить поле».

«Добавить поле» (включен плагин Page fields) — плагин фактически дублирующий функциональность частей. Это факт. За исключением нескольких особенностей. 1. Поля более компактные 2. Поля могут содержать максимум 255 символов, поэтому работа с этими полями должна быть значительно быстрей, чем с полями типа TEXT, которыми являются части. UPD. Планируется в будущем добавить специальные типы полей: выпадающий список, чекбоксы…

Использовать поля можно таким образом:

<?php echo $this->fields->my_field; ?>

В такие «поля» можно загонять, например, цену продукта (если у вас каталог продукции), дополнительные SEO-поля, если не достаточно стандартных, ссылки, если у вас реализовано портфолио с работами, и т.д.…

Так же доступ к полям работает и при получении потомков, например:


<ul>
<?php foreach ($this->children() as $page): ?>
<li><a href="<?php echo $page->fields->site_url; ?>"><?php echo $page->title(); ?></a></li>
<?php endforeach; ?>
</ul>

Можно совместить с плагином подключаемых изображений (включен плагин Page images):


<ul>
<?php foreach ($this->children() as $page): ?>
<?php $image = $page->images->findOne(); ?>
<li><a href="<?php echo $page->fields->site_url; ?>"><img src="<?php echo (empty($image) ? PUBLIC_URL.'images/no-image.gif': $image->url()); ?>" alt="<?php echo $page->title(); ?>" /> <?php echo $page->title(); ?></a></li>
<?php endforeach; ?>
</ul>

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

UPD. Забыл добавить по какому принципу формируется список полей, если добавляется новая страница. Все просто. Список полей берется из последней добавленной страницы, из раздела в который добавляется страница (старшая сестра — у которой наибольшая ID в данном разделе). По такому же принципу работают и части.

Всего: 133