Перейти к содержанию

Сделать возможность создавать "Отложенные публикации"


Heavenanvil

Рекомендуемые сообщения

Здравствуйте.

В одном из раздело в форума добавляю новости. Необходимо сделать так, чтобы допустим я, добавил несколько новостей, указал им "дату/время создания" и они появились на форуме только тогда, когда эта дата наступит.

К примеру, добавил я десяток новостей, указал у них разные даты публикации, скажем... с интервалом в 2 часа и они автоматически добавляются в нужное время.

Необязательно делать в виде плагина/хака.

Можно обойтись php+mysql+cron.

Есть даже кое-какие наработки и мысли по реализации. Пишите в ЛС. 

Скрин для примера (нарисован мной)

2.png.3be429695ce6098c0f4f7b7817e51c72.png

Ссылка на комментарий
Поделиться на другие сайты

Уже не актуально. Сделал сам.

Если кому-то интересно, пишите в ЛС.

Ссылка на комментарий
Поделиться на другие сайты

55 минут назад, Heavenanvil сказал:

Уже не актуально. Сделал сам.

Если кому-то интересно, пишите в ЛС.

Интересует, но не код а способ его реализации и какие плюсы в выбранном методе.

Ссылка на комментарий
Поделиться на другие сайты

soka, плюсы по сравнению с чем?

аналогов я не нашел.

Ссылка на комментарий
Поделиться на другие сайты

7 минут назад, Heavenanvil сказал:

soka, плюсы по сравнению с чем?

аналогов я не нашел.

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

Ссылка на комментарий
Поделиться на другие сайты

PHP файл с MySQL запросами, запущен через cron.
Моих навыков хватило только на это, но результат меня устраивает.

Ссылка на комментарий
Поделиться на другие сайты

Темы создаются из PHP файла? Всю статистику и связи обновляете запросами? Апи форума для создания не рассматривали? Структура темы для постинга.

Ссылка на комментарий
Поделиться на другие сайты

Кхм. Нет. Попробую описать алгоритм.

Создаю тему как обычно, только в параметрах ставлю галочку "Скрыть тему".
Там же в параметрах указываю дату открытия темы (взял этот параметр за основу времени будущей публикации).
Скрипт запущенный в cron сравнивает этот параметр "Дата открытия" с реальным временем и если он < или = ему,  то публикует его (меняя несколько значения в бд форума)

Никаких лазаний в бд или отдельный запуск файлов не требуется. Тема создаётся исключительно стандартными средствами форума. Лишь аппрувится в "нужное" время.

Это если вкратце.

Всю статистику и связи соответственно изменяю как нужно, запросами.

Хотел поизучать api, но было лень.

В скором времени наверно выложу свой файлик в паблик сюда, как только обкатаю. Нужно потестировать пару дней.

Я ведь ещё учусь. Если видели мои предыдущие работы (#1, #2) можете оценить костыли в моем коде, но буду рад, если кому-то мои наработки пригодятся.

Ссылка на комментарий
Поделиться на другие сайты

17 минут назад, Heavenanvil сказал:

Я ведь ещё учусь. Если видели мои предыдущие работы (#1, #2) можете оценить костыли в моем коде, но буду рад, если кому-то мои наработки пригодятся.

Нда, предыдущие работы полное уныние. По смене даты сообщения вообще не понимаю как можно было умудрится написать столько кода, да еще корявого, он меняется одним sql запросом с пару left join (запрос есть на ипбскинс).

REST API для обновления темы 

POST /forums/topics/{id}
locked=0
hidden=0

Ссылка на комментарий
Поделиться на другие сайты

soka, вас никто не заставляет пользоваться моими работами.

Мне было нужно, готового решения искал, и даже писал в разделе фриланс (именно эта тема), но никто не ответил, поэтому сделал сам.

Какие проблемы?

По смене даты, там если вы не заметили есть ещё смена автора, смена состояния темы, проверка пароля. Почти половина кода это вёрстка. Но запросы не спорю, можно сильно оптимизировать.

Ссылка на комментарий
Поделиться на другие сайты

Можете сделать лучше - флаг вам в руки.

Я делал для себя и о костылях предупреждал.

Если вам будет спокойней, этот скрипт состоит лишь из одного запроса и одной переменной.

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Heavenanvil сказал:

soka, вас никто не заставляет пользоваться моими работами.

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

 

1 час назад, Heavenanvil сказал:

По смене даты, там если вы не заметили есть ещё смена автора, смена состояния темы, проверка пароля.

Автор темы/сообщения тоже меняется одним запросом, ну для обновления статистики и прочей херни можно дополнительно понаписать коду. Проверка пароля тоже делается одной строчки кода, да и не нужна она в принципе, лучше подключить ядро форума и проверять права администратора (только не говорите что вы искали и не нашли). ТС, вы же сами знаете что код унылый, и дело не в том что я могу написать лучше или хуже, или не нравится не пользуйся, а в том что это говнокод, пусть и для себя но который нужно писать нормально.

 

39 минут назад, Heavenanvil сказал:

Если вам будет спокойней, этот скрипт состоит лишь из одного запроса и одной переменной.

Это уже прогресс. Критика пошла на пользу. Для будущего развития можно рассмотреть подобные варианты

<?php

require_once 'init.php';
\IPS\Dispatcher\Build::i();

foreach( \IPS\Db::i()->select('tid', 'forums_topics', array( 'topic_open_time > 0 AND topic_open_time <= ? AND approved = -1', time())) as $tid )
{
	$topic = \IPS\forums\Topic::load( $tid );
	$topic->approved = 1;
	$topic->state    = 'open';
	$topic->topic_open_time = ;
	$topic->save();
	
	$topic->resyncLastComment();
	$topic->resyncLastReview();

	if( $container = $topic->containerWrapper() )
	{
		$container->setLastComment();
		$container->setLastReview();
		$container->save();
	}
}

или одним sql запросом 

<?php

require_once 'init.php';
\IPS\Dispatcher\Build::i();

\IPS\Db::i()->update( 'forums_topics', array('approved' => 1, 'state' => 'open', 'topic_open_time' =>  ), array( 'topic_open_time > 0 AND topic_open_time <= ? AND approved = -1', time() ) );

 

Изменено пользователем soka
Ссылка на комментарий
Поделиться на другие сайты

А я думал все начинают с говнокода :)

Проблема ещё и в том, что ядро форума вообще почти не знаю, поэтому "копаюсь" в базе напрямую.

Ссылка на комментарий
Поделиться на другие сайты

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...