kreativan
3/8/2019 - 10:27 AM

Processwire Repeater API

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