Overview

Namespaces

  • None
  • PHP
  • picon

Classes

  • AbstractAjaxBehaviour
  • AbstractAssociatedMarkupSource
  • AbstractBehaviour
  • AbstractCallableOption
  • AbstractChoice
  • AbstractColumn
  • AbstractContextLoader
  • AbstractDatabaseDriver
  • AbstractInjectedDataProvider
  • AbstractJQueryBehaviour
  • AbstractJQueryUIBehaviour
  • AbstractLink
  • AbstractMarkupSource
  • AbstractMultipleChoice
  • AbstractOption
  • AbstractPageClassAuthorisationStrategy
  • AbstractRepeater
  • AbstractSingleChoice
  • AbstractTextComponent
  • AbstractToolbar
  • AbstractValidator
  • AjaxButton
  • AjaxEventBehaviour
  • AjaxFormComponentUpdateBehavior
  • AjaxFormSubmitBehavior
  • AjaxLink
  • AjaxRequestTarget
  • AllowAllAuthorisationStrategy
  • AnnotationRule
  • ApplicationConfigLoadListener
  • ApplicationContext
  • ApplicationContextLoadListener
  • ApplicationInitializer
  • ApplicationInitializerConfigLoadListenerCollection
  • ApplicationInitializerContextLoadListenerCollection
  • ApplicationProfile
  • Args
  • ArrayModel
  • ArrayOption
  • AttributeAppender
  • AttributeModifier
  • AutoContextLoader
  • AutoLoader
  • BasicModel
  • BooleanModel
  • BooleanOption
  • Border
  • BorderMarkupSourcingStratagy
  • BorderResolver
  • Button
  • CacheManager
  • CallbackAjaxCallDecorator
  • CallbackColumn
  • CallbackFunctionOption
  • CallbackOption
  • CallbackRowMapper
  • Check
  • CheckBox
  • CheckBoxGroup
  • CheckChoice
  • ChoiceRenderer
  • ClassNameRule
  • ClassNamespaceRule
  • ClassScanner
  • Comment
  • ComonDomainBase
  • Component
  • ComponentAfterRenderListenerCollection
  • ComponentAuthorisationListener
  • ComponentBeforeRenderListenerCollection
  • ComponentInitializationListenerCollection
  • ComponentInjector
  • ComponentInstantiationListenerCollection
  • ComponentRenderHeadListenerCollection
  • ComponentResolverHelper
  • ComponentTag
  • CompoundPropertyModel
  • Config
  • ConfigLoader
  • ContextLoaderFactory
  • DaoSupport
  • DataBaseTemplate
  • DataGridView
  • DataSource
  • DataSourceConfig
  • DataSourceFactory
  • DataSourceType
  • DataTable
  • DateField
  • DatePickerBehaviour
  • DefaultDataTable
  • DefaultJQueryUIBehaviour
  • DefaultMarkupSource
  • DefaultNotAuthorisedListener
  • DialogBehavior
  • DirectToPageComponentNotAuthorisedListener
  • DraggableBehaviour
  • DropDown
  • EmailAddressValidator
  • EmptyPanel
  • Enum
  • ExceptionPageRequestTarget
  • ExtendResolver
  • FeedbackMessage
  • FeedbackModel
  • FeedbackPanel
  • FileModel
  • FileUploadField
  • Form
  • FormComponent
  • FormComponentLabel
  • FormComponentPanel
  • FunctionOption
  • GridItem
  • GridView
  • HeaderContainer
  • HeaderPartContainer
  • HeaderResolver
  • HeaderResponse
  • HeaderToolbar
  • IdenticalValueValidator
  • Identifier
  • Injector
  • JQueryRenderHeadListener
  • JQueryUIRenderHeadListener
  • Label
  • LabeledMarkupContainer
  • Link
  • ListenerCollection
  • ListenerRequestResolver
  • ListenerRequestTarget
  • ListItem
  • ListMultiple
  • ListView
  • Localizer
  • ManualContextLoader
  • MarkupContainer
  • MarkupElement
  • MarkupLoader
  • MarkupParser
  • MarkupUtils
  • MaximumLengthValidator
  • MaximumValidator
  • MinimumLengthValidator
  • MinimumValidator
  • ModalWindow
  • MySqlDriver
  • MySqliDriver
  • NavigationLink
  • NavigationToolbar
  • Navigator
  • NumbericOption
  • NumericValidator
  • Objects
  • Options
  • PageInstanceRequestResolver
  • PageInstanceRequestTarget
  • PageMap
  • PageMapInitializationListenerCollection
  • PageNotFoundPage
  • PageNotFoundRequestTarget
  • PageRequestResolver
  • PageRequestTarget
  • PageRequestWithListenerTarget
  • PaginatingGridView
  • Panel
  • PanelMarkupSource
  • PanelResolver
  • PasswordField
  • PatternValidator
  • PiconApplication
  • PiconErrorHandler
  • PiconSerializer
  • PiconTag
  • PopupSettings
  • PropertyColumn
  • PropertyModel
  • PropertyOption
  • PropertyResolver
  • Radio
  • RadioChoice
  • RadioGroup
  • RangeLengthValidator
  • RangeValidator
  • RedirectRequestTarget
  • RepeatingView
  • RequestCycle
  • RequestResolverCollection
  • RequiredTextField
  • ResourceReference
  • ResourceRequestResolver
  • ResourceRequestTarget
  • SerializableClosure
  • SortableBehavior
  • StaticTabPanel
  • StringValidator
  • SubClassRule
  • Tab
  • TabCollection
  • TabPanel
  • TextArea
  • TextElement
  • TextField
  • TransparentMarkupContainer
  • ValidatableFormComponentWrapper
  • ValidationResponse
  • WebApplicationSecuritySettings
  • WebComponent
  • WebPage
  • WebRequest
  • WebResponse
  • WrappedCompoundModel
  • XMLDocument
  • XMLParser
  • XMLTag
  • XmlTagType

