Subversion Repositories web.active

Rev

Rev 1 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download

<?php namespace ProcessWire;

/**
 * URL Inputfield Module
 * 
 * An Inputfield for handling input of URLs in ProcessWire forms.
 * 
 * ProcessWire 3.x, Copyright 2022 by Ryan Cramer
 * https://processwire.com
 * 
 * @property int|bool $noRelative Whether relative URLs are disabled
 * @property int|bool $addRoot Whether to prepend root path
 * @property int|bool $allowIDN Whether to allow IDNs
 * @property int|bool $allowQuotes Whether to allow quote characters in URLs
 *
 */
class InputfieldURL extends InputfieldText {

  public static function getModuleInfo() {
    return array(
      'title' => __('URL', __FILE__), // Module Title
      'summary' => __('URL in valid format', __FILE__), // Module Summary
      'version' => 103,
    );
  }

  /**
   * Construct
   * 
   */
  public function __construct() {
    parent::__construct();
    $this->setAttribute('type', 'text'); 
    $this->setAttribute('maxlength', 1024); 
    $this->setAttribute('size', 0); 
    $this->setAttribute('name', 'href'); 
    $this->label = 'URL';
    $this->set('noRelative', 0); // whether relative URLs are disabled
    $this->set('addRoot', 0); // whether to prepend root path
    $this->set('allowIDN', 0); // whether to allow IDNs
    $this->set('allowQuotes', 0); // whether to allow quote characters in URLs
  }

  /**
   * Render Inputfield
   * 
   * @return string
   * 
   */
  public function ___render() {
    $rootUrl = $this->wire()->config->urls->root;
    if($this->addRoot && !$this->noRelative && !$this->notes && strlen($rootUrl) > 1) {
      $this->notes = sprintf(
        $this->_("Start local URLs with ā€œ/ā€ and leave off the ā€œ%sā€ part."), // Instruction for local URLs displayed when site is running from a subdirectory
        $rootUrl
      ); 
    }
    return parent::___render();
  }

  /**
   * Set value attribute
   * 
   * @param string $value
   * @return string
   * 
   */
  protected function setAttributeValue($value) {

    $value = trim((string) $value);
    $dirty = $value; 
    $label = $this->label ? $this->label : $this->name;
    
    if(!strlen($dirty)) return '';
    
    $value = $this->wire()->sanitizer->url($dirty, array(
      'allowRelative' => $this->noRelative ? false : true,
      'allowIDN' => $this->allowIDN ? true : false,
      'stripQuotes' => $this->allowQuotes ? false : true,
    ));
    
    if(empty($value) || ($dirty !== $value && "http://$dirty" !== $value && "https://$dirty" !== $value)) {
      $error = true;
      if(strpos($dirty, '%') !== false) {
        $test = rawurldecode($dirty);
        if($value === $test || $value === "http://$test" || $value === "https://$test") $error = false;
      }
      if($error) {
        $this->error("$label - " . $this->_("Error found - please check that it is a valid URL")); // Error message when invalid URL found
      }

    } else if($value !== $dirty) { 
      $scheme = '';
      foreach(array('http', 'https') as $s) {
        if($value !== "$s://$dirty") continue;
        $scheme = "$s://";
        break;
      }
      if($scheme) {
        $this->message("$label - " . sprintf($this->_("Note that %s was added"), $scheme)); // Message displayed when scheme was automatically added to the URL
      }
    }

    return $value; 
  }

  /**
   * Configure Inputfield
   * 
   * @return InputfieldWrapper
   * 
   */
  public function ___getConfigInputfields() {
    $inputfields = parent::___getConfigInputfields();
    $f = $inputfields->get('stripTags');
    if($f) $inputfields->remove($f);
    return $inputfields;
  }
}