Opened 3 years ago

Closed 3 years ago

Last modified 3 years ago

#2275 closed New feature (fixed)

New hook needed for UsersManager

Reported by: rahman Owned by:
Priority: major Milestone: Piwik 1.3
Component: Core Keywords: hooks UsersManager thirdparty-plugin-development
Cc: Sensitive: no


Following the same technique used with the Login plugin - which set's the Zend::Registry('auth') to an instance of the Login class - the same is also needed for the UsersManager, and then the instance stored in Zend::Registry should replace the static method UsersManger::get_instance called from the Piwik_UsersManager_Controller.
The reason is found here in summary:,74485,74594#msg-74591

Attachments (2)

API.php (18.2 KB) - added by rahman 3 years ago.
API.2.php (18.2 KB) - added by rahman 3 years ago.

Download all attachments as: .zip

Change History (14)

comment:1 Changed 3 years ago by matt (mattab)

  • Milestone set to Feature requests

as this is specific to your app, we are happy to do it, but are you able to submit a patch & test it for this new feature?

comment:2 Changed 3 years ago by rahman

I'm happy too to do it and will submit it for test once finished.. But it should be noted that your description for the Login plugin as "Can be easily replaced to introduce a new Authentication mechanism" is a bit misleading till this moment.

Changed 3 years ago by rahman


comment:3 Changed 3 years ago by rahman

I attached the API.php file with modifications needed to make the UsersManager overridable.

comment:4 Changed 3 years ago by matt (mattab)

Will this work as well?

Index: plugins/UsersManager/API.php
--- plugins/UsersManager/API.php	(revision 4334)
+++ plugins/UsersManager/API.php	(working copy)
@@ -23,11 +23,16 @@
 	static public function getInstance()
-		if (self::$instance == null)
-		{
-			self::$instance = new self;
+		try {
+			$instance = Zend_Registry::get('UsersManager_API');
+			if( !($instance instanceof Piwik_UsersManager_API) ) {
+				throw new Exception('UsersManager_API must inherit Piwik_UsersManager_API');
+			}
+		} catch (Exception $e) {
+			$instance = new self;
-		return self::$instance;
+		Zend_Registry::set('UsersManager_API', $instance);
+		return $instance;
 	const PREFERENCE_DEFAULT_REPORT = 'defaultReport';

If you confirm this works with your plugin I can commit
also, do you mind posting a quick example of how you use it, I will add it as a comment. thx

Changed 3 years ago by rahman


comment:5 Changed 3 years ago by rahman

instead please refer to API.2.php attached
it was tested and passed

here is an example:

Register listener for some early hook like FrontController.initAuthenticationObject
and within the observer function:


the method Piwik_MyCustomUsersManager_API::getInstance() merely returns an instance of its class, which has methods overriden such as getUser and getUserByEmail etc... that looks inside other tables/data sources for users, instead of Piwik users table

comment:6 Changed 3 years ago by matt (mattab)

  • Resolution set to fixed
  • Status changed from new to closed

(In [4434]) Fixes #2275 Thanks rahman for feedback!

comment:7 Changed 3 years ago by matt (mattab)

  • Milestone changed from Feature requests to 1.3 - Piwik 1.3

comment:8 Changed 3 years ago by rahman


comment:9 Changed 3 years ago by rahman

I'm looking forward to participating more. You can assign me tasks regarding Piwik bugs fixes/feature requests.

comment:10 follow-up: Changed 3 years ago by matt (mattab)

rahman, it is better if you grab the tasks that are interesting to you! we also look forward to seeing more patches

comment:11 in reply to: ↑ 10 Changed 3 years ago by rahman

Okay, I will search the timeline for tasks. I'm kinda new to this so not sure how I will occasionally declare undertaking a request to avoid duplicate work with other developers.

comment:12 Changed 3 years ago by matt (mattab)

in general, it is safe to work on any ticket unless

  • it was recently created and might be work in progress
  • it is already assigned to someone

Best to ask questions etc. No need to say "I'm going to work on this" because as we've seen in the past, most people who say that don't end up working on it so then it creates confusion ;)

Note: See TracTickets for help on using tickets.