Quantcast

New page name from app fields

classic Classic list List threaded Threaded
7 messages Options
D R
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

New page name from app fields

D R
Hi,

In an XWiki Application I created I want to make sure documents created
within it get named in a specific pattern from the fields filled inside
them.

Currently I use a custom button to redirect the user to a new document with
a dummy name so he doesn't need to fill the name (that should get
overwritten anyway on saving) but only the relevant fields.

Something like
#set ( $createDocLink = $xwiki.getURL($document, 'inline',
"template=${escapetool.url($urlTemplate)}&parent=${escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
)

This leads to a new document as defined in the application sheet with the
name 'New document'.

Now I want the user to fill 3 fields ('freetext1', 'freetext2',
'dropdown1'), click 'Save & View' or a custom button. Then the document
should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and the user
should be redirected to that page in view mode.

I've tried different approaches including a temporary creation page with
the 3 fields as HTML input fields (can't use the applications dropdown),
event listeners (the redirect after saving doesn't work) ...

Additionally the same must be done when a page is edited (one of the 3
fields is changed).

Please help me find a sane approach before I bite the table.

Regs, Dennis
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: New page name from app fields

Marius Dumitru Florea
Hi Dennis,

A relatively simple solution is the following:

(1) modify the application sheet to include the following HTML at the end:

<div class="hidden">
  <input type="hidden" name="xredirect" value="$doc.getURL('view',
'sheet=Path.To.NameManager')" />
</div>

The result is that whenever you create a new application entry or when you
edit an existing application entry, after you click "Save and view" you
will be taken to the view mode with ?sheet=Path.To.NameManager in the URL
query string, which means the Path.To.NameManager sheet will be applied to
the saved document.

(2) Create the Path.To.NameManager page that determines the right name for
the current document (based on its fields) and renames the current document
if needed ( using the refactoring API
http://extensions.xwiki.org/xwiki/bin/view/Extension/Refactoring+Module ),
finally redirecting to the view mode of the renamed document.

The problem with this solution is that it doesn't work if you use Save &
Continue and then Cancel (I think, to be checked).

Another option, more complex, is to write an event listener that catches
the document save event and renames the document if needed based on its
fields. The bad part with this is that the user is still not redirected
when using Save & Continue.

Hope this helps,
Marius

On Mon, Feb 27, 2017 at 3:52 PM, D R <[hidden email]> wrote:

> Hi,
>
> In an XWiki Application I created I want to make sure documents created
> within it get named in a specific pattern from the fields filled inside
> them.
>
> Currently I use a custom button to redirect the user to a new document with
> a dummy name so he doesn't need to fill the name (that should get
> overwritten anyway on saving) but only the relevant fields.
>
> Something like
> #set ( $createDocLink = $xwiki.getURL($document, 'inline',
> "template=${escapetool.url($urlTemplate)}&parent=${
> escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
> )
>
> This leads to a new document as defined in the application sheet with the
> name 'New document'.
>
> Now I want the user to fill 3 fields ('freetext1', 'freetext2',
> 'dropdown1'), click 'Save & View' or a custom button. Then the document
> should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and the user
> should be redirected to that page in view mode.
>
> I've tried different approaches including a temporary creation page with
> the 3 fields as HTML input fields (can't use the applications dropdown),
> event listeners (the redirect after saving doesn't work) ...
>
> Additionally the same must be done when a page is edited (one of the 3
> fields is changed).
>
> Please help me find a sane approach before I bite the table.
>
> Regs, Dennis
>
D R
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: New page name from app fields

D R
Hi Marius,

the refactoring approach sounds great but there seems to be something I do
wrong because the renaming doesn't work. Maybe I misunderstood the term
"current document" but I'm not sure.

I created "Test App.Code.Test App NameManager" with the following content:

```
{{velocity}}
#set ($renameRequest =
$services.refactoring.createRenameRequest($doc.fullName, 'Now RENAMED'))
#set ($discard = $renameRequest.setAutoRedirect(false))
$services.refactoring.rename($renameRequest)).join()
{{/velocity}}

```

Then I put your DIV at the end of my app sheet:

```
{{velocity}}
{{html wiki="true"}}
#set ($discard = $doc.use('Test App.Code.Test AppClass'))
(% class="xform" %)
(((
   [FORM CONTENT]
)))

<div class="hidden">
  <input type="hidden" name="xredirect" value="$doc.getURL('view',
"sheet=${escapetool.url('Test App.Code.Test App NameManager')}")" />
</div>

{{/html}}
{{/velocity}}

```

Then I opened up one of the application entries, edited it and hit "Save
and view" but the name didn't change.

Could you please tell me what I did wrong.

Thanks in advance,
Dennis

2017-02-28 11:38 GMT+01:00 Marius Dumitru Florea <
[hidden email]>:

> Hi Dennis,
>
> A relatively simple solution is the following:
>
> (1) modify the application sheet to include the following HTML at the end:
>
> <div class="hidden">
>   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> 'sheet=Path.To.NameManager')" />
> </div>
>
> The result is that whenever you create a new application entry or when you
> edit an existing application entry, after you click "Save and view" you
> will be taken to the view mode with ?sheet=Path.To.NameManager in the URL
> query string, which means the Path.To.NameManager sheet will be applied to
> the saved document.
>
> (2) Create the Path.To.NameManager page that determines the right name for
> the current document (based on its fields) and renames the current document
> if needed ( using the refactoring API
> http://extensions.xwiki.org/xwiki/bin/view/Extension/Refactoring+Module ),
> finally redirecting to the view mode of the renamed document.
>
> The problem with this solution is that it doesn't work if you use Save &
> Continue and then Cancel (I think, to be checked).
>
> Another option, more complex, is to write an event listener that catches
> the document save event and renames the document if needed based on its
> fields. The bad part with this is that the user is still not redirected
> when using Save & Continue.
>
> Hope this helps,
> Marius
>
> On Mon, Feb 27, 2017 at 3:52 PM, D R <[hidden email]> wrote:
>
> > Hi,
> >
> > In an XWiki Application I created I want to make sure documents created
> > within it get named in a specific pattern from the fields filled inside
> > them.
> >
> > Currently I use a custom button to redirect the user to a new document
> with
> > a dummy name so he doesn't need to fill the name (that should get
> > overwritten anyway on saving) but only the relevant fields.
> >
> > Something like
> > #set ( $createDocLink = $xwiki.getURL($document, 'inline',
> > "template=${escapetool.url($urlTemplate)}&parent=${
> > escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
> > )
> >
> > This leads to a new document as defined in the application sheet with the
> > name 'New document'.
> >
> > Now I want the user to fill 3 fields ('freetext1', 'freetext2',
> > 'dropdown1'), click 'Save & View' or a custom button. Then the document
> > should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and the user
> > should be redirected to that page in view mode.
> >
> > I've tried different approaches including a temporary creation page with
> > the 3 fields as HTML input fields (can't use the applications dropdown),
> > event listeners (the redirect after saving doesn't work) ...
> >
> > Additionally the same must be done when a page is edited (one of the 3
> > fields is changed).
> >
> > Please help me find a sane approach before I bite the table.
> >
> > Regs, Dennis
> >
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: New page name from app fields

Marius Dumitru Florea
On Tue, Feb 28, 2017 at 3:03 PM, D R <[hidden email]> wrote:

> Hi Marius,
>
> the refactoring approach sounds great but there seems to be something I do
> wrong because the renaming doesn't work. Maybe I misunderstood the term
> "current document" but I'm not sure.
>
> I created "Test App.Code.Test App NameManager" with the following content:
>
> ```
> {{velocity}}
> #set ($renameRequest =
>


> $services.refactoring.createRenameRequest($doc.fullName, 'Now RENAMED'))
>

As per
http://extensions.xwiki.org/xwiki/bin/view/Extension/Refactoring+Module#HScriptService
the first parameter passed to createRenameRequest must be an
EntityReference. In your case you can pass:

* either the reference of the current document, i.e. $doc.documentReference
, if the document is terminal (its name != 'WebHome')
* or the reference of the current space, i.e. $doc.documentReference.parent
, if the document is not terminal (its name is 'WebHome')


> #set ($discard = $renameRequest.setAutoRedirect(false))
> $services.refactoring.rename($renameRequest)).join()
> {{/velocity}}
>
> ```
>
> Then I put your DIV at the end of my app sheet:
>
> ```
> {{velocity}}
> {{html wiki="true"}}
> #set ($discard = $doc.use('Test App.Code.Test AppClass'))
> (% class="xform" %)
> (((
>    [FORM CONTENT]
> )))
>
> <div class="hidden">
>   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> "sheet=${escapetool.url('Test App.Code.Test App NameManager')}")" />
> </div>
>
> {{/html}}
> {{/velocity}}
>
> ```
>
> Then I opened up one of the application entries, edited it and hit "Save
> and view" but the name didn't change.
>

I don't see any redirect in "Test App NameManager" so it's normal you stay
on the same page, but do you have the sheet parameter in the query string?
i.e. is the "Test App NameManager" sheet executed?


>
> Could you please tell me what I did wrong.
>
> Thanks in advance,
> Dennis
>
> 2017-02-28 11:38 GMT+01:00 Marius Dumitru Florea <
> [hidden email]>:
>
> > Hi Dennis,
> >
> > A relatively simple solution is the following:
> >
> > (1) modify the application sheet to include the following HTML at the
> end:
> >
> > <div class="hidden">
> >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> > 'sheet=Path.To.NameManager')" />
> > </div>
> >
> > The result is that whenever you create a new application entry or when
> you
> > edit an existing application entry, after you click "Save and view" you
> > will be taken to the view mode with ?sheet=Path.To.NameManager in the URL
> > query string, which means the Path.To.NameManager sheet will be applied
> to
> > the saved document.
> >
> > (2) Create the Path.To.NameManager page that determines the right name
> for
> > the current document (based on its fields) and renames the current
> document
> > if needed ( using the refactoring API
> > http://extensions.xwiki.org/xwiki/bin/view/Extension/Refactoring+Module
> ),
> > finally redirecting to the view mode of the renamed document.
> >
> > The problem with this solution is that it doesn't work if you use Save &
> > Continue and then Cancel (I think, to be checked).
> >
> > Another option, more complex, is to write an event listener that catches
> > the document save event and renames the document if needed based on its
> > fields. The bad part with this is that the user is still not redirected
> > when using Save & Continue.
> >
> > Hope this helps,
> > Marius
> >
> > On Mon, Feb 27, 2017 at 3:52 PM, D R <[hidden email]> wrote:
> >
> > > Hi,
> > >
> > > In an XWiki Application I created I want to make sure documents created
> > > within it get named in a specific pattern from the fields filled inside
> > > them.
> > >
> > > Currently I use a custom button to redirect the user to a new document
> > with
> > > a dummy name so he doesn't need to fill the name (that should get
> > > overwritten anyway on saving) but only the relevant fields.
> > >
> > > Something like
> > > #set ( $createDocLink = $xwiki.getURL($document, 'inline',
> > > "template=${escapetool.url($urlTemplate)}&parent=${
> > > escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
> > > )
> > >
> > > This leads to a new document as defined in the application sheet with
> the
> > > name 'New document'.
> > >
> > > Now I want the user to fill 3 fields ('freetext1', 'freetext2',
> > > 'dropdown1'), click 'Save & View' or a custom button. Then the document
> > > should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and the
> user
> > > should be redirected to that page in view mode.
> > >
> > > I've tried different approaches including a temporary creation page
> with
> > > the 3 fields as HTML input fields (can't use the applications
> dropdown),
> > > event listeners (the redirect after saving doesn't work) ...
> > >
> > > Additionally the same must be done when a page is edited (one of the 3
> > > fields is changed).
> > >
> > > Please help me find a sane approach before I bite the table.
> > >
> > > Regs, Dennis
> > >
> >
>
D R
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: New page name from app fields

D R
Hi Marius,

thanks, I'm one step further now, at least the NameManager now does
renaming in general (it renamed itself until I added an #if clause to not
do so).

I wanted to implement it step by step so I didn't add the redirect yet.

But the sheet is not executed when editing application entries.

Meanwhile I have the following.

Test App.Code.Test AppSheet:

```
[...]
#set( $nameManRef = $services.model.createDocumentReference('', ['Test
App', 'Code'], 'Test App NameManager') )
#set( $nameMan = $xwiki.getDocument($nameManRef) )

<div class="hidden">
  <input type="hidden" name="xredirect" value="$doc.getURL('view',
"sheet=${escapetool.url($nameMan)}")" />
</div>

{{/html}}
{{/velocity}}

```

Test App.Code.Test App NameManager:

```
{{velocity}}
#if ( $doc.name != 'Test App NameManager' )
  #set ($renameRequest =
$services.refactoring.createRenameRequest($doc.documentReference, 'Now
RENAMED'))
  #set ($discard = $renameRequest.setAutoRedirect(false))
  $services.refactoring.rename($renameRequest)).join()
#end
{{/velocity}}

```

Thanks again,
Dennis

2017-03-01 10:30 GMT+01:00 Marius Dumitru Florea <
[hidden email]>:

> On Tue, Feb 28, 2017 at 3:03 PM, D R <[hidden email]> wrote:
>
> > Hi Marius,
> >
> > the refactoring approach sounds great but there seems to be something I
> do
> > wrong because the renaming doesn't work. Maybe I misunderstood the term
> > "current document" but I'm not sure.
> >
> > I created "Test App.Code.Test App NameManager" with the following
> content:
> >
> > ```
> > {{velocity}}
> > #set ($renameRequest =
> >
>
>
> > $services.refactoring.createRenameRequest($doc.fullName, 'Now RENAMED'))
> >
>
> As per
> http://extensions.xwiki.org/xwiki/bin/view/Extension/Refactoring+Module#
> HScriptService
> the first parameter passed to createRenameRequest must be an
> EntityReference. In your case you can pass:
>
> * either the reference of the current document, i.e. $doc.documentReference
> , if the document is terminal (its name != 'WebHome')
> * or the reference of the current space, i.e. $doc.documentReference.parent
> , if the document is not terminal (its name is 'WebHome')
>
>
> > #set ($discard = $renameRequest.setAutoRedirect(false))
> > $services.refactoring.rename($renameRequest)).join()
> > {{/velocity}}
> >
> > ```
> >
> > Then I put your DIV at the end of my app sheet:
> >
> > ```
> > {{velocity}}
> > {{html wiki="true"}}
> > #set ($discard = $doc.use('Test App.Code.Test AppClass'))
> > (% class="xform" %)
> > (((
> >    [FORM CONTENT]
> > )))
> >
> > <div class="hidden">
> >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> > "sheet=${escapetool.url('Test App.Code.Test App NameManager')}")" />
> > </div>
> >
> > {{/html}}
> > {{/velocity}}
> >
> > ```
> >
> > Then I opened up one of the application entries, edited it and hit "Save
> > and view" but the name didn't change.
> >
>
> I don't see any redirect in "Test App NameManager" so it's normal you stay
> on the same page, but do you have the sheet parameter in the query string?
> i.e. is the "Test App NameManager" sheet executed?
>
>
> >
> > Could you please tell me what I did wrong.
> >
> > Thanks in advance,
> > Dennis
> >
> > 2017-02-28 11:38 GMT+01:00 Marius Dumitru Florea <
> > [hidden email]>:
> >
> > > Hi Dennis,
> > >
> > > A relatively simple solution is the following:
> > >
> > > (1) modify the application sheet to include the following HTML at the
> > end:
> > >
> > > <div class="hidden">
> > >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> > > 'sheet=Path.To.NameManager')" />
> > > </div>
> > >
> > > The result is that whenever you create a new application entry or when
> > you
> > > edit an existing application entry, after you click "Save and view" you
> > > will be taken to the view mode with ?sheet=Path.To.NameManager in the
> URL
> > > query string, which means the Path.To.NameManager sheet will be applied
> > to
> > > the saved document.
> > >
> > > (2) Create the Path.To.NameManager page that determines the right name
> > for
> > > the current document (based on its fields) and renames the current
> > document
> > > if needed ( using the refactoring API
> > > http://extensions.xwiki.org/xwiki/bin/view/Extension/
> Refactoring+Module
> > ),
> > > finally redirecting to the view mode of the renamed document.
> > >
> > > The problem with this solution is that it doesn't work if you use Save
> &
> > > Continue and then Cancel (I think, to be checked).
> > >
> > > Another option, more complex, is to write an event listener that
> catches
> > > the document save event and renames the document if needed based on its
> > > fields. The bad part with this is that the user is still not redirected
> > > when using Save & Continue.
> > >
> > > Hope this helps,
> > > Marius
> > >
> > > On Mon, Feb 27, 2017 at 3:52 PM, D R <[hidden email]> wrote:
> > >
> > > > Hi,
> > > >
> > > > In an XWiki Application I created I want to make sure documents
> created
> > > > within it get named in a specific pattern from the fields filled
> inside
> > > > them.
> > > >
> > > > Currently I use a custom button to redirect the user to a new
> document
> > > with
> > > > a dummy name so he doesn't need to fill the name (that should get
> > > > overwritten anyway on saving) but only the relevant fields.
> > > >
> > > > Something like
> > > > #set ( $createDocLink = $xwiki.getURL($document, 'inline',
> > > > "template=${escapetool.url($urlTemplate)}&parent=${
> > > > escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
> > > > )
> > > >
> > > > This leads to a new document as defined in the application sheet with
> > the
> > > > name 'New document'.
> > > >
> > > > Now I want the user to fill 3 fields ('freetext1', 'freetext2',
> > > > 'dropdown1'), click 'Save & View' or a custom button. Then the
> document
> > > > should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and the
> > user
> > > > should be redirected to that page in view mode.
> > > >
> > > > I've tried different approaches including a temporary creation page
> > with
> > > > the 3 fields as HTML input fields (can't use the applications
> > dropdown),
> > > > event listeners (the redirect after saving doesn't work) ...
> > > >
> > > > Additionally the same must be done when a page is edited (one of the
> 3
> > > > fields is changed).
> > > >
> > > > Please help me find a sane approach before I bite the table.
> > > >
> > > > Regs, Dennis
> > > >
> > >
> >
>
D R
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: New page name from app fields

D R
Hi,

After being sick and busy with other things I checked again and found out
that the xredirect does not work so the NameManager is not executed.

Even the following in the application sheet does not do any redirect when
pressing Save and View button of an application document:

```
<div class="hidden">
  <input type="hidden" name="xredirect" value="$doc.space" />
</div>

```

Could you please help me how proceed further?

Thanks, Dennis

2017-03-01 15:51 GMT+01:00 D R <[hidden email]>:

> Hi Marius,
>
> thanks, I'm one step further now, at least the NameManager now does
> renaming in general (it renamed itself until I added an #if clause to not
> do so).
>
> I wanted to implement it step by step so I didn't add the redirect yet.
>
> But the sheet is not executed when editing application entries.
>
> Meanwhile I have the following.
>
> Test App.Code.Test AppSheet:
>
> ```
> [...]
> #set( $nameManRef = $services.model.createDocumentReference('', ['Test
> App', 'Code'], 'Test App NameManager') )
> #set( $nameMan = $xwiki.getDocument($nameManRef) )
>
> <div class="hidden">
>   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> "sheet=${escapetool.url($nameMan)}")" />
> </div>
>
> {{/html}}
> {{/velocity}}
>
> ```
>
> Test App.Code.Test App NameManager:
>
> ```
> {{velocity}}
> #if ( $doc.name != 'Test App NameManager' )
>   #set ($renameRequest = $services.refactoring.createRenameRequest($doc.documentReference,
> 'Now RENAMED'))
>   #set ($discard = $renameRequest.setAutoRedirect(false))
>   $services.refactoring.rename($renameRequest)).join()
> #end
> {{/velocity}}
>
> ```
>
> Thanks again,
> Dennis
>
> 2017-03-01 10:30 GMT+01:00 Marius Dumitru Florea <
> [hidden email]>:
>
>> On Tue, Feb 28, 2017 at 3:03 PM, D R <[hidden email]> wrote:
>>
>> > Hi Marius,
>> >
>> > the refactoring approach sounds great but there seems to be something I
>> do
>> > wrong because the renaming doesn't work. Maybe I misunderstood the term
>> > "current document" but I'm not sure.
>> >
>> > I created "Test App.Code.Test App NameManager" with the following
>> content:
>> >
>> > ```
>> > {{velocity}}
>> > #set ($renameRequest =
>> >
>>
>>
>> > $services.refactoring.createRenameRequest($doc.fullName, 'Now
>> RENAMED'))
>> >
>>
>> As per
>> http://extensions.xwiki.org/xwiki/bin/view/Extension/Refacto
>> ring+Module#HScriptService
>> the first parameter passed to createRenameRequest must be an
>> EntityReference. In your case you can pass:
>>
>> * either the reference of the current document, i.e.
>> $doc.documentReference
>> , if the document is terminal (its name != 'WebHome')
>> * or the reference of the current space, i.e.
>> $doc.documentReference.parent
>> , if the document is not terminal (its name is 'WebHome')
>>
>>
>> > #set ($discard = $renameRequest.setAutoRedirect(false))
>> > $services.refactoring.rename($renameRequest)).join()
>> > {{/velocity}}
>> >
>> > ```
>> >
>> > Then I put your DIV at the end of my app sheet:
>> >
>> > ```
>> > {{velocity}}
>> > {{html wiki="true"}}
>> > #set ($discard = $doc.use('Test App.Code.Test AppClass'))
>> > (% class="xform" %)
>> > (((
>> >    [FORM CONTENT]
>> > )))
>> >
>> > <div class="hidden">
>> >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
>> > "sheet=${escapetool.url('Test App.Code.Test App NameManager')}")" />
>> > </div>
>> >
>> > {{/html}}
>> > {{/velocity}}
>> >
>> > ```
>> >
>> > Then I opened up one of the application entries, edited it and hit "Save
>> > and view" but the name didn't change.
>> >
>>
>> I don't see any redirect in "Test App NameManager" so it's normal you stay
>> on the same page, but do you have the sheet parameter in the query string?
>> i.e. is the "Test App NameManager" sheet executed?
>>
>>
>> >
>> > Could you please tell me what I did wrong.
>> >
>> > Thanks in advance,
>> > Dennis
>> >
>> > 2017-02-28 11:38 GMT+01:00 Marius Dumitru Florea <
>> > [hidden email]>:
>> >
>> > > Hi Dennis,
>> > >
>> > > A relatively simple solution is the following:
>> > >
>> > > (1) modify the application sheet to include the following HTML at the
>> > end:
>> > >
>> > > <div class="hidden">
>> > >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
>> > > 'sheet=Path.To.NameManager')" />
>> > > </div>
>> > >
>> > > The result is that whenever you create a new application entry or when
>> > you
>> > > edit an existing application entry, after you click "Save and view"
>> you
>> > > will be taken to the view mode with ?sheet=Path.To.NameManager in the
>> URL
>> > > query string, which means the Path.To.NameManager sheet will be
>> applied
>> > to
>> > > the saved document.
>> > >
>> > > (2) Create the Path.To.NameManager page that determines the right name
>> > for
>> > > the current document (based on its fields) and renames the current
>> > document
>> > > if needed ( using the refactoring API
>> > > http://extensions.xwiki.org/xwiki/bin/view/Extension/Refacto
>> ring+Module
>> > ),
>> > > finally redirecting to the view mode of the renamed document.
>> > >
>> > > The problem with this solution is that it doesn't work if you use
>> Save &
>> > > Continue and then Cancel (I think, to be checked).
>> > >
>> > > Another option, more complex, is to write an event listener that
>> catches
>> > > the document save event and renames the document if needed based on
>> its
>> > > fields. The bad part with this is that the user is still not
>> redirected
>> > > when using Save & Continue.
>> > >
>> > > Hope this helps,
>> > > Marius
>> > >
>> > > On Mon, Feb 27, 2017 at 3:52 PM, D R <[hidden email]> wrote:
>> > >
>> > > > Hi,
>> > > >
>> > > > In an XWiki Application I created I want to make sure documents
>> created
>> > > > within it get named in a specific pattern from the fields filled
>> inside
>> > > > them.
>> > > >
>> > > > Currently I use a custom button to redirect the user to a new
>> document
>> > > with
>> > > > a dummy name so he doesn't need to fill the name (that should get
>> > > > overwritten anyway on saving) but only the relevant fields.
>> > > >
>> > > > Something like
>> > > > #set ( $createDocLink = $xwiki.getURL($document, 'inline',
>> > > > "template=${escapetool.url($urlTemplate)}&parent=${
>> > > > escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
>> > > > )
>> > > >
>> > > > This leads to a new document as defined in the application sheet
>> with
>> > the
>> > > > name 'New document'.
>> > > >
>> > > > Now I want the user to fill 3 fields ('freetext1', 'freetext2',
>> > > > 'dropdown1'), click 'Save & View' or a custom button. Then the
>> document
>> > > > should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and the
>> > user
>> > > > should be redirected to that page in view mode.
>> > > >
>> > > > I've tried different approaches including a temporary creation page
>> > with
>> > > > the 3 fields as HTML input fields (can't use the applications
>> > dropdown),
>> > > > event listeners (the redirect after saving doesn't work) ...
>> > > >
>> > > > Additionally the same must be done when a page is edited (one of
>> the 3
>> > > > fields is changed).
>> > > >
>> > > > Please help me find a sane approach before I bite the table.
>> > > >
>> > > > Regs, Dennis
>> > > >
>> > >
>> >
>>
>
>
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: New page name from app fields

Marius Dumitru Florea
On Thu, Mar 9, 2017 at 2:18 PM, D R <[hidden email]> wrote:

> Hi,
>
> After being sick and busy with other things I checked again and found out
> that the xredirect does not work so the NameManager is not executed.
>
> Even the following in the application sheet does not do any redirect when
> pressing Save and View button of an application document:
>
> ```
> <div class="hidden">
>   <input type="hidden" name="xredirect" value="$doc.space" />
> </div>
>
> ```
>

The value of the xredirect field must be an URL, see my first reply. And
you need XWiki 8.4+

Hope this helps,
Marius


>
> Could you please help me how proceed further?
>
> Thanks, Dennis
>
> 2017-03-01 15:51 GMT+01:00 D R <[hidden email]>:
>
> > Hi Marius,
> >
> > thanks, I'm one step further now, at least the NameManager now does
> > renaming in general (it renamed itself until I added an #if clause to not
> > do so).
> >
> > I wanted to implement it step by step so I didn't add the redirect yet.
> >
> > But the sheet is not executed when editing application entries.
> >
> > Meanwhile I have the following.
> >
> > Test App.Code.Test AppSheet:
> >
> > ```
> > [...]
> > #set( $nameManRef = $services.model.createDocumentReference('', ['Test
> > App', 'Code'], 'Test App NameManager') )
> > #set( $nameMan = $xwiki.getDocument($nameManRef) )
> >
> > <div class="hidden">
> >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> > "sheet=${escapetool.url($nameMan)}")" />
> > </div>
> >
> > {{/html}}
> > {{/velocity}}
> >
> > ```
> >
> > Test App.Code.Test App NameManager:
> >
> > ```
> > {{velocity}}
> > #if ( $doc.name != 'Test App NameManager' )
> >   #set ($renameRequest = $services.refactoring.createRenameRequest($doc.
> documentReference,
> > 'Now RENAMED'))
> >   #set ($discard = $renameRequest.setAutoRedirect(false))
> >   $services.refactoring.rename($renameRequest)).join()
> > #end
> > {{/velocity}}
> >
> > ```
> >
> > Thanks again,
> > Dennis
> >
> > 2017-03-01 10:30 GMT+01:00 Marius Dumitru Florea <
> > [hidden email]>:
> >
> >> On Tue, Feb 28, 2017 at 3:03 PM, D R <[hidden email]> wrote:
> >>
> >> > Hi Marius,
> >> >
> >> > the refactoring approach sounds great but there seems to be something
> I
> >> do
> >> > wrong because the renaming doesn't work. Maybe I misunderstood the
> term
> >> > "current document" but I'm not sure.
> >> >
> >> > I created "Test App.Code.Test App NameManager" with the following
> >> content:
> >> >
> >> > ```
> >> > {{velocity}}
> >> > #set ($renameRequest =
> >> >
> >>
> >>
> >> > $services.refactoring.createRenameRequest($doc.fullName, 'Now
> >> RENAMED'))
> >> >
> >>
> >> As per
> >> http://extensions.xwiki.org/xwiki/bin/view/Extension/Refacto
> >> ring+Module#HScriptService
> >> the first parameter passed to createRenameRequest must be an
> >> EntityReference. In your case you can pass:
> >>
> >> * either the reference of the current document, i.e.
> >> $doc.documentReference
> >> , if the document is terminal (its name != 'WebHome')
> >> * or the reference of the current space, i.e.
> >> $doc.documentReference.parent
> >> , if the document is not terminal (its name is 'WebHome')
> >>
> >>
> >> > #set ($discard = $renameRequest.setAutoRedirect(false))
> >> > $services.refactoring.rename($renameRequest)).join()
> >> > {{/velocity}}
> >> >
> >> > ```
> >> >
> >> > Then I put your DIV at the end of my app sheet:
> >> >
> >> > ```
> >> > {{velocity}}
> >> > {{html wiki="true"}}
> >> > #set ($discard = $doc.use('Test App.Code.Test AppClass'))
> >> > (% class="xform" %)
> >> > (((
> >> >    [FORM CONTENT]
> >> > )))
> >> >
> >> > <div class="hidden">
> >> >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> >> > "sheet=${escapetool.url('Test App.Code.Test App NameManager')}")" />
> >> > </div>
> >> >
> >> > {{/html}}
> >> > {{/velocity}}
> >> >
> >> > ```
> >> >
> >> > Then I opened up one of the application entries, edited it and hit
> "Save
> >> > and view" but the name didn't change.
> >> >
> >>
> >> I don't see any redirect in "Test App NameManager" so it's normal you
> stay
> >> on the same page, but do you have the sheet parameter in the query
> string?
> >> i.e. is the "Test App NameManager" sheet executed?
> >>
> >>
> >> >
> >> > Could you please tell me what I did wrong.
> >> >
> >> > Thanks in advance,
> >> > Dennis
> >> >
> >> > 2017-02-28 11:38 GMT+01:00 Marius Dumitru Florea <
> >> > [hidden email]>:
> >> >
> >> > > Hi Dennis,
> >> > >
> >> > > A relatively simple solution is the following:
> >> > >
> >> > > (1) modify the application sheet to include the following HTML at
> the
> >> > end:
> >> > >
> >> > > <div class="hidden">
> >> > >   <input type="hidden" name="xredirect" value="$doc.getURL('view',
> >> > > 'sheet=Path.To.NameManager')" />
> >> > > </div>
> >> > >
> >> > > The result is that whenever you create a new application entry or
> when
> >> > you
> >> > > edit an existing application entry, after you click "Save and view"
> >> you
> >> > > will be taken to the view mode with ?sheet=Path.To.NameManager in
> the
> >> URL
> >> > > query string, which means the Path.To.NameManager sheet will be
> >> applied
> >> > to
> >> > > the saved document.
> >> > >
> >> > > (2) Create the Path.To.NameManager page that determines the right
> name
> >> > for
> >> > > the current document (based on its fields) and renames the current
> >> > document
> >> > > if needed ( using the refactoring API
> >> > > http://extensions.xwiki.org/xwiki/bin/view/Extension/Refacto
> >> ring+Module
> >> > ),
> >> > > finally redirecting to the view mode of the renamed document.
> >> > >
> >> > > The problem with this solution is that it doesn't work if you use
> >> Save &
> >> > > Continue and then Cancel (I think, to be checked).
> >> > >
> >> > > Another option, more complex, is to write an event listener that
> >> catches
> >> > > the document save event and renames the document if needed based on
> >> its
> >> > > fields. The bad part with this is that the user is still not
> >> redirected
> >> > > when using Save & Continue.
> >> > >
> >> > > Hope this helps,
> >> > > Marius
> >> > >
> >> > > On Mon, Feb 27, 2017 at 3:52 PM, D R <[hidden email]> wrote:
> >> > >
> >> > > > Hi,
> >> > > >
> >> > > > In an XWiki Application I created I want to make sure documents
> >> created
> >> > > > within it get named in a specific pattern from the fields filled
> >> inside
> >> > > > them.
> >> > > >
> >> > > > Currently I use a custom button to redirect the user to a new
> >> document
> >> > > with
> >> > > > a dummy name so he doesn't need to fill the name (that should get
> >> > > > overwritten anyway on saving) but only the relevant fields.
> >> > > >
> >> > > > Something like
> >> > > > #set ( $createDocLink = $xwiki.getURL($document, 'inline',
> >> > > > "template=${escapetool.url($urlTemplate)}&parent=${
> >> > > > escapetool.url($urlParent)}&title=${escapetool.url($urlTitle)}")
> >> > > > )
> >> > > >
> >> > > > This leads to a new document as defined in the application sheet
> >> with
> >> > the
> >> > > > name 'New document'.
> >> > > >
> >> > > > Now I want the user to fill 3 fields ('freetext1', 'freetext2',
> >> > > > 'dropdown1'), click 'Save & View' or a custom button. Then the
> >> document
> >> > > > should be saved as '<freetext1> - <freetext2> (<dropdown1>)' and
> the
> >> > user
> >> > > > should be redirected to that page in view mode.
> >> > > >
> >> > > > I've tried different approaches including a temporary creation
> page
> >> > with
> >> > > > the 3 fields as HTML input fields (can't use the applications
> >> > dropdown),
> >> > > > event listeners (the redirect after saving doesn't work) ...
> >> > > >
> >> > > > Additionally the same must be done when a page is edited (one of
> >> the 3
> >> > > > fields is changed).
> >> > > >
> >> > > > Please help me find a sane approach before I bite the table.
> >> > > >
> >> > > > Regs, Dennis
> >> > > >
> >> > >
> >> >
> >>
> >
> >
>
Loading...