. // }}} namespace Component\Language; use App\Core\Event; use App\Core\Modules\Component; use App\Core\Router; use App\Entity\Actor; use App\Entity\Note; use App\Util\Formatting; use App\Util\Functional as GSF; use Component\Language\Controller as C; use Component\Language\Entity\ActorLanguage; use Doctrine\Common\Collections\ExpressionBuilder; use Doctrine\ORM\Query\Expr; use Doctrine\ORM\QueryBuilder; use Functional as F; use Symfony\Component\HttpFoundation\Request; class Language extends Component { public function onAddRoute(Router $r): bool { $r->connect('settings_sort_languages', '/settings/sort_languages', [C\Language::class, 'sortLanguages']); return Event::next; } public function onFilterNoteList(?Actor $actor, array &$notes, Request $request): bool { if (\is_null($actor)) { return Event::next; } $notes = F\select( $notes, fn (Note $n) => \is_null($n->getLanguageId()) || \in_array($n->getLanguageId(), ActorLanguage::getActorRelatedLanguagesIds($actor)), ); return Event::next; } /** * Populate $note_expr or $actor_expr with an expression to match a language */ public function onCollectionQueryCreateExpression(ExpressionBuilder $eb, string $term, ?string $locale, ?Actor $actor, &$note_expr, &$actor_expr): bool { $search_term = str_contains($term, ':') ? explode(':', $term)[1] : $term; $temp_note_expr = null; $temp_note_actor_expr = null; $temp_actor_expr = null; if (str_contains($search_term, ',')) { foreach ([ ['note_language.locale', &$temp_note_expr], ['note_actor_language.locale', &$temp_note_actor_expr], ['language.locale', &$temp_note_actor_expr], ] as $tmp) { [$column, &$var] = $tmp; $exprs = []; foreach (explode(',', $search_term) as $s) { $exprs[] = $eb->startsWith($column, $s); } $var = $eb->orX(...$exprs); } } else { $temp_note_expr = $eb->startsWith('note_language.locale', $search_term); $temp_note_actor_expr = $eb->startsWith('note_actor_language.locale', $search_term); $temp_actor_expr = $eb->startsWith('language.locale', $search_term); } if (Formatting::startsWith($term, ['lang:', 'language:'])) { $note_expr = $temp_note_expr; $actor_expr = $temp_actor_expr; return Event::stop; } elseif (Formatting::startsWith($term, GSF::cartesianProduct([['note', 'post'], ['lang', 'language'], [':']], separator: ['-', '_']))) { $note_expr = $temp_note_expr; return Event::stop; } elseif (Formatting::startsWith($term, GSF::cartesianProduct([['note', 'post'], ['author', 'actor', 'people', 'person'], ['lang', 'language'], [':']], separator: ['-', '_']))) { $note_expr = $temp_note_actor_expr; return Event::stop; } elseif (Formatting::startsWith($term, GSF::cartesianProduct([['actor', 'people', 'person'], ['lang', 'language'], [':']], separator: ['-', '_']))) { $actor_expr = $temp_actor_expr; return Event::stop; } return Event::next; } public function onCollectionQueryAddJoins(QueryBuilder &$note_qb, QueryBuilder &$actor_qb): bool { $note_aliases = $note_qb->getAllAliases(); if (!\in_array('note_language', $note_aliases)) { $note_qb->leftJoin('Component\Language\Entity\Language', 'note_language', Expr\Join::WITH, 'note.language_id = note_language.id'); } if (!\in_array('actor_language', $note_aliases)) { $note_qb->leftJoin('Component\Language\Entity\ActorLanguage', 'actor_language', Expr\Join::WITH, 'note.actor_id = actor_language.actor_id'); } if (!\in_array('note_actor_language', $note_aliases)) { $note_qb->leftJoin('Component\Language\Entity\Language', 'note_actor_language', Expr\Join::WITH, 'note_actor_language.id = actor_language.language_id'); } $actor_aliases = $note_qb->getAllAliases(); if (!\in_array('actor_language', $actor_aliases)) { $actor_qb->leftJoin('Component\Language\Entity\ActorLanguage', 'actor_language', Expr\Join::WITH, 'actor.id = actor_language.actor_id'); } if (!\in_array('language', $actor_aliases)) { $actor_qb->leftJoin('Component\Language\Entity\Language', 'language', Expr\Join::WITH, 'actor_language.language_id = language.id'); } return Event::next; } }