Interfaces

  • AjaxCallDecorator
  • ApplicationInitializerConfigLoadListener
  • ApplicationInitializerContextLoadListener
  • AuthorisationStrategy
  • Behaviour
  • BehaviourListener
  • CallDecoratorWrapper
  • ChoiceGroup
  • ClassScannerRule
  • Column
  • ComponentAfterRenderListener
  • ComponentAwareModel
  • ComponentBeforeRenderListener
  • ComponentInheritedModel
  • ComponentInitializationListener
  • ComponentInstantiationListener
  • ComponentNotAuthorisedListener
  • ComponentRenderHeadListener
  • ComponentResolver
  • CompoundModel
  • DatabaseDriver
  • DataBaseOperations
  • DataProvider
  • Detachable
  • Equalable
  • FormSubmitListener
  • FormSubmitter
  • Identifiable
  • InitializingBean
  • InjectOnWakeup
  • LinkListener
  • Listener
  • MarkupSource
  • Model
  • Pageable
  • PageMapInitializationListener
  • Request
  • RequestablePage
  • RequestResolver
  • RequestTarget
  • Response
  • RowMapper
  • Validatable
  • Validator
  • XmlElement

Exceptions

  • ConfigException
  • ConversionException
  • RestartRequestOnPageException
  • SQLException
  • UnAuthorisdeException
  • Overview
  • Namespace
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: 
  3: /**
  4:  * Picon Framework
  5:  * http://code.google.com/p/picon-framework/
  6:  *
  7:  * Copyright (C) 2011-2012 Martin Cassidy <martin.cassidy@webquub.com>
  8: 
  9:  * Picon Framework is free software: you can redistribute it and/or modify
 10:  * it under the terms of the GNU General Public License as published by
 11:  * the Free Software Foundation, either version 3 of the License, or
 12:  * (at your option) any later version.
 13: 
 14:  * Picon Framework is distributed in the hope that it will be useful,
 15:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 17:  *  General Public License for more details.
 18: 
 19:  * You should have received a copy of the GNU General Public License
 20:  * along with Picon Framework.  If not, see <http://www.gnu.org/licenses/>.
 21:  * */
 22: 
 23: namespace picon;
 24: 
 25: /**
 26:  * The mark-up loads finds, loads and parses the mark-up for a component class.
 27:  * This also performs the mark-up merge for picon:child and picon:extend
 28:  * 
 29:  * @todo the head processing and markup inheritnce is a bit of message and will
 30:  * fall over if the mark-up is not written properly. Need to add some sanity checks
 31:  * @author Martin Cassidy
 32:  * @package web/markup
 33:  */
 34: class MarkupLoader
 35: {
 36:     /**
 37:      * Constant for the markup resource cache
 38:      */
 39:     const MARKUP_RESOURCE_PREFIX = 'markup_';
 40:     
 41:     /**
 42:      * Self instance
 43:      * @var MarkupLoader
 44:      */
 45:     private static $instance;
 46:     
 47:     /**
 48:      * The supported extensions for mark-up
 49:      * @var array
 50:      */
 51:     private static $extensions = array('html', 'htm');
 52:     
 53:     /**
 54:      * Singleton
 55:      */
 56:     private function __construct()
 57:     {
 58:         
 59:     }
 60:     
 61:     /**
 62:      * Get the markup loader
 63:      * @return MarkupLoader 
 64:      */
 65:     public static function get()
 66:     {
 67:         if(!isset(self::$instance))
 68:         {
 69:             self::$instance = new self();
 70:         }
 71:         return self::$instance;
 72:     }
 73:     
 74:     /**
 75:      * Load the associated markup file for a component
 76:      * @param Component $component
 77:      * @return MarkupElement The root markup tag, populated with child tags 
 78:      */
 79:     public function loadMarkup(Component $component)
 80:     {
 81:         $name = get_class($component);
 82:         $fileSafeName = str_replace('\\', '_', $name);
 83:         
 84:         if(PiconApplication::get()->getProfile()->isCacheMarkup())
 85:         {
 86:             if(CacheManager::resourceExists(self::MARKUP_RESOURCE_PREFIX.$fileSafeName, CacheManager::APPLICATION_SCOPE))
 87:             {
 88:                 return CacheManager::loadResource(self::MARKUP_RESOURCE_PREFIX.$fileSafeName, CacheManager::APPLICATION_SCOPE);
 89:             }
 90:             else
 91:             {
 92:                 $markup = $this->internalLoadMarkup($name);
 93:                 CacheManager::saveResource(self::MARKUP_RESOURCE_PREFIX.$fileSafeName, $markup, CacheManager::APPLICATION_SCOPE);
 94:                 return $markup;
 95:             }
 96:         }
 97:         else
 98:         {
 99:             return $this->internalLoadMarkup($name);;
100:         }
101:     }
102:     
103:     private function internalLoadMarkup($className)
104:     {
105:         $reflection = new \ReflectionClass($className);
106:         $fileInfo = new \SplFileInfo($reflection->getFileName());
107:         $parser = new MarkupParser();
108:         
109:         foreach(self::$extensions as $extension)
110:         {
111:             $file = $fileInfo->getPath()."/".$reflection->getShortName().'.'.$extension;
112:             if(file_exists($file))
113:             {
114:                 return $this->completeMarkup($parser->parse($file), $className);
115:             }
116:         }
117:         if(get_parent_class($className)!=false)
118:         {
119:             return $this->internalLoadMarkup(get_parent_class($className));
120:         }
121:         return null;
122:     }
123:     
124:     private function completeMarkup($markup, $className)
125:     {
126:         //Auto add a head tag if not present
127:         $head = $markup->getChildByName('head');
128:         
129:         if($head==null)
130:         {
131:             $html = $markup->getChildByName('html');
132:             $body = $markup->getChildByName('body');
133:             $head = new PiconTag('head');
134:             $html->setChildren(array($head, $body));
135:         }
136:         
137:         $extension = MarkupUtils::findPiconTag('extend', $markup);
138:         if($extension!=null)
139:         {
140:             $parentMarkup = $this->internalLoadMarkup(get_parent_class($className));
141:             if($parentMarkup==null)
142:             {
143:                 throw new \MarkupNotFoundException(sprintf("Found picon:extend in markup for %s but there is no parent markup", $className));
144:             }
145:             
146:             $child = $this->getChildTag($parentMarkup);
147:             if($child==null)
148:             {
149:                 throw new \MarkupNotFoundException(sprintf("Component %s has inherited markup from %s but the inherited markup does not contain a picon:child tag", $className, get_parent_class($className)));
150:             }
151: 
152:             $childHead = $markup->getChildByName('picon:head');
153:             
154:             if($childHead!=null)
155:             {
156:                 $head = $parentMarkup->getChildByName('head');
157:                 $head->addChild($childHead);
158:             }
159:             
160:             $child->addChild($extension);
161:             return $parentMarkup;
162:         }
163:         
164:         return $markup;
165:     }
166:     
167:     private function getChildTag($markup)
168:     {
169:         $child = MarkupUtils::findPiconTag('child', $markup);
170:         
171:         if($child==null)
172:         {
173:             return null;
174:         }
175:         
176:         $existingExtension = MarkupUtils::findPiconTag('extend', $child);
177:         if($existingExtension==null)
178:         {
179:             return $child;
180:         }
181:         else
182:         {
183:             return $this->getChildTag($existingExtension);
184:         }
185:     }
186: }
187: 
188: ?>
189: 
Picon Framework API documentation generated by ApiGen 2.7.0