неожиданное поведение newObject
Пишу в раздел вопросы, т.к. в раздел «для разработчиков» рейтинг недостаточен
Потратив некоторое время на поиск бага, решил поделить с сообществом. Может кому то время сэкономит.
такое не работает
Причина
Возможность передать $setPrimaryKeys=true из newObject отсутствует
Сообщений об ошибке нет.
ps. Такое тоже не работает
pps.
github.com/bezumkin/Tickets/blob/32b75aad0f7bbf7407efd4fe8206c1e0e767eb6e/core/components/tickets/model/tickets/ticket.class.php#L664-L667
ppps. Для таблиц а-ля client_properties удобно юзать id совпадающий с client
Интересует мнение, в целом нормальная практика задавать id или лучше такого избегать?
Потратив некоторое время на поиск бага, решил поделить с сообществом. Может кому то время сэкономит.
такое не работает
$xpdo->newObject($className, array('id' => $id);а такое работает$obj = $xpdo->newObject($className);
$obj->id = $id;Причина
class xPDOObject {
...................................
public function fromArray($fldarray, $keyPrefix= '', $setPrimaryKeys= false, $rawValues= false, $adhocValues= false) {
...................................
$key = $this->getField($key);
if (isset ($this->_fieldMeta[$key]['index']) && $this->_fieldMeta[$key]['index'] == 'pk') {
if ($setPrimaryKeys) {
if (isset ($this->_fieldMeta[$key]['generated'])) {
$generatedKey= true;
}
if ($this->_new) {
if ($rawValues || $generatedKey) {
$this->_setRaw($key, $val);
} else {
$this->set($key, $val);
}
$pkSet= true;
}
}
}Поэтому если в массиве есть ключ совпадающий с pk, то он игнорируется.Возможность передать $setPrimaryKeys=true из newObject отсутствует
Сообщений об ошибке нет.
ps. Такое тоже не работает
$obj = $xpdo->newObject($className, $id);Сообщений об ошибке нет.pps.
github.com/bezumkin/Tickets/blob/32b75aad0f7bbf7407efd4fe8206c1e0e767eb6e/core/components/tickets/model/tickets/ticket.class.php#L664-L667
ppps. Для таблиц а-ля client_properties удобно юзать id совпадающий с client
Интересует мнение, в целом нормальная практика задавать id или лучше такого избегать?
Комментарии: 8
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Задавать нельзя, как вы проблему совпадающих id решать хотите?
Именно так msProductData привязывается к msProduct — у них всегда одинаковые id. А по ссылке на Tickets была опечатка, я её уже поправил.
поле id = id в 1с
при таком раскладе «проблемы совпадающих id» просто не могло возникнуть от слова совсем.
- артикул
- TV-поле
- расширить modResource или msProduct, добавив своё поле. Я использую extID.
id таблиц modx использовать нельзя, иначе всегда будут «сюрпризы».Использовать extID можно, но тогда:
на странице товара выводить какой код? extID?
в URL на странице товара какой код использовать? extID?
В базе потом искать тоже по extID? индекс делаем по extID?
в финале ID где будет использоваться? нигде?
а если везде вышеуказанном использовать id, то сотрудникам неудобно
в 1с один код, на сайте другой!
Самое место в разделе «Вопросы».
Если в оф. документации было бы это оговорено, то такое поведение newObject оправдано.
Если newObject игнорирует id и ругается на это в логах, то такое поведение приемлемо
текущая ситуация меня удивила, понять ее удалось только из исходников.
«решил поделить с сообществом. Может кому то время сэкономит.»
ИМХО я все сделал верно.