Ошибка при $modx->getTableName('Team')

Добрый день. Уверен, что мой вопрос глупый в плане построения кода, но столкнулся с такой проблемой (может быть я не прав в самой структуре запросов). Теория: код в снипете делает запрос к таблице Team и сравнивает поле. Если значение больше, то запускается функция обновления записи в котором запрос на update. Проблема в том, что когда делается первый запрос $modx->newQuery('Team'); таблица видна, но если внутри будет условие, а в нем запрос с $modx->getTableName('Team'), то он не видит таблицу.
Для примера код упростил с getCount() — проблемы будут такие же:

Функция (убрал все запросы, оставил только getTableName);
if (!function_exists('TeamStat')) {
    function TeamStat($t_id, $s_id, $l_id)
    {
        $modx = new modX();
        $modx->initialize('web');
        $modx->addPackage('МойКомпонент', $modx->getOption('core_path') . 'components/МойКомпонент/model/');
        $modx->log(MODX_LOG_LEVEL_ERROR, 'Название таблицы: '.$modx->getTableName('Team'));
        }
}
Код запроса и проверки:
$t = $modx->newQuery('Team');
    $isset_row_team = $modx->getCount($class_team,array('id'=>$t_id));
    if ($isset_row_team !== '0') {
      TeamStat(1993,2022,235);
     } else { }
Я максимально упростил свою конструкцию, чтобы (надеюсь) было проще объяснить.
Если я просто вызову функцию TeamStat(1993,2022,235); то она сработает, а в лог запишется название таблицы. Но как только я к этой таблице обращусь вначале как $modx->newQuery('Team'); то уже внутри работать не будет $modx->getTableName('Team'). А в лог, соответственно, попадает Could not get table name for class: Team.

Т.е. я так понимаю, что вначале в функции надо каким-то образом закрыть текущее соединение с этой таблице, которое открыло $modx->newQuery('Team'); но не совсем понимаю как это сделать универсально и чтобы при другом вызове этой функции, в другом месте, все это работало. Но вполне вероятно, что я ошибаюсь в самой логике xpdo или modx.
Станислав
29 июля 2022, 14:02
modx.pro
431
0

Комментарии: 7

Роман
29 июля 2022, 14:42
0
Ну вы объявите, не внутри функции:
$modx->addPackage('МойКомпонент', $modx->getOption('core_path') . 'components/МойКомпонент/model/');
Это тоже внутри функции зачем объявлять?
$modx = new modX();
$modx->initialize('web');
    Роман
    29 июля 2022, 14:43
    0
    $modx->addPackage('МойКомпонент', $modx->getOption('core_path') . 'components/МойКомпонент/model/');
    $t = $modx->newQuery('Team');
      Станислав
      29 июля 2022, 14:46
      0
      Если я внутри функции не объявляю modx ($modx = new modX()...), то при вызове функции даже внутри снипета будет ошибка «Undefined variable: modx in...»
        Алексей Ерохин
        29 июля 2022, 14:52
        +1
        www.php.net/manual/ru/language.variables.scope.php
        global или передавайте modx в функцию по ссылке
        в сниппете у ва уже доступна переменная $modx
        Роман
        29 июля 2022, 14:54
        +1
        ООП нужно кому-то учить.
        function TeamStat($t_id, $s_id, $l_id){
            global $modx;
        И зачем проверка нужна?
        if (!function_exists('TeamStat')) {
          Станислав
          29 июля 2022, 15:04
          0
          ООП нужно кому-то учить.
          согласен, спасибо
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      7