Создаем кнопку "Обновить дату" или "Поднять вверх"

Создаем кнопку "Обновить дату" или "Поднять вверх"

Всем привет.

Продолжим серию уроков для улучшения типов контента. В прошлый раз создали Кнопку "Начислять рейтинг", на этот раз создадим кнопку "Обновить дату" или "Поднять вверх" - это полезно для типа контента Объявления или вообще, когда потребуется поднять какую нибудь новость на верх. Советую изучить предыдущий урок, так как там мы создали базовый контроллер exemple.

Создаем хук

Кнопку мы может создать сразу для всех типов контента (новости, статьи, блоги, объявления) или же конкретно для одного типа. На данном примере, я покажу вариант для всех типов контента.

Создаем файл \system\controllers\exemple\hooks\content_before_item.php

Внутри добавить

<?php
class onExempleContentBeforeItem extends cmsAction {
    public function run($data){
        list($ctype, $item, $fields) = $data;        
        if(cmsUser::get('id') == $item['user_id'] || cmsUser::get('is_admin')) {
            cmsTemplate::getInstance()->addToolButton(array(
                'class' => 'accept',
                'title' => 'Обновить дату',
                'href'  => href_to('exemple', 'top', array($ctype['name'], $item['id']))
            ));
        }
        return array($ctype, $item, $fields);
    }
}

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

if(cmsUser::get('is_admin')) {

Запишем в манифест

Что бы хук работал и кнопка "Обновить дату" появилась на страницах просмотр материала, нам надо добавить наш хук в \system\controllers\exemple\manifest.php

Сейчас в этом файле уже есть данные от предыдущего урока, по этому мы допишем свой код.

<?php
    return array(
        'hooks' => array(
            'user_profile_buttons',
            'content_before_item',
        )
    );

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

Пишем обработчик

Создать файл \system\controllers\exemple\actions\top.php (если нет папки actions, создайте ее)

Внутри добавить

<?php
class actionExempleTop extends cmsAction {
    public function run($ctype = false, $id = false){
        if(!$ctype || !$id){cmsCore::error404();}
        $this->model->update('con_' . $ctype, $id, array('date_pub' => date('Y-m-d H:i:s')));
        cmsUser::addSessionMessage('Дата успешно обновлена', 'success');
        $this->redirectBack();        
    }
}

На этом всё, спасибо что вы с нами, ждите новых уроков :)

Нравится
Не нравится
RSS
Rex
07:21
Спасибо
17:54
19:36
Скажите, а есть практическая возможность прикрутить биллинг к этой кнопке, т.е. назначить цену за ее использование?
20:42
+1
Да возможно сделать, как будет время, сделаю еще один урок про это
21:14
+2
Отлично, буду ждать
06:55
Буду очень благодарен вам
02:51
+1
Вы про нас не забыли?
11:48
+2
Написать новый пост, нет времени, по этому снял видео
каин
13:44
+2
круто спасибо что делитесь с нами вашими знаниями
Владимир
16:07
После нажатия кнопки Обновить дату — белый экран?!
17:37
+1
включите отладку, потом в место белого экрана покажет ошибку, напишите что за ошибка
Райн
05:46
Все сделал по инструкции, но страница с материалами не открывается «Страница не работает». Удаляю папку exemple — все начинает работать. Не знаете, в чем может быть причина?
Райн
13:31
Попытался сделать первую часть. В итоге, после создания manifest.php, страница с профилем также перестает открываться (то есть не могу посмотреть даже появилась кнопка или нет).
Влияет ли как-то на работу данного решения то, что у меня стоит не стандартный шаблон?
13:34
+1
включите отладку, покажите что за ошибка?
Райн
16:15
Включил отладку. Но никакие ошибки не показывает. Только HTTP ERROR 500.
Райн
16:27
Я ведь правильно делаю (чтобы хотя бы кнопка появилась):
1.создаю папку exemple в /system/controllers
2. папку hooks в exemple
3. user_profile_buttons.php с содержимым в hooks
4.manifest.php с содержимым в exemple.
И должна появиться кнопка (но не работающая)?
Райн
16:32
Все! Разобрался! Спасибо!
Проблема была в следующем: для FTP использую FileZilla и все файлы создавал через него. А попробовал загрузил Ваши файлы (которые Вы прикрепили к первой части), кнопка в профиле «Начислять рейтинг» появилась!
Алишер
15:05
как это применить к объявлениям?
15:40
+1
Позже сделаю урок, о том как применить к конкретному тип контента
sERGEI
19:31
Сделал для контента например посты — в действии есть кнопка поднять ввверх
Посты связаны с группами — в группах есть тоже посты,
На главной выводиться виджет с постами (основными)
ка ксделать чтобы в группах выводились посты что в группах
20:18
+1
как сделать чтобы в группах выводились посты что в группах

