Revision 523
Date:
2015/11/03 18:33:17
Author:
ahitrov
Revision Log:
Блок телефонов
Files:
Legend:
Added
Removed
Modified
utf8/plugins/users/comps/contenido/ajax/credential_phone_valid.html
1
<% $json %>
2
<%once>
3
4
use JSON::XS;
5
6
</%once>
7
<%args>
8
9
$id => undef
10
$phone => undef
11
12
</%args>
13
<%init>
14
15
my %result;
16
if ( $phone ) {
17
if ( $keeper->{users}->_phone_format( $phone ) ) {
18
my $phone_r = $keeper->{users}->_phone_reduction( $phone );
19
if ( $id && $id =~ /^\d+$/) {
20
my $object = $keeper->{users}->get_profile( id => $id );
21
if ( ref $object ) {
22
my ($cred) = $keeper->get_documents(
23
name => $phone_r,
24
class => 'users::Phone',
25
limit => 1,
26
);
27
if ( ref $cred && $cred->uid != $object->id ) {
28
$result{error} = 'Phone already registered for another user';
29
}
30
} else {
31
$result{error} = 'User not found';
32
}
33
} else {
34
$result{error} = 'User ID is not valid or not defined';
35
}
36
} else {
37
$result{error} = 'Phone is not valid';
38
}
39
} else {
40
$result{nothing} = 1;
41
}
42
$result{ok} = 1 unless exists $result{error} || exists $result{nothing};
43
44
my $json = encode_json \%result;
45
46
</%init>
utf8/plugins/users/comps/contenido/components/inputs/phones.msn
1
% if ( $state->{users}->use_credentials && $object->id ) {
2
<script type="text/javascript">
3
<!--
4
function check_<% $name %>_valid( nID ){
5
}
6
7
$(document).ready(function(){
8
9
% foreach my $cred ( @credentials ) {
10
$('#<% $name %>_name_<% $cred->id %>_text').focusout(function(){
11
var oPhone = $(this);
12
$.get('/contenido/ajax/credential_phone_valid.html', { 'id' : '<% $object->id %>', 'phone' : $(oPhone).val() }, function(data){
13
if ( data.error ) {
14
$('#<% $name %>_<% $cred->id %>_check').attr('title', data.error).html('<span style="color:red">Error</span>');
15
} else {
16
$('#<% $name %>_<% $cred->id %>_check').attr('title', '').html('<span style="color:green">Ok</span>');
17
}
18
}, 'json');
19
});
20
% }
21
22
$('#<% $name %>_name__text').focusout(function(){
23
var oPhone = $(this);
24
$.get('/contenido/ajax/credential_phone_valid.html', { 'id' : '<% $object->id %>', 'phone' : $(oPhone).val() }, function(data){
25
if ( data.error ) {
26
$('#<% $name %>_new_check').attr('title', data.error).html('<span style="color:red">Error</span>');
27
} else if ( data.nothing ) {
28
$('#<% $name %>_new_check').attr('title', '').html('');
29
} else {
30
$('#<% $name %>_new_check').attr('title', '').html('<span style="color:green">Ok</span>');
31
}
32
}, 'json');
33
});
34
35
});
36
//-->
37
</script>
38
<div style="border:1px solid gray; padding:2px; width:95%;">
39
<table width="100%" cellpadding="5" cellspacing="0">
40
<tr bgcolor="white">
41
<th>Main</th>
42
<th>Телефон</th>
43
<th></th>
44
<th>Активен</th>
45
<th>Удалить</th>
46
<th></th>
47
</tr>
48
% foreach my $cred ( @credentials ) {
49
% my $checked = $cred->main ? ' checked' : '';
50
% my $bgcolor = $i++ % 2 ? 'white' : '#e0e0e0';
51
% my $active = $cred->status == 1 ? ' checked' : '';
52
<tr bgcolor="<% $bgcolor %>">
53
<td width="1%"><input type="radio" name="<% $name %>.main" value="<% $cred->id %>"<% $checked %>></td>
54
<td width="86%"><& /contenido/components/inputs/string.msn, name => $name.'_name_'.$cred->id, prop => $prop, check => $cred->name, object => $object &></td>
55
<td width="10%"><& /contenido/components/inputs/string.msn, name => $name.'_name_'.$cred->id, prop => $prop, check => $cred->name_orig, object => $object &></td>
56
<td width="1%"><input type="checkbox" name="<% $name %>_active_<% $cred->id %>" value="1"<% $active %>></td>
57
<td width="1%"><input type="checkbox" name="<% $name %>.delete" value="<% $cred->id %>"></td>
58
<td width="1%" id="<% $name %>_<% $cred->id %>_check"><span style="color:green">Ok</span></td>
59
</tr>
60
% }
61
<tr bgcolor="<% $i++ % 2 ? 'white' : '#e0e0e0' %>">
62
<td><input type="radio" name="<% $name %>.main" value=""></td>
63
<td><& /contenido/components/inputs/string.msn, name => $name.'_name_', prop => $prop, check => '', object => $object &></td>
64
<td></td>
65
<td><input type="checkbox" name="<% $name %>_active_" value="1"></td>
66
<td></td>
67
<td id="<% $name %>_new_check"></td>
68
</tr>
69
</table>
70
</div>
71
% } else {
72
<& /contenido/components/inputs/string.msn, %ARGS &>
73
% }
74
<%args>
75
76
$name => undef
77
$check => undef
78
$prop => {}
79
$object => undef
80
81
</%args>
82
<%init>
83
84
my @credentials;
85
if ( $state->{users}->use_credentials ) {
86
@credentials = $keeper->get_documents(
87
class => 'users::Phone',
88
uid => $object->id,
89
order_by => 'main desc, name',
90
);
91
}
92
my $i = 0;
93
94
</%init>
utf8/plugins/users/comps/contenido/components/outputs/phones.msn
1
<%args>
2
3
$object
4
$name => undef
5
$SETS => undef
6
7
</%args>
8
<%init>
9
10
return undef unless ref $SETS;
11
return undef unless $name;
12
13
my @props = $object->structure();
14
my ($prop) = grep { $_->{attr} eq $name } @props;
15
return undef unless ref $prop;
16
17
if ( $state->{users}->use_credentials && $object->id ) {
18
my %struct;
19
while ( my ($key, $val) = each %$SETS ) {
20
my $template = $name.'_name_';
21
if ( $key =~ /^$template/ ) {
22
my $id = $key =~ /(\d+)/ ? $1 : 'new';
23
if ( $keeper->{users}->_phone_format( $val ) ) {
24
$struct{$id}{orig} = $val;
25
$struct{$id}{name} = $keeper->{users}->_phone_reduction($val);
26
$struct{$id}{format} = $keeper->{users}->_phone_format($val);
27
$struct{$id}{id} = $id;
28
}
29
}
30
$template = $name.'_active_';
31
if ( $key =~ /^$template/ ) {
32
my $id = $key =~ /(\d+)/ ? $1 : 'new';
33
if ( $val ) {
34
$struct{$id}{status} = 1;
35
$struct{$id}{id} = $id;
36
}
37
}
38
}
39
if ( exists $SETS->{$name.'.delete'} ) {
40
if ( ref $SETS->{$name.'.delete'} eq 'ARRAY' ) {
41
map { $struct{$_}{delete} = 1 } @{$SETS->{$name.'.delete'}};
42
} elsif ( $SETS->{$name.'.delete'} ) {
43
$struct{$SETS->{$name.'.delete'}}{delete} = 1;
44
}
45
}
46
if ( exists $SETS->{$name.'.main'} && $SETS->{$name.'.main'} && exists $struct{$SETS->{$name.'.main'}} && !exists $struct{$SETS->{$name.'.main'}}{delete} ) {
47
$struct{$SETS->{$name.'.main'}}{main} = 1;
48
} elsif ( exists $struct{new} ) {
49
$struct{new}{main} = 1;
50
} else {
51
my @main = grep { exists $_->{name} && exists $_->{main} && $_->{main} && !exists $_->{delete} } values %struct;
52
unless ( @main ) {
53
my @valid = grep { exists $_->{name} && !exists $_->{delete} } values %struct;
54
if ( @valid ) {
55
$valid[0]->{main} = 1;
56
}
57
}
58
}
59
my @delete_ids = map { $_->{id} } grep { $_->{id} && exists $_->{delete} } values %struct;
60
if ( @delete_ids ) {
61
my $sql = $keeper->SQL->prepare('delete from profile_credentials where class = ? and uid = ? and id in ('.join(',', map {'?'} @delete_ids).')');
62
$sql->execute( 'users::Phone', $object->id, @delete_ids );
63
$sql->finish;
64
}
65
my @credentials = $keeper->get_documents(
66
class => 'users::Phone',
67
uid => $object->id,
68
order_by => 'main desc, name',
69
);
70
foreach my $cred ( @credentials ) {
71
my $check = exists $struct{$cred->id} ? $struct{$cred->id} : undef;
72
my $store = 0;
73
if ( ref $check && exists $check->{name} && ($cred->name ne $check->{name} || $cred->name_orig ne $check->{orig}) ) {
74
my $exists_foreign = $keeper->get_documents( class => 'users::Phone', name => $check->{name}, uid_not => $object->id, count => 1 );
75
unless ( $exists_foreign ) {
76
$cred->name( $check->{name} );
77
$cred->name_orig( $check->{orig} );
78
$cred->name_format( $check->{format} );
79
$store = 1;
80
}
81
}
82
if ( ref $check && int($check->{main}) != int($cred->main) ) {
83
$cred->main( int($check->{main}) );
84
$store = 1;
85
}
86
if ( ref $check && int($check->{status}) != int($cred->status) ) {
87
$cred->status( int($check->{status}) );
88
$store = 1;
89
}
90
if ( $store ) {
91
$cred->store;
92
}
93
}
94
if ( exists $struct{new} && exists $struct{new}{name} ) {
95
my @found = grep { $_->name eq $struct{new}{name} } @credentials;
96
unless ( @found ) {
97
my $check = $struct{new};
98
my $exists_foreign = $keeper->get_documents( class => 'users::Phone', name => $check->{name}, count => 1 );
99
unless ( $exists_foreign ) {
100
my $cred = $object->create_credential( phone => $check->{orig}, main => $check->{main}, status => ($check->{status} || 0) );
101
push @credentials, $cred if ref $cred;
102
}
103
}
104
}
105
my ($main) = grep { $_->main } @credentials;
106
$object->{$name.'s'} = \@credentials;
107
return $main;
108
} else {
109
return $keeper->{users}->_phone_format( $SETS->{$name} );
110
}
111
112
</%init>
Небольшая справка по веткам
cnddist – контейнер, в котором хранятся все дистрибутивы всех библиотек и программных пакетов, которые использовались при построении различных версий Contenido. Если какой-то библиотеки в данном хранилище нет, инсталлятор сделает попытку "подтянуть" ее с веба (например, с CPAN). Если библиотека слишком старая, есть очень большая вероятность, что ее там уже нет. Поэтому мы храним весь хлам от всех сборок. Если какой-то дистрибутив вдруг отсутствует в cnddist - напишите нам, мы положим его туда.
koi8 – отмирающая ветка, чей код, выдача и все внутренние библиотеки заточены на кодировку KOI8-R. Вносятся только те дополнения, которые касаются внешнего вида и функционала админки, баги ядра, обязательные обновления портов и мелочи, которые легко скопипастить. В дальнейшем планируется полная остановка поддержки по данной ветке.
utf8 – актуальная ветка, заточенная под UTF-8.
Внутри каждой ветки: core – исходники ядра; install – скрипт установки инсталляции; plugins – плагины; samples – "готовые к употреблению" проекты, которые можно поставить, запустить и посмотреть, как они работают.