Перейти к содержимому


- - - - -

Похожие страницы


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 blacktop

blacktop

    Активный участник

  • Пользователи
  • PipPipPip
  • 51 сообщений

Отправлено 16.12.2009, 09:32

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

К примеру есть раздел "Фрукты", в нем страница "Апельсин", внизу страницы надо вывести:
читайте также:
(линк на)Мандарин
(линк на)Яблоко

Для зебры 1.х решение здесь: http://zebrum.ru/for...p?showtopic=431

#2 support

support

    Активный участник

  • Главные администраторы
  • PipPipPip
  • 1 140 сообщений

Отправлено 16.12.2009, 13:09

Один из возможных вариантов:

<?php
$page = null;

function only_section_news ($value) {
		return strpos($value, '/news/') === 0;
}

$pages = array_filter(zengine::repository()->getTaxonomy('time')->fetch(), 'only_section_news');

while (count($pages)) {
		$i = array_rand($pages);
		$page = zengine::getPage($pages[$i]);
		if (!$page || $page->getTime() > zdate::time()) {
				unset($pages[$i]);
				$page = null;
		} else {
				break;
		}
}
if ($page) {
		echo '<a href="' . $page->getLink() . '">' . htmlspecialchars($page->getTitle()) . '</a>';
}
?>

Этот же код можно оформить в виде виджета, создав файл zcontent/extensions/zebrum/randompages.php со следующим содержимым:

<?php
class zebrum_randompages extends zwidget_abstract
{
	/**
	 * Отображает содержимое виджета
	 */
	public function displayContent ()
	{
		$pages = zengine::repository()->getTaxonomy('time')->fetch();
		$this->params['childs_of'] = rtrim($this->params['childs_of'], '/');
		if (!empty($this->params['childs_of'])) {
			$this->params['childs_of'] .= '/';
			$pages = array_filter($pages, array($this, 'filter'));
		}

		$number = 0;
		$htmlParts = array();
		while (count($pages)) {
			$i = array_rand($pages);
			$page = zengine::getPage($pages[$i]);
			if ($page && !($page->getTime() > zdate::time())) {
				$htmlParts[] = '<a href="' . $page->getLink() . '">' . htmlspecialchars($page->getTitle()) . '</a>';
				if (++$number >= $this->params['number']) {
					break;
				}
			}
			unset($pages[$i]);
		}

		if (!$number) {
			return;
		}

		echo $this->params['before'] . implode($this->params['separator'], $htmlParts) . $this->params['after'];
	}

	/**
	 * Возвращает true, если страница $pagepath находится в разделе $this->params['childs_of']
	 *
	 * @param string $pagepath
	 * @return boolean
	 */
	protected function filter ($pagepath)
	{
		return strpos($pagepath, $this->params['childs_of']) === 0;
	}

	/**
	 * Опции виджета по умолчанию
	 *
	 * @var array
	 */
	protected $defaults = array(
		'childs_of' => '',
		'number' => 5,
		'before' => '<ul><li>',
		'separator' => '</li><li>',
		'after' => '</li></ul>',
	);
}

Здесь в качестве папки для расширения была выбрана папка zebrum и, соответственно, название виджета содержит приставку zebrum_.

Вызывать виджет в шаблоне (или page.php) можно либо из сайдбара, либо напрямую (одна ссылка на рандомную страницу из раздела /news):

<?php
$widget = new zebrum_randompages(null, array(
	'childs_of' => '/news',
	'number' => 1,
	'before' => '',
	'after' => '',
	'before_widget' => '',
	'after_widget' => '',
));
echo $widget->display();
?>

Результат:

<a href="/news/versiya-1.0.3/">Версия 1.0.3</a>

Вызов:

<?php
$widget = new zebrum_randompages(null, array(
	'childs_of' => '/news',
	'number' => 5,
	'before_widget' => '<p><strong>Ссылки по теме:</strong></p>',
	'after_widget' => '',
));
echo $widget->display();
?>

Результат (отступы были добавлены для наглядности представления результата):

<p><strong>Ссылки по теме:</strong></p>
<ul>
  <li><a href="/news/versiya-1.0.4/">Версия 1.0.4</a></li>
  <li><a href="/news/versiya-1.0.3/">Версия 1.0.3</a></li>
  <li><a href="/news/versiya-1.0.6/">Версия 1.0.6</a></li>
  <li><a href="/news/versiya-1.0.14/">Версия 1.0.14</a></li>
  <li><a href="/news/versiya-1.0.9/">Версия 1.0.9</a></li>
</ul>


#3 blacktop

blacktop

    Активный участник

  • Пользователи
  • PipPipPip
  • 51 сообщений

Отправлено 17.12.2009, 00:56

Огромное спасибо!
Всегда был высокого мнения о команде Zebrum, теперь я только укрепился в своих взглядах.




Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 скрытых пользователей