X-Cart: shopping cart software

X-Cart forums (https://forum.x-cart.com/index.php)
-   Changing design (https://forum.x-cart.com/forumdisplay.php?f=51)
-   -   Products.tpl - What is safe to get rid of? (https://forum.x-cart.com/showthread.php?t=21730)

Grant 05-12-2006 03:12 AM

Products.tpl - What is safe to get rid of?
 
I want to take my products.tpl file from THIS to something like THIS.

I need to know what I HAVE to keep in the template file to ensure the store stills runs properly. There seems to be a lot of stuff in the original .tpl file that may not be needed. I guess an explaination of what each piece of code does is what i'm after really.

This is my products.tpl file

Quote:

{* $Id: products.tpl,v 1.45.2.17 2006/02/27 08:53:50 svowl Exp $ *}
{if $active_modules.Feature_Comparison ne '' && $products && $printable ne 'Y'}
{include file="modules/Feature_Comparison/compare_selected_button.tpl"}
{include file="modules/Feature_Comparison/products_check_js.tpl"}
{/if}
{*** WebsiteCM Custom Category Templates mod - start ***}
{if $categorytpl ne ""}
{include file="customer/main/$categorytpl" product=$product}
{else}
{*** WebsiteCM Custom Category Templates mod - end ***}
{if $usertype eq "C" and $config.Appearance.products_per_row ne "" and $config.Appearance.products_per_row gt 0 and $config.Appearance.products_per_row lt 4 and ($featured eq "Y" or $config.Appearance.featured_only_multicolumn eq "N")}
{include file="customer/main/products_t.tpl" products=$products}
{else}
{if $products}
{section name=product loop=$products}
{assign var="discount" value=0}
<TABLE border="0" width="100%">
<TR>
<TD width="90" align="center" valign="top">
{if $active_modules.Special_Offers ne "" and $products[product].have_offers}
{include file="modules/Special_Offers/customer/product_offer_thumb.tpl" product=$products[product]}
{$lng.lbl_see_details}
{else}
<A href="product.php?productid={$products[product].productid}&cat={$cat}&page={$navigation_page}{if $featured eq 'Y'}&featured{/if}">{include file="product_thumbnail.tpl" productid=$products[product].productid image_x=$config.Appearance.thumbnail_width product=$products[product].product tmbn_url=$products[product].tmbn_url}
{$lng.lbl_see_details}</A>
{/if}
{if $active_modules.Feature_Comparison ne '' && $products[product].fclassid > 0 && $printable ne 'Y'}




{include file="modules/Feature_Comparison/compare_checkbox.tpl" id=$products[product].productid}
{/if}
</TD>
<TD valign="top">
<FONT class="ProductTitle">{$products[product].product}</FONT>


{$lng.lbl_sku}: {$products[product].productcode}
<FONT size="1">




{$products[product].descr|truncate:300:"...":true}


</FONT>
<HR size="1" noshade width="100%" align="left">
{if $products[product].product_type eq "C"}
{include file="buttons/details.tpl" href="product.php?productid=`$products[product].productid`&cat=`$cat`&page=`$navigation_page`"}
{else}
{if $active_modules.Subscriptions ne "" and ($products[product].catalogprice gt 0 or $products[product].sub_priceplan gt 0)}
{include file="modules/Subscriptions/subscription_info_inlist.tpl"}
{else}
{if $products[product].taxed_price ne 0}
{if $products[product].list_price gt 0 and $products[product].taxed_price lt $products[product].list_price}
{math equation="100-(price/lprice)*100" price=$products[product].taxed_price lprice=$products[product].list_price format="%3.0f" assign=discount}
{if $discount gt 0}
<FONT class="MarketPrice">{$lng.lbl_market_price}: <S>
{include file="currency.tpl" value=$products[product].list_price}
</S></FONT>

{/if}
{/if}
{if $active_modules.Special_Offers ne "" and $products[product].use_special_price ne ""}
<S>
{/if}
<FONT class="ProductPrice">{$lng.lbl_our_price}: {include file="currency.tpl" value=$products[product].taxed_price}</FONT><FONT class="MarketPrice">{include file="customer/main/alter_currency_value.tpl" alter_currency_value=$products[product].taxed_price}</FONT>{if $discount gt 0}{if $config.General.alter_currency_symbol ne ""}, {/if}{$lng.lbl_save_price} {$discount}%{/if}
{if $active_modules.Special_Offers ne "" and $products[product].use_special_price ne ""}
</S>
{/if}
{if $products[product].taxes}


<TABLE border="0">
<TR>
<TD>[img]{$ImagesDir}/spacer.gif[/img]</TD>
<TD>{include file="customer/main/taxed_price.tpl" taxes=$products[product].taxes}</TD>
</TR>
</TABLE>
{/if}
{if $active_modules.Special_Offers ne "" and $products[product].use_special_price ne ""}
{include file="modules/Special_Offers/customer/product_special_price.tpl" product=$products[product]}
{/if}
{else}
<FONT class="ProductPrice">{$lng.lbl_enter_your_price}</FONT>
{/if}
{/if}
{if $usertype eq "C" and $config.Appearance.buynow_button_enabled eq "Y"}
{include file="customer/main/buy_now.tpl" product=$products[product]}
{/if}
{/if}
</TD></TR>
</TABLE>






{/section}
{if $active_modules.Feature_Comparison ne '' && $products && $printable ne 'Y'}
{include file="modules/Feature_Comparison/compare_selected_button.tpl"}
{/if}
{else}
{$lng.txt_no_products_found}
{/if}
{/if}
{*** WebsiteCM Custom Category Templates mod - start ***}
{/if}
{*** WebsiteCM Custom Category Templates mod - end ***}

Any help would be greatly appreciated before I start to rush in there like a bull in a china shop ;)

balinor 05-12-2006 03:20 AM

That is a lot to ask :) Why not just try commenting out one piece at a time until you get where you want to go? Make a backup first.

Grant 05-12-2006 03:28 AM

Quote:

Originally Posted by balinor
That is a lot to ask :) Why not just try commenting out one piece at a time until you get where you want to go? Make a backup first.