не понял вопроса, в группах и так выводиться посты, добавленные в эту группу
Ss
20:22
я имею ввиду выбрали просто пост нажали поднять, он поднялся на главной, выбрали в группах пост нажали поднять он поднялся в группах но не на главной
23:13
+1
странно, в группах не проверял, хотя должен работать, так как дата обновляется, как будет время, проверю
Вит
16:24
Мы очень ждём этот урок!)
16:43
Давно сделал, см. выше комментарий my-instantcms.ru/posts/hooks-for-update-date.html#comment_1419
Ss
20:34
или просто опишите как проделять для отдельного типа контента
Дмитрий
11:55
Хорошо было бы если вы уже готовые файлы выкладывали для загрузки.
12:07
+1
По позже соберу в архив и выложу
Дмитрий
21:52
Подскажите! все сделал как описано выше и предыдущее, НО кнопка «Обновить дату» или «Поднять вверх» так и не появилась. Это возможно из-за стороннего шаблона не дефолтного?
22:02
+1
Может какие нибудь ошибки появились? если у вас на сервере показ ошибок выключен, то нечего не выводиться а записывается в лог, покажите что за ошибки?
И еще, это 2 часть урока, первую выполнили? my-instantcms.ru/posts/4-huk-sozdaem-knopku-nachisljat-reiting.html
Дмитрий
09:29
«И предыдущее»-«Начислять рейтинг» да все это выполнял! Смотрю учусь. лог ошибок включен, но я вчера вечером все удалил. Только сегодня увидел ваш ответ. Мне это интересно поэтому буду по новой пробовать. Спасибо ВАМ!
Дмитрий
15:02
Странная ситуация у меня не выводится слово «Обновить дату»
Значок есть слова нет.
15:57
в коде есть 'title' => 'Обновить дату',?
посмотрите исходный код страницы, есть ли это слово вообще
Дмитрий
19:28
'title' => 'Обновить дату', Конечно есть. Это же ваш код… Я вот умаю это возможно из-за стороннего шаблона?
И огромная просьба сделайте что нибудь с данным окном, переписываю этот текст уже третий раз. при нажатии стрелкой в стороне окно закрывается и все сбивается. ОЧЕНЬ не удобно.
Дмитрий
19:32
Какое только слово не вставлял… :) Значок есть слова нет :)
19:57
+1
Дайте ссылку на страницу

И огромная просьба сделайте что нибудь с данным окном

