j00st

[SOLVED] Generate copy of Title Field (with content) for multiple pages?

Recommended Posts

Hi all! 

I've been searching/browsing a bit, but can't find what I'm looking for just yet...
Perhaps I'm searching in the wrong places, but I thought posting it here might work better/more efficient.

I need to do the following;

1. I have the TITLE field (the one set by ProcessWire as default).
2. There's already a whole lot of pages of the template 'project' set up.
3. Now I actually want to be able to add <i> and <br> tags to this title...which is possible if I turn off the specialchar encoder...
...but it also presents the opportunity for people to start typing, and generate the following kind of URLs:

TITLE: This is a really long title <br> which <i>needs</i> to be split in two
URL generated: this-is-a-really-long-title-br-which-i-needs-i-to-be-split-in-tow

Don't want that happening. So, I thought it might be wiser to do the following.

Next to the 'title' field, also set a 'display-title' field.
But, preferably I'd want to generate this for all the projects already in existance...including copying their content to this new display-title field.
Just adding the field means all the titles will need to be copied...not something I look forward to telling the editors of the site 🙂

I saw the Hook for on-save, but that's only for the single page...and I'm not an experienced MySQL-coder/user, otherwise I guess that would've been the way to go.
So I'm really curious to hear if you guys think there are other/better options (and what they are)

Thanks!

Share this post


Link to post
Share on other sites
2 hours ago, j00st said:

1. I have the TITLE field (the one set by ProcessWire as default).

I'd leave the title field as is. Names (urls) are generated from the title when you create a page. If your pages are live, then better leave the title as is.

2 hours ago, j00st said:

2. There's already a whole lot of pages of the template 'project' set up.

How many? This affects how you should run the script below

 

2 hours ago, j00st said:

3. Now I actually want to be able to add <i> and <br> tags to this title...which is possible if I turn off the specialchar encoder...
...but it also presents the opportunity for people to start typing, and generate the following kind of URLs:

Not a great idea! No need for html here.

 

2 hours ago, j00st said:

Next to the 'title' field, also set a 'display-title' field.

This is a better way IMO

2 hours ago, j00st said:

But, preferably I'd want to generate this for all the projects already in existance...including copying their content to this new display-title field.
Just adding the field means all the titles will need to be copied.

That's why we have the API :-). See script below.  TEST BEFORE USE IN PRODUCTION SITE!

  1. Log in as superuser
  2. Copy and paste the following code into a template file, maybe the one used by your home page. 
  3. Visit a page using the template in #2
  4. Check if things went OK
  5. Delete code from template file when done

 

If you have lots of project pages, make use of the start and limit parameters.

/**
 * Copy title field contents to a specified text field on the same page.
 *
 * @param string $fieldName Name of the field to edit.
 * @param string $templateName Name of the template file whose pages we are editing.
 * @param integer $start Start of $pages->find().
 * @param integer $limit Limit of $pages->find().
 * @return void
 */
function generateDisplayTitle($fieldName, $templateName, $start=0, $limit=10) {
    // only superusers allowed!
    if(!wire('user')->isSuperuser()) return;
    // fetch a limited number of pages
    $editPages = wire('pages')->find("template=$templateName,start=$start,limit=$limit");
    # we found pages
    if($editPages->count) {
        foreach ($editPages as $editPage) {
            $editPage->{$fieldName} = $editPage->title;
            $editPage->of(false);
            $editPage->save($fieldName);
            $editPage->of(true);
        }
    }
    
}

// call the function - here, we start at index 2 and limit to 3 pages
// the field we want to copy content to is called 'display_title'
// the template of the pages we want is 'projects'
generateDisplayTitle('display_title', 'projects', 2,3);
# not many pages use (i.e. do all)
#generateDisplayTitle('display_title', 'projects');

 

Edited by kongondo
typos
  • Like 3
  • Thanks 1

Share this post


Link to post
Share on other sites

 

1 hour ago, kongondo said:

I'd leave the title field as is.

Yup, that's what I was hoping to do 🙂 So thank you for this awesome solution!!

 

1 hour ago, kongondo said:

How many? This affects how you should run the script below

Actually not too many on the 'live' test-server...21 at the moment. So still pretty doable.
But in case it's going to fill up fast I want to be sure it's not going to be a lot of manual labour.

 

1 hour ago, kongondo said:

// call the function - here, we start at index 2 and limit to 3 pages 
// the field we want to copy content to is called 'display_title' 
// the template of the pages we want is 'projects' 
generateDisplayTitle('display_title', 'projects', 2,3); 
# not many pages use (i.e. do all) 
#generateDisplayTitle('display_title', 'projects');

 

So the first part of the code is all clear to me. This part (above) is an example right?
In the generateDisplayTitle you've set start=0 and limit=10, and here you start at 2 and limit to 3 pages? Correct?
And if I'd want to do all of them, I'd do the following:
 

generateDisplayTitle('display_title','projects', 0, 21);

And another double-check; as I'm not sure. Am I selecting the parent (projects) here? Or should it be the template, so 'project'?

Share this post


Link to post
Share on other sites
42 minutes ago, j00st said:

But in case it's going to fill up fast I want to be sure it's not going to be a lot of manual labour.

In future, will the editors, when they create a new project page, be inputting the display title themselves? 

42 minutes ago, j00st said:

This part (above) is an example right?

Yes 🙂

42 minutes ago, j00st said:

In the generateDisplayTitle you've set start=0 and limit=10, and here you start at 2 and limit to 3 pages? Correct?

Yes. The defaults are you start from the beginning (0) and you get everything (limit=0 aka, no limit). In my example, I wanted to start from 2 (not a good example, I know) A better example is, assuming I had done a batch before, say the first 100 pages. In the next batch, I'd start from start=101 and limit=100..meaning, I do 100 at a time.  There's a way to automate this, but that's a lot more code :-). 

 

42 minutes ago, j00st said:

And if I'd want to do all of them, I'd do the following:
 


generateDisplayTitle('display_title','projects', 0, 21);

Not quite. It would work though, but since you want to apply to all projects pages, there is no need to enter a start and limit. The following would do:

generateDisplayTitle('display_title','projects');

 

42 minutes ago, j00st said:

And another double-check; as I'm not sure. Am I selecting the parent (projects) here? Or should it be the template, so 'project'?

It should be the name of the template. In my example, it was 'projects'. Adapt to your needs, so yes, 'project' in your case. But it can be any template with a display_title (or whatever you've named the field) field whose pages you need to edit.

Test on a local install first 🙂

Edited by kongondo
  • Like 1
  • Thanks 1

Share this post


Link to post
Share on other sites
4 hours ago, kongondo said:

In future, will the editors, when they create a new project page, be inputting the display title themselves? 

Yes! Definitely 🙂 It's just that the existing set needs to be converted/updated.

4 hours ago, kongondo said:

generateDisplayTitle('display_title','projects');

Super!

 

4 hours ago, kongondo said:

But it can be any template with a display_title

Awesome. And much better, as it can be implemented in a wider spectrum.

 

4 hours ago, kongondo said:

Test on a local install first 🙂

For sure 😄  but good to be reminded 😉

Thank you so much. Going to try it on the local server right now!!

Share this post


Link to post
Share on other sites

@kongondo it works like a charm! Thanks again 🙂

One last question...how do I add [SOLVED] to the title of this topic? 😳

Share this post


Link to post
Share on other sites

This basically does the same as kongondo's script, but has a nice GUI if you prefer. This is one the actions in the AdmimActions module.

image.thumb.png.3a60b06d69056c83ae3c7ce3a4648c6a.png

  • Like 4

Share this post


Link to post
Share on other sites

@adrian ooooh, that's very pretty 🙂 I'll keep it in mind for the next time.
The way it was fixed now taught me some extra ProcessWire though, which is also good (for me).

Didn't know about the AdminActions module...will have to study that a bit better. Looks useful!!

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 Roberts R
      Can someone point me to the way how to fix title to name? so "ā" becomes "a" and so on. see attachment

    • By Sipho
      I recently needed a module that automatically fills the title field of a page using fields on that page. I couldn't see one that already existed so I made my own. This is mostly based on ProcessSetupPageName by @kixe which I use along with this module. Keep in mind I am very new to ProcessWire so perhaps somebody else can contribute or make a better one 
      Note: The title is automatically hidden when using this module
      You can enter any string. To add a fieldname, subfield or property, you surround the fieldname with {}. Dot syntax allowed. Example:
      Fish: {parent.title} {myfield}
      https://github.com/nextgensparx/AutoPageTitles
    • By microcipcip
      Hi, I am a new ProcessWire adept, coming from MODx Evolution (I see several of us here :))

      I would like to know if it is possible to change the <title> tag in the admin to always show "ProcessWire" at the end. So for example instead of this:
      <title>Edit Page: Home • localhost</title> I would like to see this:
      <title>Edit Page: Home • localhost • ProcessWire</title> I need this because I target the title of the page with AutoHotkey so I can use shortcuts inside ProcessWire ;p
    • By Orkun
      Hi Everyone
      Can I change the type of the title field from PageTitleLanguage to PageTitle per template and not only global? 
      Greetings
      Nukro
    • By steveooo
      Hello,
      when using the default multi-language module, you can set different titles for each language on a page.
      The logic is: the default language is the source and every non-default language inherits from it if empty.
      For a use case I have, I need to update all title's on a page for every language via the API.
      I tried a little with this code but it doesn't work (with no errors):
      $globalTitle = 'Test'; foreach ($languages as $language) { $page->set('title'.$language->id, $globalTitle); }