Haha, yeah sorry I know it is.

Ok so commenting out? I know i've seen this before but I can't remember what you have to do. Is it [**] or something before everyline you want to lose?

Grant 05-12-2006 03:31 AM

Ok 1 question then 8)

What part of that code is pulling the 'short description' from the product info?

Is it ;

{$products[product].descr|truncate:300:"...":true}

?

And if so - is it possible to add html (ie a clickable image) in the short description field or is it text only?

balinor 05-12-2006 03:34 AM

Yes, that is it. To comment it out, you would do this:

{* {$products[product].descr|truncate:300:"...":true} *}

And yes, the description fields accept html

Grant 05-12-2006 03:40 AM

Quote:

Originally Posted by balinor
Yes, that is it. To comment it out, you would do this:

{* {$products[product].descr|truncate:300:"...":true} *}

And yes, the description fields accept html


Big up B :)

This is gonna be easier than I thought.
When I've done it i'll up the code in case anybody else is ever looking for the same thing :)

Zaja 05-12-2006 08:27 AM

Grant, do you feel lucky today? :D

Replace products.tpl code with this:
Code:

{* $Id: products.tpl,v 1.45.2.17 2006/04/21 08:53:50 svowl Exp $ *}
{if $usertype eq "C" and $config.Appearance.products_per_row ne "" and $config.Appearance.products_per_row gt 0 and $config.Appearance.products_per_row lt 4 and ($featured eq "Y" or $config.Appearance.featured_only_multicolumn eq "N")}
{include file="customer/main/products_t.tpl" products=$products}
{else}
{if $products}
{section name=product loop=$products}
{assign var="discount" value=0}
<table border="0" cellpadding="5" cellspacing="1" width="100%">
<tr style="background-color:{cycle values="#eee,#fff};">
<td style="width:300px;">
<font class="ProductTitle">{$products[product].product}</font>
</td>
<td>
{if $products[product].product_type eq "C"}
{include file="buttons/details.tpl" href="product.php?productid=`$products[product].productid`&cat=`$cat`&page=`$navigation_page`"}
{else}
{if $active_modules.Subscriptions ne "" and ($products[product].catalogprice gt 0 or $products[product].sub_priceplan gt 0)}
{include file="modules/Subscriptions/subscription_info_inlist.tpl"}
{else}
{if $products[product].taxed_price ne 0}
<font class="ProductPrice">{include file="currency.tpl" value=$products[product].taxed_price}</font>
{/if}
{/if}
</td>
<td style="text-align:right;width:110px;">
{if $usertype eq "C" and $config.Appearance.buynow_button_enabled eq "Y"}
<form style="margin:0;" name="orderform_{$products[product].productid}_{$products[product].add_date}" method="post" action="cart.php?mode=add">
<input type="hidden" name="productid" value="{$products[product].productid}">
<input type="hidden" name="cat" value="{$smarty.get.cat|escape:"html"}">
<input type="hidden" name="page" value="{$smarty.get.page|escape:"html"}">
<input type="hidden" name="amount" value="1">
<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
</form>
{/if}
</td>
{/if}
</tr>
</table>
{/section}
{else}
{$lng.txt_no_products_found}
{/if}
{/if}


