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

Александр
Александр
1,2K
15
Содержание:
  1. Комментарии
Александр, здравствуйте! Столкнулся с проблемой, которая не даёт покоя, касаемо реализации своих полей в 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

  1. Александр
    Александр
    2020-11-09 01:49:47
    Александр, удалите пожалуйста этот комментарий, случайно отправил.
  1. Александр Мальцев
    Александр Мальцев
    2020-11-08 15:37:29
    Здравствуйте! Вам необходимо полю size в MySQL по умолчанию установить пустую строку.
    1. Александр
      Александр
      2020-11-09 01:52:16
      Здравствуйте! Если устанавливаю полю «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» не учитывая их значимость.

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

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

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

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

      Александр, подскажите пожалуйста, как можно попробовать решить проблему с данными ошибками?
    12. Александр Мальцев
      Александр Мальцев
      2020-12-01 15:42:35
      Здравствуйте! Удалите в конце плагина return. Установите по умолчанию в базе данных для поля mypole5 пустую строку.
    13. Александр
      Александр
      2020-12-01 19:27:16
      Александр здравствуйте! Если выставляю пустую строку поля: «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="" />
      теперь всё чисто, журнал ошибок касаемо использования своих полей при любых действиях пуст. Огромное Вам спасибо, что помогли разобраться.