Opisy parametryczne
Opisy parametryczne dają możliwość opracowania w ramach jednorodnej bazy danych różnych schematów opisu cech produktu.
Dobrym przykładem zastosowania tego mechanizmu jest baza produktów w sklepie komputerowym - poszczególne grupy elementów powinny być opisane wg różnych ale jednak stałych wzorców - monitor: rozdzielczość, pobór mocy, czas reakcji, jasność itp; karta graficzna: procesor, częstotliwość taktowania, pamięć podręczna itd - mimo tych różnic w strukturze opisu baza produktów powinna być wspólna - tu pomocne jest zastosowanie opisów parametrycznych w systemie Actualizer CMS.
Edycja szablonu

Edycja parametrów

Implementacja opisów parametrycznych
Aby powiązać opis parametryczny z bazą zdefiniowaną w systemie należy w strukturze bazy dodać pole o typie:- opis parametryczny [params]
- w polu "Opcje dodatkowe" wpisujemy nazwę pola opisującego rekord w "tej" tabeli (np "nazwa")
Opisy parametryczne od strony frot-endu są obsługiwane przez moduł xBase.
Przykład szablonu generującego tabelę z opisem parametrycznym przy wskazaniu na dany rekord:
{if count($mod.xbase.details.params.value.parameters)>0}
<table class="parameters">
<caption>Parametry produktu</caption>
<tbody>
{foreach item=ipar key=kpar name="par" from=$mod.xbase.details.params.value.parameters}
{if $ipar.node}
<tr{if $smarty.foreach.par.first}class="first-par"{/if}><td colspan="2" class="param param-head">{$ipar.name}</td></tr>
{else}
<tr class="{if $ipar.level}subparam{elseif $smarty.foreach.par.first}first-par{/if}"><td class="param">{$ipar.name}</td><td>
{foreach item=ival key=kval from=$item.params.value.values.$kpar}
{$ival}<br>
{/foreach}
</td></tr>
{/if}
{/foreach}
</tbody>
</table>
{/if}
<table class="parameters">
<caption>Parametry produktu</caption>
<tbody>
{foreach item=ipar key=kpar name="par" from=$mod.xbase.details.params.value.parameters}
{if $ipar.node}
<tr{if $smarty.foreach.par.first}class="first-par"{/if}><td colspan="2" class="param param-head">{$ipar.name}</td></tr>
{else}
<tr class="{if $ipar.level}subparam{elseif $smarty.foreach.par.first}first-par{/if}"><td class="param">{$ipar.name}</td><td>
{foreach item=ival key=kval from=$item.params.value.values.$kpar}
{$ival}<br>
{/foreach}
</td></tr>
{/if}
{/foreach}
</tbody>
</table>
{/if}
Kod CSS do powyższego przykładu:
table.parameters {
margin: 10px 0;
border-collapse: 0;
border-spacing: 0;
border: 0;
padding: 5px;
border: 1px #f94 solid;
}
table.parameters caption {
margin-top: 10px;
text-align: left;
color: #f82;
}
table.parameters td {
border-top: 1px #aaa dashed;
padding: 3px 15px 3px 0;
vertical-align: top;
}
table.parameters td.param {
font-weight: bold;
background: url(/img/library/markers/sq_arr.gif) 1px 3px no-repeat;
padding-left: 20px;
}
table.parameters tr.subparam td.param {
background-image: none;
padding-left: 20px;
font-weight: normal;
}
table.parameters tr.subparam td {
border-top: 1px #eee solid;
padding: 2px 15px 2px 0;
}
table.parameters tr.first-par td {
border-top: 0;
}
margin: 10px 0;
border-collapse: 0;
border-spacing: 0;
border: 0;
padding: 5px;
border: 1px #f94 solid;
}
table.parameters caption {
margin-top: 10px;
text-align: left;
color: #f82;
}
table.parameters td {
border-top: 1px #aaa dashed;
padding: 3px 15px 3px 0;
vertical-align: top;
}
table.parameters td.param {
font-weight: bold;
background: url(/img/library/markers/sq_arr.gif) 1px 3px no-repeat;
padding-left: 20px;
}
table.parameters tr.subparam td.param {
background-image: none;
padding-left: 20px;
font-weight: normal;
}
table.parameters tr.subparam td {
border-top: 1px #eee solid;
padding: 2px 15px 2px 0;
}
table.parameters tr.first-par td {
border-top: 0;
}
Filtrowanie wg parametrów.
Kolekcja wartości i parametrów dla formularza filtrowania pobierana jest przez moduł pvalues - należy go dodać jako moduł nieobiektowy, np. jako moduł doklejony do instancji modułu xBase, który obsługuje listę produktów

