99use Illuminate \Support \Collection ;
1010use Illuminate \Translation \Translator ;
1111use Kris \LaravelFormBuilder \Events \AfterCollectingFieldRules ;
12+ use Kris \LaravelFormBuilder \Fields \CheckableType ;
1213use Kris \LaravelFormBuilder \Fields \FormField ;
1314use Kris \LaravelFormBuilder \Form ;
1415use Kris \LaravelFormBuilder \RulesParser ;
@@ -336,6 +337,43 @@ public function mergeAttributes(array $fields)
336337 return $ attributes ;
337338 }
338339
340+ /**
341+ * Get a form's checkbox fields' names.
342+ *
343+ * @param Form $form
344+ * @return array
345+ */
346+ public function getBoolableFields (Form $ form )
347+ {
348+ $ fields = [];
349+ foreach ($ form ->getFields () as $ name => $ field ) {
350+ if ($ field instanceof CheckableType && $ field ->getOption ('value ' ) == CheckableType::DEFAULT_VALUE ) {
351+ $ fields [] = $ this ->transformToDotSyntax ($ name );
352+ }
353+ }
354+
355+ return $ fields ;
356+ }
357+
358+ /**
359+ * Turn checkbox fields into bools.
360+ *
361+ * @param Form $form
362+ * @param array $values
363+ * @return void
364+ */
365+ public function alterFieldValuesBools (Form $ form , array &$ values )
366+ {
367+ $ fields = $ this ->getBoolableFields ($ form );
368+
369+ foreach ($ fields as $ name ) {
370+ $ value = Arr::get ($ values , $ name , -1 );
371+ if ($ value !== -1 ) {
372+ Arr::set ($ values , $ name , (int ) (bool ) $ value );
373+ }
374+ }
375+ }
376+
339377 /**
340378 * Alter a form's values recursively according to its fields.
341379 *
@@ -345,6 +383,8 @@ public function mergeAttributes(array $fields)
345383 */
346384 public function alterFieldValues (Form $ form , array &$ values )
347385 {
386+ $ this ->alterFieldValuesBools ($ form , $ values );
387+
348388 // Alter the form's child forms recursively
349389 foreach ($ form ->getFields () as $ name => $ field ) {
350390 if (method_exists ($ field , 'alterFieldValues ' )) {
0 commit comments