Ошибка при $modx->getTableName('Team')
Добрый день. Уверен, что мой вопрос глупый в плане построения кода, но столкнулся с такой проблемой (может быть я не прав в самой структуре запросов). Теория: код в снипете делает запрос к таблице Team и сравнивает поле. Если значение больше, то запускается функция обновления записи в котором запрос на update. Проблема в том, что когда делается первый запрос $modx->newQuery('Team'); таблица видна, но если внутри будет условие, а в нем запрос с $modx->getTableName('Team'), то он не видит таблицу.
Для примера код упростил с getCount() — проблемы будут такие же:
Функция (убрал все запросы, оставил только getTableName);
Если я просто вызову функцию TeamStat(1993,2022,235); то она сработает, а в лог запишется название таблицы. Но как только я к этой таблице обращусь вначале как $modx->newQuery('Team'); то уже внутри работать не будет $modx->getTableName('Team'). А в лог, соответственно, попадает Could not get table name for class: Team.
Т.е. я так понимаю, что вначале в функции надо каким-то образом закрыть текущее соединение с этой таблице, которое открыло $modx->newQuery('Team'); но не совсем понимаю как это сделать универсально и чтобы при другом вызове этой функции, в другом месте, все это работало. Но вполне вероятно, что я ошибаюсь в самой логике xpdo или modx.
Для примера код упростил с 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.
Комментарии: 7
Ну вы объявите, не внутри функции:
$modx->addPackage('МойКомпонент', $modx->getOption('core_path') . 'components/МойКомпонент/model/');
Это тоже внутри функции зачем объявлять?$modx = new modX();
$modx->initialize('web');
$modx->addPackage('МойКомпонент', $modx->getOption('core_path') . 'components/МойКомпонент/model/');
$t = $modx->newQuery('Team');
Если я внутри функции не объявляю modx ($modx = new modX()...), то при вызове функции даже внутри снипета будет ошибка «Undefined variable: modx in...»
www.php.net/manual/ru/language.variables.scope.php
global или передавайте modx в функцию по ссылке
в сниппете у ва уже доступна переменная $modx
global или передавайте modx в функцию по ссылке
в сниппете у ва уже доступна переменная $modx
спасибо
ООП нужно кому-то учить.
function TeamStat($t_id, $s_id, $l_id){
global $modx;
И зачем проверка нужна?if (!function_exists('TeamStat')) {
ООП нужно кому-то учить.согласен, спасибо
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.