useFunctionsAPI is true. * The functions in this file are always available regardless of that setting. * * */ /** * Common helper for API functions dealing with pages * * @param $_apiVar * @param $selector * @return null|NullPage|Page|PageArray|Pages|PagesType * */ function _wirePagesAPI($_apiVar, $selector) { /** @var Pages|PagesType $pages */ $pages = is_object($_apiVar) ? $_apiVar : wire($_apiVar); if(!$pages) return null; if(!$selector) return $pages; if(is_array($selector) || is_object($selector)) { return $pages->find($selector); } else if(ctype_digit("$selector")) { // i.e. "123" return $pages->get((int) $selector); } else if(wireSanitizer('pageName', $selector) === $selector) { // i.e. "contact" return $pages->get("name=$selector"); } else if(strpos($selector, '/') !== false && wireSanitizer('pagePathName', $selector) === $selector) { // i.e. "/path/to/page/" return $pages->get($selector); } else { return $pages->find($selector); } } /** * Common helper for API functions dealing with WireData objects * * @param $_apiVar * @param $key * @param $value * @return mixed|null|WireData|Page * */ function _wireDataAPI($_apiVar, $key, $value) { /** @var WireData $item */ $item = wire($_apiVar); if(!$item) return null; if(strlen($key)) { if(is_null($value)) { return $item->get($key); } else { $item->set($key, $value); } } return $item; } /** * Access the $pages API variable as a function * * ~~~~ * // A call with no arguments returns the $pages API variable * $pages = pages(); * $pageArray = pages()->find("selector"); * $page = pages()->get(123); * * // Providing selector as argument maps to $pages->find() * $pageArray = pages("template=basic-page"); * * // Providing argument of single page ID, path or name maps to $pages->get() * $page = pages(123); * $page = pages("/path/to/page/"); * $page = pages("page-name"); * ~~~~ * * @param string|array $selector Specify one of the following: * - Nothing, makes it return the $pages API variable. * - Selector (string) to find matching pages, makes function return PageArray - equivalent to $pages->find("selector"); * - Page ID (int) to return a single matching Page - equivalent to $pages->get(123); * - Page name (string) to return a single page having the given name - equivalent to $pages->get("name"); * @return Pages|PageArray|Page|NullPage * */ function wirePages($selector = '') { return _wirePagesAPI('pages', $selector); } /** * Access the $page API variable as a function * * ~~~~ * $page = page(); // Simply get $page API var * $body = page()->body; // Get body field value * $body = page('body'); // Same as above * $headline = page('headline|title'); // Get headline or title * page('headline', 'Setting headline value'); // Set headline * ~~~~ * * @param string $key Optional property to get or set * @param null $value Optional value to set * @return Page|mixed * */ function wirePage($key = '', $value = null) { return _wireDataAPI('page', $key, $value); } /** * Access the $config API variable as a function * * ~~~~~ * $config = config(); // Simply get $config API var * $debug = config()->debug; // Get value of debug * $debug = config('debug'); // Same as above * config()->debug = true; // Set value of debug * config('debug', true); // Same as above * ~~~~~ * * @param string $key * @param null $value * @return Config|mixed * */ function wireConfig($key = '', $value = null) { return _wireDataAPI('config', $key, $value); } /** * Access the $modules API variable as a function * * ~~~~~ * $modules = modules(); // Simply get $modules API var * $module = modules()->get('ModuleName'); // Get a module * $module = modules('ModuleName'); // Shortcut to get a module * ~~~~~ * * @param string $name Optionally retrieve the given module name * @return Modules|Module|ConfigurableModule|null * */ function wireModules($name = '') { /** @var Modules $modules */ $modules = wire('modules'); return strlen($name) ? $modules->getModule($name) : $modules; } /** * Access the $user API variable as a function * * @param string $key Optional property to get or set * @param null $value Optional value to set * @return User|mixed * */ function wireUser($key = '', $value = null) { return _wireDataAPI('user', $key, $value); } /** * Access the $users API variable as a function * * See the pages() function for full usage details. * * @param string|array $selector Optional selector to send to find() or get() * @return Users|PageArray|User|mixed * @see pages() * */ function wireUsers($selector = '') { return _wirePagesAPI('users', $selector); } /** * Access the $session API variable as a function * * @param string $key Optional property to get or set * @param null $value Optional value to set * @return Session|mixed * */ function wireSession($key = '', $value = null) { return _wireDataAPI('session', $key, $value); } /** * Access the $fields API variable as a function * * @param string $name Optional field name to retrieve * @return Fields|Field|null * */ function wireFields($name = '') { /** @var Fields $fields */ $fields = wire('fields'); return strlen($name) ? $fields->get($name) : $fields; } /** * Access the $templates API variable as a function * * @param string $name Optional template to retrieve * @return Templates|Template|null * */ function wireTemplates($name = '') { /** @var Templates $templates */ $templates = wire('templates'); return strlen($name) ? $templates->get($name) : $templates; } /** * Access the $database API variable as a function * * @return WireDatabasePDO * */ function wireDatabase() { return wire('database'); } /** * Access the $permissions API varaible as a function * * See the pages() function for usage details. * * @param string $selector * @return Permissions|Permission|PageArray|null|NullPage * */ function wirePermissions($selector = '') { return _wirePagesAPI('permissions', $selector); } /** * Access the $roles API varaible as a function * * See the pages() function for usage details. * * @param string $selector * @return Roles|Role|PageArray|null|NullPage * */ function wireRoles($selector = '') { return _wirePagesAPI('roles', $selector); } /** * Access the $sanitizer API variable as a function * * ~~~~~ * // Example usages * $clean = sanitizer()->pageName($dirty); * $clean = sanitizer('pageName', $dirty); // same as above * ~~~~~ * * @param string $name Optionally enter a sanitizer function name * @param string $value If $name populated, enter the value to sanitize * @return Sanitizer|string|int|array|null|mixed * */ function wireSanitizer($name = '', $value = '') { $sanitizer = wire('sanitizer'); return strlen($name) ? $sanitizer->$name($value) : $sanitizer; } /** * Access the $datetime API variable as a function * * ~~~~~ * // Example usages * $str = datetime()->relativeTimeStr('2016-10-10'); * $str = datetime('Y-m-d'); * $str = datetime('Y-m-d', time()); * ~~~~~ * * @param string $format Optional date format * @param string|int $value Optional date to format * @return WireDateTime|string|int * */ function wireDatetime($format = '', $value = '') { /** @var WireDateTime $datetime */ $datetime = wire('datetime'); return strlen($format) ? $datetime->formatDate($value ? $value : time(), $format) : $datetime; } /** * Access the $files API variable as a function * * @return WireFileTools * */ function wireFiles() { return wire('files'); } /** * Access the $cache API variable as a function * * If called with no arguments it returns the $cache API variable. * If called with arguments, it can be used the same as `WireCache::get()`. * * @param string $name * @param callable|int|string|null $expire * @param callable|int|string|null $func * @return WireCache|string|array|PageArray|null * @see WireCache::get() * */ function wireCache($name = '', $expire = null, $func = null) { /** @var WireCache $cache */ $cache = wire('cache'); return strlen($name) ? $cache->get($name, $expire, $func) : $cache; } /** * Access the $languages API variable as a function * * Returns the $languages API variable, or a Language object if given a language name. * * ~~~~ * // Examples * $languages = languages(); // Languages if active, null if not * $en = languages()->getDefault(); * $de = languages('de'); * ~~~~ * * @param string|int $name Optional Language name or ID for language to retrieve * @return Languages|Language|NullPage|null * */ function wireLanguages($name = '') { /** @var Languages $languages */ $languages = wire('languages'); if(!$languages) return null; if(strlen($name)) return $languages->get($name); return $languages; } /** * Access the $input API variable as a function * * - Default behavior is to return the $input API var. * - If given just a $type (like "get" or "post"), it will return a WireInputData object for that type. * - If given a $type and $key it will return the input variable. * - If all arguments given, the returned value will also be run through the given sanitizer. * * ~~~~~ * // Examples * $input = wireInput(); // Returns $input API var (WireInput) * $post = wireInput('post'); // Returns $input->post (WireInputData) * $post = wireInput()->post(); // Same as above * $value = wireInput('get', 'sort'); // Returns $input->get('sort'); * $value = wireInput('get', 'sort', 'fieldName'); // Returns $input->get('sort') run through $sanitizer->fieldName(). * $value = wireInput('get', 'sort', 'fieldName', 'title'); // Same as above but fallback to 'title' if no sort is present (3.0.125) * $value = wireInput('get', 'sort', ['title', 'created', 'likes'], 'title'); // Require value to be one given or fallback to 'title' (3.0.125+) * $value = wireInput()->get('sort', ['title', 'created', 'likes'], 'title'); // Same as above (3.0.125) * ~~~~~ * * @param string $type Optionally indicate "get", "post", "cookie" or "whitelist" * @param string $key If getting a value, specify name of property containing value * @param string $sanitizer Optionally specify sanitizer name to run value through, or array containing whitelist of allowed values (3.0.125). * @param mixed $fallback Fallback value to return rather than null if value not present or does not validate (3.0.125+) * @return WireInput|WireInputData|array|string|int|null * */ function wireInput($type = '', $key = '', $sanitizer = null, $fallback = null) { /** @var WireInput $input */ $input = wire('input'); if(!strlen($type)) return $input; $type = strtolower($type); if(!strlen($key)) return $input->$type; $value = $input->$type($key, $sanitizer, $fallback); return $value; } /** * Access the $input->get API variable as a function * * This is the same as the input() function except that the $type "get" is already implied. * * @param string $key Name of input variable to get * @param string $sanitizer Optionally specify sanitizer name to run value through, or array containing whitelist of allowed values (3.0.125+). * @param mixed $fallback Fallback value to return rather than null if value not present or does not validate (3.0.125+) * @return WireInputData|string|int|array|null * */ function wireInputGet($key = '', $sanitizer = null, $fallback = null) { return wireInput('get', $key, $sanitizer, $fallback); } /** * Access the $input->post API variable as a function * * This is the same as the input() function except that the $type "post" is already implied. * * @param string $key Name of input variable to get * @param string $sanitizer Optionally specify sanitizer name to run value through, or array containing whitelist of allowed values (3.0.125). * @param mixed $fallback Fallback value to return rather than null if value not present or does not validate (3.0.125+) * @return WireInputData|string|int|array|null * */ function wireInputPost($key = '', $sanitizer = null, $fallback = null) { return wireInput('post', $key, $sanitizer, $fallback); } /** * Access the $input->cookie API variable as a function * * This is the same as the input() function except that the $type "cookie" is already implied. * * @param string $key Name of input variable to get * @param string $sanitizer Optionally specify sanitizer name to run value through, or array containing whitelist of allowed values (3.0.125+). * @param mixed $fallback Fallback value to return rather than null if value not present or does not validate (3.0.125+) * @return WireInputData|string|int|array|null * */ function wireInputCookie($key = '', $sanitizer = null, $fallback = null) { return wireInput('cookie', $key, $sanitizer, $fallback); } /** * Access the $log API variable as a function * * Default behavior is to return the $log API variable. * If both arguments are provided, it assumes you want to log a message. * * @param string $logName If logging a message, specify the name of the log. * @param string $message If logging a message, specify the message text. * @return WireLog|bool Returns bool if saving log entry, WireLog otherwise. * */ function wireLog($logName = '', $message = '') { /** @var WireLog $log */ $log = wire('log'); if(strlen($message)) { if(!strlen($logName)) $logName = 'unknown'; return $log->save($logName, $message); } return $log; } /** * Start or stop a profiler event or return WireProfilerInterface instance * * @param string|array|object|null $name Name of event to start or event to stop * @param null|object|string $source If starting an event, optional source of event (object) * @param array $data Optional extra data as associative array * @return null|array|object * */ function wireProfiler($name = null, $source = null, $data = array()) { $profiler = wire('profiler'); if(is_null($name)) return $profiler; if(!$profiler) return null; if(is_string($name)) { return $profiler->start($name, $source, $data); } else { return $profiler->stop($name); } } /** * Function that returns a $config->urls->[name] value o * * @param string $key * @return null|Paths|string * */ function wireUrls($key = '') { if(empty($key)) return wire('config')->urls; return wire('config')->urls($key); } /** * Function that returns a $config->paths->[name] value o * * @param string $key * @return null|Paths|string * */ function wirePaths($key = '') { if(empty($key)) return wire('config')->paths; return wire('config')->paths($key); } /** * Get or set a runtime site setting * * This is a simple helper function for maintaining runtime settings in a site profile. * It simply sets and gets settings that you define. It is preferable to using ProcessWire’s * `$config` or `config()` API var/function because it is not used to store anything else for * ProcessWire. It is also preferable to using a variable (or variables) because it is always * in scope and accessible anywhere in your template files, even within existing functions. * * ~~~~~ * // set a setting named “foo” to value “bar” * setting('foo', 'bar'); * * // get a setting named “foo” * $value = setting('foo'); * * // set or replace multiple settings * setting([ * 'foo' => 'value', * 'bar' => 123, * 'baz' => [ 'foo', 'bar', 'baz' ] * ]); * * // get all settings in associative array * $a = setting(); * * // to unset a setting * setting(false, 'foo'); * ~~~~~ * * @param string|array $name Setting name, or array to set multiple * @param string|int|array|float|mixed $value Value to set, or omit if getting value of $name (default=null) * @return array|string|int|bool|mixed|null * */ function wireSetting($name = '', $value = null) { static $settings = array(); if($name === '') return $settings; if(is_array($name)) return $settings = array_merge($settings, $name); if($name === false) { unset($settings[(string) $value]); return null; } if($value !== null) $settings[$name] = $value; return isset($settings[$name]) ? $settings[$name] : null; } /** * Return array of functions available from the functions API * * Returned array is shortVersion => longVersion * * @return array * */ function _wireFunctionsAPI() { $names = array( 'cache' => 'wireCache', 'config' => 'wireConfig', 'database' => 'wireDatabase', 'datetime' => 'wireDatetime', 'fields' => 'wireFields', 'files' => 'wireFiles', 'input' => 'wireInput', 'inputGet' => 'wireInputGet', 'inputPost' => 'wireInputPost', 'inputCookie' => 'wireInputCookie', 'languages' => 'wireLanguages', 'modules' => 'wireModules', 'page' => 'wirePage', 'pages' => 'wirePages', 'paths' => 'wirePaths', 'permissions' => 'wirePermissions', 'profiler' => 'wireProfiler', 'region' => 'wireRegion', 'roles' => 'wireRoles', 'sanitizer' => 'wireSanitizer', 'setting' => 'wireSetting', 'session' => 'wireSession', 'templates' => 'wireTemplates', 'urls' => 'wireUrls', 'user' => 'wireUser', 'users' => 'wireUsers', ); return $names; }