@@ -227,9 +227,17 @@ public function save(array $data, Form $form): HTTPResponse
227227 // Get owner using getOwnerFromRequest() rather than $link->Owner() so that validation is run
228228 // on the owner params before updating the database
229229 $ owner = $ this ->getOwnerFromRequest ();
230+ if (!$ owner ) {
231+ $ className = $ this ->getOwnerClassFromRequest ();
232+ $ owner = $ className ? Injector::inst ()->get ($ className ) : null ;
233+ }
230234 $ ownerRelation = $ this ->getOwnerRelationFromRequest ();
235+ if (!$ owner || !$ ownerRelation ) {
236+ $ this ->jsonError (404 );
237+ }
238+
231239 $ ownerRelationID = "{$ ownerRelation }ID " ;
232- $ hasOne = Injector:: inst ()-> get ( $ owner-> ClassName ) ->hasOne ();
240+ $ hasOne = $ owner ->hasOne ();
233241 if ($ operation === 'create '
234242 && array_key_exists ($ ownerRelation , $ hasOne )
235243 && $ owner ->$ ownerRelationID !== $ link ->ID
@@ -323,10 +331,14 @@ private function createLinkForm(Link $link, string $operation, bool $excludeLink
323331 /** @var Form $form */
324332 $ form = $ formFactory ->getForm ($ this , $ name , ['Record ' => $ link ]);
325333 $ owner = $ this ->getOwnerFromRequest ();
326- $ ownerID = $ owner -> ID ;
327- $ ownerClassName = $ owner -> ClassName ;
334+ $ ownerID = $ this -> getOwnerIDFromRequest () ;
335+ $ ownerClassName = $ this -> getOwnerClassFromRequest () ;
328336 $ ownerRelation = $ this ->getOwnerRelationFromRequest ();
329337
338+ if (!$ owner ) {
339+ $ owner = Injector::inst ()->create ($ ownerClassName );
340+ }
341+
330342 // Remove LinkText if appropriate
331343 if ($ excludeLinkTextField ) {
332344 $ form ->Fields ()->removeByName ('LinkText ' );
@@ -477,12 +489,12 @@ private function typeKeyFromRequest(): string
477489 /**
478490 * Get the owner class based on the query string param OwnerClass
479491 */
480- private function getOwnerClassFromRequest (): string
492+ private function getOwnerClassFromRequest (): string | null
481493 {
482494 $ request = $ this ->getRequest ();
483495 $ ownerClass = $ request ->getVar ('ownerClass ' ) ?: $ request ->postVar ('OwnerClass ' );
484496 if (!is_a ($ ownerClass , DataObject::class, true )) {
485- $ this -> jsonError ( 404 ) ;
497+ return null ;
486498 }
487499
488500 return $ ownerClass ;
@@ -495,22 +507,22 @@ private function getOwnerIDFromRequest(): int
495507 {
496508 $ request = $ this ->getRequest ();
497509 $ ownerID = (int ) ($ request ->getVar ('ownerID ' ) ?: $ request ->postVar ('OwnerID ' ));
498- if ($ ownerID === 0 ) {
499- $ this ->jsonError (404 );
500- }
501-
502510 return $ ownerID ;
503511 }
504512
505513 /**
506514 * Get the owner based on the query string params ownerID, ownerClass, ownerRelation
507515 * OR the POST vars OwnerID, OwnerClass, OwnerRelation
508516 */
509- private function getOwnerFromRequest (): DataObject
517+ private function getOwnerFromRequest (): DataObject | null
510518 {
511519 $ ownerID = $ this ->getOwnerIDFromRequest ();
512520 $ ownerClass = $ this ->getOwnerClassFromRequest ();
513521 $ ownerRelation = $ this ->getOwnerRelationFromRequest ();
522+ if (!$ ownerID || !$ ownerClass || !$ ownerRelation ) {
523+ return null ;
524+ }
525+
514526 /** @var DataObject $obj */
515527 $ obj = Injector::inst ()->get ($ ownerClass );
516528 $ hasOne = $ obj ->hasOne ();
@@ -533,21 +545,16 @@ private function getOwnerFromRequest(): DataObject
533545 return $ owner ;
534546 }
535547 }
536- $ this -> jsonError ( 404 ) ;
548+ return null ;
537549 }
538550
539551 /**
540552 * Get the owner relation based on the query string param ownerRelation
541553 * OR the POST var OwnerRelation
542554 */
543- private function getOwnerRelationFromRequest (): string
555+ private function getOwnerRelationFromRequest (): string | null
544556 {
545557 $ request = $ this ->getRequest ();
546- $ ownerRelation = $ request ->getVar ('ownerRelation ' ) ?: $ request ->postVar ('OwnerRelation ' );
547- if (!$ ownerRelation ) {
548- $ this ->jsonError (404 );
549- }
550-
551- return $ ownerRelation ;
558+ return $ request ->getVar ('ownerRelation ' ) ?: $ request ->postVar ('OwnerRelation ' );
552559 }
553560}
0 commit comments