- 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>
214 lines
7.5 KiB
PHP
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 ] );
|
|
}
|
|
}
|