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 class eZTemplateTypeOperator
00055 {
00056
00057
00058
00059 function eZTemplateTypeOperator(
00060 $isArrayName = "is_array",
00061 $isBooleanName = "is_boolean",
00062 $isIntegerName = "is_integer",
00063 $isFloatName = "is_float",
00064 $isNumericName = "is_numeric",
00065 $isStringName = "is_string",
00066 $isObjectName = "is_object",
00067 $isClassName = "is_class",
00068 $isNullName = "is_null",
00069 $isSetName = "is_set",
00070 $isUnsetName = "is_unset",
00071 $getTypeName = "get_type",
00072 $getClassName = "get_class" )
00073 {
00074 $this->Operators = array( $isArrayName,
00075 $isBooleanName,
00076 $isIntegerName,
00077 $isFloatName,
00078 $isNumericName,
00079 $isStringName,
00080 $isObjectName,
00081 $isClassName,
00082 $isNullName,
00083 $isSetName,
00084 $isUnsetName,
00085 $getTypeName,
00086 $getClassName );
00087 $this->IsArrayName = $isArrayName;
00088 $this->IsBooleanName = $isBooleanName;
00089 $this->IsIntegerName = $isIntegerName;
00090 $this->IsFloatName = $isFloatName;
00091 $this->IsNumericName = $isNumericName;
00092 $this->IsStringName = $isStringName;
00093 $this->IsObjectName = $isObjectName;
00094 $this->IsClassName = $isClassName;
00095 $this->IsNullName = $isNullName;
00096 $this->IsSetName = $isSetName;
00097 $this->IsUnsetName = $isUnsetName;
00098 $this->GetTypeName = $getTypeName;
00099 $this->GetClassName = $getClassName;
00100 $this->PHPNameMap = array( $isArrayName => 'is_array',
00101 $isBooleanName => 'is_bool',
00102 $isIntegerName => 'is_integer',
00103 $isFloatName => 'is_float',
00104 $isNumericName => 'is_numeric',
00105 $isStringName => 'is_string',
00106 $isObjectName => 'is_object',
00107 $isNullName => 'is_null' );
00108 }
00109
00110
00111
00112
00113 function &operatorList()
00114 {
00115 return $this->Operators;
00116 }
00117
00118 function operatorTemplateHints()
00119 {
00120 return array( $this->IsArrayName => array( 'input' => true,
00121 'output' => true,
00122 'parameters' => true,
00123 'element-transformation' => true,
00124 'transform-parameters' => true,
00125 'input-as-parameter' => true,
00126 'element-transformation-func' => 'isTransform'),
00127 $this->IsBooleanName => array( 'input' => true,
00128 'output' => true,
00129 'parameters' => true,
00130 'element-transformation' => true,
00131 'transform-parameters' => true,
00132 'input-as-parameter' => true,
00133 'element-transformation-func' => 'isTransform' ),
00134 $this->IsIntegerName => array( 'input' => true,
00135 'output' => true,
00136 'parameters' => true,
00137 'element-transformation' => true,
00138 'transform-parameters' => true,
00139 'input-as-parameter' => true,
00140 'element-transformation-func' => 'isTransform' ),
00141 $this->IsFloatName => array( 'input' => true,
00142 'output' => true,
00143 'parameters' => true,
00144 'element-transformation' => true,
00145 'transform-parameters' => true,
00146 'input-as-parameter' => true,
00147 'element-transformation-func' => 'isTransform' ),
00148 $this->IsNumericName => array( 'input' => true,
00149 'output' => true,
00150 'parameters' => true,
00151 'element-transformation' => true,
00152 'transform-parameters' => true,
00153 'input-as-parameter' => true,
00154 'element-transformation-func' => 'isTransform' ),
00155 $this->IsStringName => array( 'input' => true,
00156 'output' => true,
00157 'parameters' => true,
00158 'element-transformation' => true,
00159 'transform-parameters' => true,
00160 'input-as-parameter' => true,
00161 'element-transformation-func' => 'isTransform' ),
00162 $this->IsObjectName => array( 'input' => true,
00163 'output' => true,
00164 'parameters' => true,
00165 'element-transformation' => true,
00166 'transform-parameters' => true,
00167 'input-as-parameter' => true,
00168 'element-transformation-func' => 'isTransform' ),
00169 $this->IsClassName => array( 'input' => true,
00170 'output' => true,
00171 'parameters' => true,
00172 'element-transformation' => true,
00173 'transform-parameters' => true,
00174 'input-as-parameter' => true,
00175 'element-transformation-func' => 'isTransform' ),
00176 $this->IsNullName => array( 'input' => true,
00177 'output' => true,
00178 'parameters' => true,
00179 'element-transformation' => true,
00180 'transform-parameters' => true,
00181 'input-as-parameter' => true,
00182 'element-transformation-func' => 'isTransform' ),
00183 $this->IsSetName => array( 'input' => true,
00184 'output' => true,
00185 'parameters' => true,
00186 'element-transformation' => true,
00187 'transform-parameters' => true,
00188 'input-as-parameter' => true,
00189 'element-transformation-func' => 'isTransform' ),
00190 $this->IsUnsetName => array( 'input' => true,
00191 'output' => true,
00192 'parameters' => true,
00193 'element-transformation' => true,
00194 'transform-parameters' => true,
00195 'input-as-parameter' => true,
00196 'element-transformation-func' => 'isTransform' ),
00197 $this->GetTypeName => array( 'input' => true,
00198 'output' => true,
00199 'parameters' => true,
00200 'element-transformation' => true,
00201 'transform-parameters' => true,
00202 'input-as-parameter' => true,
00203 'element-transformation-func' => 'isTransform' ),
00204 $this->GetClassName => array( 'input' => true,
00205 'output' => true,
00206 'parameters' => true,
00207 'element-transformation' => true,
00208 'transform-parameters' => true,
00209 'input-as-parameter' => true,
00210 'element-transformation-func' => 'isTransform' ) );
00211 }
00212
00213
00214
00215
00216 function isTransform( $operatorName, &$node, &$tpl, &$resourceData,
00217 &$element, &$lastElement, &$elementList, &$elementTree, &$parameters )
00218 {
00219 $values = array();
00220 $values[] = $parameters[0];
00221 $code = '%output% = ';
00222
00223 switch( $operatorName )
00224 {
00225 case $this->IsArrayName:
00226 {
00227 $code .= 'is_array( %1% );';
00228 } break;
00229
00230 case $this->IsBooleanName:
00231 {
00232 $code .= 'is_bool( %1% );';
00233 } break;
00234
00235 case $this->IsIntegerName:
00236 {
00237 $code .= 'is_int( %1% );';
00238 } break;
00239
00240 case $this->IsFloatName:
00241 {
00242 $code .= 'is_float( %1% );';
00243 } break;
00244
00245 case $this->IsNumericName:
00246 {
00247 $code .= 'is_numeric( %1% );';
00248 } break;
00249
00250 case $this->IsStringName:
00251 {
00252 $code .= 'is_string( %1% );';
00253 } break;
00254
00255 case $this->IsObjectName:
00256 {
00257 $code .= 'is_object( %1% );';
00258 } break;
00259
00260 case $this->IsClassName:
00261 {
00262 $code .= '( get_class( %1% ) == strtolower( %2% ) );';
00263 $values[] = $parameters[1];
00264 } break;
00265
00266 case $this->IsNullName:
00267 {
00268 $code .= 'is_null( %1% );';
00269 } break;
00270
00271 case $this->IsSetName:
00272 {
00273 $code .= 'isset( %1% );';
00274 } break;
00275
00276 case $this->IsUnsetName:
00277 {
00278 $code .= '!isset( %1% );';
00279 } break;
00280
00281 case $this->GetTypeName:
00282 {
00283 return false;
00284 } break;
00285
00286 case $this->GetClassName:
00287 {
00288 $code .= 'get_class( %1% );';
00289 } break;
00290 }
00291
00292 return array( eZTemplateNodeTool::createCodePieceElement( $code, $values ) );
00293 }
00294
00295
00296
00297
00298 function namedParameterPerOperator()
00299 {
00300 return true;
00301 }
00302
00303
00304
00305
00306 function namedParameterList()
00307 {
00308 return array();
00309 }
00310
00311
00312
00313
00314 function modify( &$tpl, &$operatorName, &$operatorParameters, &$rootNamespace, &$currentNamespace, &$value, &$namedParameters, $placement )
00315 {
00316 if ( isset( $this->PHPNameMap[$operatorName] ) )
00317 {
00318 $typeFunction = $this->PHPNameMap[$operatorName];
00319 $this->checkType( $typeFunction, $tpl, $value, $operatorParameters, $rootNamespace, $currentNamespace, $placement );
00320 return;
00321 }
00322 switch ( $operatorName )
00323 {
00324 case $this->IsClassName:
00325 {
00326 if ( count( $operatorParameters ) == 1 )
00327 {
00328 $className =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00329 $value = get_class( $value ) == strtolower( $className );
00330 }
00331 else
00332 {
00333 $className =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00334 $value = get_class( $tpl->elementValue( $operatorParameters[1], $rootNamespace, $currentNamespace, $placement ) ) == strtolower( $className );
00335 }
00336 } break;
00337 case $this->IsSetName:
00338 {
00339 if ( count( $operatorParameters ) > 0 )
00340 {
00341 if ( count( $operatorParameters ) > 1 )
00342 {
00343 $tpl->extraParameters( $operatorName, count( $operatorParameters ), 1 );
00344 }
00345
00346 $operand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement, true );
00347 $value = $operand !== null;
00348
00349
00350 }
00351 else
00352 $tpl->missingParameter( $operatorName, 'input' );
00353
00354 } break;
00355 case $this->IsUnsetName:
00356 {
00357 if ( count( $operatorParameters ) > 0 )
00358 {
00359 if ( count( $operatorParameters ) > 1 )
00360 $tpl->extraParameters( $operatorName,
00361 count( $operatorParameters ),
00362 1 );
00363 $operand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement, true );
00364 $value = $operand === null;
00365 }
00366 else
00367 $tpl->missingParameter( $operatorName, 'input' );
00368 } break;
00369 case $this->GetTypeName:
00370 {
00371 if ( count( $operatorParameters ) > 0 )
00372 {
00373 if ( count( $operatorParameters ) > 1 )
00374 $tpl->extraParameters( $operatorName,
00375 count( $operatorParameters ),
00376 1 );
00377 $operand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00378 }
00379 else
00380 $operand =& $value;
00381 if ( $operand === null )
00382 $value = 'null';
00383 else if ( is_bool( $operand ) )
00384 $value = 'boolean[' . ( $operand ? 'true' : 'false' ) . ']';
00385 else if ( is_object( $operand ) )
00386 $value = 'object[' . get_class( $operand ) . ']';
00387 else if ( is_array( $operand ) )
00388 $value = 'array[' . count( $operand ) . ']';
00389 else if ( is_string( $operand ) )
00390 $value = 'string[' . strlen( $operand ) . ']';
00391 else
00392 $value = gettype( $operand );
00393 } break;
00394 case $this->GetClassName:
00395 {
00396 if ( count( $operatorParameters ) > 0 )
00397 {
00398 if ( count( $operatorParameters ) > 1 )
00399 $tpl->extraParameters( $operatorName,
00400 count( $operatorParameters ),
00401 1 );
00402 $operand =& $tpl->elementValue( $operatorParameters[0], $rootNamespace, $currentNamespace, $placement );
00403 $value = get_class( $operand );
00404 }
00405 else
00406 {
00407 $value = get_class( $value );
00408 }
00409 } break;
00410 }
00411 }
00412
00413 function checkType( $typeFunction, &$tpl, &$value, &$operatorParameters, &$rootNamespace, &$currentNamespace, $placement )
00414 {
00415 if ( count( $operatorParameters ) > 0 )
00416 {
00417 $value = true;
00418 for ( $i = 0; $i < count( $operatorParameters ); ++$i )
00419 {
00420 $operand =& $tpl->elementValue( $operatorParameters[$i], $rootNamespace, $currentNamespace, $placement );
00421 if ( !$typeFunction( $operand) )
00422 $value = false;
00423 }
00424 }
00425 else
00426 {
00427 $value = $typeFunction( $value );
00428 }
00429 }
00430
00431
00432 var $Operators;
00433
00434 var $IsArrayName;
00435 };
00436
00437 ?>