function arrayTrans($operatorName, &$node, $tpl, &$resourceData, $element, $lastElement, $elementList, $elementTree, &$parameters) { switch ($operatorName) { case $this->ArrayName: $code = ''; $paramCount = 0; $values = array(); $staticArray = array(); for ($i = 0; $i < count($parameters); ++$i) { if ($i != 0) { $code .= ', '; } else { $code .= '%output% = array( '; } if (!eZTemplateNodeTool::isStaticElement($parameters[$i])) { $values[] = $parameters[$i]; ++$paramCount; $code .= '%' . $paramCount . '%'; } else { if ($paramCount == 0) { $staticArray[] = eZTemplateNodeTool::elementStaticValue($parameters[$i]); } $code .= eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[$i]), 0, 0, false); } } if ($paramCount == 0) { return array(eZTemplateNodeTool::createArrayElement($staticArray)); } $code .= ' );'; return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->HashName: $code = ''; $paramCount = 0; $values = array(); $staticArray = array(); $staticKeys = true; $keys = array(); $vals = array(); $hashCount = (int) (count($parameters) / 2); for ($i = 0; $i < $hashCount; ++$i) { if ($i != 0) { $code .= ', '; } else { $code .= '%output% = array( '; } if (!eZTemplateNodeTool::isStaticElement($parameters[$i * 2])) { $staticKeys = false; $values[] = $parameters[$i * 2]; ++$paramCount; $code .= '%' . $paramCount . '%'; } else { $keys[] = eZTemplateNodeTool::elementStaticValue($parameters[$i * 2]); $code .= eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[$i * 2]), 0, 0, false); } $code .= ' => '; if (!eZTemplateNodeTool::isStaticElement($parameters[$i * 2 + 1])) { $values[] = $parameters[$i * 2 + 1]; ++$paramCount; $code .= '%' . $paramCount . '%'; } else { if ($paramCount == 0) { $staticArray[eZTemplateNodeTool::elementStaticValue($parameters[$i * 2])] = eZTemplateNodeTool::elementStaticValue($parameters[$i * 2 + 1]); } $code .= eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[$i * 2 + 1]), 0, 0, false); } if ($staticKeys) { $vals[$keys[count($keys) - 1]] = $parameters[$i * 2 + 1]; } } if ($paramCount == 0) { return array(eZTemplateNodeTool::createArrayElement($staticArray)); } if ($staticKeys) { return array(eZTemplateNodeTool::createDynamicArrayElement($keys, $vals)); } $code .= ' );'; return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->ContainsName: $values = array(); $inParam = null; $isString = false; $isArray = false; if (eZTemplateNodeTool::isStaticElement($parameters[0])) { $inParam = eZTemplateNodeTool::elementStaticValue($parameters[0]); if (is_string($inParam)) { $isString = true; } else { if (is_array($inParam)) { $isArray = true; } } $inParamCode = eZPHPCreator::variableText($inParam, 0, 0, false); } else { $values[] = $parameters[0]; $inParamCode = '%' . count($values) . '%'; } if (eZTemplateNodeTool::isStaticElement($parameters[1])) { $matchParam = eZTemplateNodeTool::elementStaticValue($parameters[1]); if (count($values) == 0) { if ($isString) { $result = strpos($inParam, $matchParam) !== false; } else { if ($isArray) { $result = in_array($matchParam, $inParam); } } return array(eZTemplateNodeTool::createBooleanElement($result)); } $matchParamCode = eZPHPCreator::variableText($matchParam, 0, 0, false); } else { $values[] = $parameters[1]; $matchParamCode = '%' . count($values) . '%'; } if ($isString) { $code = '%output% = ( strpos( ' . $inParamCode . ', ' . $matchParamCode . ' ) !== false );'; } else { if ($isArray) { $code = '%output% = in_array( ' . $matchParamCode . ', ' . $inParamCode . ' );'; } else { $code = 'if( is_string( ' . $inParamCode . ' ) )' . "\n" . '{' . "\n" . ' %output% = ( strpos( ' . $inParamCode . ', ' . $matchParamCode . ' ) !== false );' . "\n" . '}' . "\n" . 'else if ( is_array( ' . $inParamCode . ' ) )' . "\n" . '{' . "\n" . ' %output% = in_array( ' . $matchParamCode . ', ' . $inParamCode . ' );' . "\n" . '}' . "\n" . 'else' . "\n" . '{' . "\n" . '%output% = false;' . "\n" . '}'; } } return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->CompareName: $inParam = null; $isString = false; $isArray = false; $values = array(); if (eZTemplateNodeTool::isStaticElement($parameters[0])) { $inParam = eZTemplateNodeTool::elementStaticValue($parameters[0]); if (is_string($inParam)) { $isString = true; } else { if (is_array($inParam)) { $isArray = true; } } $inParamCode = eZPHPCreator::variableText($inParam, 0, 0, false); } else { $values[] = $parameters[0]; $inParamCode = '%' . count($values) . '%'; } if (eZTemplateNodeTool::isStaticElement($parameters[1])) { $matchParam = eZTemplateNodeTool::elementStaticValue($parameters[1]); if (count($values) == 0) { if ($isString) { $result = strcmp($inParam, $matchParam) === 0; } else { if ($isArray) { $result = (count(array_diff($matchParam, $inParam)) == 0 and count(array_diff($inParam, $matchParam)) == 0); } } return array(eZTemplateNodeTool::createBooleanElement($result)); } $matchParamCode = eZPHPCreator::variableText($matchParam, 0, 0, false); } else { $values[] = $parameters[1]; $matchParamCode = '%' . count($values) . '%'; } if ($isString) { $code = '%output% = strcmp( ' . $inParamCode . ', ' . $matchParamCode . ' ) === 0;'; } else { if ($isArray) { $code = '%output% = ( ( count( array_diff( ' . $inParamCode . ', ' . $matchParamCode . " ) ) == 0 ) and\n" . ' ( count( array_diff( ' . $matchParamCode . ', ' . $inParamCode . ' ) ) == 0 ) );'; } else { $code = 'if( is_string( ' . $inParamCode . ' ) )' . "\n" . '{' . "\n" . ' %output% = strcmp( ' . $inParamCode . ', ' . $matchParamCode . ') === 0;' . "\n" . '}' . "\n" . 'else if ( is_array( ' . $inParamCode . ' ) )' . "\n" . '{' . "\n" . ' %output% = ( ( count( array_diff( ' . $inParamCode . ', ' . $matchParamCode . " ) ) == 0 ) and\n" . '( count( array_diff( ' . $matchParamCode . ', ' . $inParamCode . ' ) ) == 0 ) );' . "\n" . '}'; } } return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->ImplodeName: $values = array(); if (!eZTemplateNodeTool::isStaticElement($parameters[1])) { $values[] = $parameters[1]; $code = '%1%, '; } else { $code = eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[1]), 0, 0, false) . ', '; } if (eZTemplateNodeTool::isStaticElement($parameters[0])) { if (count($values) == 0) { return array(eZTemplateNodeTool::createStringElement(implode(eZTemplateNodeTool::elementStaticValue($parameters[1]), eZTemplateNodeTool::elementStaticValue($parameters[0])))); } else { $code .= eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[0]), 0, 0, false); } } else { $values[] = $parameters[0]; $code .= '%' . count($values) . '%'; } $code = '%output% = implode( ' . $code . ' );'; return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->UniqueName: if (eZTemplateNodeTool::isStaticElement($parameters[0])) { return array(eZTemplateNodeTool::createArrayElement(array_unique(eZTemplateNodeTool::elementStaticValue($parameters[0])))); } $values = array($parameters[0]); $code = '%output% = array_unique( %1% );'; return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->ExplodeName: $values = array(); $inParam = null; $isString = false; $isArray = false; if (eZTemplateNodeTool::isStaticElement($parameters[0])) { $inParam = eZTemplateNodeTool::elementStaticValue($parameters[0]); if (is_string($inParam)) { $isString = true; } else { if (is_array($inParam)) { $isArray = true; } } $inParamCode = eZPHPCreator::variableText($inParam, 0, 0, false); } else { $values[] = $parameters[0]; $inParamCode = '%' . count($values) . '%'; } if (eZTemplateNodeTool::isStaticElement($parameters[1])) { $matchParam = eZTemplateNodeTool::elementStaticValue($parameters[1]); if (count($values) == 0) { if ($isString) { $result = explode($matchParam, $inParam); } else { if ($isArray) { $result = array(array_slice($inParam, 0, $matchParam), array_slice($inParam, $matchParam)); } } return array(eZTemplateNodeTool::createArrayElement($result)); } $matchParamCode = eZPHPCreator::variableText($matchParam, 0, 0, false); } else { $values[] = $parameters[1]; $matchParamCode = '%' . count($values) . '%'; } if ($isString) { $code = '%output% = explode( ' . $matchParamCode . ', ' . $inParamCode . ' );'; } else { if ($isArray) { $code = '%output% = array( array_slice( ' . $inParamCode . ', 0,' . $matchParamCode . ' ), array_slice( ' . $inParamCode . ', ' . $matchParamCode . ' ) );'; } else { $code = "if ( is_string( {$inParamCode} ) )\n" . "{\n" . "\t%output% = explode( {$matchParamCode}, {$inParamCode} );\n" . "}\n" . "else if ( is_array( {$inParamCode} ) )\n" . "{\n" . "\t%output% = array( array_slice( {$inParamCode}, 0, {$matchParamCode} ), array_slice( {$inParamCode}, {$matchParamCode} ) );\n" . "}\n" . "else\n" . "{\n" . "\t%output% = null;\n" . "}\n"; } } return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->RemoveName: $values = array(); $isArray = false; $isString = false; if (eZTemplateNodeTool::isStaticElement($parameters[0])) { $inputArray = eZTemplateNodeTool::elementStaticValue($parameters[0]); $inputArrayCode = eZPHPCreator::variableText($inputArray, 0, 0, false); $isString = is_string($inputArray); $isArray = is_array($inputArray); } else { $values[] = $parameters[0]; $inputArrayCode = '%' . count($values) . '%'; } if (eZTemplateNodeTool::isStaticElement($parameters[1])) { $offset = eZTemplateNodeTool::elementStaticValue($parameters[1]); $offsetCode = eZPHPCreator::variableText($offset, 0, 0, false); } else { $values[] = $parameters[1]; $offsetCode = '%' . count($values) . '%'; } $length = false; $lengthCode = ''; if (count($parameters) > 2) { if (eZTemplateNodeTool::isStaticElement($parameters[2])) { $length = eZTemplateNodeTool::elementStaticValue($parameters[2]); $lengthCode = eZPHPCreator::variableText($length, 0, 0, false); } else { $values[] = $parameters[2]; $lengthCode = '%' . count($values) . '%'; } } if (count($values) == 0) { if ($isString) { return array(eZTemplateNodeTool::createStringElement(substr($inputArray, $offset, $length))); } else { if ($isArray) { if ($length === false) { $length = 1; } $array_one = array_slice($inputArray, 0, $offset); $array_two = array_slice($inputArray, $offset + $length); return array(eZTemplateNodeTool::createArrayElement(array_merge($array_one, $array_two))); } } } if ($isString) { $code = '%output% = substr( ' . $inputArrayCode . ', ' . $offsetCode; if ($lengthCode) { $code .= ', ' . $lengthCode; } $code .= ' );'; } else { if ($isArray) { $code = '%output% = array_merge( array_slice( ' . $inputArrayCode . ', 0, ' . $offsetCode . ' ), array_slice( ' . $inputArrayCode . ', ' . $offsetCode; if ($lengthCode) { $code .= ' + ' . $lengthCode; } $code .= ' ) );'; } else { $code = '%tmp1% = ' . $inputArrayCode . ';' . "\n" . 'if ( is_string( %tmp1% ) )' . "\n" . '{' . "\n" . ' %output% = ( substr( %tmp1%, 0, ' . $offsetCode . ' )'; $lengthCode = !$lengthCode ? 1 : $lengthCode; if ($lengthCode) { $code .= ' . substr( %tmp1%, ' . $offsetCode . ' + ' . $lengthCode . ' )'; } $code .= ' );' . "\n" . '}' . "\n" . 'else if ( is_array( %tmp1% ) )' . "\n" . '{' . "\n" . ' %output% = array_merge( array_slice( %tmp1%, 0, ' . $offsetCode . ' )'; if ($lengthCode) { $code .= ', array_slice( %tmp1%, ' . $offsetCode . ' + ' . $lengthCode . ' )'; } $code .= ' );' . "\n" . '}'; } } return array(eZTemplateNodeTool::createCodePieceElement($code, $values, false, 1)); break; case $this->InsertName: $values = array(); $isArray = false; $isString = false; if (eZTemplateNodeTool::isStaticElement($parameters[0])) { $inputArray = eZTemplateNodeTool::elementStaticValue($parameters[0]); $inputArrayCode = eZPHPCreator::variableText($inputArray, 0, 0, false); $isString = is_string($inputArray); $isArray = is_array($inputArray); } else { $values[] = $parameters[0]; $inputArrayCode = '%' . count($values) . '%'; } if (eZTemplateNodeTool::isStaticElement($parameters[1])) { $offset = eZTemplateNodeTool::elementStaticValue($parameters[1]); $offsetCode = eZPHPCreator::variableText($offset, 0, 0, false); } else { $values[] = $parameters[1]; $offsetCode = '%' . count($values) . '%'; } if (count($parameters) > 2) { if (eZTemplateNodeTool::isStaticElement($parameters[2])) { $insertText = eZTemplateNodeTool::elementStaticValue($parameters[2]); } } $insertElemCode = array(); for ($i = 2; $i < count($parameters); ++$i) { if (eZTemplateNodeTool::isStaticElement($parameters[$i])) { $insertElemCode[] = eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[$i]), 0, 0, false); } else { $values[] = $parameters[$i]; $insertElemCode[] = '%' . count($values) . '%'; } } if (count($values) == 0) { if ($isString) { return array(eZTemplateNodeTool::createStringElement(substr($inputArray, 0, $offset) . $insertText . substr($inputArray, $offset))); } else { if ($isArray) { $array_one = array_slice($inputArray, 0, $offset); $array_two = array_slice($inputArray, $offset); $array_to_insert = array(); for ($i = 2; $i < count($parameters); ++$i) { $array_to_insert[] = eZTemplateNodeTool::elementStaticValue($parameters[$i]); } return array(eZTemplateNodeTool::createArrayElement(array_merge($array_one, $array_to_insert, $array_two))); } } } $tmpCount = 0; if ($isString) { $code = '%output% = substr( ' . $inputArrayCode . ', 0, ' . $offsetCode . ' ) . ' . $insertElemCode[0] . ' . substr( ' . $inputArrayCode . ', ' . $offsetCode . ' );'; } else { if ($isArray) { $code = '%tmp1% = ' . $inputArrayCode . ';' . "\n" . '%tmp2% = array_slice( %tmp1%, 0, ' . $offsetCode . ' );' . "\n" . '%tmp3% = array_slice( %tmp1%, ' . $offsetCode . ' );' . "\n" . '%tmp4% = array( '; for ($i = 0; $i < count($insertElemCode); ++$i) { if ($i != 0) { $code .= ", "; } $code .= $insertElemCode[$i]; } $code .= ' );' . "\n" . '%output% = array_merge( %tmp2%, %tmp4%, %tmp3% );' . "\n"; $tmpCount = 4; } else { $code = '%tmp1% = ' . $inputArrayCode . ';' . "\n" . 'if ( is_string( %tmp1% ) )' . "\n" . '{' . "\n" . ' %output% = substr( ' . $inputArrayCode . ', 0, ' . $offsetCode . ' ) . ' . $insertElemCode[0] . ' . substr( ' . $inputArrayCode . ', ' . $offsetCode . ' );' . "\n" . '}' . "\n" . 'else if ( is_array( %tmp1% ) )' . "\n" . '{' . "\n" . ' %tmp2% = array_slice( %tmp1%, 0, ' . $offsetCode . ' );' . "\n" . ' %tmp3% = array_slice( %tmp1%, ' . $offsetCode . ' );' . "\n" . ' %tmp4% = array( '; for ($i = 0; $i < count($insertElemCode); ++$i) { if ($i != 0) { $code .= ", "; } $code .= $insertElemCode[$i]; } $code .= ' );' . "\n" . ' %output% = array_merge( %tmp2%, %tmp4%, %tmp3% );' . "\n" . '}' . "\n"; $tmpCount = 4; } } return array(eZTemplateNodeTool::createCodePieceElement($code, $values, false, $tmpCount)); break; case $this->ReverseName: if (eZTemplateNodeTool::isStaticElement($parameters[0])) { if (is_string(eZTemplateNodeTool::elementStaticValue($parameters[0]))) { return array(eZTemplateNodeTool::createStringElement(strrev(eZTemplateNodeTool::elementStaticValue($parameters[0])))); } else { if (is_array(eZTemplateNodeTool::elementStaticValue($parameters[0]))) { return array(eZTemplateNodeTool::createArrayElement(array_reverse(eZTemplateNodeTool::elementStaticValue($parameters[0])))); } } } $values = array($parameters[0]); $code = 'if ( is_string( %1% ) )' . "\n" . '{' . "\n" . ' %output% = strrev( %1% );' . "\n" . '}' . "\n" . 'else if( is_array( %1% ) )' . "\n" . '{' . "\n" . ' %output% = array_reverse( %1% );' . "\n" . '}' . "\n"; return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->ArraySumName: if (eZTemplateNodeTool::isStaticElement($parameters[0])) { return array(eZTemplateNodeTool::createNumericElement(array_sum(eZTemplateNodeTool::elementStaticValue($parameters[0])))); } $values = array($parameters[0]); $code = '%output% = array_sum( %1% );'; return array(eZTemplateNodeTool::createCodePieceElement($code, $values)); break; case $this->RepeatName: $values = array(); $isString = false; $isArray = false; if (!eZTemplateNodeTool::isStaticElement($parameters[0])) { $values[] = $parameters[0]; $arrayCode = '%' . count($values) . '%'; } else { $arrayCode = eZPHPCreator::variableText(eZTemplateNodeTool::elementStaticValue($parameters[0]), 0, 0, false); $isString = is_string(eZTemplateNodeTool::elementStaticValue($parameters[0])); $isArray = is_array(eZTemplateNodeTool::elementStaticValue($parameters[0])); } if (!eZTemplateNodeTool::isStaticElement($parameters[1])) { $values[] = $parameters[1]; $countCode = '%' . count($values) . '%'; } else { $count = (int) eZTemplateNodeTool::elementStaticValue($parameters[1]); if (count($values) == 0) { if ($isString) { $retText = ''; $origText = eZTemplateNodeTool::elementStaticValue($parameters[0]); for ($i = 0; $i < $count; $i++) { $retText .= $origText; } return array(eZTemplateNodeTool::createStringElement($retText)); } else { if ($isArray) { $retArray = array(); $origArray = eZTemplateNodeTool::elementStaticValue($parameters[0]); for ($i = 0; $i < $count; $i++) { $retArray = array_merge($retArray, $origArray); } return array(eZTemplateNodeTool::createArrayElement($retArray)); } } } $countCode = (string) $count; } $code = '%tmp2% = ' . $arrayCode . ';' . "\n" . 'if ( is_string( %tmp2% ) )' . "\n" . ' %output% = \'\';' . "\n" . 'else if ( is_array( %tmp2% ) )' . "\n" . ' %output% = array();' . "\n" . 'for( %tmp1% = 0; %tmp1% < ' . $countCode . '; ++%tmp1% )' . "\n" . '{' . "\n" . ' if ( is_string( %tmp2% ) )' . "\n" . ' %output% .= %tmp2%;' . "\n" . ' else if ( is_array( %tmp2% ) )' . "\n" . ' %output% = array_merge( %output%, %tmp2% );' . "\n" . '}' . "\n"; return array(eZTemplateNodeTool::createCodePieceElement($code, $values, false, 2)); break; } }