Jump to content

How to get the last item of repeater programmatically after saving the page?


GeraldSchmidt
 Share

Recommended Posts

Hi,

following scenario:

I have a Single-Page implemented with ProcessWire (So i got only one page in the Backend)

post-3414-0-82860100-1453894135_thumb.pn

The customer wants me to implement a functionality which recognize the current saved item of the repeater and publish it to his facebook-page. But this is my problem. I don't see any possibility to "catch" this last-saved entry of the repeater programmatically.

This here is my repeater

post-3414-0-68434300-1453894160_thumb.pn

The name of the repeater is "referencesList" (the field-name)

post-3414-0-98940200-1453894272_thumb.pn

Do i have to programm a module for this plan?

Thank you very much in advance for your answer :)

Link to comment
Share on other sites

I think i found a solution to detect the saving of the page but i cannot get the last-saved item. It only works when im not adding an entry to the repeater.

<?php

class RepeaterLastItemCatcher extends WireData implements Module {

	/**
	 * getModuleInfo is a module required by all modules to tell ProcessWire about them
	 *
	 * @return array
	 *
	 */
	public static function getModuleInfo() {

		return array(

			// The module'ss title, typically a little more descriptive than the class name
			'title' => 'RepeaterLastItemCatcher', 

			// version number 
			'version' => 2, 

			// summary is brief description of what this module is
			'summary' => 'Dieses Modul fängt den letzten Eintrag des Repeaters ab.',
			
			// Optional URL to more information about the module
			'href' => 'https://onur-sahin.de',

			// singular=true: indicates that only one instance of the module is allowed.
			// This is usually what you want for modules that attach hooks. 
			'singular' => true, 

			// autoload=true: indicates the module should be started with ProcessWire.
			// This is necessary for any modules that attach runtime hooks, otherwise those
			// hooks won't get attached unless some other code calls the module on it's own.
			// Note that autoload modules are almost always also 'singular' (seen above).
			'autoload' => true, 
		
			// Optional font-awesome icon name, minus the 'fa-' part
			'icon' => 'smile-o', 
			);
	}

	/**
	 * Initialize the module
	 *
	 * ProcessWire calls this when the module is loaded. For 'autoload' modules, this will be called
	 * when ProcessWire's API is ready. As a result, this is a good place to attach hooks. 
	 *
	 */
	public function init() {

		// add a hook after the $pages->save, to issue a notice every time a page is saved
		$this->pages->addHookAfter('save', $this, 'catchLastItem'); 

	}

	public function catchLastItem($event) {
		$page = $event->arguments[0]; 
		$this->message("Nachdem speichern der Seite: " . $page->referencesList->last()->referencesText); 

	}

	
}

sdfsdf

Link to comment
Share on other sites

Just a guess based on a quick look through the repeater source code, but maybe try hooking: FieldtypeRepeater::savePageField

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

Also possibly: InputfieldRepeater::processInput (although this is before the repeater has saved, so not sure if it will be of any help)

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

  • Like 1
Link to comment
Share on other sites

Just a guess based on a quick look through the repeater source code, but maybe try hooking: FieldtypeRepeater::savePageField

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

Also possibly: InputfieldRepeater::processInput (although this is before the repeater has saved, so not sure if it will be of any help)

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

Thank you so much for your advice adrian!!!

Now it works!

<?php

class RepeaterLastItemCatcher extends WireData implements Module {

	public static function getModuleInfo() {

		return array(

			// The module'ss title, typically a little more descriptive than the class name
			'title' => 'RepeaterLastItemCatcher', 

			// version number 
			'version' => 2, 

			// summary is brief description of what this module is
			'summary' => 'Dieses Modul fängt den letzten Eintrag des Repeaters "" ab.',
			
			// Optional URL to more information about the module
			'href' => 'https://onur-sahin.de',

			// singular=true: indicates that only one instance of the module is allowed.
			// This is usually what you want for modules that attach hooks. 
			'singular' => true, 

			// autoload=true: indicates the module should be started with ProcessWire.
			// This is necessary for any modules that attach runtime hooks, otherwise those
			// hooks won't get attached unless some other code calls the module on it's own.
			// Note that autoload modules are almost always also 'singular' (seen above).
			'autoload' => true, 
		
			// Optional font-awesome icon name, minus the 'fa-' part
			'icon' => 'smile-o', 

			);
	}

	public function init() {

		// add a hook after the $pages->save, to issue a notice every time a page is saved
		$this->pages->addHookAfter('FieldtypeRepeater::savePageField', $this, 'catchLastItem'); 

	}

	public function catchLastItem($event) {
		
		/*
			Die Argumente sind die Parameterübergaben folgender Methode -> ___savePageField
			https://github.com/ryancramerdesign/ProcessWire/blob/master/wire/modules/Fieldtype/FieldtypeRepeater/FieldtypeRepeater.module#L958
		*/
		$page = $event->arguments[0]; 

		// Der zuletzt hinzugefügte Text des Referenz-Repeaters
		$lastSavedReferencesText = $page->referencesList->last()->referencesText;

		// Das zuletzt hinzugefügte Bild des Referenz-Repeaters
		$lastSavedReferencesImage = $_SERVER['SERVER_NAME'].$page->referencesList->last()->referencesImage->first()->url;

		// Testweise mal ausgeben im Backend
		$this->message("lastSavedReferencesText: " . $lastSavedReferencesText);
		$this->message("lastSavedReferencesImage: " . $lastSavedReferencesImage);

		// Ab dieser Stelle kommt dann die Facebook-SDK zum Einsatz...

	}

}

  • Like 1
Link to comment
Share on other sites

Glad that worked for. Just in case you don't know you can avoid the need for an entire module to add simple hooks like this.

You can place the hook and method in site/templates/admin.php

There are also site/init.php site/ready.php and site/finished.php files that you can make use of. More reading here: https://processwire.com/blog/posts/processwire-2.6.7-core-updates-and-more/#new-core-files-for-site-hooks

  • Like 2
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...