Skip to content

Commit

Permalink
findByCategories
Browse files Browse the repository at this point in the history
### Hinzufügen der `findByCategories`-Methode zur `Entry`-Klasse

#### Zusammenfassung:
In diesem Pull Request wird eine neue Methode `findByCategories` zur `Entry`-Klasse hinzugefügt. Diese Methode ermöglicht es, Einträge anhand einer oder mehrerer Kategorien zu finden, wobei der Status der Einträge ebenfalls berücksichtigt wird. Die Methode akzeptiert sowohl Strings als auch Arrays als Eingabeparameter für die Kategorie-IDs und ist kompatibel mit PHP 8.2.

#### Änderungen im Detail:
- **Neue Methode `findByCategories`:**
  - **Parameter**: 
    - `string|array|null $category_ids`: Akzeptiert entweder eine kommagetrennte Liste von Kategorie-IDs als String, ein Array von Kategorie-IDs oder `null`.
    - `int $status`: Definiert den Mindeststatus der Einträge, die gefiltert werden sollen.
  - **Funktionalität**: 
    - Wenn ein String übergeben wird, wird dieser in ein Array umgewandelt.
    - Die Methode verwendet `whereInList`, um die Einträge zu filtern, die den angegebenen Kategorien zugeordnet sind.
    - Es wird der `status` der Einträge berücksichtigt, sodass nur Einträge zurückgegeben werden, die einen bestimmten Status erfüllen.

- **Typdeklaration**:
  - Die Methode nutzt die neuen Union Types von PHP 8.2 (`string|array|null`), um klar anzugeben, welche Typen akzeptiert werden.



#### Anwendungsbeispiel:

```php
// Suche nach Einträgen, die den Kategorien 1 und 2 zugeordnet sind und den Status 1 oder höher haben
$entries = FriendsOfRedaxo\Neues\Entry::findByCategories([1, 2], 1);

// Suche mit einer kommagetrennten Liste von Kategorien als String
$entries = FriendsOfRedaxo\Neues\Entry::findByCategories('1,2', 1);

// Suche nach allen Einträgen mit einem Status von 1 oder höher, ohne Kategorienfilter
$entries = FriendsOfRedaxo\Neues\Entry::findByCategories(null, 1);
```
  • Loading branch information
skerbis authored Aug 12, 2024
1 parent f7a5c81 commit bc0f4ee
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions lib/neues_entry.php
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,37 @@ public static function findByCategory(?int $category_id = null, int $status = 1)
return $query->find();
}


/**
* Findet Einträge nach mehreren Kategorien.
* Finds entries by multiple Categories.
*
* @param string|array|null $category_ids Die IDs der Kategorien als String oder Array. / The IDs of the Categories as a String or Array.
* @param int $status Der Status der Einträge. / The status of the entries.
* @return rex_yform_manager_collection|null Die gefundenen Einträge oder null, wenn keine Einträge gefunden wurden. / The found entries or null if no entries were found.
*
* Beispiel / Example:
* $entries = FriendsOfRedaxo\Neues\Entry::findByCategories('1,2', 1);
*
* @api
*/
public static function findByCategories(string|array|null $category_ids = null, int $status = 1): ?rex_yform_manager_collection
{
$query = self::query()->where('status', $status, '>=');

if ($category_ids) {
// Wenn es ein String ist, in ein Array umwandeln
if (is_string($category_ids)) {
$category_ids = explode(',', $category_ids);
}

// whereInList anwenden
$query->whereInList('category_ids', $category_ids);
}

return $query->find();
}

/**
* Gibt die URL des Eintrags zurück.
* Returns the URL of the entry.
Expand Down

4 comments on commit bc0f4ee

@alxndr-w
Copy link
Member

Choose a reason for hiding this comment

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

@skerbis Moin, da stimmt was nicht. @christophboecker hat schon ein FIXME-Kommentar mit Vorschlag, wie es hätte heißen müssen. Kannst du das prüfen und korrigieren?

@christophboecker
Copy link
Member

@christophboecker christophboecker commented on bc0f4ee Sep 13, 2024

Choose a reason for hiding this comment

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

  1. Wo schwirrt denn dieser Commit rum? Ich finde den zugehörigen Branch nicht.
  2. Der FIXME bezog sich auf whereInList weil meine IDE zu recht sagt: die Methode gibt es nicht. Muss wohl whereListContains heißen; das ist der einzige Methoden-Name in rex_yform_manager_collection, der passt.
  3. Meinen PR Neue Methode Entry::collection() #97 hatte ich erstmal zurückgezogen. Die dort vorgeschlagene Methode Entry::collection sollte nach Categorie, Status und Sprache filtern. Alex schlug vor, einen anderen Namen zu nehmen (findXxxx) bzw. die findByCategoryIds zu erweitern. Dann wäre aber der Name zu speziell (was allgemeines wie findBy fände ich eher passend. Aber das ist nicht das Kernproblem.
  4. Die Logik bisher ist, das beim Status eine >=-Abfrage vorgesehen ist. Damit ist es aber nicht möglich, gezielt Entries eines bestimmten Status zu suchen. Das müsste m.E. ersteinmal final beschieden werden. Aktuell ist das ja keine Status-Abfrage, sondern eine isOnline-Abfrage. Siehe Diskussion zu Status-Abfrage "online": >= in = geändert #101
  5. Ich frag mich immer öfter, braucht man null als zusätzlichen "keine Angabe"-Typ. Ich versuche es nun ohne nullzu lösen. Siehe Neue Methode Entry::collection() #97. (public static function collection(int|array $category = [], int $status = 1, string|int $language = 0): rex_yform_manager_collection).

@christophboecker
Copy link
Member

Choose a reason for hiding this comment

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

Vorschlag für eine ganz allgemein gehaltene Methode, die dann von anderen, spezielleren Methoden benutzt werden könnte:

public static function findBy(
    int|array $category=[],
    bool|int $status=PHP_INT_MIN,
    string|int $lang=0,
);

Die Kategorie als int-Wert für eine oder als Liste mehrerer Kategorien; default wäre "keine Einschränkung"

Der Status als bool hätte die Bedeutung "true = online" bzw. "false = offline" oder als int-Wert der konkrete Status; default wäre hier "alle" symbolisiert durch PHP-INT-MIN

Die Sprache entweder als Name (z.B. "de") oder als ID des Datensatzes. Default 0 bedeutet "keine Einschränkung"

$entries = Entry::findBy(lang: 'de');
$entries = Entry::findBy(lang: 'de', status: Entry::ONLINE);
...

@alxndr-w
Copy link
Member

Choose a reason for hiding this comment

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

Please sign in to comment.