Jump to content

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


j00st
 Share

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!

Link to comment
Share on other sites

  On 9/13/2018 at 10:50 AM, j00st said:

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

Expand  

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.

  On 9/13/2018 at 10:50 AM, j00st said:

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

Expand  

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

 

  On 9/13/2018 at 10:50 AM, 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:

Expand  

Not a great idea! No need for html here.

 

  On 9/13/2018 at 10:50 AM, j00st said:

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

Expand  

This is a better way IMO

  On 9/13/2018 at 10:50 AM, 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.

Expand  

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
Link to comment
Share on other sites

 

  On 9/13/2018 at 12:49 PM, kongondo said:

I'd leave the title field as is.

Expand  

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

 

  On 9/13/2018 at 12:49 PM, kongondo said:

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

Expand  

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.

 

  On 9/13/2018 at 12:49 PM, 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');

 

Expand  

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'?

Link to comment
Share on other sites

  On 9/13/2018 at 2:07 PM, 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.

Expand  

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

  On 9/13/2018 at 2:07 PM, j00st said:

This part (above) is an example right?

Expand  

Yes ?

  On 9/13/2018 at 2:07 PM, 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?

Expand  

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 :-). 

 

  On 9/13/2018 at 2:07 PM, j00st said:

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

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

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');

 

  On 9/13/2018 at 2:07 PM, 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'?

Expand  

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
Link to comment
Share on other sites

  On 9/13/2018 at 2:49 PM, kongondo said:

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

Expand  

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

  On 9/13/2018 at 2:49 PM, kongondo said:

generateDisplayTitle('display_title','projects');

Expand  

Super!

 

  On 9/13/2018 at 2:49 PM, kongondo said:

But it can be any template with a display_title

Expand  

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

 

  On 9/13/2018 at 2:49 PM, kongondo said:

Test on a local install first ?

Expand  

For sure ?  but good to be reminded ?

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

Link to comment
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!!

Link to comment
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
 Share

×
×
  • Create New...