Revision 205
Date:
2012/04/06 11:27:43
Author:
ahitrov
Revision Log:
Delivery price differs according to order sum
Files:
Legend:
Added
Removed
Modified
utf8/plugins/webshop/comps/contenido/components/inputs/cost_level.msn
1
<%once>
2
3
use JSON::XS;
4
my $json = JSON::XS->new->utf8;
5
6
</%once>
7
<%args>
8
9
$name => undef
10
$rusname => undef
11
$check => undef
12
13
</%args>
14
<%init>
15
16
my $fields = $check ? $json->decode($check) : [];
17
18
$m->out('');
19
$m->out('<table width="95%" style="margin:5px 0;padding:5 6 5 6;border:1px solid #ccc;font-size:70%;font-family:Tahoma;background-color:#f5f5f5;color:#000;">');
20
$m->out('<tr bgcolor="silver" valign="top"><th width="40%"><h5 style="margin:0; padding:4px; font-size:11px; color:blue;">Порог стоимости (сумма заказа больше или равна):</h5></th>');
21
$m->out('<th width="60%"><h5 style="margin:0; padding:4px; font-size:11px; color:blue;">Стоимость доставки (% или число):</h5></th></tr>');
22
23
my $max = scalar @$fields + 2;
24
for my $i ( 1..$max ) {
25
my $rusname = "$rusname N$i";
26
my $object = $fields->[$i-1];
27
$m->comp('.field',
28
name => $name,
29
object => $object,
30
number => $i,
31
);
32
}
33
$m->out('</table>');
34
35
</%init>
36
<%def .field>
37
<%args>
38
39
$name => undef
40
$object => undef
41
$number => undef
42
43
</%args>
44
<%init>
45
</%init>
46
<tr valign="top">
47
<td><input type="text" name="<% $name.'_level_'.$number %>" value="<% (ref $object ? $object->{level} : '') |h %>" style="width:97%"></td>
48
<td><input type="text" name="<% $name.'_cost_'.$number %>" value="<% (ref $object ? $object->{cost} : '') |h %>" style="width:97%;"></td>
49
</tr>
50
</%def>
utf8/plugins/webshop/comps/contenido/components/outputs/cost_level.msn
1
<%once>
2
3
use JSON::XS;
4
my $json = JSON::XS->new;
5
6
</%once>
7
<%args>
8
9
$name => undef
10
$SETS => undef
11
12
</%args>
13
<%init>
14
15
return undef if (! ref($SETS));
16
return undef if (! $name);
17
18
my $FIELDS = {};
19
while (my ($element,$value) = each %{$SETS}) {
20
if ( $element =~ /^${name}_level_(\d+)$/ ) {
21
my $index = $1;
22
$value =~ s/^\s+//s;
23
$value =~ s/\s+$//s;
24
if ( defined $value && $value =~ /^\d+$/ ) {
25
$FIELDS->{$index}{level} = $value;
26
}
27
} elsif ( $element =~ /^${name}_cost_(\d+)$/ ) {
28
my $index = $1;
29
$value =~ s/^\s+//s;
30
$value =~ s/\s+$//s;
31
if ( defined $value && ($value =~ /^\d+$/ || $value =~ /^\d+[\.\,]\d+$/ || $value =~ /^\d+%$/) ) {
32
$value =~ s/\,/\./;
33
$FIELDS->{$index}{cost} = $value;
34
}
35
}
36
}
37
my @FIELDS = sort { int($a->{level}) <=> int($b->{level}) } grep { $_->{level} && defined $_->{cost} } values %$FIELDS;
38
return $json->encode(\@FIELDS);
39
40
</%init>
utf8/plugins/webshop/comps/contenido/webshop/index.html
38
38
<h4 align="center"><i>---- Нет документов -----</i></h4>
39
39
% }
40
40
41
42
41
</td>
43
42
<td width="1%"> </td>
44
43
</tr>
…
…
50
49
51
50
$ost => 1
52
51
$p => 1
52
$delete => undef
53
53
54
54
</%args>
55
55
<%init>
…
…
78
78
my ($status_map) = grep { $_->{attr} eq 'status' } @structure;
79
79
my ($current_status) = grep { $_->[0] == $ost } @{$status_map->{cases}};
80
80
81
my $active_rights = $m->comp('/contenido/webshop/subs/user_rights.msn');
82
if ( !$active_rights && $delete ) {
83
my $return_params = join ('&', map { $_.'='.$filter_params{$_} } grep { $_ ne 's' } keys %filter_params );
84
my %deleted;
85
while ( my ($field, $value) = each %ARGS ) {
86
if ( $field =~ /^delete_(\d+)_(\w+)$/ ) {
87
my $oid = $1;
88
my $attr = $2;
89
$deleted{$oid}{$attr} = $value;
90
}
91
}
92
my %classes = map { $_->{class} => 1 } values %deleted;
93
foreach my $delete_class ( keys %classes ) {
94
my @ids;
95
while ( my ($oid, $attr) = each %deleted) {
96
push @ids, $oid if exists $attr->{id} && $attr->{id} && ($attr->{class} eq $delete_class);
97
}
98
my @objects = $keeper->get_documents (
99
id => \@ids,
100
class => $delete_class
101
) if @ids;
102
foreach my $object ( @objects ) {
103
my $document_access = $user->section_accesses($user, $object->section);
104
next unless $document_access == 2;
105
$object->delete;
106
}
107
}
108
$m->redirect("/contenido/webshop/".($return_params ? '?'.$return_params : ''));
109
}
110
81
111
</%init>
utf8/plugins/webshop/lib/webshop/Delivery.pm
1
1
package webshop::Delivery;
2
2
3
3
use base "Contenido::Document";
4
use JSON::XS;
5
our $json = JSON::XS->new->utf8;
6
4
7
sub extra_properties
5
8
{
6
9
return (
…
…
12
15
},
13
16
{ 'attr' => 'dtime', 'hidden' => 1 },
14
17
{ 'attr' => 'price', 'type' => 'string', 'rusname' => 'Стоимость доставки (NN или NN%)', default => 0 },
18
{ 'attr' => 'price_modify', 'type' => 'cost_level', 'rusname' => 'Стоимость доставки с учетом стоимости заказа' },
15
19
{ 'attr' => 'abstr', 'type' => 'text', 'rusname' => 'Краткое описание' },
16
20
{ 'attr' => 'fields', 'type' => 'status_multi', 'rusname' => 'Поля, необходимые к заполнению',
17
21
'cases' => [
…
…
25
29
)
26
30
}
27
31
32
sub price_actual
33
{
34
my $self = shift;
35
my $sum = shift;
36
my $price = $self->price;
37
$price = defined $price && $price =~ /^\d+$/ ? $price : 0;
38
39
if ( $sum ) {
40
if ( $self->price_modify ) {
41
my $modify = $json->decode( $self->price_modify );
42
if ( ref $modify eq 'ARRAY' && @$modify ) {
43
foreach my $mod ( @$modify ) {
44
if ( $mod->{level} <= $sum ) {
45
$price = $mod->{cost};
46
}
47
}
48
}
49
}
50
return $price;
51
} else {
52
return $price;
53
}
54
}
55
28
56
sub class_name
29
57
{
30
58
return 'Способ доставки';
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.