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 ] ); } }