package WebGUI::Asset::Shortcut; #------------------------------------------------------------------- # WebGUI is Copyright 2001-2006 Plain Black Corporation. #------------------------------------------------------------------- # Please read the legal notices (docs/legal.txt) and the license # (docs/license.txt) that came with this distribution before using # this software. #------------------------------------------------------------------- # http://www.plainblack.com info@plainblack.com #------------------------------------------------------------------- use strict; use Tie::IxHash; use WebGUI::Asset; use WebGUI::International; use WebGUI::Operation::Profile; use WebGUI::ProfileField; use WebGUI::ProfileCategory; use WebGUI::Macro; our @ISA = qw(WebGUI::Asset); #------------------------------------------------------------------- sub _drawQueryBuilder { my $self = shift; # Initialize operators my @textFields = qw|text yesNo selectList radioList|; my $i18n = WebGUI::International->new($self->session,"Asset_Shortcut"); my %operator; foreach (@textFields) { $operator{$_} = { "=" => $i18n->get("is"), "!=" => $i18n->get("isnt") }; } $operator{integer} = { "=" => $i18n->get("equal to"), "!=" => $i18n->get("not equal to"), "<" => $i18n->get("less than"), ">" => $i18n->get("greater than") }; # Get the fields and count them my $fields = $self->getMetaDataFields(); my $fieldCount = scalar(keys %$fields); unless ($fieldCount) { # No fields found.... return sprintf $i18n->get('no metadata yet'), $self->session->url->page('func=manageMetaData'); } # Static form fields my $shortcutCriteriaField = WebGUI::Form::textarea($self->session, { name=>"shortcutCriteria", value=>$self->getValue("shortcutCriteria"), extras=>'style="width: 100%" '.$self->{_disabled} }); my $conjunctionField = WebGUI::Form::selectBox($self->session, { name=>"conjunction", options=>{ "AND" => $i18n->get("AND"), "OR" => $i18n->get("OR")}, value=>["OR"], extras=>'class="qbselect"', } ); # html $self->session->style->setScript($self->session->url->extras('wobject/Shortcut/querybuilder.js'), {type=>"text/javascript"}); $self->session->style->setLink($self->session->url->extras('wobject/Shortcut/querybuilder.css'), {type=>"text/css", rel=>"stylesheet"}); my $output; $output .= qq||; # Here starts the field loop my $i = 1; foreach my $field (keys %$fields) { my $fieldLabel = $fields->{$field}{fieldName}; my $fieldType = $fields->{$field}{fieldType} || "text"; # The operator select field my $opFieldName = "op_field".$i; my $opField = WebGUI::Form::selectBox($self->session, { name=>$opFieldName, uiLevel=>5, options=>$operator{$fieldType}, extras=>'class="qbselect"' }); # The value select field my $valFieldName = "val_field".$i; my $valueField = WebGUI::Form::dynamicField($self->session, fieldType=>$fieldType, name=>$valFieldName, uiLevel=>5, extras=>qq/title="$fields->{$field}{description}" class="qbselect"/, possibleValues=>$fields->{$field}{possibleValues}, ); # An empty row $output .= qq||; # Table row with field info $output .= qq| |; $i++; } # Close the table $output .= "
$shortcutCriteriaField
$conjunctionField

$fieldLabel

