SychO It took me a lot of tries to figure out the logic, but I finally did it!
@MrCaspan I have tested it many times and I think it works fine.
composer.json
{
"name": "mrcaspan/eventtodiscussion",
"description": "Creates Flarum discussions automatically when calendar events are created.",
"type": "flarum-extension",
"keywords": ["flarum", "calendar", "events", "discussion"],
"license": "MIT",
"authors": [
{
"name": "Name",
"email": "mail@gmail.com",
"role": "Developer"
}
],
"homepage": "#",
"support": {
"issues": "#",
"source": "#"
},
"require": {
"flarum/core": "^1.2.0"
},
"autoload": {
"psr-4": {
"Mrcaspan\\EventToDiscussion\\": "src/"
}
},
"extra": {
"flarum-extension": {
"title": "Event to Discussion",
"category": "feature",
"icon": {
"name": "fas fa-calendar-plus",
"backgroundColor": "#3498db",
"color": "#fff"
}
}
}
}
extend.php
<?php
namespace Mrcaspan\EventToDiscussion;
use Flarum\Extend;
use Illuminate\Contracts\Events\Dispatcher;
use Mrcaspan\EventToDiscussion\Providers\EventServiceProvider;
use Mrcaspan\EventToDiscussion\Listeners\EventCreationListener;
return [
(new Extend\ServiceProvider())
->register(EventServiceProvider::class),
(new Extend\Event())
->subscribe(EventCreationListener::class),
];
src/Listeners/ EventCreationListener.php
<?php
namespace Mrcaspan\EventToDiscussion\Listeners;
use Illuminate\Contracts\Events\Dispatcher;
use Mrcaspan\EventToDiscussion\Event\CalendarEventCreated;
use Webbinaro\AdvCalendar\Event as CalendarEvent;
class EventCreationListener
{
public function subscribe(Dispatcher $events)
{
$events->listen('eloquent.created: Webbinaro\AdvCalendar\Event', [$this, 'onEventCreated']);
}
public function onEventCreated(CalendarEvent $event)
{
app()->make(Dispatcher::class)->dispatch(new CalendarEventCreated($event));
}
}
src/Providers/EventServiceProvider.php
<?php
namespace Mrcaspan\EventToDiscussion\Providers;
use Flarum\Foundation\AbstractServiceProvider;
use Flarum\Discussion\Discussion;
use Flarum\User\User;
use Flarum\Tags\Tag;
use Webbinaro\AdvCalendar\Event as CalendarEvent;
use Flarum\Post\CommentPost;
use Illuminate\Events\Dispatcher;
use Flarum\Settings\SettingsRepositoryInterface;
use Mrcaspan\EventToDiscussion\Event\CalendarEventCreated;
class EventServiceProvider extends AbstractServiceProvider
{
public function register()
{
// empty
}
public function boot(Dispatcher $events, SettingsRepositoryInterface $settings)
{
// Tag ID 1
$tagId = $settings->get('event_to_discussion_tag_id', 1);
$events->listen(CalendarEventCreated::class, function (CalendarEventCreated $event) use ($tagId) {
$this->handleEventCreation($event->event, $tagId);
});
}
protected function handleEventCreation(CalendarEvent $event, $tagId)
{
$eventTitle = $event->name;
$eventDescription = $event->description;
$userId = $event->user_id;
// Event bilgileri eksikse işlemi durdur
if (empty($eventTitle) || empty($eventDescription) || empty($userId)) {
return;
}
$user = User::find($userId);
$tag = Tag::find($tagId);
// User contol
if (!$user) {
return;
}
try {
$now = new \DateTime();
// Discussion create
$discussion = new Discussion();
$discussion->title = $eventTitle;
$discussion->user_id = $user->id;
$discussion->created_at = $now;
$discussion->save();
// Post create
$post = new CommentPost();
$post->discussion_id = $discussion->id;
$post->number = 1;
$post->created_at = $now;
$post->user_id = $user->id;
$post->type = 'comment';
$post->content = $eventDescription;
$post->save();
// Update
$discussion->first_post_id = $post->id;
$discussion->last_post_id = $post->id;
$discussion->last_posted_at = $now;
$discussion->last_posted_user_id = $user->id;
$discussion->post_number_index = 1;
$discussion->comment_count = 1;
// Add tag
if ($tag) {
$discussion->tags()->attach($tag->id);
}
$discussion->save();
} catch (\Exception $e) {
// errors
}
}
}
src/Event/CalendarEventCreated.php
<?php
namespace Mrcaspan\EventToDiscussion\Event;
use Webbinaro\AdvCalendar\Event as CalendarEvent;
class CalendarEventCreated
{
public $event;
public function __construct(CalendarEvent $event)
{
$this->event = $event;
}
}