Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
.phpunit.result.cache
.php-cs-fixer.cache
vendor/composer/*.zip~
10 changes: 10 additions & 0 deletions docs/03_login_logout_profile_register.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,16 @@ action|ycom_auth_db

## Registrierung

> **Hinweis zu Status-Werten:** Die Status-Werte sind als Konstanten in der Klasse `rex_ycom_user` definiert. Während in YForm-Formularen die numerischen Werte verwendet werden (z.B. `hidden|status|0`), kann im PHP-Code auf die entsprechenden Konstanten zurückgegriffen werden:
> - `STATUS_INACTIVE_TERMINATION = -3`
> - `STATUS_INACTIVE_LOGINS = -2`
> - `STATUS_INACTIVE = -1`
> - `STATUS_REQUESTED = 0`
> - `STATUS_CONFIRMED = 1`
> - `STATUS_ACTIVE = 2`
>
> Siehe auch die [Status-Liste](05_passwords.md#status-liste-eines-ycom-accounts) für weitere Details.

### Registrierungs-Formular

```php
Expand Down
47 changes: 39 additions & 8 deletions docs/05_passwords.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,45 @@ Der Status kann hier auch 2 sein (`status=2`), wenn man mit selbst angelegten Ac

#### Status Liste eines YCom-Accounts

Interner Name | Übersetzung | Wert
------ | ------ | ------
ycom_account_inactive_termination | Zugang wurde gekündigt | -3
ycom_account_inactive_logins | Zugang wurde deaktiviert [Loginfehlversuche] | -2
ycom_account_inactive | Zugang ist inaktiv | -1
ycom_account_requested | Zugang wurde angefragt | 0
ycom_account_confirm | Zugang wurde bestätigt und ist aktiv | 1
ycom_account_active | Zugang ist aktiv | 2
Interner Name | Übersetzung | Wert | Konstante
------ | ------ | ------ | ------
ycom_account_inactive_termination | Zugang wurde gekündigt | -3 | `rex_ycom_user::STATUS_INACTIVE_TERMINATION`
ycom_account_inactive_logins | Zugang wurde deaktiviert [Loginfehlversuche] | -2 | `rex_ycom_user::STATUS_INACTIVE_LOGINS`
ycom_account_inactive | Zugang ist inaktiv | -1 | `rex_ycom_user::STATUS_INACTIVE`
ycom_account_requested | Zugang wurde angefragt | 0 | `rex_ycom_user::STATUS_REQUESTED`
ycom_account_confirm | Zugang wurde bestätigt und ist aktiv | 1 | `rex_ycom_user::STATUS_CONFIRMED`
ycom_account_active | Zugang ist aktiv | 2 | `rex_ycom_user::STATUS_ACTIVE`

##### Status-Konstanten

Seit Version X.X werden die Status-Werte als Konstanten in der Klasse `rex_ycom_user` definiert. Diese können im Code verwendet werden, um die Lesbarkeit zu erhöhen:
Copy link

Copilot AI Oct 14, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The placeholder 'X.X' should be replaced with the actual version number when this feature is released.

Suggested change
Seit Version X.X werden die Status-Werte als Konstanten in der Klasse `rex_ycom_user` definiert. Diese können im Code verwendet werden, um die Lesbarkeit zu erhöhen:
Seit Version 2.7 werden die Status-Werte als Konstanten in der Klasse `rex_ycom_user` definiert. Diese können im Code verwendet werden, um die Lesbarkeit zu erhöhen:

Copilot uses AI. Check for mistakes.

```php
// Statt:
$data['status'] = 1;

// Verwende:
$data['status'] = rex_ycom_user::STATUS_CONFIRMED;
```

##### Status-Optionen erweitern

Die Status-Optionen können über den Extension Point `YCOM_USER_STATUS_OPTIONS` erweitert oder angepasst werden:

```php
rex_extension::register('YCOM_USER_STATUS_OPTIONS', function (rex_extension_point $ep) {
/** @var array<int,string> $statusOptions */
$statusOptions = $ep->getSubject();

// Eigenen Status hinzufügen
$statusOptions[3] = 'translate:ycom_account_premium';

// Optional: Sortierung anpassen
ksort($statusOptions);

return $statusOptions;
});
```

#### Weitere Hinweise

Expand Down
104 changes: 104 additions & 0 deletions docs/12_status_examples.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# YCom User Status - Beispiele

## Status-Konstanten verwenden

### Im PHP-Code

```php
<?php

