Last active
April 30, 2017 13:54
-
-
Save doup/a5cb00062e5190a24c028dc9963318f9 to your computer and use it in GitHub Desktop.
CarbonFields Transformer to get & cast values from a container
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
// Define the theme container | |
use \Carbon_Fields\Container; | |
use \Carbon_Fields\Field; | |
$theme_container = Container::make('theme_options', 'Theme')->add_fields([ | |
Field::make('text', 'analytics_id', 'Google Analytics tracking ID'), | |
Field::make('text', 'maps_api_key', 'Google Maps API Key'), | |
// ... | |
]); | |
// later... | |
// Using Factory since this is used for different container types through the theme | |
$transformer = Ent\CarbonFields\Factory::create_transformer(); | |
// Get `$theme_container` values… | |
// This casts, some of the field types: | |
// 'checkbox' => bool | |
// 'date' => Datetime | |
// 'image' => TimberImage | |
$options = $transformer->transform($theme_container, function ($name, $type) { | |
return carbon_get_theme_option($name, $type); | |
}); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Ent\CarbonFields; | |
class Transformer { | |
protected $mappers = []; | |
public function add_mapper($class, $fn) { | |
$this->mappers[$class] = $fn; | |
} | |
protected function map($values, $classes) { | |
$data = []; | |
foreach ($classes as $field_name => $field) { | |
if (count($field['children'])) { | |
// Complex field | |
// Create empty array | |
$data[$field_name] = []; | |
// Map each complex field entry | |
foreach ($values[$field_name] as $complex_entry) { | |
$data[$field_name][] = $this->map($complex_entry, $field['children']); | |
} | |
} else { | |
// Regular field | |
foreach ($this->mappers as $mapper_class => $mapper_fn) { | |
if ($field['class'] == $mapper_class) { | |
$data[$field_name] = $mapper_fn($values[$field_name]); | |
// Continue with outter most foreach | |
continue 2; | |
} | |
} | |
// There are no mappers so set the value without casting | |
$data[$field_name] = $values[$field_name]; | |
} | |
} | |
return $data; | |
} | |
protected function get_classes($container) { | |
$data = []; | |
foreach ($container->get_fields() as $field) { | |
$field_name = $field->get_base_name(); | |
$field_class = get_class($field); | |
$data[$field_name] = [ | |
'class' => $field_class, | |
'children' => [], | |
]; | |
if ($field_class == 'Carbon_Fields\Field\Complex_Field') { | |
$data[$field_name]['children'] = $this->get_classes($field); | |
} | |
} | |
return $data; | |
} | |
protected function get_values($container, $get_fn) { | |
$data = []; | |
foreach ($container->get_fields() as $field) { | |
$field_name = $field->get_base_name(); | |
$field_class = get_class($field); | |
if ($field_class == 'Carbon_Fields\Field\Complex_Field') { | |
$type = 'complex'; | |
} else if ($field_class == 'Carbon_Fields\Field\Map_Field') { | |
$type = 'map'; | |
} else { | |
$type = null; | |
} | |
$data[$field_name] = $get_fn($field_name, $type); | |
} | |
return $data; | |
} | |
public function transform($container, $get_fn) { | |
$values = $this->get_values($container, $get_fn); | |
$classes = $this->get_classes($container); | |
return $this->map($values, $classes); | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
namespace Ent\CarbonFields; | |
class Factory { | |
public static function create_transformer() { | |
$transformer = new Transformer(); | |
$transformer->add_mapper('Carbon_Fields\Field\Checkbox_Field', function ($value) { | |
return $value === 'yes'; | |
}); | |
$transformer->add_mapper('Carbon_Fields\Field\Date_Field', function ($value) { | |
if (!empty($value)) { | |
$value = new \Datetime($value); | |
} | |
return $value; | |
}); | |
$transformer->add_mapper('Carbon_Fields\Field\Image_Field', function ($value) { | |
return new \TimberImage($value); | |
}); | |
return $transformer; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment