static function saveTree($meanings, $lexem) { $seenMeaningIds = array(); // Keep track of the previous meaning ID at each level. This allows us to populate the parentId field $meaningStack = array(); $displayOrder = 1; foreach ($meanings as $tuple) { $m = $tuple->id ? self::get_by_id($tuple->id) : Model::factory('Meaning')->create(); $m->parentId = $tuple->level ? $meaningStack[$tuple->level - 1] : 0; $m->displayOrder = $displayOrder++; $m->breadcrumb = $tuple->breadcrumb; $m->userId = session_getUserId(); $m->lexemId = $lexem->id; $m->internalRep = $tuple->internalRep; $m->htmlRep = AdminStringUtil::htmlize($m->internalRep, 0); $m->internalEtymology = $tuple->internalEtymology; $m->htmlEtymology = AdminStringUtil::htmlize($m->internalEtymology, 0); $m->internalComment = $tuple->internalComment; $m->htmlComment = AdminStringUtil::htmlize($m->internalComment, 0); $m->save(); $meaningStack[$tuple->level] = $m->id; $sourceIds = StringUtil::explode(',', $tuple->sourceIds); MeaningSource::updateList(array('meaningId' => $m->id), 'sourceId', $sourceIds); $meaningTagIds = StringUtil::explode(',', $tuple->meaningTagIds); MeaningTagMap::updateList(array('meaningId' => $m->id), 'meaningTagId', $meaningTagIds); foreach ($tuple->relationIds as $type => $lexemIdString) { if ($type) { $lexemIds = StringUtil::explode(',', $lexemIdString); Relation::updateList(array('meaningId' => $m->id, 'type' => $type), 'lexemId', $lexemIds); } } $seenMeaningIds[] = $m->id; } self::deleteNotInSet($seenMeaningIds, $lexem->id); }