Blame | Last modification | View Log | Download
<?php namespace ProcessWire;/*** ProcessWire URL Fieldtype** Stores a valid URL value, whether local/relative or a URL that includes a protocol.** For documentation about the fields used in this class, please see:* /wire/core/Fieldtype.php** ProcessWire 3.x, Copyright 2016 by Ryan Cramer* https://processwire.com***/class FieldtypeURL extends FieldtypeText {public static function getModuleInfo() {return array('title' => __('URL', __FILE__),'version' => 101,'summary' => __('Field that stores a URL', __FILE__),'permanent' => true,);}public function init() {parent::init();}/*** Sanitize value for storage** @param Page $page* @param Field $field* @param string $value* @return string**/public function sanitizeValue(Page $page, Field $field, $value) {return $this->sanitizer->url($value, array('allowRelative' => $field->get('noRelative') ? false : true,'allowIDN' => $field->get('allowIDN') ? true : false,'stripQuotes' => $field->get('allowQuotes') ? false : true));}public function getInputfield(Page $page, Field $field) {/** @var InputfieldURL $inputfield */$inputfield = $this->modules->get('InputfieldURL');$inputfield->set('noRelative', $field->get('noRelative'));$inputfield->set('addRoot', $field->get('addRoot'));return $inputfield;}public function ___formatValue(Page $page, Field $field, $value) {if($field->get('addRoot') && !$field->get('noRelative') && substr($value, 0, 1) == '/') {$root = rtrim($this->config->urls->root, '/');$value = $root . $value;}$value = parent::___formatValue($page, $field, $value);return $value;}public function ___getConfigInputfields(Field $field) {$inputfields = parent::___getConfigInputfields($field);$labelYes = $this->_('Yes');$labelNo = $this->_('No');/** @var InputfieldAsmSelect $f */$f = $inputfields->getChildByName('textformatters');$f->notes = $this->_('The "HTML Entity Encoder" text formatter is recommended for URL fields.');$textformatters = $field->get('textformatters');if(!is_array($textformatters)) $textformatters = array();if(!count($textformatters) || !in_array('TextformatterEntities', $textformatters)) {$this->warning($this->_('If this URL will be used for any output, it is strongly recommended that you select the "HTML Entity Encoder" for "Text Formatters" on the Details tab.')); // Wwarning to use the HTML entity encoder}/** @var InputfieldRadios $f */$f = $this->modules->get('InputfieldRadios');$f->attr('name', 'noRelative');$f->label = $this->_('Allow relative/local URLs without "http://" at the beginning?');$f->addOption(0, $labelYes);$f->addOption(1, $labelNo);$f->attr('value', $field->get('noRelative') ? 1 : 0);$f->description = $this->_('Local/relative URLs are those without scheme and domain.');$f->columnWidth = 33;$f->optionColumns = 1;$inputfields->add($f);$f = $this->modules->get('InputfieldRadios');$f->attr('name', 'allowIDN');$f->label = $this->_('Allow internationalized domain names (IDNs)?');$f->addOption(1, $labelYes);$f->addOption(0, $labelNo);$f->attr('value', $field->get('allowIDN') ? 1 : 0);$f->description = $this->_('When enabled, non-ASCII domain names are allowed.');$f->columnWidth = 33;$f->optionColumns = 1;$inputfields->add($f);$f = $this->modules->get('InputfieldRadios');$f->attr('name', 'allowQuotes');$f->label = $this->_('Allow single/double quote characters in URLs?');$f->addOption(1, $labelYes);$f->addOption(0, $labelNo);$f->attr('value', $field->get('allowQuotes') ? 1 : 0);$f->description = $this->_('When enabled, you should be absolutely certain such URLs are entity encoded when used in markup.');$f->columnWidth = 34;$f->optionColumns = 1;$inputfields->add($f);$f = $this->modules->get('InputfieldRadios');$f->attr('name', 'addRoot');$f->label = $this->_("Prepend site's root path to local/relative URLs?");$f->addOption(1, $labelYes);$f->addOption(0, $labelNo);$f->attr('value', $field->get('addRoot') ? 1 : 0);$f->description = $this->_("This option will automatically prepend the site's root path to any URLs that start with a slash, like /some/path/. This is useful if your site is running from a subdirectory because you won't have to include that subdirectory in the URLs you enter into this field. Should you later move your site to the root of a domain (or another subdirectory) you won't have to worry about broken URLs. With this option enabled, always enter URLs as if the site were running from the root of a domain, regardless of whether it's running from a subdirectory or not. Naturally this is applicable only if you selected 'Yes' to allowing local/relative URLs in the field above. Developers may also want to note that this option applies only when a page's outputFormatting is on."); // addRoot description$f->notes = $this->_("Ensures that URLs aren't broken when moving a site from a subdirectory to root (the most common example)."); // addRoot notes$f->collapsed = $field->get('addRoot') ? Inputfield::collapsedNo : Inputfield::collapsedYes;$f->optionColumns = 1;$f->showIf = "noRelative=0";$inputfields->add($f);return $inputfields;}// @todo add markupValue()}