Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Neue Methode Entry::collection() #97

Closed
wants to merge 4 commits into from

Conversation

christophboecker
Copy link
Member

Flexible Bereitstellung von Entry-Datensätzen/Instanzen nach Kategorie, Status und Sprache.

Auslöser die Frage von @claudihey im Slack, wie man denn eine sprachgefilterte Entry-Collection bekommt. Der Umweg über EntryLang ist grundsätzlich OK (außer dass man erstmal drauf kommen muss)

$lang = EntryLang::get($id);
if( null !== $lang) {
    $entries = $lang->getEntries();
}

Er hat aber keine weiteren direkten Filter z.B. für Status oder Categorie. Hier also ein Vorschlag für eine etwas flexiblere Methode, angesiedelt in der Klasse Entry. Als Parameter sind möglich:

  • Category-ID als Zahl (genau eine) oder Array (mehrere); default: kein Filter, also alle
  • Status: Zahl zwischen -1 und 2; default: 1 = online
  • Sprache: ID des Sprechdatensatzes oder ein Language-Code als String; default: kein Filter
public static function collection (int|array $category = [], int $status=1, string|int $language=0): rex_yform_manager_collection
  • $deletedEntries = Entry::collection( status: 2);
  • $onlineEntriesDe = Entry::collection( status: 1, language: 'de');
  • $onlineEntriesCat = Entry::collection( status: 1, category: [1,2]);

Flexible Bereitstellung von Entry-Datensätzen/Instanzen nach Kategorie, Status und Sprache.
Copy link
Member

@alxndr-w alxndr-w left a comment

Choose a reason for hiding this comment

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

Ich würde vorschlagen, nicht noch eine Methode dafür zu etablieren sondern die Methoden findByCategory() / findByCategories() um einen lang-Parameter zu erweitern / verbessern.

neues/lib/Entry.php

Lines 541 to 557 in c770420

public static function findByCategoryIds(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
// FIXME: whereInList gibt es nicht! Ist $query->whereListContains() gemeint?
$query->whereInList('category_ids', $category_ids);
}
return $query->find();
}

In jedem Fall würde ich gerne weiter mit dem Präfix find weiterarbeiten, um die Nähe zu YOrm und anderen Addons von mir zu halten. Da ist für mich intuitiv klar, es wird eine Collection zurückgegeben.

@christophboecker
Copy link
Member Author

Irgendwas ist hier mal wieder aufgemischt. Das Ding ist out of sync mit meiner lokalen Instanz und ich kann keine Verbindung aufbauen, um den Code zu ändern. Github halt.

Ich lösche einfach mal diesen PR und die Branch und fange von vorne an.

@christophboecker christophboecker deleted the christophboecker-patch-1 branch September 6, 2024 14:01
christophboecker referenced this pull request Sep 13, 2024
### 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);
```
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants