Undefined array key при PHP 8.

Pok4

Registered
Здравейте,

Имам проблем и реших да постна и тук.

Значи направих така, че в системата да се работи с външни lang файлове, а не да се пишат в самия екстеншън. До тук добре, всичко си работи, но когато достъпя ajax метода в някой контролер гърмят грешки от undefined array key...

Пробвах така:
$array[$value] ?? '' (понеже може в php 8), но пак не става, поне крие няколко грешки, но други не иска.
С @ отпред работи, грешките се крият и аякс заявките се инициират добре и без проблеми...

Като достъпя екстеншъна така:

излизат следните грешки:
PHP:
[phpBB Debug] PHP Warning: in file C:/xampp2/htdocs/ext/pok4/calladmin/ext.php on line 67: Undefined array key "ext_calladmin_nick"
[phpBB Debug] PHP Warning: in file C:/xampp2/htdocs/ext/pok4/calladmin/ext.php on line 68: Undefined array key "ext_calladmin_report"
[phpBB Debug] PHP Warning: in file C:/xampp2/htdocs/ext/pok4/calladmin/ext.php on line 69: Undefined array key "ext_calladmin_date"
[phpBB Debug] PHP Warning: in file C:/xampp2/htdocs/ext/pok4/calladmin/ext.php on line 70: Undefined array key "ext_calladmin_server"
[phpBB Debug] PHP Warning: in file C:/xampp2/htdocs/ext/pok4/calladmin/ext.php on line 90: Undefined array key "ext_call_admin_reload"

На тези редове имам:
PHP:
                    <td>".$this->lang['ext_calladmin_nick']."</td>
                    <td>".$this->lang['ext_calladmin_report']."</td>
                    <td>".$this->lang['ext_calladmin_date']."</td>
                    <td>".$this->lang['ext_calladmin_server']."</td>

Искам пак да кажа, че всичко си работи във фронт частта, просто аякс заявките не се инициират, тъй като има грешки и те се бъркат със самите аякс заявки, output-a не е чист и не може да изведе коректно връщането на respons-a...

Аякс метода на екстеншъна е този:
PHP:
    public function ajax() {
        if(is_ajax()) {
            $results = [];//globalize, holds every data from while cycle
            //get last info via ajax
            $get=$this->db->query("SELECT * FROM `".$this->cs16calladmin_db."`.`".$this->cs16calladmin_table."` order by id DESC LIMIT ".$this->call_admin_limit."");
            if($get->rowCount() > 0) {
                while ($row = $get->fetch(PDO::FETCH_ASSOC)) {
                    $username = $row['nick']; //caller
                    $report = $row['report'];
                    $date = $row['date'];
                    $time = $row['time'];
                    $server = $row['server'];

                    $results[] = ['username'=>$username, 'report'=>$report,'date'=>$date."-".$time,'server'=>$server];
                }
                echo json_encode($results, JSON_PRETTY_PRINT); //print array with results
            }
        }
        
    }


Проблема мисля, че е в самия лоудинг на екстеншъните:
PHP:
function load_extensions() {
    global $dbh, $container, $dispatcher,$lang_sys,$ext_language;
    $checker = $dbh->query('SELECT ext_name FROM '.$_SERVER['DB_PREFIX'].'ext WHERE ext_active=1');
    if ($checker->rowCount() > 0) {
        while ($row=$checker->fetch(PDO::FETCH_ASSOC)) {
            $ext_name = $row['ext_name'];
            if (file_exists(__DIR__.'/../ext/'.$ext_name.'/ext.php')) {
                //multilanguage system for extensions
                if (file_exists(__DIR__.'/../ext/'.$ext_name.'/lang/'.get_current_language().'.php')) {
                    require_once __DIR__.'/../ext/'.$ext_name.'/lang/'.get_current_language().'.php';
                    $lang_sys = array_merge($lang_sys,$ext_language);
                }
                //core file for the extension
                require_once __DIR__.'/../ext/'.$ext_name.'/ext.php';
            }
        }
    }
}

В екстеншъна имам папка lang/ с езиците, които се поддържат ru.php,en.php,bg.php и es.php
Примерно съдържание на bg.php:
PHP:
<?php
$ext_language = [
    'ext_call_admin_reload'=>'Обнови',
    'ext_calladmin_nick'=>'Никнейм',
    'ext_calladmin_report'=>'Репорт',
    'ext_calladmin_date'=>'Дата',
    'ext_calladmin_server'=>'Сървър',
];

Някой има ли съвет, как да направя всичко така, че да няма грешки в аякс метода ? Искам да е нормален начин без @, error_reporting(0) или ?? ''...
Екстеншъните ползват ajax() метода и се инициират вътре, но грешката се вади само когато е достъпен директно ajax url-a (горе съм го дал), но го давам пак:
url: "/ajax/ext/pok4/calladmin",

Като го достъпя и lang дефинициите все едно не са дефинирани в масива...
От 2 дни се мъча по-малко да го оправя по-нормален начин, но не мога... Ако някой иска повече код и обяснения, нека пише...
 
Очевидно поредността, в която извикваш всичко е грешна. Изглежда, че разширението се зарежда след като вече е заредила страницата.
 
Да, нещо такова е, имаш ли някакви идеи как да го оправя ? Искаш ли още код да ти дам или... ?

Проблема мисля, че е тук:
PHP:
//multilanguage system for extensions
if (file_exists(__DIR__.'/../ext/'.$ext_name.'/lang/'.get_current_language().'.php')) {
       require_once __DIR__.'/../ext/'.$ext_name.'/lang/'.get_current_language().'.php';
       $lang_sys = array_merge($lang_sys,$ext_language);
}

get_current_language връща настоящия език: bg/en/ru или es.
Проверявам преди екстеншъна и взимам езика с тази функция, след това викам екстеншъна така:
require_once __DIR__.'/../ext/'.$ext_name.'/ext.php';

Тук:
$lang_sys = array_merge($lang_sys,$ext_language);

$lang_sys е пре-дефиниран в бейс контролера като $this->lang. $ext_language пък е масива от ланг файловете на самите екстеншъни.
Обединявам ги с array_merge, но като сложа var_dump($ext_language) и вътре пак има грешки от рода на undefined array keys за конкретния екстеншън (в случая call admin)..

Пробвам да преброя с $count колко са заредените екстеншъни и колко са тези с ланг дефиниции...
33 са заредени, 23 са с мулти ланг поддръжка. Може би в този иф трябва да направя нещо по-горе, за да изведа поне празни тези стойности, които липсват в масива... Примерно да са празни, но да ги има дефинирани, за да не дава грешка...
Супер тъпа ситуация... Иначе всичко отпред си работи, преведено е и със смяната на езика работи, но аякс заявките ми са важни да проработят, иначе съм свършен :D
 
Последно редактирано:
Пробвах така дали ще стане:
PHP:
                //multilanguage system for extensions
                if (file_exists(__DIR__.'/../ext/'.$ext_name.'/lang/'.get_current_language().'.php')) {
                    require_once __DIR__.'/../ext/'.$ext_name.'/lang/'.get_current_language().'.php';
                    $lang_sys = array_merge($lang_sys,$ext_language);
                } else {
                    $lang_sys = array_merge($lang_sys,['ext_calladmin_nick'=>1]);
                }

Поне да скрие една грешка, но и така не става...

Пробвах и с var_dump($lang_sys) след този иф и вътре ги има ланг дефинициите, не разбирам защо вади грешки...
 
Последно редактирано:
Грешно е също директно да достъпваш lang пропъртито. Енкапсулирай го и изполвай метод, който ще прави проверката за теб. Ако няма такъв индекс не връщаш нищо, ако има връщаш стойността.
Допълнително се подсигури да имаш език по подразбиране. Ако избрания език не се поддържа от разширението то зареждай този по подразбиране, за да имаш винаги нещо, което да се показва.
 
Може би в този иф трябва да направя нещо по-горе, за да изведа поне празни тези стойности, които липсват в масива... Примерно да са празни, но да ги има дефинирани, за да не дава грешка...
Искаш да кажеш, че си склонен в <td>".$this->lang['ext_calladmin_nick']."</td> да изведеш празен низ, въпреки че стойността я има дефинирана в езиковия файл ли?
 
Хора, оправих се!
Казвам и как...
В бейс контролера бях дефинирал ланг системата, която държи масива така:
$this->lang = $lang_sys;

Просто я преместих под:
//Load All Enabled Extensions
load_extensions(); //@includes/functions.php

Иначе беше над него...

Всичко се оправи и грешката изчезна. Всичко си работи коректно за сега.
Иначе в core.php имам това:
Код:
    //Default Language setter
    if (isset($_COOKIE['argos_lang'])) {
        if (file_exists(__DIR__.'/lang/'.$_COOKIE['argos_lang'])) {
            require_once __DIR__."/lang/".$_COOKIE['argos_lang']."/".$_COOKIE['argos_lang'].".php";
            require_once __DIR__."/lang/".$_COOKIE['argos_lang']."/custom_".$_COOKIE['argos_lang'].".php";
        } else {
            require_once __DIR__."/lang/en/en.php";
            require_once __DIR__."/lang/en/custom_en.php";
        }
    } else {
        $default_lang = get_from_db_config('default_language');
        require_once __DIR__."/lang/$default_lang/$default_lang.php"; //default lang
        require_once __DIR__."/lang/$default_lang/custom_$default_lang.php";
    }

Винаги сетва en, ако няма избран език...


Знаех си, че е нещо малко...
 
Винаги сетва en, ако няма избран език...
Да, но като гледам нямаш такава логика за разширенията. Разширението ще издъхне, ако си избрал език, който не поддържа.

То беше ясно, че поредността на извиквания е грешен. Това е първото, което ти казах.

Поздравления.
 
Да, сега пробвах да преименувам bg.php на bg1.php и пак изкара грешки. Ще допиша нещо за това, предполагам, че и сам ще се справя.
Вече съм в БГ, но съм си споделил нет от телефона и всичко е пълна каша... Малко и изморен от 3000км път :D
 

Back
Горе