1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785 |
- <?php
- if ( !defined( 'PATFORMS_INCLUDE_PATH' ) ) {
- define( 'PATFORMS_INCLUDE_PATH', dirname( __FILE__ ). '/patForms' );
- }
- include_once PATFORMS_INCLUDE_PATH . "/Element.php";
- define( "PATFORMS_ERROR_NO_MODULE_BASE_FILE", 1001 );
- define( "PATFORMS_ERROR_MODULE_NOT_FOUND", 1002 );
- define( "PATFORMS_ERROR_ELEMENT_IS_NO_OBJECT", 1003 );
- define( "PATFORMS_ERROR_UNEXPECTED_ERROR", 1004 );
- define( "PATFORMS_ERROR_ELEMENT_NOT_FOUND", 1012 );
- define( "PATFORMS_ERROR_NO_RENDERER_SET", 1013 );
- define( "PATFORMS_ERROR_INVALID_RENDERER", 1014 );
- define( "PATFORMS_ERROR_INVALID_METHOD", 1015 );
- define( "PATFORMS_ERROR_PARAMETER_NO_BOOL", 1016 );
- define( "PATFORMS_ERROR_NO_STATIC_PROPERTY", 1017 );
- define( "PATFORMS_ERROR_UNKNOWN_EVENT", 1018 );
- define( "PATFORMS_ERROR_INVALID_HANDLER", 1019 );
- define( 'PATFORMS_NOTICE_EVENT_ALREADY_REGISTERED', 1020 );
- define( 'PATFORMS_ERROR_INVALID_STORAGE', 1021 );
- define( 'PATFORMS_NOTICE_ARRAY_EXPECTED', 1022 );
- define( 'PATFORMS_NOTICE_ATTRIBUTE_NOT_SUPPORTED', 1023 );
- define( 'PATFORMS_NOTICE_INVALID_OPTION', 1024 );
- define( 'PATFORMS_ERROR_ATTRIBUTE_REQUIRED', 1025 );
- define( 'PATFORMS_ERROR_CAN_NOT_VERIFY_FORMAT', 1026 );
- define( 'PATFORMS_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE', 1027 );
- define( 'PATFORMS_NOTICE_VALIDATOR_ERROR_LOCALE_UNDEFINED', 1028 );
- define( 'PATFORMS_WARNING_VALIDATOR_ERROR_UNDEFINED', 1029 );
- define( 'PATFORMS_RULE_BEFORE_VALIDATION', 1 );
- define( 'PATFORMS_RULE_AFTER_VALIDATION', 2 );
- define( 'PATFORMS_RULE_BOTH', 3 );
- define( 'PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS', 1 );
- define( 'PATFORMS_OBSERVER_ATTACH_TO_FORM', 2 );
- define( 'PATFORMS_OBSERVER_ATTACH_TO_BOTH', 3 );
- define('PATFORMS_VALUES_NESTED', 0);
- define('PATFORMS_VALUES_FLATTENED', 1);
- define('PATFORMS_VALUES_PREFIXED', 2);
- $GLOBALS['_patForms'] = array(
- 'format' => 'html',
- 'locale' => 'C',
- 'customLocales' => array(),
- 'autoFinalize' => true,
- 'defaultAttributes' => array(),
- );
- class patForms
- {
-
- var $globalJavascript = array();
-
- var $instanceJavascript = array();
-
- var $mode = 'default';
-
- var $xmlEntities = array(
- "<" => "<",
- ">" => ">",
- "&" => "&",
- "'" => "'",
- '"' => """
- );
-
- var $format = 'html';
-
- var $submitted = false;
-
- var $elements = array();
-
- var $elementCounter = 0;
-
- var $renderer = null;
-
- var $locale = 'C';
-
- var $customLocales = array();
-
- var $elementName = 'Form';
-
- var $autoValidate = false;
-
- var $submitVar = null;
-
- var $_eventHandler = array();
-
- var $_validEvents = array( 'onInit', 'onValidate', 'onSubmit', 'onError', 'onSuccess' );
-
- var $validated = false;
-
- var $valid = null;
-
- var $staticProperties = array(
- 'format' => 'setFormat',
- 'autoFinalize' => 'setAutoFinalize',
- 'locale' => 'setLocale',
- );
-
- var $autoFinalize = true;
-
- var $_rules = array();
-
- var $validatorErrorCodes = array();
-
- var $validationErrors = array();
-
- var $nextErrorOffset = 1000;
-
- var $attributes = array();
-
- var $attributeDefinition = array(
- 'id' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'name' => array(
- 'required' => true,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'method' => array(
- 'required' => true,
- 'format' => 'string',
- 'default' => 'post',
- 'outputFormats' => array( 'html' ),
- ),
- 'action' => array(
- 'required' => true,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'accept' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'accept-charset' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'enctype' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'onreset' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'onsubmit' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- 'target' => array(
- 'required' => false,
- 'format' => 'string',
- 'outputFormats' => array( 'html' ),
- ),
- );
-
- var $options = array(
- 'scripts' => array(
- 'enabled' => true,
- 'params' => array(),
- ),
- );
-
- var $observers = array();
-
- function setDefaultAttributes( $attributes )
- {
- patForms::setStaticProperty( 'defaultAttributes', $attributes );
- }
-
- function setLocale( $locale, $languageFile = null )
- {
- if (!is_null($languageFile)) {
- $languageData = patForms::parseLocaleFile($languageFile);
- $customLocales = patForms::getStaticProperty('customLocales');
- $customLocales[$locale] = $languageData;
- patForms::setStaticProperty('customLocales', $customLocales);
- }
- if ( isset( $this ) && is_a( $this, 'patForms' ) ) {
- $this->locale = $locale;
- if ( !empty( $this->elements ) ) {
- $cnt = count( $this->elements );
- for ( $i=0; $i < $cnt; $i++ ) {
- $this->elements[$i]->setLocale( $locale );
- }
- }
- } else {
- patForms::setStaticProperty('locale', $locale);
- }
- return true;
- }
-
- function isCustomLocale($locale)
- {
- $customLocales = patForms::getStaticProperty('customLocales');
- if (isset($customLocales[$locale])) {
- return true;
- }
- return false;
- }
-
- function getCustomLocale($locale, $key)
- {
- $customLocales = patForms::getStaticProperty('customLocales');
- if (!isset($customLocales[$locale])) {
- return false;
- }
- if (!isset($customLocales[$locale][$key])) {
- return false;
- }
- return $customLocales[$locale][$key];
- }
-
- function parseLocaleFile($filename)
- {
- return parse_ini_file($filename, true);
- }
-
- function setFormat( $format )
- {
- if ( isset( $this ) && is_a( $this, 'patForms' ) )
- {
- $this->format = strtolower( $format );
- if ( !empty( $this->elements ) )
- {
- $cnt = count( $this->elements );
- for ( $i=0; $i < $cnt; $i++ )
- {
- $this->elements[$i]->setFormat( $format );
- }
- }
- }
- else
- {
- patForms::setStaticProperty( 'format', $format );
- }
- return true;
- }
-
- function setMode( $mode )
- {
- $this->mode = strtolower( $mode );
- if ( !empty( $this->elements ) )
- {
- $cnt = count( $this->elements );
- for ( $i=0; $i < $cnt; $i++ )
- {
- $this->elements[$i]->setMode( $mode );
- }
- }
- }
-
- function setSubmitted( $state )
- {
- if ( $state == true )
- {
- $eventState = $this->triggerEvent( 'Submit' );
- if ( $eventState === false )
- return false;
- }
- $this->submitted = $state;
- if ( !empty( $this->elements ) )
- {
- $cnt = count( $this->elements );
- for ( $i=0; $i < $cnt; $i++ )
- {
- $this->elements[$i]->setSubmitted( $state );
- }
- }
- return $state;
- }
-
- function setMethod( $method )
- {
- $method = strtolower( $method );
- if ( $method != 'get' && $method != 'post' )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_INVALID_METHOD,
- 'Unknown method "'.$method.'". Currently only GET and POST are supported as patForms methods.'
- );
- }
- $this->setAttribute( 'method', $method );
- return true;
- }
-
- function setAction( $action )
- {
- return $this->setAttribute( 'action', $action );
- }
-
- function setAutoFinalize( $mode )
- {
- if ( !is_bool( $mode ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_PARAMETER_NO_BOOL,
- 'The setAutoFinalize() method requires a boolean value ( true or false ) as parameter.'
- );
- }
- if ( isset( $this ) && is_a( $this, 'patForms' ) )
- {
- $this->autoFinalize = $mode;
- }
- else
- {
- patForms::setStaticProperty( 'autoFinalize', $mode );
- }
- return true;
- }
-
- function applyFilter( &$filter )
- {
- if ( empty( $this->elements ) )
- return true;
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; $i++ )
- {
- $this->elements[$i]->applyFilter( $filter );
- }
- }
-
- function &createForm( $formDefinition = null, $attributes = null )
- {
- $form = &new patForms();
- if ( $attributes != null )
- {
- $form->setAttributes( $attributes );
- }
- if ( $formDefinition === null )
- return $form;
- foreach ( $formDefinition as $name => $element )
- {
- if ( !isset( $element["filters"] ) )
- {
- $element["filters"] = null;
- }
- if ( !isset( $element["children"] ) )
- {
- $element["children"] = null;
- }
- $el = &$form->createElement( $name, $element["type"], $element["attributes"], $element["filters"], $element["children"] );
- if ( isset( $element["renderer"] ) ) {
- $el->setRenderer( $element["renderer"] );
- }
- $result = $form->addElement( $el );
- if (patErrorManager::isError( $result )) {
- return $result;
- }
- }
- return $form;
- }
-
- function addRule( &$rule, $time = PATFORMS_RULE_AFTER_VALIDATION, $invalid = false, $revalidate = false )
- {
- $rule->prepareRule( $this );
- $this->_rules[] = array(
- 'rule' => &$rule,
- 'time' => $time,
- 'invalid' => $invalid,
- 'revalidate' => $revalidate
- );
- }
-
- function __construct()
- {
- foreach ( $this->staticProperties as $staticProperty => $setMethod )
- {
- $propValue = patForms::getStaticProperty( $staticProperty );
- if ( patErrorManager::isError( $propValue ) )
- continue;
- $this->$setMethod( $propValue );
- }
-
- $this->loadAttributeDefaults();
- }
-
- function patForms()
- {
- patForms::__construct();
- }
-
- function setRenderer( &$renderer, $args = array() )
- {
- if ( !is_object( $renderer ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_INVALID_RENDERER,
- 'You can only set a patForms_Renderer object with the setRenderer() method, "'.gettype( $renderer ).'" given.'
- );
- }
- $this->renderer = &$renderer;
- if ( isset( $args['includeElements'] ) && $args['includeElements'] === true )
- {
-
-
-
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; $i++ )
- {
- if ( $this->elements[$i]->usesRenderer && !is_object( $this->elements[$i]->renderer ) )
- {
- $this->elements[$i]->setRenderer( $renderer );
- }
- }
- }
- return true;
- }
-
- function setStorage( &$storage )
- {
- if ( !is_object( $storage ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_INVALID_STORAGE,
- 'You can only set a patForms_Storage object with the setStorage() method, "'.gettype( $storage ).'" given.'
- );
- }
- $this->registerEventHandlerObject( $storage,
- array(
- 'onInit' => 'loadEntry',
- 'onValidate' => 'validateEntry',
- 'onSuccess' => 'storeEntry'
- )
- );
- }
-
- function renderForm( $args = null )
- {
- if ( $this->renderer === null )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_NO_RENDERER_SET,
- 'Form cannot be rendered, you have to set a renderer first via the setRenderer() method.'
- );
- }
-
- if ( !$this->isSubmitted() || $this->autoValidate !== true )
- {
- $this->triggerEvent( 'Init' );
- return $this->renderer->render( $this, $args );
- }
- $this->validateForm();
- return $this->renderer->render( $this, $args );
- }
-
- function validateForm( $revalidate = false )
- {
- if ( $this->validated && !$revalidate )
- return $this->valid;
- $valid = true;
-
- if ( !$this->_applyRules( PATFORMS_RULE_BEFORE_VALIDATION ) )
- {
- $valid = false;
- }
-
- if ( $valid === true )
- {
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; ++$i )
- {
- if ( !$this->elements[$i]->validate() )
- {
- $valid = false;
- }
- }
- }
- if ($valid === true) {
- $result = $this->triggerEvent('Validate');
- if ($result === false) {
- $valid = false;
- }
- }
-
- if ( !$this->_applyRules( PATFORMS_RULE_AFTER_VALIDATION, $valid ) )
- {
- $valid = false;
- }
- if ( $valid === true && $this->autoFinalize === true )
- $this->finalizeForm();
- $this->valid = $valid;
- $this->validated = true;
- if ( $valid === true )
- {
- $this->_announce( 'status', 'validated' );
- $event = 'Success';
- }
- else
- {
- $this->_announce( 'status', 'error' );
- $event = 'Error';
- }
- $this->triggerEvent( $event );
- return $this->valid;
- }
-
- function _applyRules( $time, $isValid = true )
- {
- $valid = true;
- $cnt = count( $this->_rules );
- for ($i = 0; $i < $cnt; $i++) {
-
- if (( $this->_rules[$i]['time'] & $time ) != $time) {
- continue;
- }
- if (!$isValid && !$this->_rules[$i]['invalid']) {
- continue;
- }
- $result = $this->_rules[$i]['rule']->applyRule( $this, PATFORMS_RULE_AFTER_VALIDATION );
- if ( $result === false ) {
- $valid = false;
- }
- }
- return $valid;
- }
-
- function finalizeForm()
- {
- $success = true;
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; ++$i )
- {
- if ( !$this->elements[$i]->finalize() )
- {
- patErrorManager::raiseWarning(
- PATFORMS_ERROR_ELEMENT_NOT_FINALIZED,
- 'Element "'.$this->elements[$i]->elementName.'" could not be finalized. See the element error messages for more details.'
- );
- $success = false;
- }
- }
- return $success;
- }
-
- function &createRenderer( $name )
- {
- return patForms::_createModule( 'Renderer', $name );
- }
-
- function &createStorage( $name )
- {
- return patForms::_createModule( 'Storage', $name );
- }
-
- function &createFilter( $name, $params = null )
- {
- $filter = &patForms::_createModule( 'Filter', $name );
- if ( !is_array( $params ) )
- {
- return $filter;
- }
- foreach ( $params as $param => $value )
- {
- $setter = 'set' . ucfirst( $param );
- if ( method_exists( $filter, $setter ) )
- {
- $filter->$setter( $value );
- }
- }
- return $filter;
- }
-
- function &createRule( $name, $id = null )
- {
- $rule = &patForms::_createModule( 'Rule', $name );
- if ( $id != null )
- {
- $rule->setId( $id );
- }
- return $rule;
- }
-
- function &createObserver( $name )
- {
- $observer = &patForms::_createModule( 'Observer', $name );
- return $observer;
- }
-
- function &_createModule( $type, $name )
- {
- $baseFile = PATFORMS_INCLUDE_PATH . '/'.$type.'.php';
- $baseClass = 'patForms_'.$type;
-
-
-
- $pathName = $name;
- if ( strstr( $pathName, '_' ) )
- {
- $pathName = str_replace( '_', '/', $name );
- }
- $moduleFile = PATFORMS_INCLUDE_PATH . '/'.$type.'/'.$pathName.'.php';
- $moduleClass = 'patForms_'.$type.'_'.$name;
- if ( !class_exists( $baseClass ) )
- {
- if ( !file_exists( $baseFile ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_NO_MODULE_BASE_FILE,
- $type .' base file could not be found',
- 'Tried to load base file in path "'.$baseFile.'"'
- );
- }
- include_once $baseFile;
- }
- if ( !class_exists( $moduleClass ) )
- {
- if ( !file_exists( $moduleFile ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_MODULE_NOT_FOUND,
- $type.' "'.$name.'" file "'.$moduleFile. '" could not be found.'
- );
- }
- include_once $moduleFile;
- }
- $module = &new $moduleClass();
- return $module;
- }
-
- function addElement( &$element )
- {
- if ( !is_object( $element ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_ELEMENT_IS_NO_OBJECT,
- 'The addElement() method expects an element object, "'.gettype( $element ).'" given.'
- );
- }
- if ( patErrorManager::isError( $element ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_UNEXPECTED_ERROR,
- 'The element you are trying to add is a patError object, and not a patForms element object.'
- );
- }
- if ( !$element->getId() ) {
- $element->setId( $this->getElementId() );
- }
- $element->setMode( $this->getMode() );
- $element->setFormat( $this->getFormat() );
- $element->setSubmitted( $this->isSubmitted() );
- $element->setLocale( $this->getLocale() );
- $this->elements[] =& $element;
- return true;
- }
-
- function replaceElement( $element, &$replace )
- {
- if ( !is_object( $replace ) ) {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_ELEMENT_IS_NO_OBJECT,
- 'The addElement() method expects an element object, "'.gettype( $replace ).'" given.'
- );
- }
- if ( patErrorManager::isError( $replace ) ) {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_UNEXPECTED_ERROR,
- 'The element you are trying to add is a patError object, and not a patForms element object.'
- );
- }
- if (is_object($element)) {
- $element = $element->getId();
- }
- $cnt = count($this->elements);
- for ($i = 0; $i < $cnt; $i++) {
- if ($this->elements[$i]->getId() === $element) {
- if ( !$replace->getId() ) {
- $replace->setId( $this->getElementId() );
- }
- $replace->setMode( $this->getMode() );
- $replace->setFormat( $this->getFormat() );
- $replace->setSubmitted( $this->isSubmitted() );
- $replace->setLocale( $this->getLocale() );
- $this->elements[$i] = &$replace;
- return true;
- }
-
- if (method_exists($this->elements[$i], 'replaceElement')) {
- $result = $this->elements[$i]->replaceElement($element, $replace);
- if ($result === true) {
- return $result;
- }
- }
- }
- return false;
- }
-
- function &getElement( $name )
- {
- return $this->getElementByName( $name );
- }
-
- function &getElementByName( $name )
- {
- if ( $name == '__form' ) {
- return $this;
- }
- $elements = array();
- $cnt = count( $this->elements );
- for ($i = 0; $i < $cnt; $i++) {
- if ($this->elements[$i]->getName() == $name) {
- $elements[] = &$this->elements[$i];
- continue;
- }
- if (method_exists($this->elements[$i], 'getElementById')) {
- patErrorManager::pushExpect(PATFORMS_ERROR_ELEMENT_NOT_FOUND);
- $result = &$this->elements[$i]->getElementByName($name);
- patErrorManager::popExpect();
- if (!patErrorManager::isError($result)) {
- if (is_array($result)) {
- $cnt2 = count( $result );
- for ($j = 0; $j < $cnt2; $j++) {
- $elements[] = &$result[$j];
- }
- } else {
- $elements[] = &$result;
- }
- }
- }
- }
- switch( count( $elements ) )
- {
- case 0:
- return patErrorManager::raiseError(
- PATFORMS_ERROR_ELEMENT_NOT_FOUND,
- 'Element '.$name.' could not be found.'
- );
- break;
- case 1:
- return $elements[0];
- break;
- default:
- return $elements;
- break;
- }
- }
-
- function &getElementById( $id )
- {
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; $i++ )
- {
- if ( $this->elements[$i]->getId() == $id ) {
- return $this->elements[$i];
- }
- if (method_exists($this->elements[$i], 'getElementById')) {
- patErrorManager::pushExpect(PATFORMS_ERROR_ELEMENT_NOT_FOUND);
- $result = &$this->elements[$i]->getElementById($id);
- patErrorManager::popExpect();
- if (!patErrorManager::isError($result)) {
- return $result;
- }
- }
- }
- return patErrorManager::raiseError(
- PATFORMS_ERROR_ELEMENT_NOT_FOUND,
- 'Element '.$name.' could not be found.'
- );
- }
-
- function &getElements()
- {
- return $this->elements;
- }
-
- function &createElement( $name, $type, $attributes, $filters = null, $children = null )
- {
- $element =& patForms::_createModule( 'Element', $type );
- if ( patErrorManager::isError( $element ) )
- {
- return $element;
- }
- $attributes['name'] = $name;
- if ( !isset( $attributes['id'] ) ) {
- $attributes['id'] = $this->getElementId();
- }
-
-
-
- foreach ( patForms::getStaticProperty( 'defaultAttributes' ) as $attributeName => $attributeValue )
- {
- if ( !$element->hasAttribute( $attributeName ) )
- {
- continue;
- }
- $element->setAttribute( $attributeName, $attributeValue );
- }
-
- $success = $element->setAttributes( $attributes );
- if ( patErrorManager::isError( $success ) )
- {
- return $success;
- }
- if (is_array($children)) {
- foreach ($children as $child) {
- $childName = $child['attributes']['name'];
- $childEl = &patForms::createElement($childName, $child['type'], $child['attributes']);
- if ( isset( $child["renderer"] ) ) {
- $childEl->setRenderer( $child["renderer"] );
- }
- $element->addElement($childEl);
- }
- }
- $success = $element->_init();
- if ( patErrorManager::isError( $success ) ) {
- return $success;
- }
-
- if ( !is_array( $filters ) )
- {
- return $element;
- }
- $cnt = count( $filters );
- for ( $i = 0; $i < $cnt; $i++ )
- {
- $params = isset( $filters[$i]['params'] ) ? $filters[$i]['params'] : null;
- $filter = &patForms::createFilter( $filters[$i]['filter'], $params );
- if ( patErrorManager::isError( $filter ) )
- {
- continue;
- }
- $element->applyFilter( $filter );
- }
- return $element;
- }
-
- function getValidationErrors($withElements = true)
- {
- $found = false;
- $errors = array();
- if ( !empty( $this->validationErrors ) )
- {
- $errors['__form'] = $this->validationErrors;
- $found = true;
- }
- if ($withElements === false) {
- return $errors;
- }
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; ++$i )
- {
- $name = $this->elements[$i]->getAttribute( 'name' );
- if ( $name === false )
- {
- continue;
- }
- $elementErrors = $this->elements[$i]->getValidationErrors();
- if ( empty( $elementErrors ) )
- continue;
- $errors[$name] = $elementErrors;
- $found = true;
- }
- if ( $found )
- return $errors;
- return false;
- }
-
- function getValues( $fields = null, $type = PATFORMS_VALUES_NESTED )
- {
- $values = array();
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; ++$i )
- {
- $name = $this->elements[$i]->getAttribute( 'name' );
- if ( $name === false ) {
- continue;
- }
- if ( is_array( $fields ) && !in_array( $name, $fields ) ) {
- continue;
- }
- $tmpVal = $this->elements[$i]->getValue();
- if (!is_array($tmpVal) || $this->elements[$i]->elementName != 'Group') {
- $values[$name] = $tmpVal;
- continue;
- }
- switch ($type) {
- case PATFORMS_VALUES_FLATTENED:
- $values = array_merge($values, $tmpVal);
- break;
- case PATFORMS_VALUES_PREFIXED:
- foreach ($tmpVal as $key => $val) {
- $values[$name.'_'.$key] = $val;
- }
- break;
- case PATFORMS_VALUES_NESTED:
- default:
- $values[$name] = $tmpVal;
- break;
- }
- }
- return $values;
- }
-
- function setValues( $values, $overrideUserInput = false )
- {
- patErrorManager::pushExpect(PATFORMS_ERROR_ELEMENT_NOT_FOUND);
- foreach ($values as $elName => $value) {
- $el = &$this->getElementByName($elName);
- if (patErrorManager::isError($el)) {
- continue;
- }
- if ($overrideUserInput === true) {
- $el->setValue($value);
- } else {
- $el->setDefaultValue($value);
- }
- }
- patErrorManager::popExpect();
- return true;
- }
-
- function getMode()
- {
- return $this->mode;
- }
-
- function getLocale()
- {
- return $this->locale;
- }
-
- function getFormat()
- {
- return $this->format;
- }
-
- function getMethod()
- {
- return $this->getAttribute( 'method' );
- }
-
- function getAction()
- {
- $action = $this->getAttribute( 'action' );
- if ( !empty( $action ) )
- return $action;
- return $_SERVER['PHP_SELF'];
- }
-
- function setAttribute( $attributeName, $attributeValue )
- {
- if ( !isset( $this->attributeDefinition[$attributeName] ) )
- {
- patErrorManager::raiseNotice(
- PATFORMS_NOTICE_ATTRIBUTE_NOT_SUPPORTED,
- "The attribute '".$attributeName."' is not supported by the form, skipped it. [".get_class( $this )."]"
- );
- return true;
- }
- $this->attributes[$attributeName] = $attributeValue;
- return true;
- }
-
- function setAttributes( $attributes )
- {
- if ( !is_array( $attributes ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_NOTICE_ARRAY_EXPECTED,
- "setAttributes: array expected"
- );
- }
- foreach ( $attributes as $attributeName => $attributeValue )
- {
- $this->setAttribute( $attributeName, $attributeValue );
- }
- return true;
- }
-
- function getAttribute( $attribute )
- {
- if ( !isset( $this->attributes[$attribute] ) )
- {
- return false;
- }
- return $this->attributes[$attribute];
- }
-
- function getAttributes( $attributes = array() )
- {
- if ( empty( $attributes ) )
- {
- return $this->attributes;
- }
- $result = array();
- foreach ( $attributes as $attribute )
- {
- if ( $attributeValue = $this->getAttribute( $attribute ) )
- {
- $result[$attribute] = $attributeValue;
- }
- }
- return $result;
- }
-
- function loadAttributeDefaults()
- {
- foreach ( $this->attributeDefinition as $attributeName => $attributeDef )
- {
- if ( isset( $attributeDef['default'] ) )
- {
- $this->attributes[$attributeName] = $attributeDef['default'];
- }
- if ( $attributeName == 'action' )
- {
- $this->attributes[$attributeName] = $_SERVER['PHP_SELF'];
-
- if ( defined( 'SID' ) )
- $this->attributes[$attributeName] .= '?' . SID;
- }
- }
- return true;
- }
-
- function isSubmitted()
- {
- if ( $this->submitted === true )
- {
- return true;
- }
- if ( !isset( $this->submitVar ) )
- {
- return false;
- }
- if ( !$this->autoValidate )
- {
- return false;
- }
- if ( isset( $_GET[$this->submitVar] ) || isset( $_POST[$this->submitVar] ) )
- {
- $this->setSubmitted( true );
- }
- return $this->submitted;
- }
-
- function createCreator( $type )
- {
- return patForms::_createModule( 'Creator', $type );
- }
-
- function getElementName()
- {
- return $this->elementName;
- }
-
- function getErrorOffset( $requiredCodes = 100 )
- {
- $offset = $this->nextErrorOffset;
- $this->nextErrorOffset = $this->nextErrorOffset + $requiredCodes;
- return $offset;
- }
-
- function addValidatorErrorCodes( $defs, $offset = 1000 )
- {
- foreach ( $defs as $lang => $codes )
- {
- if ( !isset( $this->validatorErrorCodes[$lang] ) )
- {
- $this->validatorErrorCodes[$lang] = array();
- }
- foreach ( $codes as $code => $message )
- {
- $this->validatorErrorCodes[$lang][($offset+$code)] = $message;
- }
- }
- }
-
- function addValidationError( $code, $vars = array() )
- {
- $error = false;
- $lang = $this->locale;
- $element = $this->getElementName();
-
- while ( true )
- {
-
- if ( isset( $this->validatorErrorCodes[$lang][$code] ) )
- {
- $error = array( "element" => $element, "code" => $code, "message" => $this->validatorErrorCodes[$lang][$code] );
- break;
- }
-
- else if ( $lang == "C" )
- {
- break;
- }
- $lang_old = $lang;
-
- if ( strlen( $lang ) > 5 )
- {
- list( $lang, $trash ) = explode( ".", $lang );
- }
- else if ( strlen( $lang ) > 2 )
- {
- list( $lang, $trash ) = explode( "_", $lang );
- }
- else
- {
- $lang = "C";
- }
-
- patErrorManager::raiseNotice(
- PATFORMS_NOTICE_VALIDATOR_ERROR_LOCALE_UNDEFINED,
- "Required Validation Error-Code for language: $lang_old not available. Now trying language: $lang",
- "Add language definition in used element or choose other language"
- );
- }
-
- if ( !$error )
- {
- patErrorManager::raiseWarning(
- PATFORMS_WARNING_VALIDATOR_ERROR_UNDEFINED,
- "No Error Message for this validation Error was defined",
- "Review the error-definition for validation-errors in your element '$element'."
- );
- $error = array( "element" => $element, "code" => 0, "message" => "Unknown validation Error" );
- }
-
- if ( !empty( $vars ) )
- {
- foreach ( $vars as $key => $value )
- {
- $error["message"] = str_replace( "[". strtoupper( $key ) ."]", $value, $error["message"] );
- }
- }
- array_push( $this->validationErrors, $error );
- $this->valid = false;
- return true;
- }
-
- function getElementId()
- {
- $this->elementCounter++;
- return 'pfo'.$this->elementCounter;
- }
-
- function attachObserver( &$observer, $where = PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS )
- {
-
- if ( ( $where & PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS ) == PATFORMS_OBSERVER_ATTACH_TO_ELEMENTS )
- {
- $cnt = count( $this->elements );
- for ( $i = 0; $i < $cnt; ++$i )
- {
- $this->elements[$i]->attachObserver( $observer );
- }
- }
-
- if ( ( $where & PATFORMS_OBSERVER_ATTACH_TO_FORM ) == PATFORMS_OBSERVER_ATTACH_TO_FORM )
- {
- $this->observers[] = &$observer;
- }
- return true;
- }
-
- function serializeStart()
- {
- $methodName = "serializeStart".ucfirst( $this->getFormat() ).ucfirst( $this->getMode() );
- if ( !method_exists( $this, $methodName ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE,
- "Method for patForms mode '".$this->getMode()."' (".$methodName.") is not available."
- );
- }
- return $this->$methodName();
- }
-
- function serializeStartHtmlDefault()
- {
- $attributes = $this->getAttributesFor( $this->format );
- if ( patErrorManager::isError( $attributes ) )
- {
- return $attributes;
- }
- $content = patForms_Element::createTag( 'form', 'opening', $attributes );
- if ( $this->optionEnabled( 'scripts' ) )
- {
- $content .= $this->getScripts();
- }
- return $content;
- }
-
- function serializeStartHtmlReadonly()
- {
- $attributes = $this->getAttributesFor( $this->format );
- if ( patErrorManager::isError( $attributes ) )
- {
- return $attributes;
- }
- return patForms_Element::createTag( 'form', 'opening', $attributes );
- }
-
- function serializeEnd()
- {
- $methodName = "serializeEnd".ucfirst( $this->getFormat() ).ucfirst( $this->getMode() );
- if ( !method_exists( $this, $methodName ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_METHOD_FOR_MODE_NOT_AVAILABLE,
- "Method for patForms mode '".$this->getMode()."' (".$methodName.") is not available."
- );
- }
- return $this->$methodName();
- }
-
- function serializeEndHtmlDefault()
- {
- return patForms_Element::createTag( 'form', 'closing' );
- }
-
- function serializeEndHtmlReadonly()
- {
- return $this->serializeEndHtmlDefault();
- }
-
- function getAttributesFor( $format )
- {
- $attributes = array();
- foreach ( $this->attributeDefinition as $attributeName => $attributeDef )
- {
- if ( !isset( $this->attributes[$attributeName] ) )
- {
- if ( $attributeDef["required"] )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_ATTRIBUTE_REQUIRED,
- 'patForms needs the attribute "'.$attributeName.'" to be set.',
- 'See the patForms attribute definition of patForms for a complete attribute reference.'
- );
- }
- continue;
- }
- $attributeValue = $this->attributes[$attributeName];
- if ( !in_array( $format, $attributeDef["outputFormats"] ) )
- {
- continue;
- }
- if ( isset( $attributeDef["format"] ) )
- {
- if ( !$this->_checkAttributeFormat( $attributeValue, $attributeDef["format"] ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_CAN_NOT_VERIFY_FORMAT,
- "Format '".$attributeDef["format"]."' could not be verified for patForms attribute '".$attributeName."' => '".$attributeValue."'"
- );
- }
- }
- $attributes[$attributeName] = $attributeValue;
- }
- return $attributes;
- }
-
- function _checkAttributeFormat( $attributeValue, $format )
- {
- return true;
- }
-
- function enableOption( $option, $params = array() )
- {
- if ( !in_array( $option, array_keys( $this->options ) ) )
- {
- return patErrorManager::raiseNotice(
- PATFORMS_NOTICE_INVALID_OPTION,
- 'The option "'.$option.'" is not a valid patForms option.'
- );
- }
- $this->options[$option]['enabled'] = true;
- $this->options[$option]['params'] = $params;
-
- $cnt = count( $this->elements );
- for ( $i=0; $i < $cnt; $i++ )
- {
- $this->elements[$i]->enableOption( $option, $params );
- }
- return true;
- }
-
- function disableOption( $option )
- {
- if ( !in_array( $option, array_keys( $this->options ) ) )
- {
- return patErrorManager::raiseNotice(
- PATFORMS_NOTICE_INVALID_OPTION,
- 'The option "'.$option.'" is not a valid patForms option.'
- );
- }
- $this->options[$option]['enabled'] = false;
-
- $cnt = count( $this->elements );
- for ( $i=0; $i < $cnt; $i++ )
- {
- $this->elements[$i]->disableOption( $option );
- }
- return true;
- }
-
- function optionEnabled( $option )
- {
- if ( !isset( $this->options[$option] ) )
- return false;
- return $this->options[$option]['enabled'];
- }
-
- function setAutoValidate( $submitVar )
- {
- $this->autoValidate = true;
- $this->submitVar = $submitVar;
- }
-
- function registerEvent( $name )
- {
- $event = 'on' . $name;
- if ( in_array( $event, $this->_validEvents ) )
- {
- return patErrorManager::raiseNotice(
- PATFORMS_NOTICE_EVENT_ALREADY_REGISTERED,
- 'Event "'.$event.'" already has been registered or is built-in event'
- );
- }
- array_push( $this->_validEvents, $event );
- return true;
- }
-
- function registerEventHandler( $event, $handler )
- {
- if ( !in_array( $event, $this->_validEvents ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_UNKNOWN_EVENT,
- 'Cannot register event handler for unknown event "' . $event .'".'
- );
- }
- if ( !is_callable( $handler ) )
- {
- return patErrorManager::raiseError(
- PATFORMS_ERROR_INVALID_HANDLER,
- 'Event handler is not callable.'
- );
- }
- if ( !isset( $this->_eventHandler[$event] ) )
- {
- $this->_eventHandler[$event] = array();
- }
- $this->_eventHandler[$event][] = &$handler;
- return true;
- }
-
- function registerEventHandlerObject( &$obj, $methods = array() )
- {
- if ( empty( $methods ) )
- {
- foreach ( $this->_validEvents as $event )
- {
- if ( !method_exists( $obj, $event ) )
- continue;
- $methods[$event] = $event;
- }
- }
- foreach ( $methods as $event => $method )
- {
- if ( !isset( $this->_eventHandler[$event] ) )
- {
- $this->_eventHandler[$event] = array();
- }
- $this->_eventHandler[$event][] = array( &$obj, $method );
- }
- return true;
- }
-
- function triggerEvent( $event )
- {
- $handlerName = 'on' . $event;
- if ( !isset( $this->_eventHandler[$handlerName] ) || empty( $this->_eventHandler[$handlerName] ) )
- {
- return true;
- }
- $cnt = count( $this->_eventHandler[$handlerName] );
- for ( $i = 0; $i < $cnt; $i++ )
- {
- $result = call_user_func( $this->_eventHandler[$handlerName][$i], $this, $event );
- if ( $result == false )
- {
- return $result;
- }
- }
- return true;
- }
-
- function toXML( $namespace = null )
- {
- $tagName = 'Form';
-
- if ( $namespace != null )
- {
- $tagName = $namespace.':'.$tagName;
- }
-
- $attributes = $this->getAttributes();
-
- foreach ( $attributes as $key => $value )
- {
- $attributes[$key] = strtr( $value, $this->xmlEntities );
- }
- $elements = '';
- for ( $i = 0; $i < $this->elementCounter; $i++ )
- {
- $elements .= $this->elements[$i]->toXML( $namespace );
- }
- return patForms_Element::createTag( $tagName, "full", $attributes, $elements );
- }
-
- function setStaticProperty( $property, &$value )
- {
- $GLOBALS["_patForms"][$property] = &$value;
- }
-
- function &getStaticProperty( $property )
- {
- if ( isset( $GLOBALS["_patForms"][$property] ) )
- {
- return $GLOBALS["_patForms"][$property];
- }
- return patErrorManager::raiseWarning(
- PATFORMS_ERROR_NO_STATIC_PROPERTY,
- 'Static property "'.$property.'" could not be retreived, it does not exist.'
- );
- }
-
- function getName()
- {
- if ( isset( $this->attributes['name'] ) )
- return $this->attributes['name'];
- return 'patForms';
- }
-
- function getScripts()
- {
- foreach ($this->elements as $element) {
- $element->registerJavascripts($this);
- }
- $globalJavascript = implode ("", $this->javascripts['global']);
- $instances = implode ("", $this->javascripts['instance']);
- $script = '<script type="text/javascript" language="Javascript1.3">' . "\n"
- . $globalJavascript . "\n\n" . $instances . "\n"
- . '</script>';
- return $script;
-
- }
- private $javascripts = array(
- 'global' => array(),
- 'instance' => array()
- );
- function registerGlobalJavascript($type, $script) {
- $this->javascripts['global'][$type] = $script;
- }
- function registerInstanceJavascript($script) {
- $this->javascripts['instance'][] = $script;
- }
-
- function _announce( $property, $value )
- {
- $cnt = count( $this->observers );
- for ( $i = 0; $i < $cnt; $i++ )
- {
- $this->observers[$i]->notify( $this, $property, $value );
- }
- return true;
- }
- }
|