Плагин aceWidgetManager - включаем/выключаем виджеты по расписанию и по условиям

Если вы еще не знаете, что это за плагин такой aceWidgetManager, то для начала читаем:
Часть 0: Бесплатный плагин aceWidgetManager (бывший aceBlockManager)
Часть 1: Инструкция по применению
Часть 2: Наглядные примеры использования

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

Иногда нужно виджет выключить на время, а потом опять включить, а потом опять выключить. Для этого есть опция 'display'. Достаточно задать ей значение false (или просто 0) — и виджет не будет отображаться:
$config['widgets'][] = array(
    'name' => 'blocks/block.something.tpl', // название шаблона виджета
    'group' => 'right', // позиционирование
    'display' => false, // отключить виджет
);

Потом задали там же значение true (или 1) — виджет опять включился.

А что, если нужно отключить виджет в точно назначенное время? Например, вы объявили какой-то конкурс и повесили баннер о конкурсе (как это сделать — см. в предыдущей статье). Но конкурс должен завершиться в новогоднюю ночь строго в полночь. И как быть? Одной рукой держать бокал с шампанским, а другой — стучать по клаве? Нет, поручите это плагину, а сами отдыхайте и веселитесь:
$config['widgets'][] = array(
    'name' => 'template', // название пустого виджета
    'group' => 'right', // позиционирование
    'params' => array(
        'plugin' => 'acewidgetmanager', //
        'title' => 'Клевый конкурс',
        'text' => '<a href="#"><img src="/uploads/banner/pic.png"></a>', 
    ),
    'display' => array('date_upto'=>'2012-12-31 23:59:59'),
);

Просто? По-моему, проще некуда.

А можно задать и временной период для вывода виджета. Например, вы продали Яндексу рекламное место на сайте строго на 10 дней — с 11 по 20 декабря включительно:
$config['widgets'][] = array(
    'name' => 'template', // название пустого виджета
    'group' => 'right', // позиционирование
    'params' => array(
        'plugin' => 'acewidgetmanager', //
        'title' => 'Клевый конкурс',
        'text' => '<a href="#"><img src="/uploads/banner/pic.png"></a>', 
    ),
    'display' => array('date_from'=>'2012-12-10', 'date_upto'=>'2012-12-21'),
);

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

ВАЖНО! Дата и время берутся из настроек сервера, поэтому учитывайте, пожалуйста, сдвиг по часовым поясам.

Но это еще не все! Для более продвинутых админов сайта, которые знают, что такое php и с чем его едят, есть дополнительная возможность: можно задавать произвольное php-выражение (в виде строки), которое вычисляется при инициализации виджетов. Если результат вычисления выражения равен true, то виджет выводится, иначе — нет (значение опции по умолчанию — true).

Например, так можно показать виджет только зарегистрированным и залогиненным пользователям:
$config['widgets'][] = array(
    'name' => 'blocks/block.something.tpl', // название шаблона виджета
    'group' => 'right', // позиционирование
    'condition' => '$this->User_GetUserCurrent()', 
);

А вот так можно задать демонстрацию виджета только по понедельникам:
$config['widgets'][] = array(
    'name' => 'blocks/block.something.tpl', // название шаблона виджета
    'group' => 'right', // позиционирование
    'condition' => 'date("N")==1', 
);

А вот так виджет может показываться пользователю с IP 192.168.0.1:
$config['blocks'][] = array(
    'block' => '...', // название блока
    'position' => 'right', // позиционирование блока
    'params' => array(
    ),
    'condition' => '$_SERVER["REMOTE_ADDR"]=="192.168.0.1"', 
);

Ну, я думаю, принцип ясен. И теперь, с таким мощным и гибким инструментом, как aceWidgetManager, возможности манипулирования виджетами ограничиваются только вашей фантазией.

Предлагаем итальянские кухни премиум класса на любой вкус. От модерна до ретро!

26 комментариев

avatar
Спасибо за разъяснения!
avatar
Божественные настройки. Но вопрос: почему не сделать это все в виде интерфейса? :) Это… было бы неплохо, верно?)
avatar
avatar
Ну что сказать? Сказка! Настроил все и пожалуйста — на Новый Год у тебя дед Мороз подарки раздает, на 8 марта, девушкам цветы выдаются, на 1 апреля анекдоты сыпются. Жизнь сайта кипит!.. А ты в это время на Канарах кокосы жуешь и в ус не дуешь. Лепота :)
  • aex
  • 0
avatar
Так для того все и задумано! Человек должен думать, а машина — работать :)
avatar
Например, так можно показать виджет только зарегистрированным и залогиненным пользователям:

