подробнее о рекламодателе можно узнать внутри блока
Спасибо. А теперь сам материал.
Долго не мог понять, почему у меня не меняется запись в поле таблицы modx 3, при вызове стандартного modx->save().
В чем суть, из своей панельки extjs я, нажав на кнопку "запретить", должен передать в таблицу значение 1 в поле banlist. для этого я использовал стандартное extends Processor и this->modx->getObject , ->set , ->save() . Однако же значение не менялось и ошибок не было. после долгого ковыряния я узнал, что есть такое замечательное как $this->modx->setDebug(true); с помощью этой команды, в логи пишется абсолютно все и можно найти ошибку при выполнении запроса save.
use MODX\Revolution\Processors\Processor;
class BanlistProcessor extends Processor {
public $classKey = 'Table_class';
public $primaryKeyField = 'id_name';
public function process()
{
$id_get = $this->getProperty('id_name');
$Ban_Update = $this->modx->getObject($this->$classKey, array('id_name' => $id_get));
if ($Ban_Update) {
$Ban_Update->set('ban', '1');
 
$this->modx->setDebug(true); //неожиданный дебаг
 
if ($Ban_Update->save() === false) {
$errors = $this->modx->error->errors;
$errorMessage = 'Ошибка при обновлении объекта: ' . print_r($errors, true);
return $this->failure($errorMessage);
} else {
return $this->success('Запись успешно обновлена', $Ban_Update);
}
} else {
return $this->failure('error');
}
return 'BanlistProcessor';
Это позволило мне узнать, что я не прописал в файле table.map.inc.php, что у меня нестандартный primary key (id_name я назвал для примера, в общем поле уникальное (unique) , но не автоинкрементное).
исправляем
Сразу оговорюсь, возможны ошибки в описании полей
$xpdo_meta_map['Table_class'] = array(
 
'package' => 'MyPackage',
 
'version' => '1.0',
 
'table' => 'real_table_name', 
 
'extends' => 'xPDOObject', //внимание. Не xPDOSimpleObject
'fields' => 
 
array( 
 
'id_name' => null,
 
'ban' => null,
 
),'indexes' =>
 
array ( 
 
'id_name' =>
 
array (
 
'alias' => 'id_name',
 
'type' => 'BTREE',
 
'columns' =>
 
array (
 
'id_name' =>
 
array (
 
'length' => '20',
 
'collation' => 'A',
 
'null' => false,
 
),
 
),
 
'primary' => true,
 
)
 
),
 
'fieldMeta' =>
 
array( 
 
'id_name' =>
 
array(
 
'dbtype' => 'int',
 
'precision' => '20',
 
'phptype' => 'string',
 
'null' => true,
 
'default' => null,
 
),
 
'ban' =>
 
array(
 
'dbtype' => 'text',
 
'phptype' => 'string',
 
'null' => true,
 
'default' => null,
 
),
 
)
);
Вроде бы все работает и все теперь обновляется. на часах 2-30 ночи, можно допивать кофе и спать.
ОБЯЗАТЕЛЬНО потом не забыть убрать $this->modx->setDebug(true); или $this->modx->log(1,'сообщения'); , которые использовались для отладки.