oro/crm-task-bundle
Adds Task activity support to Oro applications, with UI to create and manage tasks, a default task workflow, grid listings for personal and system-wide tasks, and calendar integration to view tasks by date and link them to related records.
Installation Add the bundle via Composer in a Laravel project using Doctrine ORM:
composer require oro/crm-task-bundle
Ensure your Laravel app supports Symfony’s DependencyInjection and HttpKernel (e.g., via symfony/http-kernel and symfony/dependency-injection).
Database Setup
Run Oro’s migrations for the Task entity:
php bin/console doctrine:migrations:execute --query="SELECT * FROM migration_version WHERE version = 'Oro\Bundle\TaskBundle\Migrations\Schema\vX_Y_Z'"
Note: If using Laravel’s migrations, manually adapt Oro’s SQL or use doctrine/dbal to execute raw SQL.
First Use Case Create a task via the CLI or a Laravel controller:
use Oro\Bundle\TaskBundle\Entity\Task;
use Oro\Bundle\TaskBundle\Manager\TaskManager;
$taskManager = app(TaskManager::class);
$task = new Task();
$task->setTitle('Follow up with client');
$task->setDescription('Call John Doe on 2023-12-31');
$task->setDueDate(new \DateTime('2023-12-31'));
$taskManager->save($task);
Basic Routing
Expose a REST endpoint in routes/web.php:
use Oro\Bundle\TaskBundle\Controller\TaskController;
Route::get('/tasks', [TaskController::class, 'index']);
Note: Oro’s controllers assume Symfony’s routing. Override or adapt to Laravel’s router.
Task Creation and Management
TaskManager to create/update tasks:
$taskManager = app(TaskManager::class);
$task = $taskManager->find(1); // Fetch by ID
$taskManager->save($task); // Update
$task->setAssignee($userEntity);
Workflow Integration
use Oro\Bundle\WorkflowBundle\Provider\WorkflowProvider;
$workflowProvider = app(WorkflowProvider::class);
$workflow = $workflowProvider->getWorkflow('task_workflow');
$workflow->apply($task, 'complete');
EventDispatcher with Laravel’s events:
event(new TaskCompleted($task));
Calendar Integration
CalendarBundle:
$task->setCalendarEvent($calendarEventEntity);
spatie/calendar or laravel-calendar to sync with Oro’s events via API.DataGrid Customization
TaskDatagrid in Laravel:
use Oro\Bundle\TaskBundle\Datagrid\TaskDatagrid;
use Oro\Bundle\DataGridBundle\Extension\Datagrid\DatagridExtension;
$datagrid = new TaskDatagrid();
$datagrid->add('custom_column', 'entity.customField');
voyager.API Exposure
Route::apiResource('tasks', \App\Http\Controllers\TaskApiController::class);
// TaskApiController.php
public function index(TaskManager $taskManager) {
return response()->json($taskManager->getAll());
}
Task Assignment Workflow
TaskManager.$task->getAssignee()->notify(new TaskAssigned($task));
Automated Task Creation
// app/Observers/LeadObserver.php
public function created(Lead $lead) {
$task = new Task();
$task->setTitle("Follow up on lead {$lead->id}");
$taskManager->save($task);
}
Calendar Sync
spatie/laravel-google-calendar) or a custom calendar:
$calendarEvent = new \Oro\Bundle\CalendarBundle\Entity\CalendarEvent();
$calendarEvent->setTitle($task->getTitle());
$calendarEvent->setStartDate($task->getDueDate());
$calendarManager->save($calendarEvent);
$task->setCalendarEvent($calendarEvent);
$taskManager->save($task);
Laravel-ify Oro Services
AppServiceProvider:
public function register() {
$this->app->bind(
\Oro\Bundle\TaskBundle\Manager\TaskManager::class,
\Oro\Bundle\TaskBundle\Manager\TaskManager::class
);
}
Doctrine Configuration
config/doctrine.php:
return [
'orm' => [
'entity_managers' => [
'default' => [
'mappings' => [
'OroTaskBundle' => [
'type' => 'xml',
'path' => 'vendor/oro/task-bundle/Resources/config/doctrine',
],
],
],
],
],
];
Frontend Adaptation
laravel-blade-twig.// resources/js/app.js
import 'oro-task-bundle/js/app';
Event Handling
// app/Listeners/TaskListener.php
public function handle(TaskCreatedEvent $event) {
Log::info("Task created: {$event->getTask()->getTitle()}");
}
Register the listener in EventServiceProvider:
protected $listen = [
\Oro\Bundle\TaskBundle\Event\TaskEvents::TASK_CREATED => [
\App\Listeners\TaskListener::class,
],
];
Symfony vs. Laravel DI
ContainerInterface. Laravel’s Container may throw errors for missing methods (e.g., getParameterBag()).symfony/dependency-injection to bridge the gap:
$container = new \Symfony\Component\DependencyInjection\Container();
$container->set('oro_task.manager.task', $taskManager);
Database Conflicts
task table columns might differ.doctrine/dbal to manually run Oro’s SQL or adapt migrations:
php bin/console doctrine:schema:update --force
Tip: Backup your database before running Oro migrations.Routing Conflicts
/task) may clash with Laravel’s routes.routes/web.php:
Route::prefix('oro')->group(function () {
require __DIR__.'/oro.php'; // Include Oro’s routes
});
Twig Dependencies
laravel-blade-twig or rewrite templates in Blade:
composer require darkaonline/laravel-blade-twig
Workflow Engine
WorkflowBundle is tightly coupled to Symfony’s event system. Laravel’s events won’t trigger Oro workflows by default.public function handle(TaskCreated $event) {
$workflow = app(\Oro\Bundle\WorkflowBundle\Provider\WorkflowProvider::class)
->getWorkflow('task_workflow');
$workflow->apply($event->task, 'start');
}
Entity Class Names
How can I help you explore Laravel packages today?