Grant 05-12-2006 09:51 AM

Zaja - you are a LEGEND!

Thank you so much brother - that works beautifully :)

I have a little problem though - after speaking with Jon at websitecm it turns out that I have to be using skin1/customer/main/products_t.tpl and NOT skin1/customer/main/products.tpl

Now i've had a look inside products_t.tpl and had a play around and boy is that one confusing page of code!

Could the code you have written here be used in the products_t.tpl file also? And where would I place it? Because everytime i've tried to edit it at all I get all kinds of math errors and smarty parse errors.

Ideally i'm trying to go from this : (which is the basic 1 column product_t.tpl with the buy button activated)

http://www.wyzeshop.com/1st.jpg

To something like this :

http://www.wyzeshop.com/2nd.jpg

Thanks again for hooking up that code man :)

Zaja 05-12-2006 11:23 AM

Well....you need a full customization of product listing! ](*,)

It may be better to look into the "Professional Help Services - Requests" forum, there you can find users(like Ryan, TelaFirma, Boomer, Jon, Carrie ... ) that can do it for you with a reasonable fee.

Grant 05-12-2006 01:29 PM

Quote:

Originally Posted by Zaja
Well....you need a full customization of product listing! ](*,)

It may be better to look into the "Professional Help Services - Requests" forum, there you can find users(like Ryan, TelaFirma, Boomer, Jon, Carrie ... ) that can do it for you with a reasonable fee.


