protected function validateAttributes($type, $attributes)
{
Prado::using($type);
if (($pos = strrpos($type, '.')) !== false) {
$className = substr($type, $pos + 1);
} else {
$className = $type;
}
$class = new \ReflectionClass($className);
if (is_subclass_of($className, '\\Prado\\Web\\UI\\TControl') || $className === '\\Prado\\Web\\UI\\TControl') {
foreach ($attributes as $name => $att) {
if (($pos = strpos($name, '.')) !== false) {
// a subproperty, so the first segment must be readable
$subname = substr($name, 0, $pos);
if (!$class->hasMethod('get' . $subname)) {
throw new TConfigurationException('template_property_unknown', $type, $subname);
}
} else {
if (strncasecmp($name, 'on', 2) === 0) {
// an event
if (!$class->hasMethod($name)) {
throw new TConfigurationException('template_event_unknown', $type, $name);
} else {
if (!is_string($att)) {
throw new TConfigurationException('template_eventhandler_invalid', $type, $name);
}
}
} else {
// a simple property
if (!($class->hasMethod('set' . $name) || $class->hasMethod('setjs' . $name) || $this->isClassBehaviorMethod($class, 'set' . $name))) {
if ($class->hasMethod('get' . $name) || $class->hasMethod('getjs' . $name)) {
throw new TConfigurationException('template_property_readonly', $type, $name);
} else {
throw new TConfigurationException('template_property_unknown', $type, $name);
}
} else {
if (is_array($att) && $att[0] !== self::CONFIG_EXPRESSION) {
if (strcasecmp($name, 'id') === 0) {
throw new TConfigurationException('template_controlid_invalid', $type);
} else {
if (strcasecmp($name, 'skinid') === 0) {
throw new TConfigurationException('template_controlskinid_invalid', $type);
}
}
}
}
}
}
}
} else {
if (is_subclass_of($className, '\\Prado\\TComponent') || $className === '\\Prado\\TComponent') {
foreach ($attributes as $name => $att) {
if (is_array($att) && $att[0] === self::CONFIG_DATABIND) {
throw new TConfigurationException('template_databind_forbidden', $type, $name);
}
if (($pos = strpos($name, '.')) !== false) {
// a subproperty, so the first segment must be readable
$subname = substr($name, 0, $pos);
if (!$class->hasMethod('get' . $subname)) {
throw new TConfigurationException('template_property_unknown', $type, $subname);
}
} else {
if (strncasecmp($name, 'on', 2) === 0) {
throw new TConfigurationException('template_event_forbidden', $type, $name);
} else {
// id is still alowed for TComponent, even if id property doesn't exist
if (strcasecmp($name, 'id') !== 0 && !($class->hasMethod('set' . $name) || $this->isClassBehaviorMethod($class, 'set' . $name))) {
if ($class->hasMethod('get' . $name)) {
throw new TConfigurationException('template_property_readonly', $type, $name);
} else {
throw new TConfigurationException('template_property_unknown', $type, $name);
}
}
}
}
}
} else {
throw new TConfigurationException('template_component_required', $type);
}
}
}