Newbie questions about Pliant

Newbie questions about Pliant

dynamic_page argument

Is it possible to pass arguments with the instruction
execute_dynamic_page ?
Message posted by michel on 2005/09/01 08:47:55

Is it possible to pass arguments with rhe instruction
 execute_dynamic_page ?
ans if yes how catch them for use ?

Michel

PS it seeems that my previous message has not been correctly recorded
Message posted by hubert.tonneau on 2005/09/01 09:01:42
> Is it possible to pass arguments with the instruction execute_dynamic_page ?

Not directly.

The question might be what for ?

If you have an instruction that need some parameters, just write it as a method
in a .pli so you can have arguments.

method page foo ...
  arg_rw HtmlPage page ; ...
  implicit page
    ...

See 'file_browser' method in /pliant/appli/file_browser.pli as an example.

The other solution would be to pass arguments in the 'environment' dictionary
of the page, but I find it a bit heavy and dirty.


> PS it seeems that my previous message has not been correctly recorded

I need to replace the UPS battery because the Pliant server has rebooted quite
some time this summer because of power failure.
Message posted by maybe Boris on 2005/09/21 03:38:51
Hi, 

I often have todo some work before switching to a new
page as a result of click on an icon. is this a correct
way to do it ?

                icon "images/Add_to_cart_fl.png"
                  var Data:BasketItem tmp_item :> tmpbasket add_item _network _code
                  tmp_item:price := actual_price
                  execute_dynamic_page "flowers_details.html"

should i put this inside block into a method ?

also, would it be possible to have a custom pliant http method to be called to 
draw header and footer ?

should i aim to try to generate all the screens from within one .page ?
if yes, how would it affect search engine robots coming to my site ?

Thanks
Message posted by hubert.tonneau on 2005/09/21 09:20:47
> should i put this inside block into a method ?

Your decision.

> also, would it be possible to have a custom pliant http method to be called to 
> draw header and footer ?

Create a style, with something like:

style_setup
  tag_html page_header
    ...
  tag_html page_footer
    ...

> should i aim to try to generate all the screens from within one .page ?
> if yes, how would it affect search engine robots coming to my site ?

Well, using a single URL is probably not a good idea.
About search engines, rather ask Google.
Message posted by maybe Boris Reitman on 2005/09/21 22:29:51
Now I remembered precisely why I have refrained from doing that.
I want to have a table as part of my header that doesn't close,
the body of the table becomes a cell in this table, and the footer 
closes it.  So the following doesn't solve my need:

tag_html page_header
  text "this is the top of the page"
  table columns 2
    cell
      left_side_menu
    cell  # i want it to stay open

tag_html page_footer
  # somehow to close the table
  text "this is the footer"

text "this is the body"

So, I if I understand correctly I need to use explicit html to open and
close the table like this ? 
Thanks,
Boris
Message posted by hubert.tonneau on 2005/09/22 00:02:35
Yes, you do.
Using 'write' instruction in a .style is fairly common, and sane from the
code maintaining point of view. What must be avoided as far as possible
is to have raw HTML in the .page since in an application, it is expected
to have much less lines of .style than of .page, and concentrating the tricks
rather than spreading them all around is good.
Message posted by maybe Boris Reitman on 2005/09/22 18:36:38
Ok, makes sense.

My next question is about how I can control whats showing 
up in the header and footer depending on what page I am visiting.
I have a few pages that need a slightly different footer and header,
but not significantly so.

I have used page:http_request:path to get a hold of the path,
and do pattern matching on that to decide what goes in the footer
and header.  

This works but, for pages that I call as a result
of execute_dynamic_page "xxx.html" 
the URL is very mangled and my pattern match fails to find "xxx.html" there.

I also didn't understand what you said about using method instead of execute_dynamic_page
to pass parameters.  Say I have a page show_details.html that I need
to show after a button or icon is pressed, but before switching to it I need to do
some processing.  So what I do is to the processing and call execute_dynamic_page

button
  # do stuff
  execute_dynamic_page "show_details.html"

I have show_details which must receive an ID as an argument.
What I do right now is use a temporary svar variable to hold this argument.
Are you suggesting a better way with the method ?  Are you suggesting 
that the whole body of show_details.page should go into a method,
and in the show_details.page I should merely invoke it ?
In this case, development of such .page is difficult because
I have to restart the web server everytime I make a change, since
the method will be in a .pli.

Thanks,
Boris
Message posted by cyril.checroun on 2005/09/23 07:37:06
As far as I know, you can use a method directly in your .page (at least during
the developpement, so that you do not need to restart your server) :

method page show_details id
  arg HtmlPage page ; arg Str id
  implicit page
    # here your previous show_details.page

...

button "button name"
  # do stuff
  show_details your_id