$opField $valueField
"; return $output; } #------------------------------------------------------------------- sub _submenu { my $self = shift; my $workarea = shift; my $title = shift; my $help = shift; my $ac = WebGUI::AdminConsole->new($self->session,"shortcutmanager"); $ac->setHelp($help) if ($help); $ac->setIcon($self->getIcon); my $i18n = WebGUI::International->new($self->session,"Asset_Shortcut"); $ac->addSubmenuItem($self->getUrl('func=edit'), $i18n->get("Back to Edit Shortcut")); $ac->addSubmenuItem($self->getUrl("func=manageOverrides"),$i18n->get("Manage Shortcut Overrides")); return $ac->render($workarea, $title); } #------------------------------------------------------------------- sub canEdit { my $self = shift; return 1 if ($self->SUPER::canEdit || ($self->isDashlet && $self->getParent->canManage)); return 0; } #------------------------------------------------------------------- sub canManage { my $self = shift; return $self->canEdit; } #------------------------------------------------------------------- sub definition { my $class = shift; my $session = shift; my $definition = shift; my $i18n = WebGUI::International->new($session,"Asset_Shortcut"); push(@{$definition}, { assetName=>$i18n->get('assetName'), icon=>'shortcut.gif', tableName=>'Shortcut', className=>'WebGUI::Asset::Shortcut', properties=>{ shortcutToAssetId=>{ noFormPost=>1, fieldType=>"hidden", defaultValue=>undef }, shortcutByCriteria=>{ fieldType=>"yesNo", defaultValue=>0, }, disableContentLock=>{ fieldType=>"yesNo", defaultValue=>0 }, resolveMultiples=>{ fieldType=>"selectBox", defaultValue=>"mostRecent", }, shortcutCriteria=>{ fieldType=>"textarea", defaultValue=>"", }, templateId=>{ fieldType=>"template", defaultValue=>"PBtmpl0000000000000140" }, prefFieldsToShow=>{ fieldType=>"checkList", defaultValue=>undef }, prefFieldsToImport=>{ fieldType=>"checkList", defaultValue=>undef }, showReloadIcon=>{ fieldType=>"yesNo", defaultValue=>1 } } }); return $class->SUPER::definition($session,$definition); } #------------------------------------------------------------------- sub discernUserId { my $self = shift; return ($self->canManage && $self->session->var->isAdminOn) ? '1' : $self->session->user->userId; } #------------------------------------------------------------------- sub getEditForm { my $self = shift; my $tabform = $self->SUPER::getEditForm(); my $originalTemplate; my $i18n = WebGUI::International->new($self->session, "Asset_Shortcut"); my $shortcut = $self->getShortcut; if (defined $shortcut) { $tabform->getTab("properties")->readOnly( -label=>$i18n->get(1), -hoverHelp=>$i18n->get('1 description'), -value=>''.$shortcut->get('title').' ('.$shortcut->getId.')' ); } else { $tabform->getTab("properties")->readOnly( value=>''.$self->notLinked.'' ); } $tabform->getTab("display")->template( -value=>$self->getValue("templateId"), -label=>$i18n->get('shortcut template title'), -hoverHelp=>$i18n->get('shortcut template title description'), -namespace=>"Shortcut" ); if($self->session->setting->get("metaDataEnabled")) { $tabform->getTab("properties")->yesNo( -name=>"shortcutByCriteria", -value=>$self->getValue("shortcutByCriteria"), -label=>$i18n->get("Shortcut by alternate criteria"), -hoverHelp=>$i18n->get("Shortcut by alternate criteria description"), -extras=>q|onchange=" if (this.form.shortcutByCriteria[0].checked) { this.form.resolveMultiples.disabled=false; this.form.shortcutCriteria.disabled=false; } else { this.form.resolveMultiples.disabled=true; this.form.shortcutCriteria.disabled=true; }"| ); $tabform->getTab("properties")->yesNo( -name=>"disableContentLock", -value=>$self->getValue("disableContentLock"), -label=>$i18n->get("disable content lock"), -hoverHelp=>$i18n->get("disable content lock description") ); if ($self->getValue("shortcutByCriteria") == 0) { $self->{_disabled} = 'disabled=true'; } $tabform->getTab("properties")->selectBox( -name=>"resolveMultiples", -value=>[ $self->getValue("resolveMultiples") ], -label=>$i18n->get("Resolve Multiples"), -hoverHelp=>$i18n->get("Resolve Multiples description"), -options=>{ mostRecent=>$i18n->get("Most Recent"), random=>$i18n->get("Random"), }, -extras=>$self->{_disabled} ); $tabform->getTab("properties")->readOnly( -value=>$self->_drawQueryBuilder(), -label=>$i18n->get("Criteria"), -hoverHelp=>$i18n->get("Criteria description") ); } $tabform->addTab('overrides',$i18n->get('Overrides')); $tabform->getTab('overrides')->raw($self->getOverridesList); if ($self->isDashlet) { $tabform->addTab('preferences',$i18n->get('Preferences')); $tabform->getTab('preferences')->raw($self->getFieldsList); $tabform->getTab("properties")->yesNo( -value=>$self->getValue("showReloadIcon"), -name=>"showReloadIcon", -label=>$i18n->get("show reload icon"), -hoverHelp=>$i18n->get("show reload icon description") ); } return $tabform; } #------------------------------------------------------------------- =head2 getExtraHeadTags ( ) Returns the extraHeadTags stored in the asset. Called in $self->session->style->generateAdditionalHeadTags if this asset is the $self->session->asset. Also called in WebGUI::Layout::view for its child assets. Overriden here in Shortcut.pm. =cut sub getExtraHeadTags { my $self = shift; my $output = $self->get("extraHeadTags")."\n"; my $shortcut = $self->getShortcut; $output .= $self->getShortcut->get("extraHeadTags") if defined $shortcut; return $output; } #------------------------------------------------------------------- sub getFieldsList { my $self = shift; my $i18n = WebGUI::International->new($self->session, "Asset_Shortcut"); my $output = ''.$i18n->get('Manage Profile Fields').'