:( Thats what I have slowly started to realise.

So the code you pasted earlier can't just be thrown into products_t.tpl then?

Anyone have any idea what kind of dollar am I gonna be looking at for something like this?

Grant 05-15-2006 08:33 AM

Ok I've sorted it out now. I'm using multiple templates for both products and catergories. Here is the products_t.tpl I played around with below just in case it's at all useful to anybody else and a little screen shot of how it renders.

http://www.wyzeshop.com/screenshot5.jpg

Quote:

{* $Id: products_t.tpl,v 1.10.2.12 2006/02/27 08:53:50 svowl Exp $ *}
<TABLE border="0" width="100%" cellpadding="0" cellspacing="0"><TR><TD class="TableThumbnailBorder">

<TABLE border="0" width="100%" cellpadding="5" cellspacing="1">

{math equation="floor(100/x)" x=$config.Appearance.products_per_row assign="width"}

{section name=product loop=$products}
{assign var="discount" value=0}

{if %product.index% is div by $config.Appearance.products_per_row}
<TR>
{assign var="cell_counter" value=0}
{/if}

{math equation="x+1" x=$cell_counter assign="cell_counter" }

<TD align="center" valign="top" width="{$width}%" class="DialogBox">
<TABLE cellpadding="3" cellspacing="0" border="0" height="120">
<TR>
<TD height="100" width="60"> <A href="product.php?productid={$products[product].productid}&cat={$cat}&page={$navigation_page}">{i nclude
file="product_thumbnail.tpl" productid=$products[product].productid
image_x=$config.Appearance.thumbnail_width product=$products[product].product
tmbn_url=$products[product].tmbn_url}</A>
</TD>
<TD width="439">{$products[product].product}

{$lng.lbl_sku}: {$products[product].productcode}

{if $active_modules.Special_Offers ne "" and $products[product].have_offers}
{include file="modules/Special_Offers/customer/product_offer_thumb.tpl"
product=$products[product]} {else}{/if} {if $products[product].product_type
ne "C"} </TD>
<TD width="150">{if $active_modules.Subscriptions ne "" and ($products[product].catalogprice
gt 0 or $products[product].sub_priceplan gt 0)} {include file="modules/Subscriptions/subscription_info_inlist.tpl"}
{else} {if $products[product].taxed_price ne 0} {if $products[product].list_price
gt 0 and $products[product].taxed_price lt $products[product].list_price}
{math equation="100-(price/lprice)*100" price=$products[product].taxed_price
lprice=$products[product].list_price format="%3.0f" assign=discount}
{if $discount gt 0} <FONT class="MarketPrice">{$lng.lbl_market_price}:
<S> {include file="currency.tpl" value=$products[product].list_price}
</S></FONT>

{/if} {/if} <FONT class="ProductPrice">{include file="currency.tpl"
value=$products[product].taxed_price}</FONT><FONT class="MarketPrice">{include
file="customer/main/alter_currency_value.tpl" alter_currency_value=$products[product].taxed_price}</FONT>{if
$discount gt 0}{if $config.General.alter_currency_symbol ne
""}, {/if}{$lng.lbl_save_price} {$discount}%{/if} {if $products[product].taxes}

{include file="customer/main/taxed_price.tpl" taxes=$products[product].taxes}{/if}
{else} <FONT class="ProductPrice">{$lng.lbl_enter_your_price}</FONT>
{/if} {/if} {if $active_modules.Feature_Comparison ne '' &&
$products[product].fclassid > 0}

{include file="modules/Feature_Comparison/compare_checkbox.tpl"
id=$products[product].productid} {/if}</TD>
<TD width="100">{if $usertype eq "C" and $config.Appearance.buynow_button_enabled
eq "Y"}
<form style="margin:0;" name="orderform_{$products[product].productid}_{$products[product].add_date}" method="post" action="cart.php?mode=add">
<input type="hidden" name="productid2" value="{$products[product].productid}">
<input type="hidden" name="cat2" value="{$smarty.get.cat|escape:"html"}">
<input type="hidden" name="page2" value="{$smarty.get.page|escape:"html"}">
<input type="hidden" name="amount2" value="1">
<input name="button" type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
</form>
{/if}</TD>
</TR>
</TABLE>

{/if} </TD>

{capture name=prod_index}
{math equation="index+x+1" index=%product.index% x=$config.Appearance.products_per_row}
{/capture}
{if $smarty.capture.prod_index is div by $config.Appearance.products_per_row }
</TR>
{/if}

{/section}

{if $cell_counter lt $config.Appearance.products_per_row}
{section name=rest_cells loop=$config.Appearance.products_per_row start=$cell_counter}
<TD class="DialogBox"></TD>
{/section}
</TR>
{/if}

</TABLE>
</TD></TR></TABLE>
{if $active_modules.Feature_Comparison ne '' && $products && $printable ne 'Y'}
{include file="modules/Feature_Comparison/compare_selected_button.tpl"}
{/if}


Grant 05-16-2006 08:51 AM

Zaja,

The code you so generously supplied is working like a charm, again thank you so much. But I have a little problem with it that I can't figure out. I'm sure it's a simple one - well I hope it's a simple one ;)

The 'add to cart' button displays in product listings even if the item is out of stock. Is there a simple fix for this?

Cheers,

G

Quote:

Originally Posted by Zaja
Grant, do you feel lucky today? :D

Replace products.tpl code with this:
Code:

