Files
cmsPRO/autoload/Domain/Languages/LanguagesRepository.php
Jacek Pyziak 9ee4116f50 Refaktoryzacja Faza 0+1: PSR-4 autoloader + Shared/Domain klasy
- Dodano PSR-4 autoloader do wszystkich 6 punktów wejścia
- Shared\: CacheHandler, Helpers, Html, ImageManipulator, Tpl
- Domain\: LanguagesRepository, SettingsRepository, UserRepository
- Stare class.*.php → cienkie wrappery (kompatybilność wsteczna)
- Dodano dokumentację: docs/PROJECT_STRUCTURE.md + pozostałe docs/
- Dodano CLAUDE.md z workflow

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 23:43:55 +01:00

214 lines
7.5 KiB
PHP

<?php
namespace Domain\Languages;
class LanguagesRepository
{
private $db;
public function __construct( $db )
{
$this->db = $db;
}
// -------------------------------------------------------------------------
// Odczyt
// -------------------------------------------------------------------------
public function languagesList(): array
{
return $this->db->select( 'pp_langs', '*', [ 'ORDER' => [ 'o' => 'ASC' ] ] ) ?: [];
}
public function languageDetails( string $languageId ): ?array
{
return $this->db->get( 'pp_langs', '*', [ 'id' => $languageId ] ) ?: null;
}
public function availableDomains(): array
{
return $this->db->query(
'SELECT domain FROM pp_langs WHERE status = 1 AND domain IS NOT NULL GROUP BY domain'
)->fetchAll( \PDO::FETCH_ASSOC ) ?: [];
}
public function defaultDomain(): ?string
{
$results = $this->db->query(
'SELECT domain FROM pp_langs WHERE status = 1 AND domain IS NOT NULL AND main_domain = 1'
)->fetchAll();
return $results[0][0] ?? null;
}
public function defaultLanguage( string $domain = '' ): ?string
{
if ( !$default = \Shared\Cache\CacheHandler::fetch( "default_language:$domain" ) )
{
if ( $domain )
$results = $this->db->query(
'SELECT id FROM pp_langs WHERE status = 1 AND domain = \'' . $domain . '\' ORDER BY start DESC, o ASC LIMIT 1'
)->fetchAll();
if ( !$domain || !$this->defaultDomain() )
$results = $this->db->query(
'SELECT id FROM pp_langs WHERE status = 1 AND domain IS NULL ORDER BY start DESC, o ASC LIMIT 1'
)->fetchAll();
$default = $results[0][0] ?? null;
\Shared\Cache\CacheHandler::store( "default_language:$domain", $default );
}
return $default;
}
public function activeLanguages(): array
{
if ( !$active = \Shared\Cache\CacheHandler::fetch( 'active_languages' ) )
{
$active = $this->db->select( 'pp_langs', [ 'id', 'name', 'domain' ], [ 'status' => 1, 'ORDER' => [ 'o' => 'ASC' ] ] ) ?: [];
\Shared\Cache\CacheHandler::store( 'active_languages', $active );
}
return $active;
}
public function langTranslations( string $language = 'pl' ): array
{
if ( !$translations = \Shared\Cache\CacheHandler::fetch( "lang_translations:$language" ) )
{
$translations = [ '0' => $language ];
$results = $this->db->select( 'pp_langs_translations', [ 'text', $language ] );
if ( is_array( $results ) )
foreach ( $results as $row )
$translations[ $row['text'] ] = $row[ $language ];
\Shared\Cache\CacheHandler::store( "lang_translations:$language", $translations );
}
return $translations;
}
public function translationDetails( int $translationId ): ?array
{
return $this->db->get( 'pp_langs_translations', '*', [ 'id' => $translationId ] ) ?: null;
}
public function maxOrder(): int
{
return (int) $this->db->max( 'pp_langs', 'o' );
}
// -------------------------------------------------------------------------
// Zapis / usuwanie
// -------------------------------------------------------------------------
public function languageSave( string $languageId, string $name, $status, $start, $o, $domain, $main_domain ): string
{
if ( $start == 'on' && $status == 'on' && !\S::get_domain( $domain ) )
$this->db->update( 'pp_langs', [ 'start' => 0 ], [ 'id[!]' => $languageId ] );
if ( $start == 'on' && $status == 'on' && \S::get_domain( $domain ) )
$this->db->update( 'pp_langs', [ 'start' => 0 ], [
'AND' => [ 'id[!]' => $languageId, 'domain' => \S::get_domain( $domain ) ]
] );
if ( $main_domain == 'on' && $domain && $status == 'on' )
$this->db->update( 'pp_langs', [ 'main_domain' => 0 ], [ ' id[!]' => $languageId ] );
if ( $this->db->count( 'pp_langs', [ 'id' => $languageId ] ) )
{
$this->db->update( 'pp_langs', [
'status' => $status == 'on' ? 1 : 0,
'start' => $start == 'on' ? 1 : 0,
'name' => $name,
'o' => $o,
'domain' => \S::get_domain( $domain ) ?: null,
'main_domain' => $main_domain == 'on' && \S::get_domain( $domain ) ? 1 : 0,
], [ 'id' => $languageId ] );
}
else
{
if ( $this->db->query( 'ALTER TABLE pp_langs_translations ADD ' . strtolower( $languageId ) . ' TEXT NULL DEFAULT NULL' ) )
{
$this->db->insert( 'pp_langs', [
'id' => strtolower( $languageId ),
'name' => $name,
'status' => $status == 'on' ? 1 : 0,
'start' => $start == 'on' ? 1 : 0,
'o' => $o,
'domain' => \S::get_domain( $domain ) ?: null,
'main_domain' => $main_domain == 'on' && \S::get_domain( $domain ) ? 1 : 0,
] );
}
}
// Upewnij się, że każda domena ma język startowy
if ( !$this->db->count( 'pp_langs', [ 'AND' => [ 'status' => 1, 'domain[!]' => null ] ] ) )
{
if ( !$this->db->count( 'pp_langs', [ 'AND' => [ 'status' => 1, 'start' => 1, 'domain' => null ] ] ) )
{
if ( $idTmp = $this->db->get( 'pp_langs', 'id', [ 'status' => 1, 'ORDER' => [ 'o' => 'ASC' ] ] ) )
$this->db->update( 'pp_langs', [ 'start' => 1 ], [ 'id' => $idTmp ] );
}
}
$domains = $this->db->select( 'pp_langs', 'domain', [ 'domain[!]' => null, 'GROUP' => 'domain' ] );
if ( is_array( $domains ) && !empty( $domains ) )
{
$this->db->update( 'pp_langs', [ 'start' => 0 ], [ 'domain' => null ] );
foreach ( $domains as $dom )
{
if ( !$this->db->count( 'pp_langs', [ 'AND' => [ 'status' => 1, 'start' => 1, 'domain' => $dom ] ] ) )
{
if ( $idTmp = $this->db->get( 'pp_langs', 'id', [ 'AND' => [ 'status' => 1, 'domain' => $dom ], 'ORDER' => [ 'o' => 'ASC' ] ] ) )
$this->db->update( 'pp_langs', [ 'start' => 1 ], [ 'id' => $idTmp ] );
}
}
}
if ( !$this->db->count( 'pp_langs', [ 'AND' => [ 'status' => 1, 'main_domain' => 1 ] ] ) )
{
if ( $idTmp = $this->db->get( 'pp_langs', 'id', [ 'AND' => [ 'status' => 1, 'domain[!]' => null ], 'ORDER' => [ 'o' => 'ASC' ] ] ) )
$this->db->update( 'pp_langs', [ 'main_domain' => 1 ], [ 'id' => $idTmp ] );
}
\S::htacces();
\S::delete_cache();
return $languageId;
}
public function languageDelete( string $languageId ): bool
{
if ( $this->db->count( 'pp_langs' ) > 1 )
{
if ( $this->db->query( 'ALTER TABLE pp_langs_translations DROP ' . $languageId )
&& $this->db->delete( 'pp_langs', [ 'id' => $languageId ] ) )
return true;
}
return false;
}
public function translationSave( $translationId, string $text, array $languages = [] ): int
{
if ( $translationId )
{
$this->db->update( 'pp_langs_translations', [ 'text' => $text ], [ 'id' => $translationId ] );
foreach ( $languages as $key => $val )
$this->db->update( 'pp_langs_translations', [ $key => $val ], [ 'id' => $translationId ] );
}
else
{
$this->db->insert( 'pp_langs_translations', [ 'text' => $text ] );
$translationId = $this->db->id();
foreach ( $languages as $key => $val )
$this->db->update( 'pp_langs_translations', [ $key => $val ], [ 'id' => $translationId ] );
}
\S::htacces();
\S::delete_cache();
return (int) $translationId;
}
public function translationDelete( int $translationId ): bool
{
return (bool) $this->db->delete( 'pp_langs_translations', [ 'id' => $translationId ] );
}
}