'; my %fieldNames; tie %fieldNames, 'Tie::IxHash'; foreach my $field (@{WebGUI::ProfileField->getFields($self->session)}) { my $fieldId = $field->getId; next if $fieldId =~ /contentPositions/; $fieldNames{$fieldId} = $field->getLabel.' ['.$fieldId.']'; } $output .= '
'; my @prefFieldsToShow = split("\n",$self->getValue("prefFieldsToShow")); $output .= WebGUI::Form::CheckList->new($self->session, -name=>"prefFieldsToShow", -value=>\@prefFieldsToShow, -options=>\%fieldNames, -label=>$i18n->get('pref fields to show'), -hoverHelp=>$i18n->get('pref fields to show description'), -vertical=>1, -uiLevel=>9 )->toHtmlWithWrapper; $output .= '
'; my @prefFieldsToImport = split("\n",$self->getValue("prefFieldsToImport")); $output .= WebGUI::Form::CheckList->new($self->session, -name=>"prefFieldsToImport", -value=>\@prefFieldsToImport, -options=>\%fieldNames, -label=>$i18n->get('pref fields to import'), -hoverHelp=>$i18n->get('pref fields to import description'), -vertical=>1, -uiLevel=>9 )->toHtmlWithWrapper; $output .= '
'; return $output; } #------------------------------------------------------------------- sub getOverridesList { my $self = shift; my $output = ''; my $i18n = WebGUI::International->new($self->session, "Asset_Shortcut"); my %overrides = $self->getOverrides; $output .= ''; $output .= ''; my $shortcut = $self->getShortcutOriginal; return undef unless defined $shortcut; foreach my $definition (@{$shortcut->definition($self->session)}) { foreach my $prop (keys %{$definition->{properties}}) { next if $definition->{properties}{$prop}{fieldType} eq 'hidden'; $output .= ''; $output .= ''; $output .= ''; } } $output .= '
'.$i18n->get('fieldName').''.$i18n->get('edit delete fieldname').''.$i18n->get('Original Value').''.$i18n->get('New value').''.$i18n->get('Replacement value').'
'.$prop.''; $output .= $self->session->icon->edit('func=editOverride;fieldName='.$prop,$self->get("url")); $output .= $self->session->icon->delete('func=deleteOverride;fieldName='.$prop,$self->get("url")) if exists $overrides{overrides}{$prop}; $output .= ''; $output .= $overrides{overrides}{$prop}{origValue}; $output .= ''; $output .= $overrides{overrides}{$prop}{newValue}; $output .= ''; $output .= $overrides{overrides}{$prop}{parsedValue}; $output .= '
'; return $output; } #------------------------------------------------------------------- sub _overridesCacheTag { my $self = shift; #cache by userId, assetId of this shortcut, and whether adminMode is on or not. return ["shortcutOverrides", $self->getId, $self->session->user->userId, $self->session->var->get("adminOn")]; } #------------------------------------------------------------------- sub getOverrides { my $self = shift; my $i = 0; my $cache = WebGUI::Cache->new($self->session,$self->_overridesCacheTag); my $overridesRef = $cache->get; unless ($overridesRef->{cacheNotExpired}) { my %overrides; my $orig = $self->getShortcutOriginal; if (defined $orig) { unless ( exists $orig->{_propertyDefinitions}) { my %properties; foreach my $definition (@{$orig->definition($self->session)}) { %properties = (%properties, %{$definition->{properties}}); } $orig->{_propertyDefinitions} = \%properties; } } $overrides{cacheNotExpired} = 1; my $sth = $self->session->db->read("select fieldName, newValue from Shortcut_overrides where assetId=".$self->session->db->quote($self->getId)." order by fieldName"); while (my ($fieldName, $newValue) = $sth->array) { $overrides{overrides}{$fieldName}{fieldType} = $orig->{_propertyDefinitions}{$fieldName}{fieldType}; $overrides{overrides}{$fieldName}{origValue} = $self->getShortcutOriginal->get($fieldName); $overrides{overrides}{$fieldName}{newValue} = $newValue; $overrides{overrides}{$fieldName}{parsedValue} = $newValue; } $sth->finish; if ($self->isDashlet) { my $u = WebGUI::User->new($self->session, $self->discernUserId); my @userPrefs = $self->getPrefFieldsToImport; foreach my $fieldId (@userPrefs) { my $field = WebGUI::ProfileField->new($self->session,$fieldId); next unless $field; my $fieldName = $field->getId; my $fieldValue = $u->profileField($field->getId); $overrides{userPrefs}{$fieldName}{value} = $fieldValue; $overrides{userPrefs}{$fieldName}{parsedValue} = $fieldValue; # 'myTemplateId is ##userPref:myTemplateId##', for example. foreach my $overr (keys %{$overrides{overrides}}) { $overrides{overrides}{$overr}{parsedValue} =~ s/\#\#userPref\:${fieldName}\#\#/$fieldValue/gm; } } } $cache->set(\%overrides, 60*60); $overridesRef = \%overrides; } return %$overridesRef; } #------------------------------------------------------------------- sub getShortcut { my $self = shift; unless ($self->{_shortcut}) { $self->{_shortcut} = $self->getShortcutOriginal; } $self->{_shortcut}{_properties}{displayTitle} = undef if ($self->isDashlet); # Hide title by default. If you want, you can create an override # to display it. But it's being shown in the dragheader by default. my %overhash = $self->getOverrides; if (exists $overhash{overrides}) { my %overrides = %{$overhash{overrides}}; foreach my $override (keys %overrides) { $self->{_shortcut}{_properties}{$override} = $overrides{$override}{parsedValue}; } $self->{_shortcut}{_properties}{showReloadIcon} = $self->get("showReloadIcon"); } return $self->{_shortcut}; } #------------------------------------------------------------------- =head2 getShortcutByCriteria ( hashRef ) This function will search for a asset that match a metadata criteria set. If no asset is found, undef will be returned. =cut sub getShortcutByCriteria { my $self = shift; my $assetProxy = shift; my $criteria = $self->get("shortcutCriteria"); my $order = $self->get("resolveMultiples"); my $assetId = $self->getId; # Parse macro's in criteria WebGUI::Macro::process($self->session,\$criteria); # Once a asset is found, we will stick to that asset, # to prevent the proxying of multiple- depth assets like Surveys and USS. my $scratchId; if ($assetId) { $scratchId = "Shortcut_" . $assetId; if($self->session->scratch->get($scratchId) && !$self->getValue("disableContentLock")) { unless ($self->session->var->get("adminOn")) { return WebGUI::Asset->newByDynamicClass($self->session, $self->session->scratch->get($scratchId)); } } } # $criteria = "State = Wisconsin AND Country != Sauk"; # # State = Wisconsin AND Country != Sauk # | | | # |- $field |_ $operator |- $value # |_ $attribute |_ $attribute my $operator = qr/<>|!=|=|>=|<=|>|<|like/i; my $attribute = qr/['"][^()|=>session->db; my $counter = "b"; my @joins = (); foreach my $expression ($criteria =~ /($attribute\s*$operator\s*$attribute)/gi) { # $expression will match "State = Wisconsin" my $replacement = $expression; # We don't want to modify $expression. # We need it later. push(@joins," left join metaData_values ".$counter."_v on a.assetId=".$counter."_v.assetId "); # Get the field (State) and the value (Wisconsin) from the $expression. $expression =~ /($attribute)\s*$operator\s*($attribute)/gi; my $field = $1; my $value = $2; # quote the field / value variables. my $quotedField = $field; my $quotedValue = $value; unless ($field =~ /^\s*['"].*['"]\s*/) { $quotedField = $db->quote($field); } unless ($value =~ /^\s*['"].*['"]\s*/) { $quotedValue = $db->quote($value); } # transform replacement from "State = Wisconsin" to # "(fieldname=State and value = Wisconsin)" my $clause = "(".$counter."_p.fieldName=".$quotedField." and ".$counter."_v.value "; $replacement =~ s/\Q$field/$clause/; $replacement =~ s/\Q$value/$quotedValue )/i; # replace $expression with the new $replacement in $constraint. $constraint =~ s/\Q$expression/$replacement/; push (@joins, " left join metaData_properties ".$counter."_p on ".$counter."_p.fieldId=".$counter."_v.fieldId "); $counter++; } my $sql = "select a.assetId from asset a ".join("\n", @joins)." where a.className = ".$db->quote($self->getShortcutDefault->get("className")); # Add constraint only if it has been modified. $sql .= " and ".$constraint if (($constraint ne $criteria) && $constraint ne ""); $sql .= " order by a.creationDate desc"; # Execute the query with an unconditional read my @ids; my $sth = $db->unconditionalRead($sql); while (my ($data) = $sth->array) { push (@ids, $data); } $sth->finish; # No matching assets found. if (scalar(@ids) == 0) { return $self->getShortcutDefault; # fall back to the originally mirrored asset. } my $id; # Grab a wid from the results if ($order eq 'random') { $id = $ids[ rand @ids ]; } else { #default order is mostRecent $id = $ids[0]; # 1st element in list is most recent. } # Store the matching assetId in user scratch. $self->session->scratch->set($scratchId,$id) if ($scratchId); return WebGUI::Asset->newByDynamicClass($self->session, $id); } #------------------------------------------------------------------- sub getShortcutDefault { my $self = shift; return WebGUI::Asset->newByDynamicClass($self->session, $self->get("shortcutToAssetId")); } #------------------------------------------------------------------- sub getShortcutOriginal { my $self = shift; if ($self->get("shortcutByCriteria")) { return $self->getShortcutByCriteria; } else { return $self->getShortcutDefault; } } #------------------------------------------------------------------- sub getPrefFieldsToShow { my $self = shift; return split("\n",$self->getValue("prefFieldsToShow")); } #------------------------------------------------------------------- sub getPrefFieldsToImport { my $self = shift; return split("\n",$self->getValue("prefFieldsToImport")); } #------------------------------------------------------------------- sub isDashlet { my $self = shift; return 1 if ref $self->getParent eq 'WebGUI::Asset::Wobject::Dashboard'; return 0; } #------------------------------------------------------------------- sub notLinked { my $self = shift; $self->session->errorHandler->warn("Shortcut ".$self->getId." is linked to an asset ".$self->get("shortcutToAssetId").", which no longer exists."); return "The asset this shortcut is linked to no longer exists. You need to delete this shortcut."; } #------------------------------------------------------------------- =head2 prepareView ( ) See WebGUI::Asset::prepareView() for details. =cut sub prepareView { my $self = shift; $self->SUPER::prepareView(); my $template = WebGUI::Asset::Template->new($self->session, $self->get("templateId")); $template->prepare; $self->{_viewTemplate} = $template; my $shortcut = $self->getShortcut; $shortcut->prepareView if defined $shortcut; } #------------------------------------------------------------------- sub processPropertiesFromFormPost { my $self = shift; $self->SUPER::processPropertiesFromFormPost; my $scratchId = "Shortcut_" . $self->getId; $self->session->scratch->delete($scratchId); $self->uncacheOverrides; } #------------------------------------------------------------------- sub uncacheOverrides { my $self = shift; WebGUI::Cache->new($self->session,$self->_overridesCacheTag)->delete; } #------------------------------------------------------------------- sub view { my $self = shift; my $content; my $i18n = WebGUI::International->new($self->session,"Asset_Shortcut"); my $shortcut = $self->getShortcut; unless (defined $shortcut) { if ($self->canEdit) { return $self->session->style->userStyle(''.$self->notLinked.''); } else { return $self->notLinked; } } if ($self->get("shortcutToAssetId") eq $self->get("parentId")) { $content = $i18n->get("Displaying this shortcut would cause a feedback loop"); } else { $content = $shortcut->view; } my %var = ( isShortcut => 1, 'shortcut.content' => $content, 'shortcut.label' => $i18n->get('assetName'), originalURL => $shortcut->getUrl, 'shortcut.url'=>$self->getUrl ); foreach my $prop (keys %{$self->{_shortcut}{_properties}}) { next if ($prop eq 'content' || $prop eq 'label' || $prop eq 'url'); $var{'shortcut.'.$prop} = $self->{_shortcut}{_properties}{$prop}; } return $self->processTemplate(\%var,undef, $self->{_viewTemplate}); } #------------------------------------------------------------------- sub www_edit { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; $self->getAdminConsole->setHelp("shortcut add/edit","Asset_Shortcut"); my $i18n = WebGUI::International->new($self->session,"Asset_Shortcut"); $self->getAdminConsole->addSubmenuItem($self->getUrl("func=manageOverrides"),$i18n->get("Manage Shortcut Overrides")); return $self->getAdminConsole->render($self->getEditForm->print,$i18n->get(2)); } #------------------------------------------------------------------- sub www_getUserPrefsForm { #This is a form retrieved by "ajax". my $self = shift; return 'You are no longer logged in' if $self->session->user->userId eq '1'; return 'You are not allowed to personalize this Dashboard.' unless $self->getParent->canPersonalize; my $output; my @fielden = $self->getPrefFieldsToShow; my $f = WebGUI::HTMLForm->new($self->session,extras=>' onsubmit="submitForm(this,\''.$self->getId.'\',\''.$self->getUrl.'\');return false;"'); $f->raw(''); $f->hidden( -name => 'func', -value => 'saveUserPrefs' ); foreach my $fieldId (@fielden) { my $field = WebGUI::ProfileField->new($self->session,$fieldId); next unless $field; my $params = {}; if (lc($field->get("fieldType")) eq 'textarea') { $params->{rows} = 4; $params->{columns} = 20; } if (lc($field->get("fieldType")) eq 'text') { $params->{size} = 20; } $f->raw($field->formField($params,1)); } $f->submit({extras=>'className="nothing"'}); $f->raw('
'); my $tags = join "", values %{ $self->session->style->{_javascript} }; $output .= $tags.$f->print; return $output; } #------------------------------------------------------------------- sub www_manageOverrides { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; my $i18n = WebGUI::International->new($self->session,"Asset_Shortcut"); return $self->_submenu($self->getOverridesList,$i18n->get("Manage Shortcut Overrides")); } #------------------------------------------------------------------- sub www_purgeOverrideCache { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; $self->uncacheOverrides; return $self->www_manageOverrides; } #------------------------------------------------------------------- sub www_deleteOverride { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; $self->session->db->write('delete from Shortcut_overrides where assetId='.$self->session->db->quote($self->getId).' and fieldName='.$self->session->db->quote($self->session->form->process("fieldName"))); $self->uncacheOverrides; return $self->www_manageOverrides; } #------------------------------------------------------------------- sub www_saveUserPrefs { my $self = shift; return '' unless $self->getParent->canPersonalize; my @fellowFields = $self->getPrefFieldsToShow; my %data = (); $self->uncacheOverrides; my $i18n = WebGUI::International->new($self->session); my $u = WebGUI::User->new($self->session, $self->discernUserId); foreach my $fieldId ($self->session->form->param) { my $field = WebGUI::ProfileField->new($self->session,$fieldId); next unless $field; $data{$field->getId} = $field->formProcess; if ($field->getId eq 'email' && WebGUI::Operation::Profile::isDuplicateEmail($self->session,$data{$field->getId})) { return '
  • '.$i18n->get(1072).'
  • '; } if ($field->isRequired && !$data{$field->getId}) { return '
  • '.$field->getLabel.' '.$i18n->get(451).'
  • '; } $u->profileField($field->getId,$data{$field->getId}); } return $self->www_view; } #------------------------------------------------------------------- sub www_getNewTitle { my $self = shift; return '' unless $self->getParent->canPersonalize; my $foo = $self->getShortcut; return $foo->{_properties}{title}; } #------------------------------------------------------------------- sub www_editOverride { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; my $i18n = WebGUI::International->new($self->session, "Asset_Shortcut"); my $fieldName = $self->session->form->process("fieldName"); # Using getOverrides is not the most efficient way to get the properties of only # one override, since it'll return all overrides (that have been set) my %overrides = $self->getOverrides; # Cannot fetch the original value from the overrides hash b/c it will be empty if # the override has not been set before. Also getOverrides uses a cached version of # the origValue, which can be out of date. my $origValue = $self->getShortcutOriginal->getValue($fieldName); my $output = ''; $output .= ''; my $f = WebGUI::HTMLForm->new($self->session,-action=>$self->getUrl); $f->hidden( -name => "func", -value => "saveOverride" ); $f->hidden( -name => "overrideFieldName", -value => $fieldName ); $f->readOnly( -label => $i18n->get("fieldName"), -value => $fieldName ); $f->readOnly( -label => $i18n->get("Original Value"), -value => $origValue ); # Fetch the parameters for the dynamic field. my (%params, %props); foreach my $def (@{$self->getShortcutOriginal->definition($self->session)}) { %props = (%props,%{$def->{properties}}); } foreach my $key (keys %{$props{$fieldName}}) { next if ($key eq "tab"); $params{$key} = $props{$fieldName}{$key}; } $params{value} = $origValue; $params{name} = $fieldName; $params{label} = $params{label} || $i18n->get("Edit Field Directly"); $params{hoverHelp} = $params{hoverHelp} || $i18n->get("Use this field to edit the override using the native form handler for this field type"); if ($params{fieldType} eq 'template') {$params{namespace} = $params{namespace} || WebGUI::Asset->newByDynamicClass($self->session, $origValue)->get("namespace");} $f->dynamicField(%params); $f->textarea( -name => "newOverrideValueText", -label => $i18n->get("New Override Value"), -value => $overrides{overrides}{$fieldName}{newValue}, -hoverHelp => $i18n->get("Place something in this box if you dont want to use the automatically generated field") ); $f->readOnly( -label => $i18n->get("Replacement Value"), -value => $overrides{overrides}{$fieldName}{parsedValue}, -hoverHelp => $i18n->get("This is the example output of the field when parsed for user preference macros") ) if $self->isDashlet; $f->submit; $output .= $f->print; return $self->_submenu($output,$i18n->get('Edit Override')); } #------------------------------------------------------------------- sub www_saveOverride { my $self = shift; return $self->session->privilege->insufficient() unless $self->canEdit; my $fieldName = $self->session->form->process("overrideFieldName"); my %overrides = $self->getOverrides; my $output = ''; my %props; foreach my $def (@{$self->getShortcutOriginal->definition($self->session)}) { %props = (%props,%{$def->{properties}}); } my $fieldType = $props{$fieldName}{fieldType}; my $value = $self->session->form->process($fieldName,$fieldType); $value = $self->session->form->process("newOverrideValueText") || $value; $self->session->db->write("delete from Shortcut_overrides where assetId=".$self->session->db->quote($self->getId)." and fieldName=".$self->session->db->quote($fieldName)); $self->session->db->write("insert into Shortcut_overrides values (".$self->session->db->quote($self->getId).",".$self->session->db->quote($fieldName).",".$self->session->db->quote($value).")"); $self->uncacheOverrides; $self->getShortcutOriginal->purgeCache(); return $self->www_manageOverrides; } #------------------------------------------------------------------- sub www_view { my $self = shift; my $check = $self->checkView; return $check if defined $check; my $shortcut = $self->getShortcut; $self->prepareView; if ($shortcut->get("className") =~ m/Asset::Wobject/) { $self->session->http->setLastModified($self->getContentLastModified); $self->session->http->sendHeader; $shortcut->prepareView; my $style = $shortcut->processStyle("~~~"); my ($head, $foot) = split("~~~",$style); $self->session->output->print($head, 1); $self->session->output->print($self->view); $self->session->output->print($foot, 1); return "chunked"; } return $shortcut->www_view; } 1;