'Page Edit Link', 'summary' => 'Provides a link capability as used by some Fieldtype modules (like rich text editors).', 'version' => 109, 'permanent' => true, 'permission' => 'page-edit', 'icon' => 'link', ); } /** * URL type: Absolute path from root (no relative paths) * */ const urlTypeAbsolute = 0; /** * URL type: Relative path in same branch only * */ const urlTypeRelativeBranch = 1; /** * URL type: Relative path always * */ const urlTypeRelativeAll = 2; /** * @var Page|null * */ protected $page = null; /** * The "choose page" start label * * @var string * */ protected $startLabel = ''; /** * Language ID * * @var int * */ protected $langID = 0; /** * Get default configuration settings * * @return array * */ public static function getDefaultSettings() { return array( 'classOptions' => "", 'relOptions' => "nofollow", 'targetOptions' => "_blank", 'urlType' => self::urlTypeAbsolute, 'extLinkRel' => '', 'extLinkTarget' => '', 'extLinkClass' => '', ); } /** * Construct * */ public function __construct() { parent::__construct(); foreach(self::getDefaultSettings() as $key => $value) { $this->set($key, $value); } } /** * Init * * @throws WireException * */ public function init() { $this->startLabel = $this->_('Choose page'); $this->modules->get("ProcessPageList"); $id = (int) $this->input->get('id'); $this->langID = (int) $this->input->get('lang'); if($id) $this->page = $this->pages->get($id); if($this->page && $this->page->id && !$this->user->hasPermission("page-view", $this->page)) { throw new WireException("You don't have access to this page"); } if(!$this->page) $this->page = $this->wire('pages')->newNullPage(); $this->config->js('ProcessPageEditLink', array( 'selectStartLabel' => $this->startLabel, 'langID' => $this->langID, 'pageID' => $id, 'pageUrl' => $this->page->url, 'pageName' => $this->page->name, 'rootParentUrl' => $this->page->rootParent->url, 'slashUrls' => $this->page->template ? $this->page->template->slashUrls : 1, 'urlType' => $this->urlType, 'extLinkRel' => $this->wire('sanitizer')->names($this->extLinkRel), 'extLinkTarget' => $this->extLinkTarget, 'extLinkClass' => $this->wire('sanitizer')->names($this->extLinkClass), )); parent::init(); } /** * Primary execute * * @return string * */ public function ___execute() { if($this->wire('input')->get('href')) { $currentValue = $this->wire('sanitizer')->url($this->wire('input')->get('href'), array( 'stripQuotes' => false, 'allowIDN' => true, )); } else { $currentValue = ''; } $currentText = $this->wire()->input->get('text'); $currentText = $currentText === null ? '' : $this->wire()->sanitizer->text($currentText); /** @var InputfieldForm $form */ $form = $this->modules->get("InputfieldForm"); $form->attr('id', 'ProcessPageEditLinkForm'); //$form->description = $this->_("Enter a URL, select a page, or select a file to link:"); // Headline $this->wire('modules')->get('JqueryWireTabs'); /** @var InputfieldWrapper $fieldset */ $fieldset = $this->wire(new InputfieldWrapper()); $fieldset->attr('title', $this->_('Link')); $fieldset->addClass('WireTab'); $form->add($fieldset); if($currentText) { /** @var InputfieldText $field */ $field = $this->modules->get("InputfieldText"); $field->label = $this->_('Link text'); $field->icon = 'pencil-square'; $field->attr('id+name', 'link_text'); $field->val($currentText); $fieldset->add($field); } /** @var InputfieldPageAutocomplete $field */ $field = $this->modules->get("InputfieldPageAutocomplete"); $field->label = $this->_('Link to URL'); $field->attr('id+name', 'link_page_url'); $field->icon = 'external-link-square'; $field->description = $this->_('Enter a URL, email address, anchor, or enter word(s) to find a page.'); $field->labelFieldName = 'url'; if($this->wire('modules')->isInstalled('PagePaths') && !$this->wire('languages')) { $field->searchFields = 'path title'; } else { $field->searchFields = 'name title'; } if($this->langID) $field->lang_id = $this->langID; $field->maxSelectedItems = 1; $field->useList = false; $field->allowAnyValue = true; $field->disableChars = '/:.#'; $field->useAndWords = true; $field->findPagesSelector = "has_parent!=" . $this->wire('config')->adminRootPageID . ", " . "id!=" . $this->wire('config')->http404PageID; if($currentValue) $field->attr('value', $currentValue); $fieldset->add($field); if(is_array($this->wire('input')->get('anchors'))) { $field->columnWidth = 60; /** @var InputfieldSelect $field */ $field = $this->modules->get('InputfieldSelect'); $field->columnWidth = 40; $field->attr('id+name', 'link_page_anchor'); $field->label = $this->_('Select Anchor'); $field->description = $this->_('Anchors found in the text you are editing.'); $field->icon = 'flag'; foreach($this->wire('input')->get('anchors') as $anchor) { $anchor = '#' . $this->wire('sanitizer')->text($anchor); if(strlen($anchor)) $field->addOption($anchor); if($currentValue && $currentValue == $anchor) $field->attr('value', $currentValue); } $fieldset->add($field); } /** @var InputfieldInteger $field */ $field = $this->modules->get('InputfieldInteger'); $field->attr('id+name', 'link_page_id'); $field->label = $this->_("Select Page"); $field->set('startLabel', $this->startLabel); $field->collapsed = Inputfield::collapsedYes; $field->icon = 'sitemap'; $fieldset->add($field); if($this->page->numChildren) { $field = $this->modules->get('InputfieldInteger'); $field->attr('id+name', 'child_page_id'); $field->label = $this->_("Select Child Page"); $field->description = $this->_('This is the same as "Select Page" above, but may quicker to use if linking to children of the current page.'); $field->set('startLabel', $this->startLabel); $field->collapsed = Inputfield::collapsedYes; $field->icon = 'sitemap'; $fieldset->append($field); } $fieldset->append($this->getFilesField()); $fieldset = $this->wire(new InputfieldWrapper()); $fieldset->attr('title', $this->_('Attributes')); $fieldset->attr('id', 'link_attributes'); $fieldset->addClass('WireTab'); $form->append($fieldset); $field = $this->modules->get('InputfieldText'); $field->attr('id+name', 'link_title'); $field->label = $this->_('Title'); $field->description = $this->_('Additional text to describe link.'); if($this->wire('input')->get('title')) { $field->attr('value', $this->wire('sanitizer')->text($this->wire('input')->get('title'))); } $fieldset->add($field); if($this->targetOptions) { /** @var InputfieldSelect $field */ $field = $this->modules->get('InputfieldSelect'); $field->attr('id+name', 'link_target'); $field->label = $this->_('Target'); $field->description = $this->_('Where this link will open.'); $this->addSelectOptions($field, 'target', $this->targetOptions); if($this->relOptions) $field->columnWidth = 50; $fieldset->add($field); } if($this->relOptions) { $field = $this->modules->get('InputfieldSelect'); $field->attr('id+name', 'link_rel'); $field->label = $this->_('Rel'); $field->description = $this->_('Relationship of link to document.'); if($this->targetOptions) $field->columnWidth = 50; $this->addSelectOptions($field, 'rel', $this->relOptions); $fieldset->add($field); } if($this->classOptions) { /** @var InputfieldCheckboxes $field */ $field = $this->modules->get('InputfieldCheckboxes'); $field->attr('id+name', 'link_class'); $field->label = $this->_('Class'); $field->description = $this->_('Additional classes that can affect the look or behavior of the link.'); $field->optionColumns = 1; $this->addSelectOptions($field, 'class', $this->classOptions); $fieldset->add($field); } if($this->wire('user')->isSuperuser()) $fieldset->notes = sprintf( $this->_('You may customize available attributes shown above in the %s module settings.'), "[ProcessPageEditLink](" . $this->wire('config')->urls->admin . "module/edit?name=ProcessPageEditLink)" ); return $form->render() . "