Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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

This comment has been minimized.

Copy link

commented Aug 20, 2013

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
You can’t perform that action at this time.