00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 class eZTemplateLogicOperator
00088 {
00089
00090
00091
00092 function eZTemplateLogicOperator()
00093 {
00094 $this->Operators = array( 'lt', 'gt', 'le', 'ge', 'eq', 'ne',
00095 'null', 'not',
00096 'or', 'and',
00097 'true', 'false', 'choose' );
00098 foreach ( $this->Operators as $operator )
00099 {
00100 $name = $operator . 'Name';
00101 $name[0] = $name[0] & "\xdf";
00102 $this->$name = $operator;
00103 }
00104 }
00105
00106
00107
00108
00109 function &operatorList()
00110 {
00111 return $this->Operators;
00112 }
00113
00114
00115
00116
00117 function namedParameterPerOperator()
00118 {
00119 return true;
00120 }
00121
00122 function operatorTemplateHints()
00123 {
00124 return array( $this->LtName => array( 'input' => true,
00125 'output' => true,
00126 'parameters' => 1,
00127 'element-transformation' => true,
00128 'transform-parameters' => true,
00129 'input-as-parameter' => true,
00130 'element-transformation-func' => 'logicalComparisonTransformation'),
00131 $this->GtName => array( 'input' => true,
00132 'output' => true,
00133 'parameters' => 1,
00134 'element-transformation' => true,
00135 'transform-parameters' => true,
00136 'input-as-parameter' => true,
00137 'element-transformation-func' => 'logicalComparisonTransformation'),
00138 $this->LeName => array( 'input' => true,
00139 'output' => true,
00140 'parameters' => 1,
00141 'element-transformation' => true,
00142 'transform-parameters' => true,
00143 'input-as-parameter' => true,
00144 'element-transformation-func' => 'logicalComparisonTransformation'),
00145 $this->GeName => array( 'input' => true,
00146 'output' => true,
00147 'parameters' => 1,
00148 'element-transformation' => true,
00149 'transform-parameters' => true,
00150 'input-as-parameter' => true,
00151 'element-transformation-func' => 'logicalComparisonTransformation'),
00152
00153 $this->EqName => array( 'input' => true,
00154 'output' => true,
00155 'parameters' => true,
00156 'element-transformation' => true,
00157 'transform-parameters' => true,
00158 'input-as-parameter' => true,
00159 'element-transformation-func' => 'logicalComparisonTransformation'),
00160 $this->NeName => array( 'input' => true,
00161 'output' => true,
00162 'parameters' => true,
00163 'element-transformation' => true,
00164 'transform-parameters' => true,
00165 'input-as-parameter' => true,
00166 'element-transformation-func' => 'logicalComparisonTransformation'),
00167
00168 $this->NullName => array( 'input' => true,
00169 'output' => true,
00170 'parameters' => false ),
00171
00172 $this->OrName => array( 'input' => true,
00173 'output' => true,
00174 'parameters' => true,
00175 'element-transformation' => true,
00176 'transform-parameters' => true,
00177 'input-as-parameter' => true,
00178 'element-transformation-func' => 'logicalComparisonTransformation'),
00179 $this->AndName => array( 'input' => true,
00180 'output' => true,
00181 'parameters' => true,
00182 'element-transformation' => true,
00183 'transform-parameters' => true,
00184 'input-as-parameter' => true,
00185 'element-transformation-func' => 'logicalComparisonTransformation'),
00186
00187 $this->NotName => array( 'input' => true,
00188 'output' => true,
00189 'parameters' => true,
00190 'element-transformation' => true,
00191 'transform-parameters' => true,
00192 'input-as-parameter' => true,
00193 'element-transformation-func' => 'negateTransformation'),
00194
00195 $this->ChooseName => array( 'input' => true,
00196 'output' => true,
00197 'parameters' => true,
00198 'element-transformation' => true,
00199 'transform-parameters' => true,
00200 'input-as-parameter' => 'always',
00201 'element-transformation-func' => 'chooseTransformation'),
00202 $this->TrueName => array( 'input' => false,
00203 'output' => true,
00204 'parameters' => false,
00205 'static' => true,
00206 'element-transformation' => true,
00207 'transform-parameters' => true,
00208 'input-as-parameter' => true,
00209 'element-transformation-func' => 'trueFalseTransformation'),
00210 $this->FalseName => array( 'input' => false,
00211 'output' => true,
00212 'parameters' => false,
00213 'static' => true,
00214 'element-transformation' => true,
00215 'transform-parameters' => true,
00216 'input-as-parameter' => true,
00217 'element-transformation-func' => 'trueFalseTransformation') );
00218 }
00219
00220 function operatorCompiledStaticData( $operatorName )
00221 {
00222 switch( $operatorName )
00223 {
00224 case $this->TrueName:
00225 {
00226 return true;
00227 } break;
00228 case $this->FalseName:
00229 {
00230 return false;
00231 } break;
00232 }
00233 return false;
00234 }
00235
00236
00237
00238
00239 function namedParameterList()
00240 {
00241 return array( $this->LtName => array( "threshold" => array( "type" => "mixed",
00242 "required" => true,
00243 "default" => false ) ),
00244 $this->GtName => array( "threshold" => array( "type" => "mixed",
00245 "required" => true,
00246 "default" => false ) ),
00247 $this->LeName => array( "threshold" => array( "type" => "mixed",
00248 "required" => true,
00249 "default" => false ) ),
00250 $this->GeName => array( "threshold" => array( "type" => "mixed",
00251 "required" => true,
00252 "default" => false ) ) );
00253 }
00254
00255
00256 function logicalComparisonTransformation( $operatorName, &$node, &$tpl, &$resourceData,
00257 &$element, &$lastElement, &$elementList, &$elementTree, &$parameters )
00258 {
00259 $values = array();
00260 $function = $operatorName;
00261 $minParameterCount = $maxParameterCount = 2;
00262
00263 switch ( $operatorName )
00264 {
00265 case 'lt':
00266 $operator = '<';
00267 break;
00268 case 'le':
00269 $operator = '<=';
00270 break;
00271 case 'gt':
00272 $operator = '>';
00273 break;
00274 case 'ge':
00275 $operator = '>=';
00276 break;
00277 case 'eq':
00278 $operator = '==';
00279 break;
00280 case 'ne':
00281 $operator = '!=';
00282 break;
00283 case 'and':
00284 $operator = 'and';
00285 $maxParameterCount = false;
00286 break;
00287 case 'or':
00288 $operator = 'or';
00289 $maxParameterCount = false;
00290 break;
00291 }
00292 if ( ( count( $parameters ) < 2 ) ||
00293 ( $maxParameterCount && ( count( $parameters ) > $maxParameterCount ) ) )
00294 {
00295 return false;
00296 }
00297 $newElements = array();
00298
00299 if ( $operatorName == 'or' )
00300 {
00301 $staticResult = false;
00302 $staticValue = null;
00303 $dynamicParameters = array();
00304 $addDynamic = false;
00305 $lastValue = null;
00306 foreach ( $parameters as $parameter )
00307 {
00308 if ( $addDynamic )
00309 {
00310 $dynamicParameters[] = $parameter;
00311 continue;
00312 }
00313 if ( eZTemplateNodeTool::isStaticElement( $parameter ) )
00314 {
00315 $parameterValue = eZTemplateNodeTool::elementStaticValue( $parameter );
00316 if ( $staticValue === null )
00317 {
00318 $staticValue = $parameterValue;
00319 }
00320 else
00321 {
00322 $staticValue = ( $staticValue or $parameterValue );
00323 }
00324 $lastValue = $parameterValue;
00325 if ( $parameterValue )
00326 {
00327 $staticResult = true;
00328 break;
00329 }
00330 continue;
00331 }
00332 $addDynamic = true;
00333 $dynamicParameters[] = $parameter;
00334 $staticValue = null;
00335 }
00336 if ( count( $dynamicParameters ) == 0 )
00337 {
00338 if ( !$staticResult )
00339 $lastValue = false;
00340 $newElements[] = eZTemplateNodeTool::createStaticElement( $lastValue );
00341 return $newElements;
00342 }
00343
00344 $code = '';
00345 $counter = 0;
00346 foreach ( $dynamicParameters as $parameter )
00347 {
00348 if ( $counter++ )
00349 {
00350 $code .= "else ";
00351 }
00352 $code .= ( "if ( %$counter% )\n" .
00353 " %output% = %$counter%;\n" );
00354 $values[] = $parameter;
00355 }
00356 $code .= ( "else\n" .
00357 " %output% = false;\n" );
00358 }
00359 else if ( $operatorName == 'and' )
00360 {
00361 $staticResult = false;
00362 $staticValue = null;
00363 $dynamicParameters = array();
00364 $addDynamic = false;
00365 $lastValue = null;
00366 foreach ( $parameters as $parameter )
00367 {
00368 if ( $addDynamic )
00369 {
00370 $dynamicParameters[] = $parameter;
00371 continue;
00372 }
00373 if ( eZTemplateNodeTool::isStaticElement( $parameter ) )
00374 {
00375 $parameterValue = eZTemplateNodeTool::elementStaticValue( $parameter );
00376 if ( $staticValue === null )
00377 {
00378 $staticValue = $parameterValue;
00379 }
00380 else
00381 {
00382 $staticValue = ( $staticValue and $parameterValue );
00383 }
00384 $lastValue = $parameterValue;
00385 if ( !$parameterValue )
00386 {
00387 $lastValue = false;
00388 $staticResult = true;
00389 break;
00390 }
00391 continue;
00392 }
00393 $addDynamic = true;
00394 $dynamicParameters[] = $parameter;
00395 $staticValue = null;
00396 }
00397 if ( count( $dynamicParameters ) == 0 )
00398 {
00399 $newElements[] = eZTemplateNodeTool::createStaticElement( $lastValue );
00400 return $newElements;
00401 }
00402
00403 $code = '';
00404 $counter = 0;
00405 foreach ( $dynamicParameters as $parameter )
00406 {
00407 if ( $counter++ )
00408 {
00409 $code .= "else ";
00410 }
00411 $code .= ( "if ( !%$counter% )\n" .
00412 " %output% = false;\n" );
00413 $values[] = $parameter;
00414 }
00415 $code .= ( "else\n" .
00416 " %output% = %$counter%;\n" );
00417 }
00418 else
00419 {
00420 $code = '%output% = (';
00421 $counter = 0;
00422 $allStatic = true;
00423 foreach ( $parameters as $parameter )
00424 {
00425 if ( !eZTemplateNodeTool::isStaticElement( $parameter ) )
00426 $allStatic = false;
00427 }
00428 if ( $allStatic )
00429 {
00430 switch ( $operatorName )
00431 {
00432 case 'lt':
00433 {
00434 $evalStatus = ( eZTemplateNodeTool::elementStaticValue( $parameters[0] ) <
00435 eZTemplateNodeTool::elementStaticValue( $parameters[1] ) );
00436 } break;
00437
00438 case 'le':
00439 {
00440 $evalStatus = ( eZTemplateNodeTool::elementStaticValue( $parameters[0] ) <=
00441 eZTemplateNodeTool::elementStaticValue( $parameters[1] ) );
00442 } break;
00443
00444 case 'gt':
00445 {
00446 $evalStatus = ( eZTemplateNodeTool::elementStaticValue( $parameters[0] ) >
00447 eZTemplateNodeTool::elementStaticValue( $parameters[1] ) );
00448 } break;
00449
00450 case 'ge':
00451 {
00452 $evalStatus = ( eZTemplateNodeTool::elementStaticValue( $parameters[0] ) >=
00453 eZTemplateNodeTool::elementStaticValue( $parameters[1] ) );
00454 } break;
00455
00456 case 'eq':
00457 {
00458 $staticParameters = array();
00459 foreach ( $parameters as $parameter )
00460 {
00461 $staticParameters[] = eZPHPCreator::variableText( eZTemplateNodeTool::elementStaticValue( $parameter ),
00462 0, 0, false );
00463 }
00464 eval( '$evalStatus = ( ' . implode( ' == ', $staticParameters ) . ' );' );
00465 } break;
00466
00467 case 'ne':
00468 {
00469 $staticParameters = array();
00470 foreach ( $parameters as $parameter )
00471 {
00472 $staticParameters[] = eZPHPCreator::variableText( eZTemplateNodeTool::elementStaticValue( $parameter ),
00473 0, 0, false );
00474 }
00475 eval( '$evalStatus = ( ' . implode( ' != ', $staticParameters ) . ' );' );
00476 } break;
00477 break;
00478 }
00479 $newElements[] = eZTemplateNodeTool::createBooleanElement( $evalStatus );
00480 return $newElements;
00481 }
00482
00483 foreach ( $parameters as $parameter )
00484 {
00485 if ( !eZTemplateNodeTool::isStaticElement( $parameter ) )
00486 $allStatic = false;
00487 if ( $counter++ )
00488 {
00489 $code .= " $operator";
00490 }
00491 $code .= " ( %$counter% )";
00492 $values[] = $parameter;
00493 }
00494 $code .= " );\n";
00495 }
00496 $newElements[] = eZTemplateNodeTool::createCodePieceElement( $code, $values );
00497 return $newElements;
00498 }
00499
00500 function negateTransformation( $operatorName, &$node, &$tpl, &$resourceData,
00501 &$element, &$lastElement, &$elementList, &$elementTree, &$parameters )
00502 {
00503 $values = array();
00504 $function = $operatorName;
00505
00506 if ( ( count( $parameters ) != 1) )
00507 {
00508 return false;
00509 }
00510 $newElements = array();
00511
00512 $values[] = $parameters[0];
00513 $code = "%output% = !( %1% );\n";
00514
00515 $newElements[] = eZTemplateNodeTool::createCodePieceElement( $code, $values );
00516 return $newElements;
00517 }
00518
00519 function trueFalseTransformation( $operatorName, &$node, &$tpl, &$resourceData,
00520 &$element, &$lastElement, &$elementList, &$elementTree, &$parameters )
00521 {
00522 $values = array();
00523 if ( ( count( $parameters ) != 0 ) )
00524 {
00525 return false;
00526 }
00527 $newElements = array();
00528
00529 $value = false;
00530 if ( $operatorName == $this->TrueName )
00531 $value = true;
00532 $newElements[] = eZTemplateNodeTool::createBooleanElement( $value );
00533 return $newElements;
00534 }
00535
00536 function chooseTransformation( $operatorName, &$node, &$tpl, &$resourceData,
00537 &$element, &$lastElement, &$elementList, &$elementTree, &$parameters )
00538 {
00539 $values = array();
00540 $function = $operatorName;
00541
00542 if ( ( count( $parameters ) < 2) )
00543 {
00544 return false;
00545 }
00546
00547 $tmpValues = false;
00548 $newElements = array();
00549 if ( eZTemplateNodeTool::isStaticElement( $parameters[0] ) )
00550 {
00551 $selected = eZTemplateNodeTool::elementStaticValue( $parameters[0] );
00552
00553 if ( $selected < 0 or $selected > ( count( $parameters ) - 1 ) )
00554 {
00555 return false;
00556 }
00557
00558 return $parameters[$selected + 1];
00559 }
00560 else
00561 {
00562 $values[] = $parameters[0];
00563 $array = $parameters;
00564 unset( $array[0] );
00565
00566 $count = count( $parameters ) - 1;
00567 $operatorNameText = eZPHPCreator::variableText( $operatorName );
00568
00569 if ( count( $parameters ) == ( 2 + 1 ) )
00570 {
00571 $code = "%output% = %1% ? %3% : %2%;\n";
00572 $values[] = $parameters[1];
00573 $values[] = $parameters[2];
00574 }
00575 else
00576 {
00577 $code = ( "if ( %1% < 0 and\n" .
00578 " %1% >= $count )\n" .
00579 "{\n" .
00580 " \$tpl->error( $operatorNameText, \"Index \" . %1% . \" out of range\" );\n" .
00581 " %output% = false;\n" .
00582 "}\n" );
00583 $code .= "else switch ( %1% )\n{\n";
00584 $valueNumber = 2;
00585 for ( $i = 0; $i < $count; ++$i )
00586 {
00587 $parameterNumber = $i + 1;
00588 $code .= " case $i:";
00589 if ( eZTemplateNodeTool::isStaticElement( $parameters[$parameterNumber] ) )
00590 {
00591 $value = eZTemplateNodeTool::elementStaticValue( $parameters[$parameterNumber] );
00592 $valueText = eZPHPCreator::variableText( $value, 0, 0, false );
00593 $code .= " %output% = $valueText; break;\n";
00594 }
00595 else
00596 {
00597 $code .= "\n {\n";
00598 $code .= "%code$valueNumber%\n";
00599 $code .= "%output% = %$valueNumber%;\n";
00600 $code .= " } break;\n";
00601 $values[] = $parameters[$parameterNumber];
00602 ++$valueNumber;
00603 }
00604 }
00605 $code .= "}\n";
00606 }
00607 }
00608 $newElements[] = eZTemplateNodeTool::createCodePieceElement( $code, $values, eZTemplateNodeTool::extractVariableNodePlacement( $node ), false );
00609 return $newElements;
00610 }
00611
00612
00613
00614
00615
00616 function getValueCount( $val )
00617 {
00618 $val_cnt = false;
00619
00620 if ( is_array( $val ) )
00621 {
00622 $val_cnt = count( $val );
00623 }
00624 else if ( is_null( $val ) )
00625 {
00626 $val_cnt = 0;
00627 }
00628 else if ( is_bool( $val ) )
00629 {
00630 $val_cnt = (int)$val;
00631 }
00632 else if ( is_object( $val ) and
00633 method_exists( $val, "attributes" ) )
00634 {
00635 $val_cnt = count( $val->attributes() );
00636 }
00637 else if ( is_numeric( $val ) )
00638 {
00639 $val_cnt = $val;
00640 }
00641 else if ( is_string( $val ) )
00642 {
00643 $val_cnt = strlen( $val );
00644 }
00645 return $val_cnt;
00646 }
00647
00648
00649
00650
00651 function modify( &$tpl, &$operatorName, &$operatorParameters, &$rootNamespace, &$currentNamespace, &$value, &$namedParameters,
00652 $placement )
00653 {
00654 if ( $operatorName == $this->LtName or $operatorName == $this->GtName or
00655 $operatorName == $this->LeName or $operatorName == $this->GeName )
00656 {
00657 $val = $namedParameters["threshold"];
00658
00659 if ( ( $val_cnt = $this->getValueCount( $val ) ) === false )
00660 {
00661 $tpl->warning( $operatorName, "Unsupported input type: " . gettype( $val ) . "( $val ), must be either array, attribute object or numerical", $placement );
00662 return;
00663 }
00664 }
00665 switch ( $operatorName )
00666 {
00667 case $this->TrueName:
00668 case $this->FalseName:
00669 {
00670 $value = ( $operatorName == $this->TrueName );
00671 } break;
00672 case $this->NeName:
00673 {
00674 if ( count( $operatorParameters ) >= 1 )
00675 {
00676 if ( count( $operatorParameters ) == 1 )
00677 {
00678 $lastOperand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00679 $value = ( $lastOperand != $value );
00680 }
00681 else
00682 {
00683 $similar = false;
00684 $value = false;
00685 $lastOperand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00686 for ( $i = 1; $i < count( $operatorParameters ); ++$i )
00687 {
00688 $operand =& $tpl->elementValue( $operatorParameters[$i], $rootNamespace, $currentNamespace, $placement );
00689 if ( $operand != $lastOperand )
00690 {
00691 $value = true;
00692 break;
00693 }
00694 unset( $lastOperand );
00695 $lastOperand =& $operand;
00696 }
00697 }
00698 }
00699 else
00700 {
00701 $value = false;
00702 $tpl->warning( $operatorName, "Requires one parameter for input checking or two or more for parameter checking", $placement );
00703 }
00704 } break;
00705 case $this->EqName:
00706 {
00707 if ( count( $operatorParameters ) >= 1 )
00708 {
00709 if ( count( $operatorParameters ) == 1 )
00710 {
00711 $lastOperand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00712 $value = ( $lastOperand == $value );
00713 }
00714 else
00715 {
00716 $similar = false;
00717 $value = true;
00718 $lastOperand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00719 for ( $i = 1; $i < count( $operatorParameters ); ++$i )
00720 {
00721 $operand =& $tpl->elementValue( $operatorParameters[$i], $rootNamespace, $currentNamespace, $placement );
00722 if ( $operand != $lastOperand )
00723 {
00724 $value = false;
00725 break;
00726 }
00727 unset( $lastOperand );
00728 $lastOperand =& $operand;
00729 }
00730 }
00731 }
00732 else
00733 {
00734 $value = false;
00735 $tpl->warning( $operatorName, "Requires one parameter for input checking or two or more for parameter checking", $placement );
00736 }
00737 } break;
00738 case $this->OrName:
00739 {
00740 for ( $i = 0; $i < count( $operatorParameters ); ++$i )
00741 {
00742 $operand = $tpl->elementValue( $operatorParameters[$i], $rootNamespace, $currentNamespace, $placement );
00743 $operand_logic = false;
00744 if ( is_array( $operand ) )
00745 $operand_logic = count( $operand ) > 0;
00746 else if ( is_numeric( $operand ) )
00747 $operand_logic = $operand != 0;
00748 else if ( is_null( $operand ) )
00749 $operand_logic = false;
00750 else if ( is_object( $operand ) )
00751 $operand_logic = ( method_exists( $operand, "attributes" ) and
00752 method_exists( $operand, "attribute" ) );
00753 else if ( is_bool( $operand ) )
00754 $operand_logic = $operand;
00755 else if ( is_string( $operand ) )
00756 $operand_logic = strlen(trim($operand)) > 0;
00757 if ( $operand_logic )
00758 {
00759 $value = $operand;
00760 return;
00761 }
00762 }
00763 $value = false;
00764 } break;
00765 case $this->AndName:
00766 {
00767 $operand = null;
00768 for ( $i = 0; $i < count( $operatorParameters ); ++$i )
00769 {
00770 $operand = $tpl->elementValue( $operatorParameters[$i], $rootNamespace, $currentNamespace, $placement );
00771 $operand_logic = false;
00772 if ( is_array( $operand ) )
00773 $operand_logic = count( $operand ) > 0;
00774 else if ( is_numeric( $operand ) )
00775 $operand_logic = $operand != 0;
00776 else if ( is_null( $operand ) )
00777 $operand_logic = false;
00778 else if ( is_object( $operand ) )
00779 $operand_logic = ( method_exists( $operand, "attributes" ) and
00780 method_exists( $operand, "attribute" ) );
00781 else if ( is_bool( $operand ) )
00782 $operand_logic = $operand;
00783 else if ( is_string( $operand ) )
00784 $operand_logic = strlen(trim($operand)) > 0;
00785 if ( !$operand_logic )
00786 {
00787 $value = false;
00788 return;
00789 }
00790 }
00791 $value = $operand;
00792 } break;
00793 case $this->ChooseName:
00794 {
00795 if ( is_array( $value ) or
00796 ( is_object( $value ) and
00797 method_exists( $value, "attributes" ) ) )
00798 {
00799 $tpl->error( $operatorName, "Only supports numeric and boolean values", $placement );
00800 return;
00801 }
00802 else if ( is_numeric( $value ) )
00803 $index = $value;
00804 else if ( is_null( $value ) )
00805 $index = 0;
00806 else
00807 $index = $value ? 1 : 0;
00808 if ( $index < 0 or
00809 $index > count( $operatorParameters ) - 1 )
00810 {
00811 $tpl->error( $operatorName, "Index $index out of range 0 => " . ( count( $operatorParameters ) - 1 ),
00812 $placement );
00813 $value = false;
00814 return;
00815 }
00816 $value = $tpl->elementValue( $operatorParameters[$index], $rootNamespace, $currentNamespace, $placement );
00817 } break;
00818 case $this->LtName:
00819 case $this->GtName:
00820 case $this->LeName:
00821 case $this->GeName:
00822 {
00823 if ( $value !== null )
00824 {
00825 $operandA = $value;
00826 $operandB = $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00827 }
00828 else
00829 {
00830 $operandA = $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00831 $operandB = $tpl->elementValue( $operatorParameters[1], $rootNamespace, $currentNamespace, $placement );
00832 }
00833
00834 if ( ( $cnt = $this->getValueCount( $operandA ) ) === false )
00835 {
00836 $tpl->warning( $operatorName, "Unsupported input type: " . gettype( $operandA ) . "( $operandA ), must be either array, attribute object or numerical", $placement );
00837 return;
00838 }
00839 if ( ( $val_cnt = $this->getValueCount( $operandB ) ) === false )
00840 {
00841 $tpl->warning( $operatorName, "Unsupported input type: " . gettype( $operandB ) . "( $operandB ), must be either array, attribute object or numerical", $placement );
00842 return;
00843 }
00844 if ( $operatorName == $this->LtName )
00845 $value = ( $cnt < $val_cnt );
00846 else if ( $operatorName == $this->GtName )
00847 $value = ( $cnt > $val_cnt );
00848 else if ( $operatorName == $this->LeName )
00849 $value = ( $cnt <= $val_cnt );
00850 else if ( $operatorName == $this->GeName )
00851 $value = ( $cnt >= $val_cnt );
00852 } break;
00853 case $this->NullName:
00854 {
00855 $value = is_null( $value );
00856 } break;
00857 case $this->NotName:
00858 {
00859 if ( $value === null and isset( $operatorParameters[0] ) )
00860 {
00861 $operand = $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00862 }
00863 else
00864 {
00865 $operand = $value;
00866 }
00867 if ( is_array( $operand ) )
00868 $operand = ( count( $operand ) == 0 );
00869 else if ( is_null( $operand ) )
00870 $operand = true;
00871 else if ( is_object( $operand ) and
00872 method_exists( $operand, "attributes" ) )
00873 $operand = ( count( $operand->attributes() ) == 0 );
00874 else if ( is_numeric( $operand ) )
00875 $operand = ( $operand == 0 );
00876 else if ( is_string( $operand ) )
00877 $operand = ( strlen( $operand ) == 0 );
00878 else
00879 $operand = !$operand;
00880 $value = $operand;
00881 } break;
00882 }
00883 }
00884
00885
00886
00887 var $Operators;
00888
00889 var $LtName;
00890
00891 var $GtName;
00892
00893 var $LeName;
00894
00895 var $GeName;
00896
00897 var $EqName;
00898
00899 var $NeName;
00900
00901 var $NullName;
00902
00903 var $NotName;
00904
00905 var $OrName;
00906
00907 var $AndName;
00908
00909 var $TrueName;
00910
00911 var $FalseName;
00912
00913 var $ChooseName;
00914 };
00915
00916 ?>