/** * Propagate move, delete, or undelete to other articles if necessary * * @param String $newTitleString null in case of delete; same as this title string in case of undelete * @param String $text text of article * @param bool $textChanged we never change the text, so this is never set to true * @return bool true if success */ protected function propagateMoveDeleteUndelete($newTitleString, $newNs, &$text, &$textChanged) { $result = true; // move: maintain place abbrevs and add place redirect job if ($newTitleString && $newTitleString != $this->titleString) { Place::placeAbbrevsDelete($this->titleString); Place::placeAbbrevsDelete($newTitleString); Place::placeAbbrevsAdd($newTitleString, $this->xml); // edit wlh pages to point to the target title $newTitle = Title::newFromText($newTitleString, NS_PLACE); $job = new PlaceRedirectJob(array('old_title' => $this->titleString, 'new_title' => $newTitle->getText())); $job->insert(); } else { if (!$newTitleString) { Place::placeAbbrevsDelete($this->titleString); } } // determine parents and type and lat and lng list($alsoLocatedIn, $type, $lat, $lng, $fromYear, $toYear) = Place::getPropagatedData($this->xml); // get new name pieces $newName = Place::getPrefNameLocatedIn($newTitleString); // follow redirects $t = (string) $this->locatedIn ? Title::newFromText((string) $this->locatedIn, NS_PLACE) : null; if ($t) { $t = StructuredData::getRedirectToTitle($t); } $oldLocatedIn = $t ? $t->getText() : (string) $this->locatedIn; $t = $newName[1] ? Title::newFromText($newName[1], NS_PLACE) : null; if ($t) { $t = StructuredData::getRedirectToTitle($t); } $newLocatedIn = $t ? $t->getText() : $newName[1]; foreach ($alsoLocatedIn as $ali) { $t = $ali['place'] ? Title::newFromText($ali['place'], NS_PLACE) : null; if ($t) { $t = StructuredData::getRedirectToTitle($t); } if ($t) { $ali['place'] = $t->getText(); } } // if current located-in place is not also an also-located-in place if (StructuredData::mapArraySearch($oldLocatedIn, $alsoLocatedIn, 'place') === false) { if ($oldLocatedIn == $newLocatedIn) { // update title in located-in place $article = StructuredData::getArticle(Title::newFromText($oldLocatedIn, NS_PLACE), true); if ($article) { $content =& $article->fetchContent(); $updatedContent =& $this->updateContainedPlace($newTitleString, $type, $lat, $lng, $fromYear, $toYear, $content); if ($updatedContent) { $updateResult = $article->doEdit($updatedContent, self::PROPAGATE_MESSAGE . ' [[' . $this->title->getPrefixedText() . ']]', PROPAGATE_EDIT_FLAGS); $result = $result && $updateResult; } } } else { // remove from current parent $parentArticle = StructuredData::getArticle(Title::newFromText($oldLocatedIn, NS_PLACE), true); if ($parentArticle) { $content =& $parentArticle->fetchContent(); $updatedContent =& $this->updateContainedPlace(null, null, null, null, null, null, $content); if ($updatedContent) { $updateResult = $parentArticle->doEdit($updatedContent, self::PROPAGATE_MESSAGE . ' [[' . $this->title->getPrefixedText() . ']]', PROPAGATE_EDIT_FLAGS); $result = $result && $updateResult; } } } } // add to new parent if necessary if ($oldLocatedIn != $newLocatedIn && StructuredData::mapArraySearch($newLocatedIn, $alsoLocatedIn, 'place') === false) { $article = StructuredData::getArticle(Title::newFromText($newLocatedIn, NS_PLACE), true); if ($article) { $content =& $article->fetchContent(); $updatedContent =& $this->updateContainedPlace($newTitleString, $type, $lat, $lng, $fromYear, $toYear, $content); if ($updatedContent) { $updateResult = $article->doEdit($updatedContent, self::PROPAGATE_MESSAGE . ' [[' . $this->title->getPrefixedText() . ']]', PROPAGATE_EDIT_FLAGS); $result = $result && $updateResult; } } } // update title in also-located-in places foreach ($alsoLocatedIn as $pli) { $article = StructuredData::getArticle(Title::newFromText((string) $pli['place'], NS_PLACE), true); if ($article) { $content =& $article->fetchContent(); $updatedContent =& $this->updateContainedPlace($newTitleString, $type, $lat, $lng, (string) $pli['from_year'], (string) $pli['to_year'], $content); if ($updatedContent) { $updateResult = $article->doEdit($updatedContent, self::PROPAGATE_MESSAGE . ' [[' . $this->title->getPrefixedText() . ']]', PROPAGATE_EDIT_FLAGS); $result = $result && $updateResult; } } } if (!$result) { error_log("ERROR! Place move/delete/undelete not propagated: {$this->titleString} -> " . ($newTitleString ? $newTitleString : "[delete]") . "\n"); } return $result; }