{* $Id: products.tpl,v 1.45.2.17 2006/04/21 08:53:50 svowl Exp $ *}
{if $usertype eq "C" and $config.Appearance.products_per_row ne "" and $config.Appearance.products_per_row gt 0 and $config.Appearance.products_per_row lt 4 and ($featured eq "Y" or $config.Appearance.featured_only_multicolumn eq "N")}
{include file="customer/main/products_t.tpl" products=$products}
{else}
{if $products}
{section name=product loop=$products}
{assign var="discount" value=0}
<table border="0" cellpadding="5" cellspacing="1" width="100%">
<tr style="background-color:{cycle values="#eee,#fff};">
<td style="width:300px;">
<font class="ProductTitle">{$products[product].product}</font>
</td>
<td>
{if $products[product].product_type eq "C"}
{include file="buttons/details.tpl" href="product.php?productid=`$products[product].productid`&cat=`$cat`&page=`$navigation_page`"}
{else}
{if $active_modules.Subscriptions ne "" and ($products[product].catalogprice gt 0 or $products[product].sub_priceplan gt 0)}
{include file="modules/Subscriptions/subscription_info_inlist.tpl"}
{else}
{if $products[product].taxed_price ne 0}
<font class="ProductPrice">{include file="currency.tpl" value=$products[product].taxed_price}</font>
{/if}
{/if}
</td>
<td style="text-align:right;width:110px;">
{if $usertype eq "C" and $config.Appearance.buynow_button_enabled eq "Y"}
<form style="margin:0;" name="orderform_{$products[product].productid}_{$products[product].add_date}" method="post" action="cart.php?mode=add">
<input type="hidden" name="productid" value="{$products[product].productid}">
<input type="hidden" name="cat" value="{$smarty.get.cat|escape:"html"}">
<input type="hidden" name="page" value="{$smarty.get.page|escape:"html"}">
<input type="hidden" name="amount" value="1">
<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
</form>
{/if}
</td>
{/if}
</tr>
</table>
{/section}
{else}
{$lng.txt_no_products_found}
{/if}
{/if}



Zaja 05-16-2006 09:26 AM

Try to replace:
Code:

<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
with(not tested):
Code:

{if $product.avail gt 0}
<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
{else}
{$lng.txt_out_of_stock}
{/if}


Grant 05-16-2006 09:41 AM

Quote:

Originally Posted by Zaja
Try to replace:
Code:

<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
with(not tested):
Code:

{if $config.General.unlimited_products ne "Y" and ($product.avail le 0 or $product.avail lt $product.min_amount)}
{$lng.txt_out_of_stock}
{else}
<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
{/if}



Oooppps! Now everything is out of stock?

Zaja 05-16-2006 09:46 AM

I have changed the code, try again please.

Grant 05-16-2006 09:56 AM

Nope still out of stock?

Just in case i'm being a spaz here is my products_t.tpl

Quote:

{* $Id: products_t.tpl,v 1.10.2.12 2006/02/27 08:53:50 svowl Exp $ *}
<TABLE border="0" width="100%" cellpadding="0" cellspacing="0"><TR><TD class="TableThumbnailBorder">

<TABLE border="0" width="100%" cellpadding="3" cellspacing="1">

{math equation="floor(100/x)" x=$config.Appearance.products_per_row assign="width"}

{section name=product loop=$products}
{assign var="discount" value=0}

{if %product.index% is div by $config.Appearance.products_per_row}
<TR>
{assign var="cell_counter" value=0}
{/if}

{math equation="x+1" x=$cell_counter assign="cell_counter" }

<TD align="center" valign="top" width="{$width}%" class="DialogBox">
<TABLE cellpadding="3" cellspacing="0" border="0" height="55">
<TR>
<TD height="50" width="60"> <A href="product.php?productid={$products[product].productid}&cat={$cat}&page={$navigation_page}">{i nclude
file="product_thumbnail.tpl" productid=$products[product].productid
image_x=$config.Appearance.thumbnail_width product=$products[product].product
tmbn_url=$products[product].tmbn_url}</A>
</TD>
<TD width="439">{$products[product].product}

{$lng.lbl_sku}: {$products[product].productcode}

