added thingyrecord per-field pricing

This commit is contained in:
Doug Bell 2009-07-15 04:58:33 +00:00
parent 3b63250cf4
commit 47c6aaa994
4 changed files with 179 additions and 13 deletions

View file

@ -27,6 +27,7 @@ use WebGUI::Asset;
my $toVersion = '7.7.14';
my $quiet; # this line required
addFieldPriceToThingyRecord( $session );
my $session = start(); # this line required
@ -45,6 +46,21 @@ finish($session); # this line required
#}
#----------------------------------------------------------------------------
# Add the field price storage to ThingyRecord
sub addFieldPriceToThingyRecord {
my $session = shift;
print "\tAdd field prices to ThingyRecord... " unless $quiet;
$session->db->write(
"ALTER TABLE ThingyRecord ADD COLUMN fieldPrice LONGTEXT",
);
print "DONE!\n" unless $quiet;
}
# -------------- DO NOT EDIT BELOW THIS LINE --------------------------------
#----------------------------------------------------------------------------

View file

@ -18,6 +18,7 @@ use strict;
use Tie::IxHash;
use base 'WebGUI::Asset::Sku';
use WebGUI::Utility;
use HTML::Entities qw( encode_entities );
# Collateral data class... very long name. Zoffix eat your heart out.
my $RECORD_CLASS = 'WebGUI::AssetCollateral::Sku::ThingyRecord::Record';
@ -72,8 +73,6 @@ sub definition {
options => $class->getThingOptions($session),
label => $i18n->get('thingId label'),
hoverHelp => $i18n->get('thingId description'),
extras =>
q{onchange="WebGUI.ThingyRecord.getThingFields(this.options[this.selectedIndex].value,'thingFields_formId')"},
},
thingFields => {
tab => "properties",
@ -95,6 +94,13 @@ sub definition {
label => $i18n->get( '10', "Asset_Product" ), #Price
hoverHelp => $i18n->get( 'price', 'Asset_Product' ),
},
fieldPrice => {
tab => "properties",
fieldType => "text",
customDrawMethod => 'drawEditFieldPrice',
label => $i18n->get( 'fieldPrice label' ),
hoverHelp => $i18n->get( 'fieldPrice hoverHelp '),
},
duration => {
tab => "properties",
fieldType => "interval",
@ -125,9 +131,10 @@ the header or footer!
sub appendVarsEditRecord {
my ( $self, $var, $recordId ) = @_;
my $session = $self->session;
my $thingy = $self->getThingy;
my $record = {};
my $session = $self->session;
my $thingy = $self->getThingy;
my $fieldPrice = JSON->new->decode( $self->get('fieldPrice') );
my $record = {};
if ($recordId) {
# Get an existing record
@ -141,7 +148,16 @@ sub appendVarsEditRecord {
my @allowed = split "\n", $self->get('thingFields');
for my $field ( @{$fields} ) {
next unless grep { $_ eq $field->{fieldId} } @allowed;
# Don't allow user to edit fields they didn't purchase
next if (
$recordId
&& $fieldPrice->{ $field->{fieldId} } > 0
&& not defined $record->{ 'field_' . $field->{fieldId} }
);
$field->{value} = $record->{ 'field_' . $field->{fieldId} } || $field->{defaultValue};
my $price = $fieldPrice->{ $field->{fieldId} };
my %fieldProperties = (
"input" => $thingy->getFormElement($field),
"value" => $thingy->getFieldValue( $field->{value}, $field ),
@ -151,6 +167,7 @@ sub appendVarsEditRecord {
"isRequired" => ( $field->{status} eq "required" ),
"pretext" => $field->{pretext},
"subtext" => $field->{subtext},
"price" => $price > 0 ? $price : "",
);
push @{ $var->{form_fields} }, { map { "field_" . $_ => $fieldProperties{$_} } keys %fieldProperties };
@ -179,6 +196,24 @@ sub deleteThingRecord {
#-------------------------------------------------------------------
=head2 drawEditFieldPrice ( )
Draw the field to edit field prices. Add appropriate javascript.
=cut
sub drawEditFieldPrice {
my ( $self ) = @_;
my $fieldHtml = sprintf <<'ENDHTML', encode_entities( $self->get('fieldPrice') );
<div id="fieldPrice"></div><input type="hidden" name="fieldPrice" value="%s" />
ENDHTML
return $fieldHtml;
}
#-------------------------------------------------------------------
=head2 getEditForm ( )
Add the javascript needed for the edit form
@ -257,7 +292,21 @@ Get the price
sub getPrice {
my ($self) = @_;
return $self->get('price');
my $price = $self->get('price');
my $fieldPrice = JSON->new->decode( $self->get('fieldPrice') );
my $option = $self->getOptions;
my $record = $RECORD_CLASS->new( $self->session, $option->{recordId} );
my $fields = JSON->new->decode( $record->get('fields') );
# Calculate field price
for my $key ( keys %{$fields} ) {
my $fieldId = substr $key, length("field_");
if ( $fieldPrice->{ $fieldId } > 0 ) {
$price += $fieldPrice->{ $fieldId };
}
}
return $price;
}
#----------------------------------------------------------------------------
@ -366,9 +415,9 @@ sub onCompletePurchase {
# Update record
$record->update( {
expires => $now + $self->get('duration'),
transactionId => $item->transaction->getId,
isHidden => 0,
expires => $now + $self->get('duration'),
transactionId => $item->transaction->getId,
isHidden => 0,
}
);
@ -445,14 +494,22 @@ Process the edit record form and return the record
sub processEditRecordForm {
my ($self) = @_;
my $var = {};
my $var = {};
my $fieldPrice = JSON->new->decode( $self->get('fieldPrice') );
my $fields = $self->getThingFields( $self->get('thingId') );
for my $field ( @{$fields} ) {
my $fieldName = 'field_' . $field->{fieldId};
my $fieldType = $field->{fieldType};
$fieldType = "" if ( $fieldType =~ m/^otherThing/x );
$var->{$fieldName} = $self->session->form->get( $fieldName, $fieldType, $field->{defaultValue}, $field );
my $value = $self->session->form->get( $fieldName, $fieldType, $field->{defaultValue}, $field );
# Don't save fields we didn't pay for
if ( $fieldPrice->{ $field->{fieldId} } > 0 && !$value ) {
next;
}
$var->{ $fieldName } = $value;
}
return $var;

View file

@ -75,6 +75,18 @@ our $I18N = {
lastUpdated => 0,
context => "Description of asset property",
},
'fieldPrice label' => {
message => "Field Add-on Price",
lastUpdated => 0,
context => "Label for asset property",
},
'fieldPrice description' => {
message => "Add to the base price if a user decides to fill-in this field.",
lastUpdated => 0,
context => "Description of asset property",
},
};
1;

View file

@ -9,12 +9,13 @@ if ( typeof WebGUI.ThingyRecord == "undefined" ) {
}
WebGUI.ThingyRecord.getThingFields
= function ( thingId, elementId ) {
= function ( thingId ) {
// Callback to populate the form element
var callback = {
success : function (o) {
var el = document.getElementById(elementId);
// Add fields to select list
var el = document.forms[0].elements['thingFields'];
while ( el.options.length >= 1 )
el.remove(0);
var fields = YAHOO.lang.JSON.parse( o.responseText );
@ -22,6 +23,9 @@ WebGUI.ThingyRecord.getThingFields
el.options[el.options.length]
= new Option( fields[key], key, 1, 1 );
}
// Add fields to field price
WebGUI.ThingyRecord.updateFieldPrices();
}
};
@ -30,3 +34,80 @@ WebGUI.ThingyRecord.getThingFields
;
YAHOO.util.Connect.asyncRequest( 'GET', url, callback );
};
WebGUI.ThingyRecord.updateFieldPrices
= function ( ) {
var form = document.forms[0];
var fieldList = form.elements["thingFields"];
var selected = [];
var div = document.getElementById( 'fieldPrice' );
var currentPrices = {};
try {
currentPrices = YAHOO.lang.JSON.parse( form.elements["fieldPrice"].value );
}
catch (e) {
// Initialize if there's a parse error
form.elements["fieldPrice"].value = "{}";
}
// Get the selected fields
for ( var i = 0; i < fieldList.options.length; i++ ) {
var opt = fieldList.options[i];
if ( opt.selected ) {
selected.push( opt );
}
else {
currentPrices[ opt.value ] = 0;
}
}
form.elements['fieldPrice'].value = YAHOO.lang.JSON.stringify( currentPrices );
// Clear out old records
while ( div.childNodes.length )
div.removeChild( div.childNodes[0] );
for ( var i = 0; i < selected.length; i++ ) {
var opt = selected[i];
var label = document.createElement( 'label' );
label.style.display = "block";
label.style.width = "50%";
var price = document.createElement( 'input' );
price.name = "fieldPrice_" + opt.value;
price.type = "text";
price.size = "5";
price.value = currentPrices[ opt.value ] ? currentPrices[ opt.value ] : "0.00";
YAHOO.util.Event.addListener( price, "change", function () {
var fieldName = this.name.substr( "fieldPrice_".length );
var json = YAHOO.lang.JSON.parse( form.elements["fieldPrice"].value );
json[fieldName] = this.value;
form.elements["fieldPrice"].value = YAHOO.lang.JSON.stringify( json );
alert( json );
alert( form.elements["fieldPrice"].value );
} );
label.appendChild( price );
label.appendChild( document.createTextNode( opt.text ) );
div.appendChild( label );
}
};
// Load the columns and field prices
YAHOO.util.Event.onDOMReady( function () {
var form = document.forms[0];
// Add events to form fields
YAHOO.util.Event.addListener( form.elements["thingId"], "change", function () {
WebGUI.ThingyRecord.getThingFields( this.value );
} );
YAHOO.util.Event.addListener( form.elements['thingFields'], "change", function () {
WebGUI.ThingyRecord.updateFieldPrices();
} );
// Populate the fields list if necessary
if ( form.elements[ "thingId" ].value ) {
WebGUI.ThingyRecord.getThingFields( form.elements[ "thingId"].value );
}
} );