Processwire Repeater API Methods / Functions
<?php
//
// Delete
//
$page->of(false);
$itemToRemove = $page->Body_Repeater->eq(0);
$page->Body_Repeater->remove($itemToRemove);
$page->save();
//
// Edit
//
$itemToEdit = $page->Body_Repeater->eq(0);
$itemToEdit->of(false);
$itemToEdit->body = "My new content";
$itemToEdit->save();
//
// Add
//
$page->of(false);
$item = $page->professions->getNewItem(); // professions = repeater_field_name
$item->profession = "Web Developer";
$item->save();
$page->professions->add($item);
$page->save('professions');
$page->save();
//
// Remove All items from a repeater
//
$home = $pages->get("template=home");
$home->of(false);
// Change the Repeater field value
$home->submissions->removeAll();
$home->save();
//
// Loop Trough repeater items and delete each
//
$submissions = $pages->get("template=home")->submissions;
foreach ($submissions as $s) {
$s->delete();
$s->save();
}
$pages->get("template=home")->save();
<?php
/**
* Create Repeater
*
* @param name str -- The name of your repeater field
* @param label str -- The label for your repeater
* @param fields array -- Array of fields names to add to repeater
* @param items_label str -- Lable for repeater items eg: {title}
* @param tags str -- Tags for the repeater field
*
* @example $this->createRepeater("dropdown", "Dropdown", $fields_array, "{title}", "Repeaters");
*
*/
public function createRepeater($name, $label, $fields, $items_label, $tags) {
// Create field
$f = new Field();
$f->type = $this->modules->get("FieldtypeRepeater");
$f->name = $name;
$f->label = $label;
$f->tags = $tags;
$f->repeaterReadyItems = 3;
$f->repeaterTitle = $items_label;
// Create fieldgroup
$fg = new Fieldgroup();
$fg->name = "repeater_$name";
// Add fields to fieldgroup
foreach($fields as $field) {
$fg->append($this->fields->get($field));
}
$fg->save();
// Create template
$tmp = new Template();
$tmp->name = "repeater_$name";
$tmp->flags = 8;
$tmp->noChildren = 1;
$tmp->noParents = 1;
$tmp->noGlobal = 1;
$tmp->slashUrls = 1;
$tmp->fieldgroup = $fg;
$tmp->save();
// Setup page for the repeater - Very important
$p = "for-field-{$f->id}";
$f->parent_id = $this->pages->get("name=$p")->id;
$f->template_id = $tmp->id;
$f->repeaterReadyItems = 3;
// Now, add the fields directly to the repeater field
foreach($fields as $field) {
$f->repeaterFields = $this->fields->get($field);
}
$f->save();
return $f;
}
/**
* Add field to repeater
* In a specific position, before or after existing field
*
* @param repeater_name string, name of the repeater field
* @param field_name string, name of the field we want to add
* @param existing_field_name string, we want to add new field before or after this field
* @param position string, before / after
*
*/
public function addFieldToRepeater($repeater_name, $field_name, $existing_field_name, $position = "before") {
// field to add
$this_f = $this->fields->get("$field_name");
// get reapeater field
$repeater = $this->fields->get("$repeater_name");
// get repeater field template
$t = $this->templates->get($repeater->template_id);
// ge the field from the set, we will insert new field before or after this one
$existing_field = $t->fieldgroup->fields("$existing_field_name");
// insert $this_f insertBefore or insertAfter $existing_field
if($position == "before") {
$t->fieldgroup->insertBefore($this_f, $existing_field);
} else {
$t->fieldgroup->insertAfter($this_f, $existing_field);
}
// save
$t->fieldgroup->save();
}
/**
* Repeater Field Options
* @param repeater_name string -- name of the repeater field
* @param field_name string -- name of the field
* @param options array -- field options ["option" => "value"]
*
* @example $this->repeaterFieldOptions("my_repeater_name", "text", ["label" => "My Text"]);
*
*/
public function repeaterFieldOptions($repeater_name, $field_name, $options) {
// change field settings for this template
$t = wire('templates')->get("repeater_{$repeater_name}");
Filename (eg: foobar.js)
$f = $t->fieldgroup->getField($field_name, true);
foreach($options as $key => $value) {
$f->$key = $value;
}
$this->fields->saveFieldgroupContext($f, $t->fieldgroup);//save new setting in context