Skip to content

Instantly share code, notes, and snippets.

@somatonic
Last active November 1, 2018 09:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save somatonic/6272112 to your computer and use it in GitHub Desktop.
Save somatonic/6272112 to your computer and use it in GitHub Desktop.
Create templates and fields using array.
<?php
// .... module
// create fields and templates using arrays
public function getTemplatesConfig() {
// title | field1 | field2 ...
$templatesArray = array(
'category' => array('title'),
'house' => array('title','select_category'),
'price' => array('title','price','color'),
'week' => array('title','select_price','week_date','not_available','booked'),
'year' => array('title','year')
);
return $templatesArray;
}
public function getFieldsConfig() {
// custom php code for a page field
$select_price_phpcode = <<<_END
\$id = \$_GET['id'];
\$p = \$pages->get(\$id);
return \$p->parents('template=house')->first()->select_category->children();";
_END;
// fields array, type and label, specific setting as key=>value as they're known to the field
$fieldsArray = array(
'booked' => array('type' => 'Checkbox', 'label' => 'Booked'),
'color' => array('type' => 'ColorPicker', 'label' => 'Color'),
'not_available' => array('type' => 'Checkbox', 'label' => 'Off'),
'price' => array('type' => 'Integer', 'label' => 'Price'),
'year' => array('type' => 'Integer', 'label' => 'Year'),
'week_date' => array('type' => 'Datetime', 'label' => 'Week Date'),
'select_category' => array('type' => 'Page', 'label' => 'Select category',
'settings' => array(
'derefAsPage' => FieldtypePage::derefAsPageOrFalse,
'template_id' => $this->templates->get('category')->id
)),
'select_price' => array('type' => 'Page', 'label' => 'Select category',
'settings' => array(
'derefAsPage' => FieldtypePage::derefAsPageOrFalse,
'findPagesCode' => $select_price_phpcode
))
);
return $fieldsArray;
}
public function ___install() {
$tplArray = $this->getTemplatesConfig();
// add templates without fields so we can reference page fields to template id
foreach($tplArray as $key => $t) {
if (!$this->templates->get($key)) {
$fg = new Fieldgroup();
$fg->name = $key;
$fg->save();
$tp = new Template();
$tp->name = $key;
$tp->fieldgroup = $fg;
$tp->tags = "housemanager";
$tp->save();
} else {
$this->error("Template '$key' already exists!");
}
}
$fieldArray = $this->getFieldsConfig();
// create fields
foreach($fieldArray as $key => $field) {
if (!$this->fields->get($key)) {
$f = new Field();
$f->type = $this->modules->get("Fieldtype" . $field['type']);
$f->tags = "housemanager";
$f->name = $key;
$f->label = $field['label'];
if(isset($field['settings']) && count($field['settings'])) {
foreach($field['settings'] as $key => $value) $f->$key = $value;
}
$f->save();
} else {
$this->error("Field '$key' already exists.");
}
}
// add fields to templates
foreach($tplArray as $key => $t) {
$fg = $this->fieldgroups->get($key);
foreach($t as $f) $fg->add($this->fields->get($f));
$fg->save();
}
}
@arjenblokzijl
Copy link

Thanks Soma! Really helpful when automating these kinds of actions.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment