wumbo

Module: FieldtypeAssistedURL

Recommended Posts

Hi folks!

I'm about to add my new module FieldtypeAssistedURL to the repository.

You find the source code on github and hopefully in the modules repository soon.

Here an extract from the README.md:

This module offers you a new field type AssistedURL Field, providing and input field for storing absolute and relative URLs.
The field type adds a button to open the URL chooser dialog known from the CKEditor link feature without the tab
navigation bar for specifying link attributes.

Using the URL chooser dialog the editor may select URLs from internal pages or uploaded files via a search field with
auto-completion, a page tree control, and a file selector control.

Please feel free to post suggestions and any form of feedback here in the forums or on github.

Wumbo

  • Like 20

Share this post


Link to post
Share on other sites

Hi @wumbo - thanks for this - looks pretty handy, but a few thoughts for you.

  1. If you manually enter a URL it automatically adds the http://, forcing it to be an absolute URL, but if you choose a page, it populates a relative URL - this will be problematic when outputting this field's contents in something like an emailable template.
  2. When selecting a page from the site, I would rather the field stores the ID of the page, just in case the path (and therefore the URL) is changed down the road. The module could handle outputting the URL of that page automatically, so if an absolute URL is stored, then echo that, otherwise echo the URL of the page, maybe with an option to force an absolute URL just in case you are using this field in something like an email template. I think this would be a very useful addition.
  3. Just visual stuff, but I'd like to see the "Open Link Assistant" a little LOT smaller - perhaps a small icon or something. Also, the width of the text input is not quite right.

Thanks again!

Share this post


Link to post
Share on other sites

Hi Adrian,

1. This seems to be the default behavior of the FieldtypeURL, which this module extends, or the InputfieldURL, which is used be the module. I'm not sure it's necessary/wise to change that.

2. The whole purpose for developing this module was to mimic the exact behavior of the link chooser dialog of the CKEditor module. This dialog wraps the marked rte content with completely rendered <a> tags. All I do is getting the href attribute from this <a> tag and copy it to the InputfieldURL. 

I'll try to introduce a config setting to choose whether to return a page's url or it's id.

3. I replaced the buttons text with the link icon.

Share this post


Link to post
Share on other sites

Here are some screenshots.

The field:

m46af8ex.png

The dialog:

jenywpjs.png

  • Like 4

Share this post


Link to post
Share on other sites

Hi Adrian,

1. This seems to be the default behavior of the FieldtypeURL, which this module extends, or the InputfieldURL, which is used be the module. I'm not sure it's necessary/wise to change that.

2. The whole purpose for developing this module was to mimic the exact behavior of the link chooser dialog of the CKEditor module. This dialog wraps the marked rte content with completely rendered <a> tags. All I do is getting the href attribute from this <a> tag and copy it to the InputfieldURL. 

I'll try to introduce a config setting to choose whether to return a page's url or it's id.

3. I replaced the buttons text with the link icon.

  1. Good point - I hadn't noticed this before as I guess I have never entered a relative URL in a FieldtypeURL field before.
  2. I guess the difference for me is that in an RTE field you always need to insert a URL, but in the case of a field that is just storing a link to a page, it might be better to store the page ID - I think if you do go this route, you want to store the ID, but always return the page object so in the template you could choose ->url, ->id, ->title, etc
  3. I think that looks much cleaner!

Share this post


Link to post
Share on other sites

Thanks for this Wumbo, I've been keen for a combined internal/external URL chooser for a while now, will check this one out.

Share this post


Link to post
Share on other sites

OMG this one is what I have been looking for.

But I have one challange. I do use repeaters quite a lot in my templates. And images in those repeaters are not listed? Are you aware of this? Maybe even working on a fix?

I will dig into it in the following days, but if you are already on it let me know ;-)

Felix

Share this post


Link to post
Share on other sites

Okay... I got a first fix (but it does not help yet)

in ProcessPageEditLink.module you need to replace the existing getFiles() method with the following code. It iterates thru all RepeaterFields as well. This results in all images being shown:

protected function getFiles() {
	$files = array();
	if($this->page->id) {
		$files = $this->getFilesFromPage($this->page);
	}
	asort($files); 
	return $files;
}
	
protected function getFilesFromPage($pageToCheck){
	$files = array();
	foreach($pageToCheck->fields as $field) {
		if($field->type instanceof FieldtypeFile){
			foreach($pageToCheck->get($field->name) as $file) {
				$files[$file->url] = $field->getLabel() . ': ' . $file->basename; 
			}
		}
		else if($field->type instanceof FieldtypeRepeater){
			foreach($pageToCheck->$field as $repeaterPage){
				$files = array_merge($this->getFilesFromPage($repeaterPage),$files);
			}
		}
		else {
			
		}
	}
	return $files;
}

Just to make sure we have it all in here. This was the original code of getFiles()

protected function getFilesOrig() {
	$files = array();
	if($this->page->id) foreach($this->page->fields as $f) {
		if(!$f->type instanceof FieldtypeFile) continue;
		foreach($this->page->get($f->name) as $file) {
			$files[$file->url] = $f->getLabel() . ': ' . $file->basename; 
		}
	}
	asort($files); 
	return $files;
}

So this works now. Only problem is, that InputfieldAssistedURL.module uses not the main page ID as the link.

So when the InputField is placed inside a repeater, it sends the ID of the repeater and not the one of the page (repeaters behave like pages). So we need to break out to main page from this repeater as well to see all images of the page...

I will follow up on this.

(Side question: Any hint were I should post my getFiles() patch so it might end up in the main core?)

Share this post


Link to post
Share on other sites
So when the InputField is placed inside a repeater, it sends the ID of the repeater and not the one of the page (repeaters behave like pages). So we need to break out to main page from this repeater as well to see all images of the page...

I think you are looking for getForPage(): https://github.com/ryancramerdesign/ProcessWire/blob/7e8c7c6836282b6b64de81263f5aaa8112fd51ae/wire/modules/Fieldtype/FieldtypeRepeater/RepeaterPage.php#L46

Share this post


Link to post
Share on other sites

Okay, off to learn git ,-)

But thank you for the quick answer.

 Wow, that one was quick. Yes this was what I was looking for...

Share this post


Link to post
Share on other sites

If I could make any request, it would be to make it optional to hide the file select option altogether, as personally find processwire's own method of linking to files to be really strange - useless if you don't have a separate field for uploading to that page.

What I have done instead is have an Options field, where the user chooses file or link, and make this field or a file upload field visible, depending on that selection.

Anyway regardless of that, this module is really great, thanks for providing it. So much better than a single text field when you want to avoid your users putting in broken links.

Share this post


Link to post
Share on other sites

Hey,

thanks for that module. 

Maybe I missed something, but how to get the propoerties, like target, title, or rel in a page template?
Are these values stored anywhere?

Thanks for help.

Share this post


Link to post
Share on other sites

Hello everybody,

I am new to PW and while I am playing around to learn PW I downloaded this module and it works great but I have no clue how to get the name of the page I will link to:

<a href="<?php echo $page->AssistedURL; ?>">?</a>

Thank you very much for your help.

Share this post


Link to post
Share on other sites

Hello gmclelland,

thank you for your reply and the TracyDebugger tip.

I think my approach is probably going in the wrong direction... I just wanted to have an input field to insert a link to another page or an anchor or select a page via the menu tree. That's why I decided to use this module.

This

<a href="<?php echo $page->AssistedURL; ?>"></a>

outputs this:

<a href="/processwire-test/page1/"></a>

which is fine so far but I'd like to have the page name (or a custom text) within the <a></a> tags. Is there a better way to achieve that? Most probably :-)

Thank you again.

Share this post


Link to post
Share on other sites

@sms - if it's a local page, then you can get the title of the linked page with:

$pages->get($page->AssistedURL)->title;

But you might be better using a Page Reference field because then you could do:

$page->linkedpage->url;
$page->linkedpage->title;

If there will be some external links, then maybe a Repeater field with URL and Title fields might be the best option.

Share this post


Link to post
Share on other sites

Hello adrian,

thank you again for your quick reply.

I have tested your code but the field outputs nothing now. However, I will test the Page Reference field tomorrow. Might be a better option :-)

<a href="<?php echo $page->AssistedURL; ?>"><?php echo $pages->get($page->AssistedURL)->title; ?></a>

 

Share this post


Link to post
Share on other sites

@sms - I don't know why that code isn't working for you - it's fine here. Is this live somewhere we can look at?

