@@ -432,9 +432,9 @@ public function add(array $params = []): void
432
432
if ($ metaFieldsEnabled ) {
433
433
$ metaTemplates = $ this ->getMetaTemplates ();
434
434
$ data = $ this ->attachMetaTemplatesIfNeeded ($ data , $ metaTemplates ->toArray ());
435
- if ( isset ( $ params [ ' afterFind ' ])) {
436
- $ data = $ params ['afterFind ' ]( $ data , $ params );
437
- }
435
+ }
436
+ if ( isset ( $ params ['afterFind ' ])) {
437
+ $ data = $ params [ ' afterFind ' ]( $ data , $ params );
438
438
}
439
439
if ($ this ->request ->is ('post ' )) {
440
440
$ patchEntityParams = [
@@ -458,6 +458,9 @@ public function add(array $params = []): void
458
458
$ massagedData = $ this ->massageMetaFields ($ data , $ input , $ metaTemplates );
459
459
unset($ input ['MetaTemplates ' ]); // Avoid MetaTemplates to be overriden when patching entity
460
460
$ data = $ massagedData ['entity ' ];
461
+ if (isset ($ input ['meta_fields ' ])) {
462
+ unset($ input ['meta_fields ' ]);
463
+ }
461
464
}
462
465
$ data = $ this ->Table ->patchEntity ($ data , $ input , $ patchEntityParams );
463
466
if (isset ($ params ['beforeSave ' ])) {
@@ -568,10 +571,35 @@ private function saveMetaFields($id, $input)
568
571
$ this ->Table ->saveMetaFields ($ id , $ input , $ this ->Table );
569
572
}
570
573
574
+ private function handleSimpleMetaFieldInput ($ allMetaTemplates , $ input , &$ cleanupMetaFields )
575
+ {
576
+ $ input ['MetaTemplates ' ] = [];
577
+ foreach ($ input ['meta_fields ' ] as $ metaField ) {
578
+ foreach ($ allMetaTemplates as $ metaTemplate ) {
579
+ if ($ metaTemplate ->uuid != $ metaField ['template_uuid ' ] || $ metaTemplate ->version != $ metaField ['template_version ' ]) {
580
+ continue ;
581
+ }
582
+ foreach ($ metaTemplate ['meta_template_fields ' ] as $ mtp ) {
583
+ if ($ mtp ->field == $ metaField ['field ' ]) {
584
+ // I feel dirty. I'm sorry.
585
+ $ input ['MetaTemplates ' ][$ metaTemplate ->id ]['meta_template_fields ' ][$ mtp ->id ]['metaFields ' ]['new ' ][] = $ metaField ['value ' ];
586
+ $ cleanupMetaFields [] = [
587
+ 'scope ' => $ this ->Table ->getBehavior ('MetaFields ' )->getScope (),
588
+ 'field ' => $ mtp ->field ,
589
+ 'meta_template_field_id ' => $ mtp ->id ,
590
+ 'meta_template_id ' => $ metaTemplate ->id
591
+ ];
592
+ }
593
+ }
594
+ }
595
+ }
596
+ return $ input ;
597
+ }
598
+
571
599
// prune empty values and marshall fields
572
- public function massageMetaFields ($ entity , $ input , $ allMetaTemplates = [])
600
+ public function massageMetaFields ($ entity , $ input , $ allMetaTemplates = [], & $ cleanupMetaFields = [] )
573
601
{
574
- if (empty ($ input ['MetaTemplates ' ]) || !$ this ->metaFieldsSupported ()) {
602
+ if (( empty ($ input ['MetaTemplates ' ]) && ! isset ( $ input [ ' meta_fields ' ]) ) || !$ this ->metaFieldsSupported ()) {
575
603
return ['entity ' => $ entity , 'metafields_to_delete ' => []];
576
604
}
577
605
@@ -580,6 +608,11 @@ public function massageMetaFields($entity, $input, $allMetaTemplates = [])
580
608
if (empty ($ metaTemplates )) {
581
609
$ allMetaTemplates = $ this ->getMetaTemplates ()->toArray ();
582
610
}
611
+ // handle simpler format of meta_templates via the API
612
+ // the idea is that integrators shouldn't have to mimic the complex format used by the UI.
613
+ if (isset ($ input ['meta_fields ' ])) {
614
+ $ input = $ this ->handleSimpleMetaFieldInput ($ allMetaTemplates , $ input , $ cleanupMetaFields );
615
+ }
583
616
if (!empty ($ entity ->meta_fields )) {
584
617
foreach ($ entity ->meta_fields as $ i => $ metaField ) {
585
618
$ metaFieldsIndex [$ metaField ->id ] = $ i ;
@@ -738,11 +771,28 @@ public function edit(int $id, array $params = []): void
738
771
throw new NotFoundException (__ ('Could not save {0} due to the marshaling failing. Your input is bad and you should feel bad. ' , $ this ->ObjectAlias ));
739
772
}
740
773
}
774
+ $ cleanupMetaFields = [];
741
775
if ($ metaFieldsEnabled ) {
742
- $ massagedData = $ this ->massageMetaFields ($ data , $ input , $ metaTemplates );
776
+ $ massagedData = $ this ->massageMetaFields ($ data , $ input , $ metaTemplates , $ cleanupMetaFields );
777
+ if (!empty ($ cleanupMetaFields )) {
778
+ foreach ($ cleanupMetaFields as $ cleanupMetaField ) {
779
+ $ this ->Table ->MetaFields ->deleteAll ([
780
+ 'AND ' => [
781
+ 'scope ' => $ cleanupMetaField ['scope ' ],
782
+ 'field ' => $ cleanupMetaField ['field ' ],
783
+ 'meta_template_field_id ' => $ cleanupMetaField ['meta_template_field_id ' ],
784
+ 'meta_template_id ' => $ cleanupMetaField ['meta_template_id ' ],
785
+ 'parent_id ' => $ id
786
+ ]
787
+ ]);
788
+ }
789
+ }
743
790
unset($ input ['MetaTemplates ' ]); // Avoid MetaTemplates to be overriden when patching entity
744
791
$ data = $ massagedData ['entity ' ];
745
792
$ metaFieldsToDelete = $ massagedData ['metafields_to_delete ' ];
793
+ if (isset ($ input ['meta_fields ' ])) {
794
+ unset($ input ['meta_fields ' ]);
795
+ }
746
796
}
747
797
$ data = $ this ->Table ->patchEntity ($ data , $ input , $ patchEntityParams );
748
798
if (isset ($ params ['beforeSave ' ])) {
0 commit comments