Сам недавно столкнулся :) написал тикет в гитхабе, разрабочики сказали что исправят
Александр
22:31
Можно ли сделать как конкретное поле? Купил у вас дополнение доски — в билленге есть хорошая вещь — покупка полей. Допустим, если поднятие в топ будет как поле is_top то настроить цены в панели биллинга намного проще.
22:55
+1
Для доски по позже будет такой же хук, с настройками цены из админки
Александр
14:45
Еще вопрос: как разграничить в зависимости от группы пользователей. На доске есть группа ВИП, которая имеет скидки на платный функционал, вот если бы поднятие было с указание цен для разных групп — вообще бы цены не было
Артём
03:51
Название должно быть только «exemple»? С другим работать не будет?
Артём
19:29
Все, разобрался. Все работает, главное — везде «exemple» заменить на свое название.
Спасибо за урок!
Лизхен
10:33
+1
А где именно вы меняли? Так как я установила по уроку, но у меня 404 ошибка…
Артём
11:20
+1
Блин, не туда написал. Короче, ответ ниже.))
Артём
11:16
+1
названиеконтроллера/actions/top.php
class actionНазваниеконтроллераTop extends cmsAction {

Если конкретно для объявлений, то
/hooks/content_board_before_item.php
2 строка — class onНазваниеконтроллераContentBoardBeforeItem extends cmsAction {
9 строка — 'href' => href_to('названиеконтроллера', 'top', array($ctype['name'], $item['id']))

Если для всех типов контента, то
/hooks/content_before_item.php
2 строка — class onНазваниеконтроллераContentBeforeItem extends cmsAction {
9 строка — 'href' => href_to('названиеконтроллера', 'top', array($ctype['name'], $item['id']))

В файле frontend.php
2 строка — class названиеконтроллера extends cmsFrontend {
Если кнопка для начисления рейтинга не нужна, то можно оставить только
class названиеконтроллера extends cmsFrontend {}

В файле model.php
class modelНазваниеконтроллера extends cmsModel{
Лизхен
11:23
+1
О! Огромное спасибо! То есть если у меня не работало (показывалась ошибка) с class onExempleContentBeforeItem extends cmsAction (при этом рейтинг работает и с ним все окей), то есть шанс, что если я изменю на class onДОМЕНСАЙТАContentBeforeItem extends cmsAction, то есть шанс, что заработает?))
Простите за глупый вопрос.
Артём
11:51
+1
Не понял. Зачем ДОМЕНСАЙТА? И обратите внимание на то, с какой буквы начинается «названиеконтроллера». Если стоит заглавная, то и вам нужно писать свое название с заглавной, если с маленькой, то с маленькой.
Лизхен
11:53
+1
Я запуталась. ХД А можно вашу почту или id вк? Я бы вам показала в скринах что именно и как получается…
Артём
12:09
+1
Лизхен, заходите в гости, пообщаемся. dcdoze.bget.ru Логин: Lizhen@exemple.ru пароль: 123456789
Владимир
15:40
При нажатии «Обновить дату» — белый экран!
Fatal error: Uncaught Error: Call to a member function update() on null in /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/controllers/exemple/actions/top.php:5 Stack trace: #0 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/core/controller.php(406): actionExempleTop->run('articles', '644') #1 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/core/controller.php(332): cmsController->runExternalAction('top', Array) #2 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/core/core.php(727): cmsController->runAction('top', Array) #3 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/index.php(44): cmsCore->runController() #4 {main} thrown in /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/controllers/exemple/actions/top.php on line 5
16:52
где то допустили ошибку, проверьте всё
22:22
также был белый экран, не обновляло. потом просто закинул файл model.php и все заработало))
Вит
17:36
Здравствуйте, и всё же, как применить сабж только к объявлениям?
17:42
Посмотрите видео с 3 минуты, там как раз показано Объявления youtu.be/IjyDIqmXl_g
Вит
17:46
Благодарю Вас! Последний вопрос, как сделать чтобы функция «поднятия» объявления была доступна пользователю спустя скажем 3 дня после предыдущего поднятия? Иначе будут клацать каждый день.
Николай
20:49
поддерживаю, это очень нужное ограничение!
Вит
17:09
Здравствуйте! Так как быть с ограничением по времени? Поможете?
13:02
Пока не знаю решение
Вит
14:42
Я не селён в php, но что если сделать запрос в базу на дату документа и сравнить с текущей и если она больше, скажем 5 дней, то… далее ваш код?))
Вит
17:27
+1
В общем, как принято, сам отвечаю на свой вопрос))) Итак, чтобы кнопка была доступна раз в 5 дней, файл content_before_item.php делаем вида:
<?php
class onExempleContentBeforeItem extends cmsAction {
    public function run($data){
        list($ctype, $item, $fields) = $data;        
        if(cmsUser::get('id') == $item['user_id'] || cmsUser::get('is_admin')) {
			$date = (strtotime(date("d.m.Y H:i:s"))-strtotime($item['date_pub']))/3600/24;
			$days = 5; //количество дней
			if ($date >= $days) {
				cmsTemplate::getInstance()->addToolButton(array(
					'class' => 'up',
					'title' => 'Обновить дату',
					'href'  => href_to('exemple', 'top', array($ctype['name'], $item['id']))
				));
			}
        }
        return array($ctype, $item, $fields);
    }
}
Владимир
10:02
Fatal error: Uncaught Error: Call to a member function update() on null in /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/controllers/exemple/actions/top.php:5 Stack trace: #0 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/core/controller.php(406): actionExempleTop->run('articles', '763') #1 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/core/controller.php(332): cmsController->runExternalAction('top', Array) #2 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/core/core.php(773): cmsController->runAction('top', Array) #3 /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/index.php(33): cmsCore->runController() #4 {main} thrown in /home/users/r/reneplus/domains/xn----ctbbj1acidfjbu3a.xn--p1ai/system/controllers/exemple/actions/top.php on line 5
11:23
Что то делаете не так, проверьте код
Владимир
12:55
instant 2.7.2
кнопки видно, но при нажатии — белый экран.
Андрей
13:39
Добрый день. Подскажите пожалуйста, как сделать ограничение на кнопку «Обновить дату», чтобы пользователи могли на нее нажать допустим, не более 3 раз в сутки?
16:32
Ограничении нет, для этого требуется серьезные доработки, где надо хранить даты в какой нибудь таблице
Загрузка...