Как убрать ошибки при использовании своих полей?

Александр, здравствуйте! Столкнулся с проблемой, которая не даёт покоя, касаемо реализации своих полей в Modx, сделано способом описанным тут, в статье всё очень подробно рассказано и понятно, всё работает, но конкретно в моём случае работает если в таблице у поля уже есть готовая строка, но если строки нет, при сохранении ресурса вылазит такая ошибка
Error HY000 executing statement:
INSERT INTO `pes6_site_content_extend` (`resource`, `country`, `date`, `context`) VALUES (1, '', '2000', '', '', '', '', '')
Array
(
    [0] => HY000
    [1] => 1364
    [2] => Field 'size' doesn't have a default value
)  
и значения в таблицу не добавляются, эту ошибку получилось убрать, отключив в конфиге "MySql" строгий режим:
 # Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
но это грубо и нагло, не хотелось бы таким образом делать и даже если так сделать, работать будет, но при сохранении значений в таблицу, будет другая ошибка вылазить:
PHP warning: Illegal offset type
Изначально перед тем как сделать свои поля у ресурсов, было реализовано способом описанным тут то-есть плагин дублировал тв поля в свою таблицу, проблем не было, хотя по логике плагин что тот, что этот, выполняет практически туже самую функцию. Подскажите пожалуйста, как можно устранить эти ошибки?

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

Александр
Александр
Александр, удалите пожалуйста этот комментарий, случайно отправил.
Александр Мальцев
Александр Мальцев
Здравствуйте! Вам необходимо полю size в MySQL по умолчанию установить пустую строку.
Александр
Александр
Здравствуйте! Если устанавливаю полю «size» пустую строку, подобная ошибка вылазит, только уже касаемо поля «context»:
Error HY000 executing statement:
INSERT INTO `pes6_site_content_extend` (`resource`, `country`, `datesa`, `size`) VALUES (1, '', '', 'XS')
Array
(
    [0] => HY000
    [1] => 1364
    [2] => Field 'context' doesn't have a default value
)
далее устанавливаю полю «context» пустую строку и уже получаю такую ошибку:
Error 22007 executing statement:
INSERT INTO `pes6_site_content_extend` (`resource`, `country`, `datesa`, `size`, `context`) VALUES (1, '', '', 'S', '')
Array
(
[0] => 22007
[1] => 1366
[2] => Incorrect integer value: '' for column `aso`.`pes6_site_content_extend`.`datesa` at row 1
)

Александр, я на Яндекс диск выложил файл плагина, схему и на всякий случай дамп таблицы, если возможно, посмотрите пожалуйста.

У меня получилось добиться, чтобы работало без ошибок, но это не решение проблемы, если к примеру выставить у всех полей кроме id и resource в MySQL по умолчанию «NULL» как я раннее писал, получаем ошибку
PHP warning: Illegal offset type
от этой ошибки удалось избавится удалив в плагине «ExtendedResource» эту строку
$extendResource->set('resource', $id);
но как я понимаю это неверно, назначать всем полям по умолчанию «NULL» не учитывая их значимость.

Возможно это тоже необходимая информация в данном случае. Параметры сервера:
Александр
Александр
Александр, доброго вечера! В предыдущем комментарии, начиная с предложения (У меня получилось добиться, чтобы работало без ошибок,) до (Параметров сервера), не соответствует действительности это ошибочные выводы.

На данный момент ситуация такая, работает и сохраняет выбранные значения, только если в phpMyAdmin отключаешь строгий режим «sql-mode» но тогда выходит эта ошибка:
PHP warning: Illegal offset type
о чём это говорит и как от неё можно избавится?

