#!/usr/bin/perl # # DW::Controller::Customize # # This controller is for miscellanous style customization routes # # Authors: # Momiji register_string( '/customize/viewuser', \&viewuser_handler, app => 1 ); sub viewuser_handler { my ( $ok, $rv ) = controller( authas => 1 ); return $rv unless $ok; my $r = $rv->{r}; my $remote = $rv->{remote}; my $get = $r->{get_args}; my $dbh = LJ::get_db_writer(); my $authas = $get->{authas} || $remote->{user}; my $as = $get->{as}; my $u = LJ::get_authas_user($authas); my $userid = $u->{'userid'}; $u->preload_props( "stylesys", "s2_style" ) if $u; my ( $style, $layer ); # when given 'w' argument, load user's current style, and edit the user layer. # this is the mode redirected to from /customize/ (the simple customization UI) if ( $u->{'stylesys'} == 2 ) { $style = LJ::S2::load_style( $u->{'s2_style'} ); return error_ml("Style not found.") unless $style && $style->{userid} == $u->userid; $layer = LJ::S2::load_layer( $dbh, $style->{layer}->{user} ); } return error_ml('/customize/viewuser.tt.no.user.layer2') unless $layer; return error_ml('/customize/viewuser.tt.layer.belongs') unless $layer->{userid} == $u->userid; return error_ml('/customize/viewuser.tt.layer.isnt.type2') unless $layer->{type} eq "user"; my $lyr_layout = LJ::S2::load_layer( $dbh, $layer->{'b2lid'} ); return error_ml( '/customize/viewuser.tt.layout.layer', { 'layertype' => $layer->{'type'} } ) unless $lyr_layout; my $lyr_core = LJ::S2::load_layer( $dbh, $lyr_layout->{'b2lid'} ); return error_ml('/customize/viewuser.tt.core.layer.for.layout') unless $lyr_core; $lyr_layout->{'uniq'} = $dbh->selectrow_array( "SELECT value FROM s2info WHERE s2lid=? AND infokey=?", undef, $lyr_layout->{'s2lid'}, "redist_uniq" ); my ( $lid_i18nc, $lid_theme, $lid_i18n ); $lid_i18nc = $style->{'layer'}->{'i18nc'}; $lid_theme = $style->{'layer'}->{'theme'}; $lid_i18n = $style->{'layer'}->{'i18n'}; my $layerid = $layer->{'s2lid'}; my @layers; push @layers, ( [ 'core' => $lyr_core->{'s2lid'} ], [ 'i18nc' => $lid_i18nc ], [ 'layout' => $lyr_layout->{'s2lid'} ], [ 'i18n' => $lid_i18n ] ); if ( $layer->{'type'} eq "user" && $lid_theme ) { push @layers, [ 'theme' => $lid_theme ]; } push @layers, [ $layer->{'type'} => $layer->{'s2lid'} ]; my @layerids = grep { $_ } map { $_->[1] } @layers; LJ::S2::load_layers(@layerids); my %layerinfo; # load the language and layout choices for core. LJ::S2::load_layer_info( \%layerinfo, \@layerids ); my @props; foreach my $prop ( S2::get_properties( $lyr_layout->{'s2lid'} ) ) { $prop = S2::get_property( $lyr_core->{'s2lid'}, $prop ) unless ref $prop; next unless ref $prop; next if $prop->{'noui'}; my $name = $prop->{'name'}; my $type = $prop->{'type'}; # figure out existing value (if there was no user/theme layer) my $existing; foreach my $lid ( reverse @layerids ) { next if $lid == $layerid; $existing = S2::get_set( $lid, $name ); last if defined $existing; } if ( ref $existing eq "HASH" ) { $existing = $existing->{'as_string'}; } my $val = S2::get_set( $layerid, $name ); my $had_override = defined $val; $val = $existing unless $had_override; if ( ref $val eq "HASH" ) { $val = $val->{'as_string'}; } next if $as eq "" && !$had_override; next if $as eq "theme" && $type ne "Color"; $val = LJ::S2::convert_prop_val( $prop, $val ); push @props, ( { name => $name, val => $val } ); } my $vars = { authas_form => $rv->{authas_form}, u => $rv->{u}, as => $as, props => \@props, layer => $lyr_layout }; return DW::Template->render_template( 'customize/viewuser.tt', $vars ); } 1;