> For the complete documentation index, see [llms.txt](https://docs.norrnext.com/norrcompetition/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.norrnext.com/norrcompetition/customisation/events/contest.md).

# Contest

Contest events are dispatched during the lifecycle of contests (competitions) across both administrator and frontend environments.

***

### `onCompetitionDisplay`

* **Event Class:** `\NorrNext\Component\Competition\Administrator\Event\Display\CompetitionDisplayEvent`
* **Context:** `com_competition.competition`
* **Triggered In:** Frontend Contest view (`site/src/View/Competition/HtmlView.php`)

#### Description

Fired when a contest page is initialized for rendering, allowing plugins to inspect or enrich the contest entity.

```php
use NorrNext\Component\Competition\Administrator\Event\Display\CompetitionDisplayEvent;

public function onCompetitionDisplay(CompetitionDisplayEvent $event): void
{
    $context = $event->getContext(); // 'com_competition.competition'
    $contest = $event->getItem();    // stdClass / Competition object
}
```

***

### `onCompetitionBeforeSave`

* **Event Class:** `\NorrNext\Component\Competition\Administrator\Event\Model\BeforeSaveEvent`
* **Context:** `com_competition.competition`
* **Triggered In:** `CompetitionModel::save()` (admin)
* **Cancellable:** Yes (returning `false` aborts the save)

#### Description

Triggered within the database transaction before the contest record is saved. Returning `false` aborts the operation and rolls back the transaction.

```php
use NorrNext\Component\Competition\Administrator\Event\Model\BeforeSaveEvent;

public function onCompetitionBeforeSave(BeforeSaveEvent $event): bool
{
    $table = $event->getItem();  // Table object
    $isNew = $event->getIsNew(); // bool

    // Validation check
    if ($isNew && empty($table->title)) {
        return false; // Abort save
    }

    return true;
}
```

***

### `onCompetitionAfterSave`

* **Event Class:** `\NorrNext\Component\Competition\Administrator\Event\Model\AfterSaveEvent`
* **Context:** `com_competition.competition`
* **Triggered In:** `CompetitionModel::save()` (admin)

#### Description

Triggered after the contest record is successfully written to the database table.

```php
use NorrNext\Component\Competition\Administrator\Event\Model\AfterSaveEvent;

public function onCompetitionAfterSave(AfterSaveEvent $event): void
{
    $table = $event->getItem();  // Saved table object
    $isNew = $event->getIsNew(); // bool
}
```

***

### `onCompetitionBeforeDelete`

* **Event Class:** `\NorrNext\Component\Competition\Administrator\Event\Model\BeforeDeleteEvent`
* **Context:** `com_competition.competition`
* **Triggered In:** `CompetitionModel::delete()` (admin)
* **Cancellable:** Yes (returning `false` aborts deletion)

#### Description

Triggered before deleting a contest. Returning `false` prevents deletion.

```php
use NorrNext\Component\Competition\Administrator\Event\Model\BeforeDeleteEvent;

public function onCompetitionBeforeDelete(BeforeDeleteEvent $event): bool
{
    $table = $event->getItem(); // Contest table object to be deleted

    // Prevent deletion if condition is met
    return true;
}
```

***

### `onCompetitionAfterDelete`

* **Event Class:** `\NorrNext\Component\Competition\Administrator\Event\Model\AfterDeleteEvent`
* **Context:** `com_competition.competition`
* **Triggered In:** `CompetitionModel::delete()` (admin)

#### Description

Triggered after the contest and associated cascade records are deleted from the database.

```php
use NorrNext\Component\Competition\Administrator\Event\Model\AfterDeleteEvent;

public function onCompetitionAfterDelete(AfterDeleteEvent $event): void
{
    $table = $event->getItem(); // Deleted contest table object
}
```

***

### `onCompetitionChangeState`

* **Context:** `com_competition.competition`
* **Triggered In:** `CompetitionModel::publish()` (admin)

#### Description

Fired after one or more contests have their published state changed.

```php
use Joomla\Event\Event;

public function onCompetitionChangeState(Event $event): void
{
    $context = $event->getArgument('context');
    $pks     = $event->getArgument('pks', []);
    $value   = $event->getArgument('value'); // 1 = Published, 0 = Unpublished, -2 = Trashed
}
```

***

### `onCompetitionChangeStatus`

* **Event Class:** `\NorrNext\Component\Competition\Administrator\Event\Competition\ChangeStatusEvent`
* **Context:** `com_competition.competition`
* **Triggered In:** Automatic contest lifecycle checks

#### Description

Fired when a contest status changes automatically (for example, when the contest voting period closes and the status transitions from Active to Closed).

```php
use NorrNext\Component\Competition\Administrator\Event\Competition\ChangeStatusEvent;

public function onCompetitionChangeStatus(ChangeStatusEvent $event): void
{
    $contest = $event->getCompetition(); // Contest entity
    $status  = $event->getStatus();      // 0 = Closed, 1 = Active
}
```
