Проблемы с переопределением метода get
Давеча появилась у меня тут работенка. Суть заключается в следующем: у нас есть компонент который при установке создает наследника в том числе и msProduct. Загвоздка появилась при переопределении метода get, в нашем классе он имеет следующий вид:
PS Покопавшись еще немного пришел к тому что проблема в классе xpdoobject в методе getOne:
Решено: там была самая обычная зацикленность.
public function get($k, $format = null, $formatTemplate = null) {
return isset(array_merge($this->loadData()->_fieldMeta,$this->_originalFieldMeta)[$k])
? parent::get($k, $format = null, $formatTemplate = null)
: $this->loadChars(false)[$k];
}При вызове метода в таком виде скрипт просто падает(вызываю во всем известном компоненте Console), и дает информацию о нехватки памяти. Путем несложного копания — «где проблема», пришел в метод loadData() все того же класса msProduct:public function loadData()
{
if (!is_object($this->Data) || !($this->Data instanceof msProductData)) {
if (!$this->Data = $this->getOne('Data')) {//виснет как оказалось в этом условии
$this->Data = $this->xpdo->newObject('msProductData');
parent::addOne($this->Data);
}
}
return $this->Data;
}При чем если вызвать этот кусок кода!$this->Data = $this->getOne('Data') выше, то ничего не виснет, получается проблема ТОЛЬКО в методе get нашего класса, в остальных все работает отлично. Суть проблемы вроде описал нормально, будут вопросы — задавайте. И конечно же буду рад любой помощи)PS Покопавшись еще немного пришел к тому что проблема в классе xpdoobject в методе getOne:
public function & getOne($alias, $criteria= null, $cacheFlag= true) {
$object= null;
if ($fkdef= $this->getFKDefinition($alias)) {
$k= $fkdef['local'];
$fk= $fkdef['foreign'];
die(var_dump($this->_relatedObjects[$alias]));//вот здесь отдается NULL
if (isset ($this->_relatedObjects[$alias])) {//а здесь если закомментировать строчку выше, то виснет
if (is_object($this->_relatedObjects[$alias])) {
$object= & $this->_relatedObjects[$alias];
return $object;
}
}
if ($criteria === null) {
$criteria= array ($fk => $this->get($k));
if (isset($fkdef['criteria']) && isset($fkdef['criteria']['foreign'])) {
$criteria= array($fkdef['criteria']['foreign'], $criteria);
}
}
if ($object= $this->xpdo->getObject($fkdef['class'], $criteria, $cacheFlag)) {
$this->_relatedObjects[$alias]= $object;
}
} else {
$this->xpdo->log(xPDO::LOG_LEVEL_WARN, "Could not getOne: foreign key definition for alias {$alias} not found.");
}
return $object;
}И еще раз напоминаю это происходит ТОЛЬКО в одном методе и классе, в остальных все работает.Решено: там была самая обычная зацикленность.
Комментарии: 6
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Конструктор:
Как я понял проблема действительно в модели, так как ошибки на который виснет это вызов $this->loadClass в классе xpdo.
Плюс 596 строчка в xpdo это:Как я понимаю сюда попадает файл класса acproduct.class.php из папки model/<name_component>/, а должен попадать из папки model/<name_component>/mysql/, единственное я понятия не имею как это отдебажить или проверить свою догадку.
не нужны, поскольку они уже указаны в msProduct, и их нужно удалить из схемы и перегенерировать модель. Возможно возникает конфликт из-за того, что в acProduct и в родительском msProduct указаны связи с одинаковыми алиасами.
И невозможность достать что либо из msProductData (price, color и тд).
добавить идентификатор, как
1) Вызывается метод get класса acProduct, в нем есть вызов loadData
2) В loadData вызывается метод getOne
3) В getOne класса msProduct вызывается родительский метод getOne класса xPDOObject
4) В getOne класса xPDOObject в этом куске кода
вызывается снова метод get из класса acProduct, в котором вызывается loadData и все уходит в цикл.
Дмитрий, касательно того, что не проставляются связи без указания их в схеме. Я полагаю, что вы подключаете файл класса через require? Если так, то стоит в главном классе компонента вручную загрузить класс msProduct и тогда acProduct наследует все связи.