Jump to content

Issue when creating pages with RepeaterField


MichaMichaMicha
 Share

Recommended Posts

I've stumbled upon a weird issue with repeaters.

I've created a repeaterfield with only a title field and assigned it to a template.

When I create the first page everything goes well, but then when I'm creating additional pages I'm getting this error:

ProcessPageAdd: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'for-page-23947-23799' for key 'name_parent_id'

I'm not getting redirected (probably because of the error, but the page does get created with the RepeaterField correctly).

The problem seems to exist in the file FieldtypeRepeater.module in the function 'getRepeaterPageParent'.

I've modified the file to see what actually happens and it looks like the function doesn't find the required page of saves the page correctly.

protected function getRepeaterPageParent(Page $page, Field $field) { 

		$repeaterParent = $this->getRepeaterParent($field);
		

		
		$parent = $repeaterParent->child('name=' . self::repeaterPageNamePrefix . $page->id . ', include=all'); 
		$this->message("L".__LINE__." | selectorresult: ".$parent->id);
		
		if($parent->id) return $parent; 


		$parent = new Page();
		$parent->template = $repeaterParent->template;

		$this->message("L".__LINE__." | template: ".$repeaterParent->template);
		$this->message("L".__LINE__." | parent: ".$repeaterParent->path);
		$parent->parent = $repeaterParent->id; 
		$parent->name = self::repeaterPageNamePrefix . $page->id;
		$parent->title = $page->name;
		$parent->addStatus(Page::statusSystem);

		// exit early if a field is in the process of being deleted
		// so that a repeater page parent doesn't get automatically re-created
		if($this->deletePageField === $field->parent_id){
			return $parent; 
		}

		$parent->save();
		
		$this->message("L".__LINE__." | looking for: ".self::repeaterPageNamePrefix . $page->id);
		$this->message("L".__LINE__." | current for: ".$parent->name);
		$this->message("L".__LINE__." | Created Repeater Page Parent: NAME={$parent->name} a " . $parent->path, Notice::debug); 

		return $parent; 
	}

See the attachment for the output. IMO the second time FieldtypeRepeater: L574 |  should output the previously created page...

Anyone has an idea what's going wrong? I'm on the latest master branch.

post-943-0-89910200-1403594816_thumb.png

Link to comment
Share on other sites

  • 3 weeks later...

Finally got a workaround for this.

Simply added 

$this->pages->uncache($repeaterParent); 

after

https://github.com/ryancramerdesign/ProcessWire/blob/master/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module#L556

When debugging is on in config.php you see the message twice:

Session: Created Repeater Page Parent: /admin/repeaters/for-field-140/for-page-24397/

Not the prettiest solution but at least the client can add pages again.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...