public function prepValueFromPost($data) { $blockTypes = craft()->neo->getBlockTypesByFieldId($this->model->id, 'handle'); if (!is_array($data)) { return []; } $oldBlocksById = []; if (!empty($this->element->id)) { $ownerId = $this->element->id; $ids = []; foreach (array_keys($data) as $blockId) { if (is_numeric($blockId) && $blockId != 0) { $ids[] = $blockId; } } if ($ids) { $criteria = craft()->elements->getCriteria(Neo_ElementType::NeoBlock); $criteria->fieldId = $this->model->id; $criteria->ownerId = $ownerId; $criteria->id = $ids; $criteria->limit = null; $criteria->status = null; $criteria->localeEnabled = null; $criteria->locale = $this->element->locale; $oldBlocks = $criteria->find(); foreach ($oldBlocks as $oldBlock) { $oldBlocksById[$oldBlock->id] = $oldBlock; } } } else { $ownerId = null; } $blocks = []; foreach ($data as $blockId => $blockData) { if (!isset($blockData['type']) || !isset($blockTypes[$blockData['type']])) { continue; } $blockType = $blockTypes[$blockData['type']]; if (strncmp($blockId, 'new', 3) === 0 || !isset($oldBlocksById[$blockId])) { $block = new Neo_BlockModel(); $block->modified = true; $block->fieldId = $this->model->id; $block->typeId = $blockType->id; $block->ownerId = $ownerId; $block->ownerLocale = $this->element->locale; } else { $block = $oldBlocksById[$blockId]; $block->modified = isset($blockData['modified']) ? (bool) $blockData['modified'] : true; } $block->setOwner($this->element); $block->enabled = isset($blockData['enabled']) ? (bool) $blockData['enabled'] : true; $block->collapsed = isset($blockData['collapsed']) ? (bool) $blockData['collapsed'] : false; $block->level = (isset($blockData['level']) ? intval($blockData['level']) : 0) + 1; $ownerContentPostLocation = $this->element->getContentPostLocation(); if ($ownerContentPostLocation) { $block->setContentPostLocation("{$ownerContentPostLocation}.{$this->model->handle}.{$blockId}.fields"); } if (isset($blockData['fields'])) { $block->setContentFromPost($blockData['fields']); } $blocks[] = $block; } return $blocks; }