{if $active_modules.Special_Offers ne "" and $products[product].have_offers}
{include file="modules/Special_Offers/customer/product_offer_thumb.tpl"
product=$products[product]} {else}{/if} {if $products[product].product_type
ne "C"} </TD>
<TD width="60"><div align="center">{if $active_modules.Subscriptions
ne "" and ($products[product].catalogprice gt 0 or $products[product].sub_priceplan
gt 0)} {include file="modules/Subscriptions/subscription_info_inlist.tpl"}
{else} {if $products[product].taxed_price ne 0} {if $products[product].list_price
gt 0 and $products[product].taxed_price lt $products[product].list_price}
{math equation="100-(price/lprice)*100" price=$products[product].taxed_price
lprice=$products[product].list_price format="%3.0f" assign=discount}
{if $discount gt 0} <FONT class="MarketPrice">{$lng.lbl_market_price}:
<S> {include file="currency.tpl" value=$products[product].list_price}
</S></FONT>

{/if} {/if} <FONT class="ProductPrice">{include file="currency.tpl"
value=$products[product].taxed_price}</FONT><FONT class="MarketPrice">

<font size="1" face="Geneva, Arial, Helvetica, sans-serif">{include
file="customer/main/alter_currency_value.tpl" alter_currency_value=$products[product].taxed_price}</font>
</FONT><font size="1" face="Geneva, Arial, Helvetica, sans-serif">{if
$discount gt 0}{if $config.General.alter_currency_symbol ne
""}, {/if}</font>
{$lng.lbl_save_price} {$discount}%{/if}
{/if} {/if} {if $active_modules.Feature_Comparison ne '' &&
$products[product].fclassid > 0}

{include file="modules/Feature_Comparison/compare_checkbox.tpl"
id=$products[product].productid} {/if}</div></TD>
<TD width="100">{if $usertype eq "C" and $config.Appearance.buynow_button_enabled
eq "Y"}
<form style="margin:0;" name="orderform_{$products[product].productid}_{$products[product].add_date}" method="post" action="cart.php?mode=add">
<input type="hidden" name="productid" value="{$products[product].productid}">
<input type="hidden" name="cat" value="{$smarty.get.cat|escape:"html"}">
<input type="hidden" name="page" value="{$smarty.get.page|escape:"html"}">
<input type="hidden" name="amount" value="1">
{if $product.avail gt 0}
<input type="button" value="{$lng.lbl_add_to_cart}" onclick="document.orderform_{$products[product].productid}_{$products[product].add_date}.submit();">
{else}
{$lng.txt_out_of_stock}
{/if}
</form>

{/if}</TD>
</TR>
</TABLE>{/if}</TD>
{capture name=prod_index}
{math equation="index+x+1" index=%product.index% x=$config.Appearance.products_per_row}
{/capture}
{if $smarty.capture.prod_index is div by $config.Appearance.products_per_row }
</TR>
{/if}
{/section}
{if $cell_counter lt $config.Appearance.products_per_row}
{section name=rest_cells loop=$config.Appearance.products_per_row start=$cell_counter}
<TD class="DialogBox" height="29"></TD>
{/section}
</TR>
{/if}
</TABLE>
</TD></TR></TABLE>
{if $active_modules.Feature_Comparison ne '' && $products && $printable ne 'Y'}
{include file="modules/Feature_Comparison/compare_selected_button.tpl"}
{/if}

Zaja 05-16-2006 10:03 AM

fixed, replace(in products.tpl):
Code:

{if $product.avail gt 0}
with:
Code:

{if $products[product].avail gt 0}

Grant 05-16-2006 10:06 AM

You are officially THE man! 8)

It be workin' harder than a $5 hooker...

Thanks so much bro ;)

Zaja 05-16-2006 10:10 AM

Quote:

Originally Posted by Grant
You are officially THE man! 8)

It be workin' harder than a $5 hooker...


8) :mrgreen: :wink: :)

Grant 05-16-2006 10:12 AM

I don't wanna take the piss but would you also know the code for placing a form button that is linked to 'show product details'?

As i'm using custom templates I have different things set up all over the place. I'm having a problem as everything that is searched for displays using the same template containing the 'add to cart' button when some products require the customer to select options before hitting the buy button.

I just want to replace the 'add to cart' button with a 'show details' button for the cat listings pulled from a search.


All times are GMT -8. The time now is 10:11 AM.

Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.