// Neuen User erstellen mit bestätigtem Status
$user = rex_ycom_user::create();
$user->setValue('email', '[email protected]');
$user->setValue('login', '[email protected]');
$user->setValue('status', rex_ycom_user::STATUS_CONFIRMED);
$user->save();

// Status prüfen
$currentUser = rex_ycom_user::getMe();
if ($currentUser && $currentUser->getValue('status') >= rex_ycom_user::STATUS_CONFIRMED) {
// User ist eingeloggt und bestätigt
}

// Status auf inaktiv setzen
$user->setValue('status', rex_ycom_user::STATUS_INACTIVE);
$user->save();
```

## Status-Optionen erweitern via Extension Point

### Beispiel 1: Eigenen Status hinzufügen

```php
<?php

rex_extension::register('YCOM_USER_STATUS_OPTIONS', function (rex_extension_point $ep) {
/** @var array<int,string> $statusOptions */
$statusOptions = $ep->getSubject();

// Premium-Status hinzufügen (Wert 3)
$statusOptions[3] = 'translate:ycom_account_premium';

// VIP-Status hinzufügen (Wert 4)
$statusOptions[4] = 'translate:ycom_account_vip';

return $statusOptions;
});
```

### Beispiel 2: Status-Optionen anpassen und sortieren

```php
<?php

rex_extension::register('YCOM_USER_STATUS_OPTIONS', function (rex_extension_point $ep) {
/** @var array<int,string> $statusOptions */
$statusOptions = $ep->getSubject();

// Bestimmte Stati entfernen (optional)
unset($statusOptions[rex_ycom_user::STATUS_INACTIVE_TERMINATION]);

// Eigene Stati hinzufügen
$statusOptions[10] = 'translate:ycom_account_special';

// Nach Schlüssel sortieren
ksort($statusOptions);

return $statusOptions;
});
```

### Beispiel 3: Status-Labels projektspezifisch anpassen

```php
<?php