That said, I do think a Page Reference field is more appropriate for your use case.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By anderson
      Hi all,
      I'm a new to website building. Learned some CRASH course of js,jquery,php. Then I found CMS. Still learning around forum, youtube....
      Anyway, please help me with some beginer questions:
      1, About template - please correct me if I understand wrong : every page should be (or recommended) built on a template. So if in total I'll have 10 pages, 2 of them have same layout, I'll need 9 templates.  And, what fields a page includes, is not defined in page, but defined in the template that page uses. 
      2,  Where to see what modules I've installed? is it in "Modules - Site"? 
      3, I installed "PageTable Extended", then what?  As in a youtube tutorial, it should appear in Setup tab, but it doesn't.  What's in there: templates,fields,logs,comments. (I installed "Uikit 3 site_blog profile".)
      4, I did a search in Processwire website for the famous "repeater matrix" module, and can not find it, there's a Repeater, as well as a Matrix. Is it not a module?
      5, I watched this youtube tuts: https://www.youtube.com/watch?v=IHqnLQy9R1A
      Anybody familiar with this tuts please help: 
      After he analysed a target webpage layout he wanted to mimic, he created some fields, some template, then based on those he created a page and input some "content" in there, then clicked "view", it's just some text. So, here comes my question, he copied a folder "assets" (subfolders are: css,fonts,js,img) over, then the page have the appearance/layout he wanted to mimic. Where does that assets folder come from?
      Appreciate any help.
    • By mtwebit
      I've created a set of modules for importing (manipulating and displaying) data from external resources. A key requirement was to handle large (100k+) number of pages easily.
      Main features
      import data from CSV and XML sources in the background (using Tasker) purge, update or overwrite existing pages using selectors user configurable input <-> field mappings on-the-fly data conversion and composition (e.g. joining CSV columns into a single field) download external resources (files, images) during import handle page references by any (even numeric) fields How it works
      You can upload CSV or XML files to DataSet pages and specify import rules in their description.
      The module imports the content of the file and creates/updates child pages automatically.
      How to use it
      Create a DataSet page that stores the source file. The file's description field specifies how the import should be done:
      After saving the DataSet page an import button should appear below the file description.

      When you start the import the DataSet module creates a task (executed by Tasker) that will import the data in the background.
      You can monitor its execution and check its logs for errors.

      See the module's wiki for more details.
      The module was already used in three projects to import and handle large XML and CSV datasets. It has some rough edges and I'm sure it needs improvement so comments are welcome.
    • By dreerr
      TemplateEnginePug (formally TemplateEngineJade)
       
      This module adds Pug templates to the TemplateEngineFactory. It uses https://github.com/pug-php/pug to render templates.
      doctype html html(lang='en') head meta(http-equiv='content-type', content='text/html; charset=utf-8') title= $page->title link(rel='stylesheet', type='text/css', href=$config->urls->templates . 'styles/main.css') body include header.pug h1= $page->title if $page->editable() p: a(href=$page->editURL) Edit Project on GitHub: github.com/dreerr/TemplateEnginePug
      Project in modules directory: modules.processwire.com/modules/template-engine-pug/
       
      For common problems/features/questions about the Factory, use the TemplateEngineFactory thread.
       
    • By Robin S
      Pages At Bottom
      Keeps selected pages at the bottom of their siblings.
      A "bottom page" will stay at the bottom even if it is drag-sorted to a different location or another page is drag-sorted below it (after Page List is refreshed the bottom page will still be at the bottom).
      Newly added sibling pages will not appear below a bottom page.
      The module also prevents the API methods $pages->sort() and $pages->insertAfter() from affecting the position of bottom pages.
      Note: the module only works when the sort setting for children on the parent page/template is "Manual drag-n-drop".
      Why?
      Because you want some pages to always be at the bottom of their siblings for one reason or another. And someone requested it. 🙂
      Usage
      Install the Pages At Bottom module.
      Select one or more pages to keep at the bottom of their siblings. If you select more than one bottom page per parent then their sort order in the page list will be the same as the sort order in the module config.

       
      https://github.com/Toutouwai/PagesAtBottom
      https://modules.processwire.com/modules/pages-at-bottom/
    • By Robin S
      Another little admin helper module...
      Template Field Widths
      Adds a "Field widths" field to Edit Template that allows you to quickly set the widths of inputfields in the template.

      Why?
      When setting up a new template or trying out different field layouts I find it a bit slow and tedious to have to open each field individually in a modal just to set the width. This module speeds up the process.
      Installation
      Install the Template Field Widths module.
      Config options
      You can set the default presentation of the "Field widths" field to collapsed or open. You can choose Name or Label as the primary identifier shown for the field. The unchosen alternative will become the title attribute shown on hover. You can choose to show the original field width next to the template context field width.  
      https://github.com/Toutouwai/TemplateFieldWidths
      https://modules.processwire.com/modules/template-field-widths/