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?

2 years 1 month 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:

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:
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.
2 years 1 month ago #212169 by alorenc
I found in the runWithParams method in the Survey_Common_Action class Line 75:
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:
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'])) {
        $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.
2 years 1 month ago #212206 by DenisChenu

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 service on demand , plugin development .
I don't answer to private message.
The following user(s) said Thank You: alorenc
The topic has been locked.

Lime-years ahead

Online-surveys for every purse and purpose