From 8508ed4392d8b704f72daf439cf4c07010cc7d99 Mon Sep 17 00:00:00 2001 From: Ciro Mattia Gonano Date: Fri, 18 Oct 2013 15:02:28 +0200 Subject: Rebuild pradolite to release new tag --- framework/pradolite.php | 696 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 686 insertions(+), 10 deletions(-) (limited to 'framework/pradolite.php') diff --git a/framework/pradolite.php b/framework/pradolite.php index cc4bbb79..c80005e1 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@ getFileName()).DIRECTORY_SEPARATOR.$assetPath; return $this->publishFilePath($fullPath); } - public function publishFilePath($fullPath) + public function publishFilePath($fullPath, $checkTimestamp=false) { - return Prado::getApplication()->getAssetManager()->publishFilePath($fullPath); + return Prado::getApplication()->getAssetManager()->publishFilePath($fullPath, $checkTimestamp); } } abstract class TModule extends TApplicationComponent implements IModule @@ -1248,6 +1248,377 @@ class TTextWriter extends TComponent implements ITextWriter $this->write($str."\n"); } } +class TPriorityList extends TList +{ + private $_d=array(); + private $_o=false; + private $_fd=null; + private $_c=0; + private $_dp=10; + private $_p=8; + public function __construct($data=null,$readOnly=false,$defaultPriority=10,$precision=8) + { + parent::__construct(); + if($data!==null) + $this->copyFrom($data); + $this->setReadOnly($readOnly); + $this->setPrecision($precision); + $this->setDefaultPriority($defaultPriority); + } + public function count() + { + return $this->getCount(); + } + public function getCount() + { + return $this->_c; + } + public function getPriorityCount($priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + if(!isset($this->_d[$priority]) || !is_array($this->_d[$priority])) + return false; + return count($this->_d[$priority]); + } + public function getDefaultPriority() + { + return $this->_dp; + } + protected function setDefaultPriority($value) + { + $this->_dp=(string)round(TPropertyValue::ensureFloat($value),$this->_p); + } + public function getPrecision() + { + return $this->_p; + } + protected function setPrecision($value) + { + $this->_p=TPropertyValue::ensureInteger($value); + } + public function getIterator() + { + return new ArrayIterator($this->flattenPriorities()); + } + public function getPriorities() + { + $this->sortPriorities(); + return array_keys($this->_d); + } + protected function sortPriorities() { + if(!$this->_o) { + ksort($this->_d,SORT_NUMERIC); + $this->_o=true; + } + } + protected function flattenPriorities() { + if(is_array($this->_fd)) + return $this->_fd; + $this->sortPriorities(); + $this->_fd=array(); + foreach($this->_d as $priority => $itemsatpriority) + $this->_fd=array_merge($this->_fd,$itemsatpriority); + return $this->_fd; + } + public function itemAt($index) + { + if($index>=0&&$index<$this->getCount()) { + $arr=$this->flattenPriorities(); + return $arr[$index]; + } else + throw new TInvalidDataValueException('list_index_invalid',$index); + } + public function itemsAtPriority($priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + return isset($this->_d[$priority])?$this->_d[$priority]:null; + } + public function itemAtIndexInPriority($index,$priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority), $this->_p); + return !isset($this->_d[$priority])?false:( + isset($this->_d[$priority][$index])?$this->_d[$priority][$index]:false + ); + } + public function add($item,$priority=null) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + return $this->insertAtIndexInPriority($item,false,$priority,true); + } + public function insertAt($index,$item) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if(($priority=$this->priorityAt($index,true))!==false) + $this->insertAtIndexInPriority($item,$priority[1],$priority[0]); + else + throw new TInvalidDataValueException('list_index_invalid',$index); + } + public function insertAtIndexInPriority($item,$index=false,$priority=null,$preserveCache=false) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority), $this->_p); + if($preserveCache) { + $this->sortPriorities(); + $cc=0; + foreach($this->_d as $prioritykey=>$items) + if($prioritykey>=$priority) + break; + else + $cc+=count($items); + if($index===false&&isset($this->_d[$priority])) { + $c=count($this->_d[$priority]); + $c+=$cc; + $this->_d[$priority][]=$item; + } else if(isset($this->_d[$priority])) { + $c=$index+$cc; + array_splice($this->_d[$priority],$index,0,array($item)); + } else { + $c = $cc; + $this->_o = false; + $this->_d[$priority]=array($item); + } + if($this->_fd&&is_array($this->_fd)) array_splice($this->_fd,$c,0,array($item)); + } else { + $c=null; + if($index===false&&isset($this->_d[$priority])) { + $cc=count($this->_d[$priority]); + $this->_d[$priority][]=$item; + } else if(isset($this->_d[$priority])) { + $cc=$index; + array_splice($this->_d[$priority],$index,0,array($item)); + } else { + $cc=0; + $this->_o=false; + $this->_d[$priority]=array($item); + } + if($this->_fd&&is_array($this->_fd)&&count($this->_d)==1) + array_splice($this->_fd,$cc,0,array($item)); + else + $this->_fd=null; + } + $this->_c++; + return $c; + } + public function remove($item,$priority=false) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if(($p=$this->priorityOf($item,true))!==false) + { + if($priority!==false) { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + if($p[0]!=$priority) + throw new TInvalidDataValueException('list_item_inexistent'); + } + $this->removeAtIndexInPriority($p[1],$p[0]); + return $p[2]; + } + else + throw new TInvalidDataValueException('list_item_inexistent'); + } + public function removeAt($index) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if(($priority=$this->priorityAt($index, true))!==false) + return $this->removeAtIndexInPriority($priority[1],$priority[0]); + throw new TInvalidDataValueException('list_index_invalid',$index); + } + public function removeAtIndexInPriority($index, $priority=null) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + if(!isset($this->_d[$priority])||$index<0||$index>=count($this->_d[$priority])) + throw new TInvalidDataValueException('list_item_inexistent'); + $value=array_splice($this->_d[$priority],$index,1); + $value=$value[0]; + if(!count($this->_d[$priority])) + unset($this->_d[$priority]); + $this->_c--; + $this->_fd=null; + return $value; + } + public function clear() + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + $d=array_reverse($this->_d,true); + foreach($this->_d as $priority=>$items) { + for($index=count($items)-1;$index>=0;$index--) + $this->removeAtIndexInPriority($index,$priority); + unset($this->_d[$priority]); + } + } + public function contains($item) + { + return $this->indexOf($item)>=0; + } + public function indexOf($item) + { + if(($index=array_search($item,$this->flattenPriorities(),true))===false) + return -1; + else + return $index; + } + public function priorityOf($item,$withindex = false) + { + $this->sortPriorities(); + $absindex = 0; + foreach($this->_d as $priority=>$items) { + if(($index=array_search($item,$items,true))!==false) { + $absindex+=$index; + return $withindex?array($priority,$index,$absindex, + 'priority'=>$priority,'index'=>$index,'absindex'=>$absindex):$priority; + } else + $absindex+=count($items); + } + return false; + } + public function priorityAt($index,$withindex = false) + { + if($index<0||$index>=$this->getCount()) + throw new TInvalidDataValueException('list_index_invalid',$index); + $absindex=$index; + $this->sortPriorities(); + foreach($this->_d as $priority=>$items) { + if($index>=($c=count($items))) + $index-=$c; + else + return $withindex?array($priority,$index,$absindex, + 'priority'=>$priority,'index'=>$index,'absindex'=>$absindex):$priority; + } + return false; + } + public function insertBefore($indexitem, $item) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if(($priority=$this->priorityOf($indexitem,true))===false) + throw new TInvalidDataValueException('list_item_inexistent'); + $this->insertAtIndexInPriority($item,$priority[1],$priority[0]); + return $priority[2]; + } + public function insertAfter($indexitem, $item) + { + if($this->getReadOnly()) + throw new TInvalidOperationException('list_readonly',get_class($this)); + if(($priority=$this->priorityOf($indexitem,true))===false) + throw new TInvalidDataValueException('list_item_inexistent'); + $this->insertAtIndexInPriority($item,$priority[1]+1,$priority[0]); + return $priority[2]+1; + } + public function toArray() + { + return $this->flattenPriorities(); + } + public function toPriorityArray() + { + $this->sortPriorities(); + return $this->_d; + } + public function toArrayBelowPriority($priority,$inclusive=false) + { + $this->sortPriorities(); + $items=array(); + foreach($this->_d as $itemspriority=>$itemsatpriority) + { + if((!$inclusive&&$itemspriority>=$priority)||$itemspriority>$priority) + break; + $items=array_merge($items,$itemsatpriority); + } + return $items; + } + public function toArrayAbovePriority($priority,$inclusive=true) + { + $this->sortPriorities(); + $items=array(); + foreach($this->_d as $itemspriority=>$itemsatpriority) + { + if((!$inclusive&&$itemspriority<=$priority)||$itemspriority<$priority) + continue; + $items=array_merge($items,$itemsatpriority); + } + return $items; + } + public function copyFrom($data) + { + if($data instanceof TPriorityList) + { + if($this->getCount()>0) + $this->clear(); + foreach($data->getPriorities() as $priority) + { + foreach($data->itemsAtPriority($priority) as $index=>$item) + $this->insertAtIndexInPriority($item,$index,$priority); + } + } else if(is_array($data)||$data instanceof Traversable) { + if($this->getCount()>0) + $this->clear(); + foreach($data as $key=>$item) + $this->add($item); + } else if($data!==null) + throw new TInvalidDataTypeException('map_data_not_iterable'); + } + public function mergeWith($data) + { + if($data instanceof TPriorityList) + { + foreach($data->getPriorities() as $priority) + { + foreach($data->itemsAtPriority($priority) as $index=>$item) + $this->insertAtIndexInPriority($item,false,$priority); + } + } + else if(is_array($data)||$data instanceof Traversable) + { + foreach($data as $priority=>$item) + $this->add($item); + } + else if($data!==null) + throw new TInvalidDataTypeException('map_data_not_iterable'); + } + public function offsetExists($offset) + { + return ($offset>=0&&$offset<$this->getCount()); + } + public function offsetGet($offset) + { + return $this->itemAt($offset); + } + public function offsetSet($offset,$item) + { + if($offset===null) + return $this->add($item); + if($offset===$this->getCount()) { + $priority=$this->priorityAt($offset-1,true); + $priority[1]++; + } else { + $priority=$this->priorityAt($offset,true); + $this->removeAtIndexInPriority($priority[1],$priority[0]); + } + $this->insertAtIndexInPriority($item,$priority[1],$priority[0]); + } + public function offsetUnset($offset) + { + $this->removeAt($offset); + } +} class TMap extends TComponent implements IteratorAggregate,ArrayAccess,Countable { private $_d=array(); @@ -1392,6 +1763,310 @@ class TMapIterator implements Iterator return $this->_key!==false; } } +class TPriorityMap extends TMap +{ + private $_d=array(); + private $_r=false; + private $_o=false; + private $_fd=null; + private $_c=0; + private $_dp=10; + private $_p=8; + public function __construct($data=null,$readOnly=false,$defaultPriority=10,$precision=8) + { + if($data!==null) + $this->copyFrom($data); + $this->setReadOnly($readOnly); + $this->setPrecision($precision); + $this->setDefaultPriority($defaultPriority); + } + public function getReadOnly() + { + return $this->_r; + } + protected function setReadOnly($value) + { + $this->_r=TPropertyValue::ensureBoolean($value); + } + public function getDefaultPriority() + { + return $this->_dp; + } + protected function setDefaultPriority($value) + { + $this->_dp = (string)round(TPropertyValue::ensureFloat($value), $this->_p); + } + public function getPrecision() + { + return $this->_p; + } + protected function setPrecision($value) + { + $this->_p=TPropertyValue::ensureInteger($value); + } + public function getIterator() + { + return new ArrayIterator($this->flattenPriorities()); + } + protected function sortPriorities() { + if(!$this->_o) { + ksort($this->_d, SORT_NUMERIC); + $this->_o=true; + } + } + protected function flattenPriorities() { + if(is_array($this->_fd)) + return $this->_fd; + $this->sortPriorities(); + $this->_fd = array(); + foreach($this->_d as $priority => $itemsatpriority) + $this->_fd = array_merge($this->_fd, $itemsatpriority); + return $this->_fd; + } + public function count() + { + return $this->getCount(); + } + public function getCount() + { + return $this->_c; + } + public function getPriorityCount($priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + if(!isset($this->_d[$priority])||!is_array($this->_d[$priority])) + return false; + return count($this->_d[$priority]); + } + public function getPriorities() + { + $this->sortPriorities(); + return array_keys($this->_d); + } + public function getKeys() + { + return array_keys($this->flattenPriorities()); + } + public function itemAt($key,$priority=false) + { + if($priority===false){ + $map=$this->flattenPriorities(); + return isset($map[$key])?$map[$key]:null; + } else { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + return (isset($this->_d[$priority])&&isset($this->_d[$priority][$key]))?$this->_d[$priority][$key]:null; + } + } + public function setPriorityAt($key,$priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + $oldpriority=$this->priorityAt($key); + if($oldpriority!==false&&$oldpriority!=$priority) { + $value=$this->remove($key,$oldpriority); + $this->add($key,$value,$priority); + } + return $oldpriority; + } + public function itemsAtPriority($priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + return isset($this->_d[$priority])?$this->_d[$priority]:null; + } + public function priorityOf($item) + { + $this->sortPriorities(); + foreach($this->_d as $priority=>$items) + if(($index=array_search($item,$items,true))!==false) + return $priority; + return false; + } + public function priorityAt($key) + { + $this->sortPriorities(); + foreach($this->_d as $priority=>$items) + if(array_key_exists($key,$items)) + return $priority; + return false; + } + public function add($key,$value,$priority=null) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + if(!$this->_r) + { + foreach($this->_d as $innerpriority=>$items) + if(array_key_exists($key,$items)) + { + unset($this->_d[$innerpriority][$key]); + $this->_c--; + if(count($this->_d[$innerpriority])===0) + unset($this->_d[$innerpriority]); + } + if(!isset($this->_d[$priority])) { + $this->_d[$priority]=array($key=>$value); + $this->_o=false; + } + else + $this->_d[$priority][$key]=$value; + $this->_c++; + $this->_fd=null; + } + else + throw new TInvalidOperationException('map_readonly',get_class($this)); + return $priority; + } + public function remove($key,$priority=false) + { + if(!$this->_r) + { + if($priority===null) + $priority=$this->getDefaultPriority(); + if($priority===false) + { + $this->sortPriorities(); + foreach($this->_d as $priority=>$items) + if(array_key_exists($key,$items)) + { + $value=$this->_d[$priority][$key]; + unset($this->_d[$priority][$key]); + $this->_c--; + if(count($this->_d[$priority])===0) + { + unset($this->_d[$priority]); + $this->_o=false; + } + $this->_fd=null; + return $value; + } + return null; + } + else + { + $priority=(string)round(TPropertyValue::ensureFloat($priority),$this->_p); + if(isset($this->_d[$priority])&&(isset($this->_d[$priority][$key])||array_key_exists($key,$this->_d[$priority]))) + { + $value=$this->_d[$priority][$key]; + unset($this->_d[$priority][$key]); + $this->_c--; + if(count($this->_d[$priority])===0) { + unset($this->_d[$priority]); + $this->_o=false; + } + $this->_fd=null; + return $value; + } + else + return null; + } + } + else + throw new TInvalidOperationException('map_readonly',get_class($this)); + } + public function clear() + { + foreach($this->_d as $priority=>$items) + foreach(array_keys($items) as $key) + $this->remove($key); + } + public function contains($key) + { + $map=$this->flattenPriorities(); + return isset($map[$key])||array_key_exists($key,$map); + } + public function toArray() + { + return $this->flattenPriorities(); + } + public function toArrayBelowPriority($priority,$inclusive=false) + { + $this->sortPriorities(); + $items=array(); + foreach($this->_d as $itemspriority=>$itemsatpriority) + { + if((!$inclusive&&$itemspriority>=$priority)||$itemspriority>$priority) + break; + $items=array_merge($items,$itemsatpriority); + } + return $items; + } + public function toArrayAbovePriority($priority,$inclusive=true) + { + $this->sortPriorities(); + $items=array(); + foreach($this->_d as $itemspriority=>$itemsatpriority) + { + if((!$inclusive&&$itemspriority<=$priority)||$itemspriority<$priority) + continue; + $items=array_merge($items,$itemsatpriority); + } + return $items; + } + public function copyFrom($data) + { + if($data instanceof TPriorityMap) + { + if($this->getCount()>0) + $this->clear(); + foreach($data->getPriorities() as $priority) { + foreach($data->itemsAtPriority($priority) as $key => $value) { + $this->add($key,$value,$priority); + } + } + } + else if(is_array($data)||$data instanceof Traversable) + { + if($this->getCount()>0) + $this->clear(); + foreach($data as $key=>$value) + $this->add($key,$value); + } + else if($data!==null) + throw new TInvalidDataTypeException('map_data_not_iterable'); + } + public function mergeWith($data) + { + if($data instanceof TPriorityMap) + { + foreach($data->getPriorities() as $priority) + { + foreach($data->itemsAtPriority($priority) as $key => $value) + $this->add($key,$value,$priority); + } + } + else if(is_array($data)||$data instanceof Traversable) + { + foreach($data as $key=>$value) + $this->add($key,$value); + } + else if($data!==null) + throw new TInvalidDataTypeException('map_data_not_iterable'); + } + public function offsetExists($offset) + { + return $this->contains($offset); + } + public function offsetGet($offset) + { + return $this->itemAt($offset); + } + public function offsetSet($offset,$item) + { + $this->add($offset,$item); + } + public function offsetUnset($offset) + { + $this->remove($offset); + } +} class TStack extends TComponent implements IteratorAggregate,Countable { private $_d=array(); @@ -3767,7 +4442,7 @@ class TAttributeCollection extends TMap } public function hasProperty($name) { - return $this->contains($name) || parent::hasProperty($name); + return $this->contains($name) || parent::canGetProperty($name) || parent::canSetProperty($name); } public function canGetProperty($name) { @@ -6436,12 +7111,9 @@ class TClientScriptManager extends TApplicationComponent public function getStyleSheetUrls() { $stylesheets = array_values( - array_merge( - array_map( - create_function('$e', 'return is_array($e) ? $e[0] : $e;'), - $this->_styleSheetFiles), - $this->_styleSheets - ) + array_map( + create_function('$e', 'return is_array($e) ? $e[0] : $e;'), + $this->_styleSheetFiles) ); foreach(Prado::getApplication()->getAssetManager()->getPublished() as $path=>$url) if (substr($url,strlen($url)-4)=='.css') @@ -6449,6 +7121,10 @@ class TClientScriptManager extends TApplicationComponent $stylesheets = array_unique($stylesheets); return $stylesheets; } + public function getStyleSheetCodes() + { + return array_unique(array_values($this->_styleSheets)); + } public function registerHeadScriptFile($key,$url) { $this->checkIfNotInRender(); -- cgit v1.2.3 From 6d7ac281324719b48df690e9d4b4b8e432147b2c Mon Sep 17 00:00:00 2001 From: Ciro Mattia Gonano Date: Tue, 19 Nov 2013 10:24:03 +0100 Subject: Rebuild pradolite for 3.2.2.05 --- framework/pradolite.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'framework/pradolite.php') diff --git a/framework/pradolite.php b/framework/pradolite.php index c80005e1..bfcf36ad 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@ Date: Tue, 26 Nov 2013 09:44:59 +0100 Subject: Rebuilt pradolite --- framework/pradolite.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'framework/pradolite.php') diff --git a/framework/pradolite.php b/framework/pradolite.php index bfcf36ad..cb0db1f0 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@ Date: Tue, 26 Nov 2013 09:58:10 +0100 Subject: Clean up checks for .svn directory --- bin/prado-cli.php | 2 +- build.xml | 12 ------------ buildscripts/classtree/build.php | 1 - framework/pradolite.php | 2 +- 4 files changed, 2 insertions(+), 15 deletions(-) (limited to 'framework/pradolite.php') diff --git a/bin/prado-cli.php b/bin/prado-cli.php index 4fa70c08..b4b43062 100755 --- a/bin/prado-cli.php +++ b/bin/prado-cli.php @@ -569,7 +569,7 @@ class PradoCommandLineUnitTest extends PradoCommandLineAction if($match==null||($match!=null && $this->hasMatch($match,$entry))) $test->addTestFile($path.'/'.$entry); } - if($entry!=='.' && $entry!=='..' && $entry!=='.svn' && is_dir($path.'/'.$entry) && $recursive) + if($entry!=='.' && $entry!=='..' && is_dir($path.'/'.$entry) && $recursive) $this->addTests($test,$path.'/'.$entry,$recursive,$match); } closedir($dir); diff --git a/build.xml b/build.xml index 582b832b..023debe2 100644 --- a/build.xml +++ b/build.xml @@ -37,7 +37,6 @@ All Source Files in framework --> - @@ -58,7 +57,6 @@ Surrounding files --> - @@ -72,7 +70,6 @@ Documentation --> - @@ -85,7 +82,6 @@ Demos --> - @@ -201,8 +197,6 @@ php="false" templateconfig="buildscripts/apigen/pradosoft/config.neon" /> - Cleaning svn directories from API manuals... - Indexing API manuals... @@ -335,7 +329,6 @@ Checking php files.. - @@ -345,7 +338,6 @@ Checking js files.. - @@ -355,7 +347,6 @@ Checking xml files.. - @@ -367,7 +358,6 @@ Checking php files.. - @@ -377,7 +367,6 @@ Checking js files.. - @@ -387,7 +376,6 @@ Checking xml files.. - diff --git a/buildscripts/classtree/build.php b/buildscripts/classtree/build.php index 44700be4..f7b8d7e7 100644 --- a/buildscripts/classtree/build.php +++ b/buildscripts/classtree/build.php @@ -12,7 +12,6 @@ $exclusions=array( 'pradolite.php', 'prado-cli.php', 'JSMin.php', - '.svn', '/I18N/core', '/3rdParty', '/Testing', diff --git a/framework/pradolite.php b/framework/pradolite.php index cb0db1f0..40ad7ccd 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@ Date: Tue, 26 Nov 2013 10:04:16 +0100 Subject: Forgot to update Quickstart tutorial pdf's version --- buildscripts/texbuilder/quickstart/quickstart.tex | 2 +- .../protected/pages/Fundamentals/Components.page | 64 +++++++++++----------- framework/pradolite.php | 2 +- 3 files changed, 34 insertions(+), 34 deletions(-) (limited to 'framework/pradolite.php') diff --git a/buildscripts/texbuilder/quickstart/quickstart.tex b/buildscripts/texbuilder/quickstart/quickstart.tex index deaba73c..41258800 100644 --- a/buildscripts/texbuilder/quickstart/quickstart.tex +++ b/buildscripts/texbuilder/quickstart/quickstart.tex @@ -52,7 +52,7 @@ %----------------- TITLE -------------- -\title{\Huge \bfseries PRADO v3.2.2 Quickstart Tutorial +\title{\Huge \bfseries PRADO v3.2.3 Quickstart Tutorial \thanks{Copyright 2004-2013. All Rights Reserved.} } \author{Qiang Xue and Wei Zhuo} diff --git a/demos/quickstart/protected/pages/Fundamentals/Components.page b/demos/quickstart/protected/pages/Fundamentals/Components.page index 84c6070c..11235b56 100755 --- a/demos/quickstart/protected/pages/Fundamentals/Components.page +++ b/demos/quickstart/protected/pages/Fundamentals/Components.page @@ -105,13 +105,13 @@ $button->attachEventHandler( 'OnClick' , $callback );
  • array($object,'MainContent.SubmitButton.buttonClicked') : $object->MainContent->SubmitButton->buttonClicked($sender,$param);
  • -

    Global events

    -

    +

    Global events

    +

    With the addition of behaviors, a more expansive event model is needed. There are two new event types (global and dynamic events) as well as a more comprehensive behavior model that includes class wide behaviors.

    -

    +

    A global event is defined by all events whose name starts with 'fx'. The event name is potentially a method name and is thus case-insensitive. All 'fx' events are valid as the whole 'fx' event/method space is global in nature. Any object may patch into @@ -121,7 +121,7 @@ nature of all events which start with 'fx' being valid, in effect, every object has every 'fx' global event. It is simply an issue of tapping into the desired global event.

    -

    +

    A global event that starts with 'fx' can be called even if the object does not implement the method of the global event. A call to a non-existing 'fx' method will, at minimal, function and return null. If a method argument list has a first @@ -131,7 +131,7 @@ object's global event listeners, call the object's listen and unlisten methods, respectively. An object may auto-install its global event during __construct by overriding getAutoGlobalListen and returning true.

    -

    +

    As of PHP version 5.3, nulled objects without code references will still continue to persist in the global event queue because __destruct is not automatically called. In the common __destruct method, if an object is listening to global events, then unlisten is called. @@ -139,11 +139,11 @@ __destruct method, if an object is listening to global events, then unlisten left without references if it is currently listening to any global events. This includes class wide behaviors.

    -

    +

    An object that contains a method that starts with 'fx' will have those functions automatically receive those events of the same name after listen is called on the object.

    -

    +

    An object may listen to a global event without defining an 'fx' method of the same name by adding an object method to the global event list. For example

    @@ -151,21 +151,21 @@ adding an object method to the global event list. For example $component->fxGlobalCheck=$callback; // or $component->OnClick->add($callback); $component->attachEventHandler('fxGlobalCheck',array($object, 'someMethod')); -

    Events between Objects and their behaviors, Dynamic Events

    -

    +

    Events between Objects and their behaviors, Dynamic Events

    +

    An intra-object/behavior event is defined by methods that start with 'dy'. Just as with 'fx' global events, every object has every dynamic event. Any call to a method that starts with 'dy' will be handled, regardless of whether it is implemented. These events are for communicating with attached behaviors.

    -

    +

    Dynamic events can be used in a variety of ways. They can be used to tell behaviors when a non-behavior method is called. Dynamic events could be used as data filters. They could also be used to specify when a piece of code is to be run, eg. should the loop process be performed on a particular piece of data. In this way, some control is handed to the behaviors over the process and/or data.

    -

    +

    If there are no handlers for an 'fx' or 'dy' event, it will return the first parameter of the argument list. If there are no arguments, these events will return null. If there are handlers an 'fx' method will be called directly @@ -174,36 +174,36 @@ For dynamic events where there are behaviors that respond to the dynamic events, TCallChain is developed. A call chain allows the behavior dynamic event implementations to call further implementing behaviors within a chain.

    -

    +

    If an object implements IDynamicMethods, all global and object dynamic events will be sent to __dycall. In the case of global events, all global events will trigger this method. In the case of behaviors, all undefined dynamic events which are called will be passed through to this method.

    -

    -

    Behaviors

    -

    +

    +

    Behaviors

    +

    There are two types of behaviors. There are individual object behaviors and there are class wide behaviors. Class behaviors depend upon object behaviors.

    -

    +

    When a new class implements IBehavior or IClassBehavior or extends TBehavior or TClassBehavior, it may be added to an object by calling the object's attachBehavior. The behaviors associated name can then be used to enableBehavior or disableBehavior the specific behavior.

    -

    +

    All behaviors may be turned on and off via enableBehaviors and disableBehaviors, respectively. To check if behaviors are on or off a call to getBehaviorsEnabled will provide the variable.

    -

    +

    Attaching and detaching whole sets of behaviors is done using attachBehaviors and detachBehaviors. clearBehaviors removes all of an object's behaviors.

    -

    +

    asa returns a behavior of a specific name. isa is the behavior inclusive function that acts as the PHP operator instanceof. A behavior could provide the functionality of a specific class thus causing @@ -211,13 +211,13 @@ the host object to act similarly to a completely different class. A behavior would then implement IInstanceCheck to provide the identity of the different class.

    -

    +

    Class behaviors are similar to object behaviors except that the class behavior is the implementation for all instances of the class. A class behavior will have the object upon which is being called be prepended to the parameter list. This way the object is known across the class behavior implementation.

    -

    +

    Class behaviors are attached using attachClassBehavior and detached using detachClassBehavior. Class behaviors are important in that they will be applied to all new instances of a particular class. In this way @@ -226,7 +226,7 @@ class behaviors become default behaviors to a new instances of a class in from the default set of behaviors created for an object when the object is instanced.

    -

    +

    Class behaviors are also added to all existing instances via the global 'fx' event mechanism. When a new class behavior is added, the event fxAttachClassBehavior is raised and all existing instances that are @@ -235,8 +235,8 @@ will have this new behavior attached. A similar process is used when detaching class behaviors. Any objects listening to the global 'fx' event fxDetachClassBehavior will have a class behavior removed.

    -

    Dynamic Intra-Object Events

    -

    +

    Dynamic Intra-Object Events

    +

    Dynamic events start with 'dy'. This mechanism is used to allow objects to communicate with their behaviors directly. The entire 'dy' event space is valid. All attached, enabled behaviors that implement a dynamic event @@ -249,7 +249,7 @@ parameter in the dynamic event. null == $this->dyBehaviorEvent(); 5 == $this->dyBehaviorEvent(5); //when no behaviors implement this dynamic event -

    +

    Dynamic events can be chained together within behaviors to allow for data filtering. Dynamic events are implemented within behaviors by defining the event as a method. @@ -262,12 +262,12 @@ class TObjectBehavior extends TBehavior { } } -

    +

    This implementation of a behavior and dynamic event will flow through to the next behavior implementing the dynamic event. The first parameter is always return when it is supplied. Otherwise a dynamic event returns null.

    -

    +

    In the case of a class behavior, the object is also prepended to the dynamic event.

    @@ -280,14 +280,14 @@ class TObjectClassBehavior extends TClassBehavior { }

    -

    +

    When calling a dynamic event, only the parameters are passed. The host object and the call chain are built into the framework.

    -

    Global Event and Dynamic event catching

    +

    Global Event and Dynamic event catching

    -

    +

    Given that all global 'fx' events and dynamic 'dy' events are valid and operational, there is a mechanism for catching events called that are not implemented (similar to the built-in PHP method __call). When @@ -295,12 +295,12 @@ a dynamic or global event is called but a behavior does not implement it, yet desires to know when an undefined dynamic event is run, the behavior implements the interface IDynamicMethods and method __dycall.

    -

    +

    In the case of dynamic events, __dycall is supplied with the method name and its parameters. When a global event is raised, via raiseEvent, the method is the event name and the parameters are supplied.

    -

    +

    When implemented, this catch-all mechanism is called for event global event event when implemented outside of a behavior. Within a behavior, it will also be called when the object to which the behavior is attached calls any unimplemented dynamic diff --git a/framework/pradolite.php b/framework/pradolite.php index 40ad7ccd..911db340 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@ Date: Tue, 26 Nov 2013 10:09:54 +0100 Subject: Updatd release date --- HISTORY | 2 +- framework/pradolite.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'framework/pradolite.php') diff --git a/HISTORY b/HISTORY index e5b274df..ef7b7d60 100644 --- a/HISTORY +++ b/HISTORY @@ -1,4 +1,4 @@ -Version 3.2.3 to be released +Version 3.2.3 Nov 26, 2013 BUG: Issue #467 - TSafeHtml error on php 5.5 (ctrlaltca) BUG: Issue #470 - Problem escaping characters in TActiveDropDownList (ctrlaltca) diff --git a/framework/pradolite.php b/framework/pradolite.php index 911db340..d9627d13 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@