Welcome to the LimeSurvey Community Forum

Ask the community, share ideas, and connect with other LimeSurvey users!

I created a class that extends admin\tokens - why did all actions stop working?

More
5 years 6 months ago #212140 by alorenc
Limesurvey v3.25 does not supported PHP paging for LDAP.

The "ldap_doTokenSearch ()" function from ldap_helper.php is actually responsible for the import. Overwriting the function would not be a good idea in this case.

So I decided to create the admin\tokensext.php class that extends the tokens.php class and override the importldap() method.

I set it to import my helper from importldap() method:
Yii::app()->loadHelper('ldappaging');

Then in AdminController for the getActionClasses() method I changed the entry "'tokens' => 'tokensext',"

I would have to overwrite them to make them work as well. So in the tokensext class with a reference to the parent method. Example:
Code:
public function browse($iSurveyId, $limit = 50, $start = 0): void     {         parent::browse($iSurveyId, $limit, $start);     }
I don't want to do it that way. Normally a class extension should work. And the actions should be directed to the parent's methods. But in this case, they don't work or return any error.

What did I do wrong? or possibly how should I have done it correctly?
The topic has been locked.
More
5 years 6 months ago #212169 by alorenc
I found in the runWithParams method in the Survey_Common_Action class Line 75:
Code:
if (empty($aActions[$this->getId()]) || strtolower($oMethod->getDeclaringClass()->name) != strtolower($aActions[$this->getId()]) || !$oMethod->isPublic()) {     $oMethod = new ReflectionMethod($this, $sDefault); }
In this state, "$oMethod->getDeclaringClass ()->name" returns "tokens" and strtolower($aActions[$ this->getId()]) returns my "tokensext". Therefore it returns the default page which is "index".

I added an override to the runWithParams method in my tokensext class:
Code:
public function runWithParams($params)     {         if (empty($params['sa'])) {             $sSubAction = 'index';         } else {             $sSubAction = $params['sa'];         }         $oClass = new ReflectionClass($this);         if (!$oClass->hasMethod($sSubAction)) {             $sSubAction = 'run';         }         $params = $this->_addPseudoParams($params);         if (!empty($params['iSurveyId'])) {             LimeExpressionManager::SetSurveyId($params['iSurveyId']);         }         $oMethod  = new ReflectionMethod($this, $sSubAction);         if (strtolower($oMethod->getDeclaringClass()->name) == 'tokens' && $oMethod->getName() != 'importldap') {             return parent::runWithParamsInternal($this, $oMethod, $params);         } else {             return parent::runWithParams($params);         }     }
Everything would be nice if the _addPseudoParams method modifier in the Survey_Common_Action class was not private, but e.g. protected. But unfortunately this is not the case and the example above will not work.

How can I do it differently?
The topic has been locked.
More
5 years 6 months ago #212206 by DenisChenu
www.limesurvey.org/manual/BeforeControllerAction

This allow to run your own controller,

But : it's really hard to have a plugin allowing update with this

I have this working plugin : gitlab.com/SondagesPro/ExportAndStats/extendAdminStatitistics
in 2.50, 2.63. Broke around 2.70

Assistance on LimeSurvey forum and LimeSurvey core development are on my free time.
I'm not a LimeSurvey GmbH member. - Professional support - Plugins, theme and development .
I don't answer to private message.
The following user(s) said Thank You: alorenc
The topic has been locked.
Moderators: holchtpartner

Lime-years ahead

Online-surveys for every purse and purpose