Skip to content

Commit

Permalink
Dev: fixed issue with any number of arguments function
Browse files Browse the repository at this point in the history
Dev: PHP function receive a big array with argument : call_user_function
Dev: add doHtmlList in example
  • Loading branch information
Shnoulle committed Jun 1, 2018
1 parent d5959d9 commit 930dc8f
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 8 deletions.
9 changes: 7 additions & 2 deletions application/config/packages.php
Expand Up @@ -270,7 +270,12 @@
'depends' => array(
'adminbasics',
)
)

),
/* An empty package to be extended for EM (after core expressions) */
'expression-extend' =>array(
'depends' => array(
// Empty, 'expressions' for 4.0
)
),

);
34 changes: 28 additions & 6 deletions application/helpers/expressions/em_core_helper.php
Expand Up @@ -263,13 +263,22 @@ public function ExpressionManagerStartEvent()
$newValidFunctions = (array) $result->get('functions');
$newPackages = (array) $result->get('packages'); // package added to expression-extend['depends'] : maybe don't add it in event, but add an helper ?
$this->RegisterFunctions($newValidFunctions); // No validation : plugin dev can break all easily
foreach($newPackages as $name => $package) {
Yii::app()->clientScript->addPackage($name,$package);
foreach($newPackages as $name => $definition) {
$this->addPackageForExpressionManager($name,$definition);
}
Yii::app()->clientScript->addPackage('expression-extend',array(
'depends' => array_keys($newPackages)
));
}

/**
* Add a package for expression
* @param string $name of package
* @param array $definition @see https://www.yiiframework.com/doc/api/1.1/CClientScript#packages-detail
* @return void
*/
public function addPackageForExpressionManager($name,$definition) {
Yii::app()->clientScript->addPackage($name,$definition);
array_push(Yii::app()->clientScript->packages['expression-extend']['depends'],$name);
}

/**
* Add an error to the error log
*
Expand Down Expand Up @@ -1851,7 +1860,16 @@ private function RDP_RunFunction($funcNameToken, $params)
return false;
}
if (!$this->RDP_onlyparse) {
$result = call_user_func_array($funcName, $params);
switch ($funcName) {
case 'sprintf':
/* function with any number of params */
$result = call_user_func_array('sprintf', $params);
break;
default:
/* function with array as param*/
$result = call_user_func($funcName, $params);
break;
}
}
// Call function with the params passed
} elseif (in_array($argsPassed, $numArgsAllowed)) {
Expand Down Expand Up @@ -1906,7 +1924,11 @@ private function RDP_RunFunction($funcNameToken, $params)
$result = call_user_func($funcName,$params[0], $params[1], $params[2]);
}
break;
case 4:
case 5:
case 6:
default:
/* We can accept any fixed numbers of params with call_user_func_array */
if (!$this->RDP_onlyparse) {
$result = call_user_func_array($funcName,$params);
}
Expand Down
16 changes: 16 additions & 0 deletions plugins/Demo/demoAddEmFunction/assets/demoAddEmFunction.js
@@ -1,3 +1,19 @@
function sayHello(message) {
return "Hello " + message;
}
function doHtmlList() {
if(!arguments.length){
return "";
}
var returnHtml = "";
for (i=0;i<arguments.length;++i) {
var string = String(arguments[i]);
if (string) {
returnHtml = returnHtml + "<li>" + string + "</li>";
}
}
if(returnHtml) {
returnHtml = "<ul>" + returnHtml + "</ul>";
}
return returnHtml;
}
24 changes: 24 additions & 0 deletions plugins/Demo/demoAddEmFunction/demoAddEmFunction.php
Expand Up @@ -17,6 +17,14 @@ public function newValidFunctions()
Yii::setPathOfAlias(get_class($this),dirname(__FILE__));
//~ Yii::import(get_class($this).".exampleFunctions");
$newFunctions = array(
'doHtmlList' => array(
'\demoAddEmFunction\exampleFunctions::doHtmlList', // PHP function, no need Class if function is directly added here
'doHtmlList', // Javascript function
$this->gT("Show an html list with elements"), // Description for admin
'string doHtmlList(arg1, arg2, ... argN)', // Extra description
'https://www.limesurvey.org', // Help url
-1, // Number of argument , here any number, no forced
),
'sayHello' => array(
'\demoAddEmFunction\exampleFunctions::sayHello', // PHP function, no need Class if function is directly added here
'sayHello', // Javascript function
Expand All @@ -38,4 +46,20 @@ public function newValidFunctions()
);
$this->getEvent()->append('packages', $newPackage);
}

/**
* If we use beforeControllerAction to register file and package :
* we don't need the event again when loading em core from $_SESSION
*
*/
public function beforeControllerAction() {
Yii::setPathOfAlias('demoAddEmFunction',dirname(__FILE__));
$newPackage = array(
'demoAddEmFunction'=> array(
'basePath' => "demoAddEmFunction.assets",
'js' => array("demoAddEmFunction.js"),
),
);
$this->getEvent()->append('packages', $newPackage);
}
}
16 changes: 16 additions & 0 deletions plugins/Demo/demoAddEmFunction/exampleFunctions.php
Expand Up @@ -9,4 +9,20 @@ public static function sayHello($message)
{
return "Hello ".$message;
}
public static function doHtmlList($elements)
{
if(!count($elements)) {
return "";
}
$returnHtml = "";
foreach($elements as $element) {
if(strval($element)) {
$returnHtml .= "<li>".$element."</li>";
}
}
if($returnHtml) {
$returnHtml = "<ul>".$returnHtml."</ul>";
}
return $returnHtml;
}
}

0 comments on commit 930dc8f

Please sign in to comment.