Message posted by maybe Boris Reitman on 2005/10/01 04:11:52
putting implicit page there doesn't work when we are in .page
it says ambiguous.
Message posted by cyril.checroun on 2005/10/01 06:14:33
That's right, you only need "implicit page" in .pli ; the method works without
it in .page.
Message posted by maybe Boris Reitman on 2005/10/01 13:43:03
Still no answer on the first past of my question, that to do with 
page:http_request:path 
Message posted by hubert.tonneau on 2005/10/01 16:04:56
You have to provide samples. The path of the caller, the path of the called
page, what you get in 'http_request:path', what you expect, etc.

There is also a 'file_name' filed in HtmlPage that tells you precisely the
path of the .page being executed (the called page in your case) whereas
'http_request:path' remains the path of the HTTP request, so of the caller.
Message posted by maybe Boris Reitman on 2005/10/01 20:12:09
Basically, I would like to communicate somehow to the header and footer some parameters,
from a .page that they are decorating.

I have in country.page a button which after being pressed invokes 
with execute_dynamic_page page flowerinter.page

inside flowerinter.page i include module local.style
inside which I declare site wide the header and footer using tags.

i would like to make an exception for some pages in these header and footer
and not display certain things.

As you see below function draw_left that shows a side menu
disables itself if we are on a page that shouldn't have the side menu.

--- local.style ----
method p sf_needs_sides -> bool
  arg_r HtmlPage p ; arg Bool bool
  var Str path := p:http_request path
  if (p:file_name search "flowerinter" -1) <> -1
    bool := false
  else
    bool := true

method p draw_left
  arg_rw HtmlPage p
  if p:sf_needs_sides
    var Str subcategory := p:options option "subcategory" Str
    p show_flower_catalog_menu subcategory

...
style_setup
  tag_html page_header
    main_headline
    write "<TABLE border=0 valign=top width=[dq]100%[dq]>"
    write "<TD valign=top align=left width=[dq]15%[dq]>"
    draw_left
    write "</TD> <TD valign=top width=[dq]100%[dq]>"
    center
      nav_menu
    html "<TABLE border=0 class=[dq]table_centre[dq] background=[dq]/images/background_lena.png[dq]> <TR> <TD valign=[dq]top[dq]>"
...
--------


Message posted by hubert.tonneau on 2005/10/01 20:29:57
You might try something like this.

at the beginning of your .page:

style
  # this bloc will be executed before the style setup code is executed
  options += " no_display"

in your .style

style_setup
  tag_html page_header
    if not (options option "no_display")
      ...
Message posted by maybe Boris Reitman on 2005/10/01 20:59:09
Same thing happens, when I invoke the page directly, indeed,
the no_display is added to the options and everything works correctly.

However, if I call it from country.page using execute_dynamic_page
it renders the header and footer before it gets to the dynamic page
flowersinter.*

the only choice i have it seems is to duplicate local.style and call
it local_empty.style and use it instead in select pages such as flowerinter.page
Message posted by maybe Boris Reitman on 2005/10/01 21:29:14
no, even this doesn't seem to work!
When I use execute_dynamic_page, instead of the page_header and page_footer
tags defined in local_empty.style whith is included in flowerinter.page
it executes the header and footer tags defined in local.style included
in country page. Here is a sample structure,

-- country.page -- 
module "local.style"

...
button "view international"
  execute_dynamic_page 'flowerinter.html'
---------------------

and,

--- flowerinter.page --- 
module "local_empty.style"

...
------------------------

so when I access flowerinter.page by clicking the button "view international"
i see the style of local.style and not of local_empty.style

accessing flowerinter.page directly works ok.
Message posted by hubert.tonneau on 2005/10/01 21:38:34
In a .page, you should not use:
module "local_empty.style"
But rather:
style "local_empty.style"
The difference beeing that 'style' also instructs to execute early the
'style_setup' code of the selected style.

Now, 'execute_dynamic_page' is not intended to care about the style of the
called page. The style of the caller is applied and this is a feature.
Message posted by hubert.tonneau on 2005/10/01 21:41:52
If you replace:
button "view international"
  execute_dynamic_page "flowerinter.html"
with:
button "view international"
  goto_url "flowerinter.html"
then 'flowerinter' will fully apply, because the browser will be instructed
to restart it's request on the right URL.
Message posted by maybe Boris Reitman on 2005/10/04 22:01:03
Thanks that worked.

Can I use this style option trick in the pliant server Sites configuration,
in order to control header and footer based on the domain name of the site ? 

for example, for english.mysite.com i would configure,

style
  # this bloc will be executed before the style setup code is executed
  options += " english_version"

and for french.mysite.com i would set the corresponding french option.
Both sites will point the the same root directory.

Also, if I forgot the admin password for the pliant server, how can I reset
it or recover it ? 

Thanks,
Boris
Message posted by hubert.tonneau on 2005/10/05 08:43:24
Instead of using 'options' (the dirty way), just now try to use the proper
way:
declare your own style, with a new tag and enough attributs to describe all
alternatives on your site. Use 'tag_protototype' to do so.

Now, you can both changes tags in a 'style' bloc at the top of one of your .page
or use 'Style options' field in 'configure' 'sites' (Pliant HTTP server
configuration page)