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

Александр
731
15
0
Александр, здравствуйте! Столкнулся с проблемой, которая не даёт покоя, касаемо реализации своих полей в 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
Изначально перед тем как сделать свои поля у ресурсов, было реализовано способом описанным тут то-есть плагин дублировал тв поля в свою таблицу, проблем не было, хотя по логике плагин что тот, что этот, выполняет практически туже самую функцию.

Подскажите пожалуйста, как можно устранить эти ошибки?

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

  1. Александр
    09 ноября 2020, 01:49
    Александр, удалите пожалуйста этот комментарий, случайно отправил.
    1. Александр Мальцев
      08 ноября 2020, 15:37
      Здравствуйте! Вам необходимо полю size в MySQL по умолчанию установить пустую строку.
      1. Александр
        11 ноября 2020, 06:04
        Здравствуйте! Все ошибки выходили из-за не правильной структуры таблицы и схемы, сам намудрил а Вам мозг парю) сейчас всё сохраняет и выводит, правда при первом сохранении ресурса (когда создаётся новая строка таблицы в базе данных) всегда, появляется эта ошибка:
        PHP warning: Illegal offset type \core\xpdo\om\xpdoobject.class.php 1478
        при последующем сохранении этого ресурса ошибки нет, с чем связано не могу понять, не подскажите?
        1. Александр Мальцев
          11 ноября 2020, 15:25
          Тут проблема с индексами в таблице. Можно, например, в phpmyadmin удалить для этой таблицы индекс id. А в файле «extendresource.mysql.schema.xml» подправить следующую строчку:
          <field key="resource" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" index="index"/>
          
          После этого обновить модель компонента.
          1. Александр
            27 ноября 2020, 21:12
            Александр, здравствуйте! Не получается не как решить проблему появившееся «ошибки» поля (список, одиночный выбор), точнее при сохранении пустого поля в таблицу сохраняется слово 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?
            1. Александр Мальцев
              28 ноября 2020, 15:52
              Добрый вечер, Алексаднр!
              Вам нужно просто убрать [] (вы же сохраняете не массив):
              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 с автоинкрементом.
              1. Александр
                28 ноября 2020, 18:55
                Александр, здравствуйте! Огромное Вам спасибо за решение и подробное разъяснение, касаемо структуры таблицы.
            2. Александр
              11 ноября 2020, 16:54
              Круто! Ошибка пропала. Я изначально проблему в коде копал а оказывается всё завязано на таблице, урок на будущее, спасибо Вам за помощь.
            3. Александр Мальцев
              11 ноября 2020, 06:27
              Привет! Отлично, что всё получилось. А в какой версии modx возникает это предупреждение (какой код написан на этой строчке)?
              Предупреждение «Illegal offset type» возникает когда мы пытаемся получить доступ к элементу массива, используя в качестве ключа индекса массив или объект.
              1. Александр
                29 ноября 2020, 23:50
                Александр, здравствуйте! В очередной раз не получается самому разобраться и понять почему появляются данные ошибки, в этот раз ошибки появляются только тогда, когда создаёшь новый ресурс со своими полями, при последующих действиях работы с ресурсом их нет.

                Первая: \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 «По умолчанию» в место «Как определено» выставить «Нет»

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

                Александр, подскажите пожалуйста, как можно попробовать решить проблему с данными ошибками?
                1. Александр Мальцев
                  01 декабря 2020, 15:42
                  Здравствуйте! Удалите в конце плагина return. Установите по умолчанию в базе данных для поля mypole5 пустую строку.
                  1. Александр
                    01 декабря 2020, 19:27
                    Александр здравствуйте! Если выставляю пустую строку поля: «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="" />
                    теперь всё чисто, журнал ошибок касаемо использования своих полей при любых действиях пуст. Огромное Вам спасибо, что помогли разобраться.
                2. Александр
                  11 ноября 2020, 06:38
                  Александр, версия MODX Revolution 2.8.1-pl
                  Код этот:
                  $this->_fields[$this->getPK()]= $this->xpdo->lastInsertId();
              2. Александр
                09 ноября 2020, 21:40
                Александр, доброго вечера! В предыдущем комментарии, начиная с предложения (У меня получилось добиться, чтобы работало без ошибок,) до (Параметров сервера), не соответствует действительности это ошибочные выводы.

                На данный момент ситуация такая, работает и сохраняет выбранные значения, только если в 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
                )
                что можно попробовать сделать в данном случае?
                1. Александр
                  09 ноября 2020, 01:52
                  Здравствуйте! Если устанавливаю полю «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» не учитывая их значимость.

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