$config['widgets'][] = array(
    'name' => 'blocks/block.something.tpl', // название шаблона виджета
    'group' => 'right', // позиционирование
    'condition' => '$this->User_GetUserCurrent()', 
);


а как сделать показ виджета только незарегистрированным и незалогиненным пользователям?
  • 007
  • 0
avatar
Ставим знак ! перед $this->User_GetUserCurrent()
$config['widgets'][] = array(
    'name' => 'blocks/block.something.tpl', // название шаблона виджета
    'group' => 'right', // позиционирование
    'condition' => '!$this->User_GetUserCurrent()', 
);
avatar
Да, палка с точкой решают все проблемы :) А вот как показать виджет девушкам, которым еще не исполнилось 18 лет? :)
avatar
Элементарно, Ватсон!

Вставляешь в качестве условия примерно такое вот выражение:
($oUser=$this->User_GetUserCurrent()) AND ($oUser->GetProfileSex()==«woman») AND (substr($oUser->GetProfileBirthday(), 4)+18 < date(«Y»))

Хотя лучше, конечно, это обернуть в какую-нибудь функцию или метод модуля и уже эту функцию (или модуль) используешь в условии. Если, конечно, понимаешь, о чем я :)
avatar
Какая прЭлесть эти ваши сказки :) Правда это я за просто так спросил, но какая гибкость! Прослезился от восторга :)
avatar
Спасибо огромное за плагин!
Можно ли реализовать отключение блока по достижению определенного количества кликов? Здесь правда уже базу нужно будет подключить.
avatar
Конечно, можно — условие может быть любым. Но, как верно отмечено, это уже надо писать отдельный модуль, который в базе будет фиксировать число кликов и возвращать это число по запросу. Тогда в условие можно поставить сравнение с заданным пороговым количеством
avatar
есть примеры разных виджетов?)
avatar
В комплекте с плагином идет три виджета в качестве демки
avatar
Есть ли хотя бы приблизительные сроки по выполнению визуальных настроек данного плагина?
avatar
Сроков нет, другим очень занят
avatar
Вопрос.
Что нужно сделать, чтобы блок «Кто онлайн» выводил пользователю время в соответствии с пользовательской таймзоной, а не серверной?
avatar
Хороший вопрос. С момента установки ЛС над ним сижу))
avatar
Пришлось грязно похакать usersonline.js
После строк:
        onLoad:function (result) {
         var $that = $ace.blockOnline;

добавляем:
	 function checkzero(i)
	 {
	  if (i<10)
	  {
	   i="0" + i;
	  }
	  return i;
	 }
	 var hcurtime = new Date();
	 var hct_month = hcurtime.getMonth() + 1;
	 var hct_year = hcurtime.getFullYear();
	 var hct_day = hcurtime.getDate();
	 var hct_hours = hcurtime.getHours();
	 var hct_mins = hcurtime.getMinutes();
	 var hct_secs = hcurtime.getSeconds();
	 var hct_month = checkzero(hct_month);
	 var hct_day = checkzero(hct_day);
	 var hct_hours = checkzero(hct_hours);
	 var hct_mins = checkzero(hct_mins);
	 var hct_secs = checkzero(hct_secs);
	 var hct_time = hct_year+"-"+hct_month+"-"+hct_day+" "+hct_hours+":"+hct_mins+":"+hct_secs;


И меняем
li.append($('<div class="block_online_last">' + item.last + '</div>'));
на
li.append($('<div class="block_online_last">' + hct_time + '</div>'));


Всё работает, несмотря на очень тупой яваскрипт.
Вообще, крайне не хватает нормальной документации на эту цмску.
avatar
И да, я в курсе, что таким макаром блок всё равно плевать хотел на пользовательскую таймзону. ^_^
avatar
Стало быть, решения по прежнему нет?
avatar
надо хранить не time() в массиве
В мануале написано:
The function time() returns always timestamp that is timezone independent (=UTC).

а в формате с сохранением часового пояса (типа GMT +0200 или UTC)
Если храните в базе, то используйте формат поля timestamp а не datetime.
avatar
Потом уже при выставлении таймзоны сервера, оно само засинхронизируется.
Для клиента время надо корректировать функцией timezone_offset_get()
avatar
Не выводятся аваторы в блоке кто онлайн. Кто сталкивался с этой проблемой?
avatar
После обновления админки до последней версии перестал работать блок «Кто он-лайн». Он выводится, но пустой.
avatar
Этот вопрос отменяется вопрос не к вам, а к кривому конфигу сайта после кривых рук.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.