Если не отключать «sql-mode» и у поля «size» и поля «context» в MySQL по умолчанию сделать пустую строку, выходит такая ошибка:
Error 22007 executing statement:
INSERT INTO `pes6_site_content_extend` (`resource`, `country`, `datesa`, `size`, `context`) VALUES (1, '', '', 'S', '')
Array
(
[0] => 22007
[1] => 1366
[2] => Incorrect integer value: '' for column `aso`.`pes6_site_content_extend`.`datesa` at row 1
)
что можно попробовать сделать в данном случае?
Александр
Александр
Здравствуйте! Все ошибки выходили из-за не правильной структуры таблицы и схемы, сам намудрил а Вам мозг парю) сейчас всё сохраняет и выводит, правда при первом сохранении ресурса (когда создаётся новая строка таблицы в базе данных) всегда, появляется эта ошибка:
PHP warning: Illegal offset type \core\xpdo\om\xpdoobject.class.php 1478
при последующем сохранении этого ресурса ошибки нет, с чем связано не могу понять, не подскажите?
Александр Мальцев
Александр Мальцев
Привет! Отлично, что всё получилось. А в какой версии modx возникает это предупреждение (какой код написан на этой строчке)?
Предупреждение «Illegal offset type» возникает когда мы пытаемся получить доступ к элементу массива, используя в качестве ключа индекса массив или объект.
Александр
Александр
Александр, версия MODX Revolution 2.8.1-pl
Код этот:
$this->_fields[$this->getPK()]= $this->xpdo->lastInsertId();
Александр Мальцев
Александр Мальцев
Тут проблема с индексами в таблице. Можно, например, в phpmyadmin удалить для этой таблицы индекс id. А в файле «extendresource.mysql.schema.xml» подправить следующую строчку:
<field key="resource" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" index="index"/>
После этого обновить модель компонента.
Александр
Александр
Круто! Ошибка пропала. Я изначально проблему в коде копал а оказывается всё завязано на таблице, урок на будущее, спасибо Вам за помощь.
Александр
Александр
Александр, здравствуйте! Не получается не как решить проблему появившееся «ошибки» поля (список, одиночный выбор), точнее при сохранении пустого поля в таблицу сохраняется слово Array что самое странное, с полями (список множественный выбор) не каких проблем нет.

Сделано таким образом:

Структура таблицы:

Схема:
<field key="mypole" dbtype="varchar" precision="30" phptype="string" null="false" default="" />
Плагин:
$features='';
----------------------------
$mypole = $extendResource->get('mypole');
----------------------------
page.insert(13,{
            xtype: 'extendresource-mypole'
           ,id: 'extendresource-mypole-id'
           ,resizable: true
           ,name: 'mypole[]'
           ,hiddenName: 'mypole[]'
           ,value:'{$mypole}'
           ,anchor: '100%'
           ,layout: 'anchor'
           ,fieldLabel: 'Осебенности'
         });
----------------------------
MODx.combo.extendresourceMypole = function(config) {
config = config || {};
Ext.applyIf(config,{
    store: new Ext.data.ArrayStore({
        id: 0
        ,fields: ['mypole']
        ,data: [
            ['Первый'],['Второй'],['Третий']
        ]
    })
    ,mode: 'local'
    ,displayField: 'mypole'
    ,valueField: 'mypole'
});
MODx.combo.extendresourceMypole.superclass.constructor.call(this,config);
};
Ext.extend(MODx.combo.extendresourceMypole,MODx.combo.ComboBox);
Ext.reg('extendresource-mypole',MODx.combo.extendresourceMypole);
----------------------------
$extendResource->set('mypole', $_POST['mypole']);
Подскажите пожалуйста с чем это может быть связано и как можно попробовать решить эту проблему?

Александр, есть сомнения касаемо структуры таблицы, особенно (Атрибуты и Дополнительно) всё ли у меня правильно и правильно ли я понял по поводу удаления индекса id?
Александр Мальцев
Александр Мальцев
Добрый вечер, Алексаднр!
Вам нужно просто убрать [] (вы же сохраняете не массив):
page.insert(2,{
  xtype: 'extendresource-mypole'
  ,id: 'extendresource-mypole-id'
  ,resizable: true
  ,name: 'mypole'
  ,hiddenName: 'mypole'
  ,value:'{$mypole}'
  ,anchor: '100%'
  ,layout: 'anchor'
  ,fieldLabel: 'Осебенности'
});
Если при создании структуры таблицы, у нас в качестве первичного ключа (pk) используется поле id с автоинкрементом, то в схеме при описании объекта мы должны наследоваться от xPDOSimpleObject. Т.к. в SimpleObject реализован именно этот механизм (т.е. на основании первичного ключа id с автоинкрементом).
В противном случае, т.е. если у нас первичным ключом является что-то другое (например, два ключа), то в схеме мы дожны наследоваться от xPDOObject.

