. */ declare(strict_types=1); namespace Fisharebest\Webtrees\Http\RequestHandlers; use Fisharebest\Webtrees\Auth; use Fisharebest\Webtrees\Factory; use Fisharebest\Webtrees\Services\GedcomEditService; use Fisharebest\Webtrees\Tree; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use function assert; use function preg_match_all; use function redirect; /** * Add a new spouse to an individual, creating a new family. */ class AddSpouseToIndividualAction implements RequestHandlerInterface { /** @var GedcomEditService */ private $gedcom_edit_service; /** * AddChildToFamilyAction constructor. * * @param GedcomEditService $gedcom_edit_service */ public function __construct(GedcomEditService $gedcom_edit_service) { $this->gedcom_edit_service = $gedcom_edit_service; } /** * @param ServerRequestInterface $request * * @return ResponseInterface */ public function handle(ServerRequestInterface $request): ResponseInterface { $tree = $request->getAttribute('tree'); assert($tree instanceof Tree); $xref = $request->getQueryParams()['xref']; $individual = Factory::individual()->make($xref, $tree); $individual = Auth::checkIndividualAccess($individual, true); $params = (array) $request->getParsedBody(); $sex = $params['SEX']; $this->gedcom_edit_service->glevels = $params['glevels'] ?? []; $this->gedcom_edit_service->tag = $params['tag'] ?? []; $this->gedcom_edit_service->text = $params['text'] ?? []; $this->gedcom_edit_service->islink = $params['islink'] ?? []; $this->gedcom_edit_service->splitSource(); $indi_gedcom = '0 @@ INDI'; $indi_gedcom .= $this->gedcom_edit_service->addNewName($request, $tree); $indi_gedcom .= $this->gedcom_edit_service->addNewSex($request); if (preg_match_all('/([A-Z0-9_]+)/', $tree->getPreference('QUICK_REQUIRED_FACTS'), $matches)) { foreach ($matches[1] as $match) { $indi_gedcom .= $this->gedcom_edit_service->addNewFact($request, $tree, $match); } } if ($params['SOUR_INDI'] ?? false) { $indi_gedcom = $this->gedcom_edit_service->handleUpdates($indi_gedcom); } else { $indi_gedcom = $this->gedcom_edit_service->updateRest($indi_gedcom); } $fam_gedcom = ''; if (preg_match_all('/([A-Z0-9_]+)/', $tree->getPreference('QUICK_REQUIRED_FAMFACTS'), $matches)) { foreach ($matches[1] as $match) { $fam_gedcom .= $this->gedcom_edit_service->addNewFact($request, $tree, $match); } } if ($params['SOUR_FAM'] ?? false) { $fam_gedcom = $this->gedcom_edit_service->handleUpdates($fam_gedcom); } else { $fam_gedcom = $this->gedcom_edit_service->updateRest($fam_gedcom); } // Create the new spouse $spouse = $tree->createIndividual($indi_gedcom); // Create a new family if ($sex === 'F') { $family = $tree->createFamily("0 @@ FAM\n1 WIFE @" . $spouse->xref() . "@\n1 HUSB @" . $individual->xref() . '@' . $fam_gedcom); } else { $family = $tree->createFamily("0 @@ FAM\n1 HUSB @" . $spouse->xref() . "@\n1 WIFE @" . $individual->xref() . '@' . $fam_gedcom); } // Link the spouses to the family $spouse->createFact('1 FAMS @' . $family->xref() . '@', true); $individual->createFact('1 FAMS @' . $family->xref() . '@', true); if (($params['goto'] ?? '') === 'new') { return redirect($spouse->url()); } return redirect($individual->url()); } }