public function load(Object\Concrete $object)
{
$fieldDef = $object->getClass()->getFieldDefinition($this->model->getFieldname());
$values = [];
foreach ($fieldDef->getAllowedTypes() as $type) {
try {
$definition = Object\Fieldcollection\Definition::getByKey($type);
} catch (\Exception $e) {
continue;
}
$tableName = $definition->getTableName($object->getClass());
try {
$results = $this->db->fetchAll("SELECT * FROM " . $tableName . " WHERE o_id = ? AND fieldname = ? ORDER BY `index` ASC", [$object->getId(), $this->model->getFieldname()]);
} catch (\Exception $e) {
$results = [];
}
$fieldDefinitions = $definition->getFieldDefinitions();
$collectionClass = "\\Pimcore\\Model\\Object\\Fieldcollection\\Data\\" . ucfirst($type);
foreach ($results as $result) {
$collection = new $collectionClass();
$collection->setIndex($result["index"]);
$collection->setFieldname($result["fieldname"]);
$collection->setObject($object);
foreach ($fieldDefinitions as $key => $fd) {
if (method_exists($fd, "load")) {
// datafield has it's own loader
$value = $fd->load($collection, ["context" => ["containerType" => "fieldcollection", "containerKey" => $type, "fieldname" => $this->model->getFieldname(), "index" => $result["index"]]]);
if ($value === 0 || !empty($value)) {
$collection->setValue($key, $value);
}
} else {
if (is_array($fd->getColumnType())) {
$multidata = [];
foreach ($fd->getColumnType() as $fkey => $fvalue) {
$multidata[$key . "__" . $fkey] = $result[$key . "__" . $fkey];
}
$collection->setValue($key, $fd->getDataFromResource($multidata));
} else {
$collection->setValue($key, $fd->getDataFromResource($result[$key]));
}
}
}
$values[] = $collection;
}
}
$orderedValues = [];
foreach ($values as $value) {
$orderedValues[$value->getIndex()] = $value;
}
ksort($orderedValues);
$this->model->setItems($orderedValues);
return $orderedValues;
}