А ошибка в данном случае возникала из-за того, что pk выступало 2 поля сразу, а в схеме был выбран xPDOSimpleObject. Один из вариантов как это можно было сделать — это установить в качестве pk один ключ id с автоинкрементом.
Александр
Александр
Александр, здравствуйте! Огромное Вам спасибо за решение и подробное разъяснение, касаемо структуры таблицы.
Александр
Александр
Александр, здравствуйте! В очередной раз не получается самому разобраться и понять почему появляются данные ошибки, в этот раз ошибки появляются только тогда, когда создаёшь новый ресурс со своими полями, при последующих действиях работы с ресурсом их нет.

Первая: \core\cache\includes\elements\modplugin\47.include.cache.php (PHP warning: implode(): Invalid arguments passed строка: 657)
Если проследовать по пути и посмотреть в файл кеша, это закешированый плагин «ExtendedResource», ошибка в этой строке:
$extendResource->set('mypole5', implode('||', $_POST['mypole5']));
и в кеше почему-то в конце кода плагина, функция «return;» прописывается два раза, с чем это связано?

Вторая: \core\xpdo\om\xpdoobject.class.php extendResource: (Attempt to set NOT NULL field mypole to NULL Строка: 811), если пройти по пути в файл: xpdoobject.class.php там эта строка:
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "{$this->_class}: Attempt to set NOT NULL field {$k} to NULL");
Третья: \core\xpdo\om\xpdoobject.class.php строка: 1452 (Error HY000 executing statement:)
INSERT INTO `pes6_site_content_extend` (`resource`, `mypole1`, `mypole2`, `mypole3`, `mypole4`) VALUES (72, '0', '', 0, '')
Array
(
    [0] => HY000
    [1] => 1364
    [2] => Field 'mypole5' doesn't have a default value
)
В файле: xpdoobject.class.php под номером 1452 эта строка:
$this->xpdo->log(xPDO::LOG_LEVEL_ERROR, "Error " . $criteria->stmt->errorCode() . " executing statement:\n" . $criteria->toSQL() . "\n" . print_r($errorInfo, true));
Пробовал менять структуру таблицы, делал первичным ключем «resource» в место «id» удалял индекс id и наоборот, пробовал по разному, но данные изменение либо не чего не меняли в плане ошибок, либо добавляли новых и уже при сохранении значений в таблицу.

От первой ошибки получилось избавится, добавив в плагин «ExtendedResource» в строку
$extendResource->set('mypole5', implode('||', (array)$_POST['mypole5']));
масив: (array), но на сколько это правильно в данном случае, стоит ли так делать или нужно как-то по другому?

Вторую ошибку получается убрать, если в phpmyadmin в структуре таблицы у поля (список одиночный выбор) в данном случае: mypole «По умолчанию» в место «Как определено» выставить «Нет»

На третью ошибку при любых вариантах, повлиять не получается.

Александр, подскажите пожалуйста, как можно попробовать решить проблему с данными ошибками?
Александр Мальцев
Александр Мальцев
Здравствуйте! Удалите в конце плагина return. Установите по умолчанию в базе данных для поля mypole5 пустую строку.
Александр
Александр
Александр здравствуйте! Если выставляю пустую строку поля: «mypole5», третья ошибка пропадает, честно говоря, как я не додумался так попробовать сделать, хотя это не удивительно:), правда появляется новая:
\core\xpdo\om\xpdoobject.class.php 811
extendResource: Attempt to set NOT NULL field mypole5 to NULL
которую получилось убрать удалив в схеме компонента «extendresource» в параметрах поля в моём случае поля: «mypole5», параметр
null="false"
получилось так:
<field key="mypole5" dbtype="varchar" precision="255" phptype="string" default="" />
теперь всё чисто, журнал ошибок касаемо использования своих полей при любых действиях пуст. Огромное Вам спасибо, что помогли разобраться.