rex_extension::register('YCOM_USER_STATUS_OPTIONS', function (rex_extension_point $ep) {
/** @var array<int,string> $statusOptions */
$statusOptions = $ep->getSubject();

// Standard-Labels durch eigene ersetzen
$statusOptions[rex_ycom_user::STATUS_ACTIVE] = 'Aktives Mitglied';
$statusOptions[rex_ycom_user::STATUS_CONFIRMED] = 'Bestätigtes Mitglied';
$statusOptions[rex_ycom_user::STATUS_REQUESTED] = 'Registrierung ausstehend';

return $statusOptions;
});
```

## Verfügbare Status-Konstanten

| Konstante | Wert | Standard-Label |
|-----------|------|----------------|
| `rex_ycom_user::STATUS_INACTIVE_TERMINATION` | -3 | Zugang wurde gekündigt |
| `rex_ycom_user::STATUS_INACTIVE_LOGINS` | -2 | Zugang wurde deaktiviert [Loginfehlversuche] |
| `rex_ycom_user::STATUS_INACTIVE` | -1 | Zugang ist inaktiv |
| `rex_ycom_user::STATUS_REQUESTED` | 0 | Zugang wurde angefragt |
| `rex_ycom_user::STATUS_CONFIRMED` | 1 | Zugang wurde bestätigt und ist aktiv |
| `rex_ycom_user::STATUS_ACTIVE` | 2 | Zugang ist aktiv |

## Status-Logik

- **Login erlaubt**: Status >= 1 (STATUS_CONFIRMED oder höher)
- **Login nicht erlaubt**: Status <= -1 (STATUS_INACTIVE oder niedriger)
- **Registriert, aber Nutzungsbedingungen fehlen**: Status = 0 (STATUS_REQUESTED)
2 changes: 1 addition & 1 deletion install/tablesets/yform_user.json
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@
"attributes": "",
"choice_attributes": "",
"choice_label": "",
"choices": "translate:ycom_account_inactive_termination=-3,translate:ycom_account_inactive_logins=-2,translate:ycom_account_inactive=-1,translate:ycom_account_requested=0,translate:ycom_account_confirm=1,translate:ycom_account_active=2",
"choices": "callable::rex_ycom_user::getStatusOptions",
"db_type": "text",
"default": "-1",
"expanded": "",
Expand Down
34 changes: 33 additions & 1 deletion lib/ycom_user.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,24 @@ class rex_ycom_user extends rex_yform_manager_dataset
public string $password = '';
public int $login_tries = 0;

// Status constants
public const STATUS_INACTIVE_TERMINATION = -3;
public const STATUS_INACTIVE_LOGINS = -2;
public const STATUS_INACTIVE = -1;
public const STATUS_REQUESTED = 0;
public const STATUS_CONFIRMED = 1;
public const STATUS_ACTIVE = 2;

// Default status options
public const DEFAULT_STATUS_OPTIONS = [
self::STATUS_INACTIVE_TERMINATION => 'translate:ycom_account_inactive_termination',
self::STATUS_INACTIVE_LOGINS => 'translate:ycom_account_inactive_logins',
self::STATUS_INACTIVE => 'translate:ycom_account_inactive',
self::STATUS_REQUESTED => 'translate:ycom_account_requested',
self::STATUS_CONFIRMED => 'translate:ycom_account_confirm',
self::STATUS_ACTIVE => 'translate:ycom_account_active',
];

/**
* @return rex_ycom_user|null
*/
Expand Down Expand Up @@ -53,7 +71,7 @@ public function getGroups(): array
*/
public static function createUserByEmail(array $data)
{
$data['status'] = 1;
$data['status'] = self::STATUS_CONFIRMED;
$data['password'] = str_shuffle('1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz');
$data['login'] = $data['email'];
$data['login_tries'] = 0;
Expand Down Expand Up @@ -111,4 +129,18 @@ public function resetOTPTries(): self
$this->setValue('otp_last_try_time', time());
return $this;
}

/**
* Get status options with extension point for customization.
* @return array<int, string>
*/
public static function getStatusOptions(): array
{
// Allow additional status options via extension point
$statusOptions = rex_extension::registerPoint(new rex_extension_point('YCOM_USER_STATUS_OPTIONS', self::DEFAULT_STATUS_OPTIONS));
if (!is_array($statusOptions)) {
$statusOptions = self::DEFAULT_STATUS_OPTIONS;
}
return $statusOptions;
}
}
65 changes: 65 additions & 0 deletions tests/unit/user_status_test.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

use PHPUnit\Framework\TestCase;

/**
* @internal
*/
class rex_ycom_user_status_test extends TestCase
{
public function testStatusConstantsExist()
{
// Test that all status constants are defined
self::assertTrue(defined('rex_ycom_user::STATUS_INACTIVE_TERMINATION'));
self::assertTrue(defined('rex_ycom_user::STATUS_INACTIVE_LOGINS'));
self::assertTrue(defined('rex_ycom_user::STATUS_INACTIVE'));
self::assertTrue(defined('rex_ycom_user::STATUS_REQUESTED'));
self::assertTrue(defined('rex_ycom_user::STATUS_CONFIRMED'));
self::assertTrue(defined('rex_ycom_user::STATUS_ACTIVE'));
}

public function testStatusConstantValues()
{
// Test that constants have the correct values
self::assertEquals(-3, rex_ycom_user::STATUS_INACTIVE_TERMINATION);
self::assertEquals(-2, rex_ycom_user::STATUS_INACTIVE_LOGINS);
self::assertEquals(-1, rex_ycom_user::STATUS_INACTIVE);
self::assertEquals(0, rex_ycom_user::STATUS_REQUESTED);
self::assertEquals(1, rex_ycom_user::STATUS_CONFIRMED);
self::assertEquals(2, rex_ycom_user::STATUS_ACTIVE);
}

public function testDefaultStatusOptions()
{
// Test that default status options contain all expected entries
$defaultOptions = rex_ycom_user::DEFAULT_STATUS_OPTIONS;

self::assertIsArray($defaultOptions);
self::assertArrayHasKey(-3, $defaultOptions);
self::assertArrayHasKey(-2, $defaultOptions);
self::assertArrayHasKey(-1, $defaultOptions);
self::assertArrayHasKey(0, $defaultOptions);
self::assertArrayHasKey(1, $defaultOptions);
self::assertArrayHasKey(2, $defaultOptions);

// Test that values are translation keys
self::assertEquals('translate:ycom_account_inactive_termination', $defaultOptions[-3]);
self::assertEquals('translate:ycom_account_inactive_logins', $defaultOptions[-2]);
self::assertEquals('translate:ycom_account_inactive', $defaultOptions[-1]);
self::assertEquals('translate:ycom_account_requested', $defaultOptions[0]);
self::assertEquals('translate:ycom_account_confirm', $defaultOptions[1]);
self::assertEquals('translate:ycom_account_active', $defaultOptions[2]);
}

public function testGetStatusOptionsReturnsArray()
{
// Test that getStatusOptions returns an array
$options = rex_ycom_user::getStatusOptions();

self::assertIsArray($options);
self::assertNotEmpty($options);

// Test that it returns the default options
self::assertEquals(rex_ycom_user::DEFAULT_STATUS_OPTIONS, $options);
}
}
Loading