Szablon formularza filtrowania wg parametrów (wymaga jQuery, dodatkowo uwzględnia pola "Producent - lista w $mod.prods i cena"):
{if $mod.pvalues}
<script type="text/javascript">
var url_pvid = [{$smarty.get.pvid|replace:'-':','}];
var url_producent = [{$smarty.get.eq.producent|intval}];
var url_pvint = {literal}{}{/literal};
{if $smarty.get.pvint}
{foreach item=i key=k from=$smarty.get.pvint}
url_pvint[{$k}] = '{$i}';
{/foreach}
{/if}
{literal}
$(document).ready( function(){
if (url_pvid.length > 0) {
$('select.pvselect').each(function() {
var a,i;
//alert(this.options.length);
for (a = 0; a < this.options.length; ++a) {
if (this.options[a].value && array_search(this.options[a].value,url_pvid)) {
//this.value = this.options[a].value;
this.selectedIndex = a;
break;
}
}
});
}
for(a in url_pvint) {
$('select.pvselect[name='+a+']').val(url_pvint[a])
}
});
function pvfilter(c) {
var pvid = '';
var pvint = '';
var pvsep = '';
var sep = '';
$('select.pvselect').each(function() {
if (this.value) {
if (this.value.indexOf('t') != -1) {
pvint += sep + 'pvint-'+this.name+','+this.value
sep = ',';
}
else {
pvid += pvsep + this.value;
pvsep = '-';
}
}
});
if (pvid != '') pvid = 'pvid,'+pvid;
// Producent
var prd = $('select[name=producent]').val();
if (prd != '') pvid += (pvid?',':'')+'eq-producent,'+prd;
// Cena
var cena = $('select[name=cena]').val();
if (cena != '') pvid += (pvid?',':'')+cena;
if (pvint != '') pvid += (pvid?',':'')+pvint;
if (pvid) {
document.location.href=c+pvid+'.html';
}
else document.location.href = c;
}
{/literal}
</script>
<form onsubmit="pvfilter('/{$category.$cat.path}/');return false;">
<fieldset id="filter">
<legend>Szukaj wg parametrów</legend>
<table>
<tr>
{foreach item=fil key=cn from=$mod.pvalues.params}
<td>{$fil} </td>
{/foreach}
<td>producent</td>
<td>cena</td>
<td rowspan="2" valign="bottom"><input type="image" src="/actualizer/img/search.gif" alt="szukaj" /></td>
</tr>
<tr>
{foreach item=fil key=cn from=$mod.pvalues.params}
<td>
<select class="pvselect" name="{$cn}">
<option value="">wszystkie</option>
{foreach item=wart key=pvid from=$mod.pvalues.values[$cn]}
<option value="{$pvid}" {if $wart == $smarty.get.eq.$cw}selected{/if}>{$wart}</option>
{/foreach}
</select>
</td>
{/foreach}
<td>
<select name="producent">
<option value="">wszyscy</option>
{foreach item=item name=prod from=$mod.prods}
<option value="{$item.id}" {if $item.id == $smarty.get.eq.producent}selected{/if}>{$item.nazwa}</option>
{/foreach}
</select>
</td>
<td>
<select name="cena">
<option value="">dowolna</option>
{foreach name=a item=lt from=$set.user_filtr_ceny}
{if $smarty.foreach.a.first}
<option value="lt-cena,{$lt}" {if $smarty.get.lt.cena == $lt} selected{/if}>< {$lt} zł</option>
{else}
<option value="gteq-cena,{$gt},lteq-cena,{$lt}" {if $smarty.get.gteq.cena == $gt} selected{/if}>{$gt} ~ {$lt} zł</option>
{/if}
{assign var=gt value=$lt}
{/foreach}
<option value="gt-cena,{$gt}" {if $smarty.get.gt.cena == $gt} selected{/if}>> {$gt} zł</option>
</select>
</td>
</tr>
</table>
</fieldset>
</form>
{/if}
<script type="text/javascript">
var url_pvid = [{$smarty.get.pvid|replace:'-':','}];
var url_producent = [{$smarty.get.eq.producent|intval}];
var url_pvint = {literal}{}{/literal};
{if $smarty.get.pvint}
{foreach item=i key=k from=$smarty.get.pvint}
url_pvint[{$k}] = '{$i}';
{/foreach}
{/if}
{literal}
$(document).ready( function(){
if (url_pvid.length > 0) {
$('select.pvselect').each(function() {
var a,i;
//alert(this.options.length);
for (a = 0; a < this.options.length; ++a) {
if (this.options[a].value && array_search(this.options[a].value,url_pvid)) {
//this.value = this.options[a].value;
this.selectedIndex = a;
break;
}
}
});
}
for(a in url_pvint) {
$('select.pvselect[name='+a+']').val(url_pvint[a])
}
});
function pvfilter(c) {
var pvid = '';
var pvint = '';
var pvsep = '';
var sep = '';
$('select.pvselect').each(function() {
if (this.value) {
if (this.value.indexOf('t') != -1) {
pvint += sep + 'pvint-'+this.name+','+this.value
sep = ',';
}
else {
pvid += pvsep + this.value;
pvsep = '-';
}
}
});
if (pvid != '') pvid = 'pvid,'+pvid;
// Producent
var prd = $('select[name=producent]').val();
if (prd != '') pvid += (pvid?',':'')+'eq-producent,'+prd;
// Cena
var cena = $('select[name=cena]').val();
if (cena != '') pvid += (pvid?',':'')+cena;
if (pvint != '') pvid += (pvid?',':'')+pvint;
if (pvid) {
document.location.href=c+pvid+'.html';
}
else document.location.href = c;
}
{/literal}
</script>
<form onsubmit="pvfilter('/{$category.$cat.path}/');return false;">
<fieldset id="filter">
<legend>Szukaj wg parametrów</legend>
<table>
<tr>
{foreach item=fil key=cn from=$mod.pvalues.params}
<td>{$fil} </td>
{/foreach}
<td>producent</td>
<td>cena</td>
<td rowspan="2" valign="bottom"><input type="image" src="/actualizer/img/search.gif" alt="szukaj" /></td>
</tr>
<tr>
{foreach item=fil key=cn from=$mod.pvalues.params}
<td>
<select class="pvselect" name="{$cn}">
<option value="">wszystkie</option>
{foreach item=wart key=pvid from=$mod.pvalues.values[$cn]}
<option value="{$pvid}" {if $wart == $smarty.get.eq.$cw}selected{/if}>{$wart}</option>
{/foreach}
</select>
</td>
{/foreach}
<td>
<select name="producent">
<option value="">wszyscy</option>
{foreach item=item name=prod from=$mod.prods}
<option value="{$item.id}" {if $item.id == $smarty.get.eq.producent}selected{/if}>{$item.nazwa}</option>
{/foreach}
</select>
</td>
<td>
<select name="cena">
<option value="">dowolna</option>
{foreach name=a item=lt from=$set.user_filtr_ceny}
{if $smarty.foreach.a.first}
<option value="lt-cena,{$lt}" {if $smarty.get.lt.cena == $lt} selected{/if}>< {$lt} zł</option>
{else}
<option value="gteq-cena,{$gt},lteq-cena,{$lt}" {if $smarty.get.gteq.cena == $gt} selected{/if}>{$gt} ~ {$lt} zł</option>
{/if}
{assign var=gt value=$lt}
{/foreach}
<option value="gt-cena,{$gt}" {if $smarty.get.gt.cena == $gt} selected{/if}>> {$gt} zł</option>
</select>
</td>
</tr>
</table>
</fieldset>
</form>
{/if}