1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198:
<?php
namespace MvcCore\View;
trait ViewHelpers {
public static function GetHelpersDir () {
return static::$helpersDir;
}
public static function SetHelpersDir ($helpersDir = 'Helpers') {
return static::$helpersDir = $helpersDir;
}
public static function AddHelpersNamespaces ($helperNamespaces) {
if (!static::$helpersNamespaces) self::initHelpersNamespaces();
$args = func_get_args();
if (count($args) === 1 && is_array($args[0])) $args = $args[0];
foreach ($args as $arg)
static::$helpersNamespaces[] = '\\' . trim($arg, '\\') . '\\';
}
public static function SetHelpersNamespaces ($helperNamespaces) {
static::$helpersNamespaces = [];
$args = func_get_args();
if (count($args) === 1 && is_array($args[0])) $args = $args[0];
foreach ($args as $arg)
static::$helpersNamespaces[] = '\\' . trim($arg, '\\') . '\\';
}
public function __call ($method, $arguments) {
$result = '';
$methodCamelCase = lcfirst($method);
$instance = & $this->GetHelper($methodCamelCase, TRUE);
$isObject = is_object($instance);
if ($instance instanceof \Closure || ($isObject && method_exists($instance, '__invoke'))) {
$result = call_user_func_array($instance, $arguments);
} else if ($isObject && method_exists($instance, $method)) {
$result = call_user_func_array([$instance, $method], $arguments);
} else {
throw new \InvalidArgumentException(
"[".get_class()."] View class instance has no method '{$method}', no view helper found."
);
}
$this->__protected['helpers'][$methodCamelCase] = & $instance;
return $result;
}
public function & GetHelper ($helperNameCamelCase, $asClosure = FALSE) {
$setUpView = FALSE;
$needsClosureFn = FALSE;
$instance = NULL;
$helpers = & $this->__protected['helpers'];
$helperNamePascalCase = ucfirst($helperNameCamelCase);
if (isset($helpers[$helperNameCamelCase])) {
$instance = & $helpers[$helperNameCamelCase];
} else if (isset(self::$_globalHelpers[$helperNamePascalCase])) {
$globalHelpersRecord = & self::$_globalHelpers[$helperNamePascalCase];
$instance = & $globalHelpersRecord[0];
$setUpView = $globalHelpersRecord[1];
$needsClosureFn = $globalHelpersRecord[2];
} else {
$helperFound = FALSE;
$toolClass = self::$_toolClass ?: self::$_toolClass = \MvcCore\Application::GetInstance()->GetToolClass();
$helpersInterface = self::HELPERS_INTERFACE_CLASS_NAME;
if (!static::$helpersNamespaces)
self::initHelpersNamespaces();
foreach (static::$helpersNamespaces as $helperClassBase) {
$className = $helperClassBase . $helperNamePascalCase . 'Helper';
if (!class_exists($className))
continue;
$helperFound = TRUE;
if ($toolClass::CheckClassInterface($className, $helpersInterface, TRUE, FALSE)) {
$setUpView = TRUE;
$instance = $className::GetInstance();
} else {
$instance = new $className();
}
$needsClosureFn = (
!($instance instanceof \Closure) &&
!method_exists($className, '__invoke')
);
self::$_globalHelpers[$helperNamePascalCase] = [& $instance, $setUpView, $needsClosureFn];
break;
}
if (!$helperFound)
throw new \InvalidArgumentException(
"[".get_class()."] View helper method '{$helperNamePascalCase}' is not"
." possible to handle by any configured view helper (View"
." helper namespaces: '".implode("', '", static::$helpersNamespaces)."')."
);
}
if ($setUpView)
$instance->SetView($this);
if ($needsClosureFn) {
$result = function () use (& $instance, $helperNamePascalCase) {
return call_user_func_array([$instance, $helperNamePascalCase], func_get_args());
};
$helpers[$helperNameCamelCase] = & $result;
} else {
$helpers[$helperNameCamelCase] = & $instance;
$result = & $instance;
}
if ($asClosure) {
return $result;
} else {
return $instance;
}
}
public function SetHelper ($helperNameCamelCase, $instance, $forAllTemplates = TRUE) {
$implementsIHelper = FALSE;
if (self::$_toolClass === NULL)
self::$_toolClass = \MvcCore\Application::GetInstance()->GetToolClass();
$toolClass = self::$_toolClass;
$helpersInterface = self::HELPERS_INTERFACE_CLASS_NAME;
$className = get_class($instance);
$implementsIHelper = $toolClass::CheckClassInterface($className, $helpersInterface, FALSE, FALSE);
$helperNamePascalCase = ucfirst($helperNameCamelCase);
$needsClosureFn = (
!($instance instanceof \Closure) &&
!method_exists($className, '__invoke')
);
if ($forAllTemplates)
self::$_globalHelpers[ucfirst($helperNameCamelCase)] = [
& $instance, $implementsIHelper, $needsClosureFn
];
$helpers = & $this->__protected['helpers'];
if ($needsClosureFn) {
$helpers[$helperNameCamelCase] = function () use (& $instance, $helperNamePascalCase) {
return call_user_func_array([$instance, $helperNamePascalCase], func_get_args());
};
} else {
$helpers[$helperNameCamelCase] = & $instance;
}
return $this;
}
}