Skip to content

Instantly share code, notes, and snippets.

@doup
Last active April 30, 2017 13:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save doup/a5cb00062e5190a24c028dc9963318f9 to your computer and use it in GitHub Desktop.
Save doup/a5cb00062e5190a24c028dc9963318f9 to your computer and use it in GitHub Desktop.
CarbonFields Transformer to get & cast values from a container
<?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);
});
<?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);
}
}
<?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