fixes #754. fixes #772. added session based AB testing storage and generation.

This commit is contained in:
arzynik 2013-02-28 18:24:43 -05:00
parent 8cdb232cb7
commit 4268d64d74
5 changed files with 110 additions and 82 deletions

View File

@ -2,16 +2,27 @@
class Controller_api_config extends Crunchbutton_Controller_Rest {
public function init() {
$config = c::appConfig();
if ($_REQUEST['lat'] && $_REQUEST['lon']) {
$restaurants = Restaurant::byRange([
'lat' => $_REQUEST['lat'],
'lon' => $_REQUEST['lon']
]);
foreach ($restaurants as $restaurant) {
$config['restaurants'][] = $restaurant->exports();
}
switch ($this->method()) {
case 'post':
if ($this->request()['ab']) {
echo 'saving';
print_r($this->request()['ab']);
c::auth()->set('ab', json_encode($this->request()['ab']));
}
break;
case 'get':
$config = c::appConfig();
if ($_REQUEST['lat'] && $_REQUEST['lon']) {
$restaurants = Restaurant::byRange([
'lat' => $_REQUEST['lat'],
'lon' => $_REQUEST['lon']
]);
foreach ($restaurants as $restaurant) {
$config['restaurants'][] = $restaurant->exports();
}
}
echo json_encode($config);
break;
}
echo json_encode($config);
}
}

View File

@ -300,6 +300,7 @@ class Crunchbutton_App extends Cana_App {
$config = [];
$config['user'] = c::user()->exports();
$config['env'] = $this->env();
$config['ab'] = json_decode($this->auth()->get('ab'));
return $config;
}

View File

@ -9,7 +9,7 @@
<div class="restaurant-name"><h1><%= restaurant.name %></h1></div>
<% if (restaurant.image) { %>
<div class="restaurant-pic-wrapper">
<div class="restaurant-pic-wrapper<%= (App.config.ab.restaurantPage == 'restaurant-page-noimage') ? ' restaurant-pic-wrapper-hidden' : '' %>">
<div class="restaurant-pic" style="background: url(<%= restaurant.img %>);"></div>
</div>
<% } %>

View File

@ -2106,7 +2106,11 @@ html[xmlns] .clearfix {
.restaurant-pic-wrapper {
height: 190px;
overflow: hidden;
margin-bottom: 0px;
margin-bottom: -50px;
}
.restaurant-pic-wrapper.restaurant-pic-wrapper-hidden {
display: none;
}
.restaurant-name {
@ -2114,7 +2118,7 @@ html[xmlns] .clearfix {
}
.cart-items {
margin-top: 20px;
margin-top: 70px;
}
.button-bottom.button-letseat-form {

View File

@ -11,7 +11,6 @@
var App = {
cartHighlightEnabled: false,
currentPage: null,
slogans: ['Push a button. Get Food.'],
tagline: '',
service: '/api/',
cached: {},
@ -36,7 +35,6 @@ var App = {
_init: false,
_pageInit: false,
_identified: false,
isDeliveryAddressOk : false,
tips: [0,5,10,15,20,25]
};
@ -286,21 +284,81 @@ App.identify = function() {
/**
* generate ab formulas
*/
App.AB = function() {
// random taglines
App.taglines = [
{
name: 'tagline-for-free',
tagline: 'Order the top food %s. For free. <br /> After you order, everything is saved for future 1 click ordering. <br /><strong>Choose a restaurant:</strong>'
},
{ name: 'tagline-no-free',
tagline: 'Order the top food %s. <br /> After you order, everything is saved for future 1 click ordering. <br /><strong>Choose a restaurant:</strong>'
App.AB = {
options: {
tagline: [
{
name: 'tagline-for-free',
tagline: 'Order the top food %s. For free. <br /> After you order, everything is saved for future 1 click ordering. <br /><strong>Choose a restaurant:</strong>'
},
{
name: 'tagline-no-free',
tagline: 'Order the top food %s. <br /> After you order, everything is saved for future 1 click ordering. <br /><strong>Choose a restaurant:</strong>'
}
],
slogan: [
{
name: 'slogan-push-food',
slogan: 'Push a button. Get Food.'
}
],
restaurantPage: [
{
name: 'restaurant-page-noimage'
},
{
name: 'restaurant-page-image',
disabled: true
}
]
},
init: function() {
if (!App.config.ab) {
// we dont have ab variables. generate them
App.AB.create(true);
}
];
App.slogan = App.slogans[Math.floor(Math.random()*App.slogans.length)];
App.tagline = App.taglines[Math.floor(Math.random()*App.taglines.length)];
App.trackProperty('restaurant-tagline', App.tagline.name);
App.AB.load();
},
create: function(clear) {
if (clear) {
App.config.ab = {};
}
_.each(App.AB.options, function(option, key) {
if (App.config.ab[key]) {
return;
}
var opts = _.filter(App.AB.options[key], function(o) { return o.disabled ? false : true; });
var opt = opts[Math.floor(Math.random()*opts.length)];
App.config.ab[key] = opt.name
App.trackProperty('AB-' + key, opt.name);
});
App.AB.save();
console.log(App.config.ab);
},
load: function() {
App.slogan = _.where(App.AB.options.slogans, {name: App.config.ab.slogan});
App.tagline = _.where(App.AB.options.tagline, {name: App.config.ab.tagline});
if (!App.slogan || !App.tagline) {
App.AB.create(true);
App.AB.load(true);
}
},
save: function() {
$.ajax({
url: App.service + 'config',
data: {ab: App.config.ab},
dataType: 'json',
type: 'POST',
complete: function(json) {
}
});
}
};
App.cart = {
@ -776,27 +834,6 @@ Issue 13: Removed the password for while
return;
}
// Check the distance between the user and the restaurant
if( order.delivery_type == 'delivery' && !App.isDeliveryAddressOk ){
App.loc.geocodeDelivery( order.address,
function(){
if( App.isDeliveryAddressOk ){
if( !App.restaurant.deliveryHere( { lat : App.loc.lat, lon : App.loc.lon } )){
alert( 'Sorry, you are too far from this restaurant!' );
App.isDeliveryAddressOk = false;
App.busy.unBusy();
return;
} else {
App.busy.unBusy();
App.cart.submit();
}
} else {
App.busy.unBusy();
}
} );
return;
}
$.ajax({
url: App.service + 'order',
data: order,
@ -1037,7 +1074,7 @@ App.test = {
$('[name="pay-name"]').val('MR TEST');
$('[name="pay-phone"]').val('***REMOVED***');
$('[name="pay-address"]').val( App.restaurant.address || "123 main\nsanta monica ca" );
$('[name="pay-address"]').val("123 main\nsanta monica ca");
App.order.cardChanged = true;
},
@ -1057,7 +1094,7 @@ App.test = {
App.processConfig = function(json) {
App.config = json;
App.AB();
App.AB.init();
if (App.config.user) {
App.identify();
App.order['pay_type'] = App.config.user['pay_type'];
@ -1070,16 +1107,17 @@ App.loc = {
distance: function(params) {
try{
var R = 6371; // Radius of the earth in km
var dLat = _toRad(params.to.lat - params.from.lat);
var dLon = _toRad(params.to.lon - params.from.lon);
var dLat = (params.to.lat - params.from.lat).toRad();
var dLon = (params.to.lon - params.from.lon).toRad();
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(_toRad(params.from.lat)) * Math.cos(_toRad(params.to.lat)) *
Math.cos(params.from.lat.toRad()) * Math.cos(params.to.lat.toRad()) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c; // Distance in km
return d;
} catch( e ) {
console.log( 'error', e );
App.track('Location Error', {
lat: App.loc.lat,
lon: App.loc.lon,
@ -1272,24 +1310,6 @@ App.loc = {
complete();
});
},
geocodeDelivery : function( address, complete ){
var geocoder = new google.maps.Geocoder();
geocoder.geocode({'address': address}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
App.loc.lat = results[0].geometry.location.lat();
App.loc.lon = results[0].geometry.location.lng();
App.isDeliveryAddressOk = true;
App.registerLocationsCookies();
} else {
alert( 'Oops! We couldn\'t find that address!' );
App.isDeliveryAddressOk = false;
}
complete();
});
},
reverseGeocode: function(complete) {
App.track('Location Reverse Geocode', {
lat: App.loc.lat,
@ -1327,12 +1347,6 @@ App.loc = {
}
});
},
km2Miles : function( km ){
return km * 0.621371;
},
Miles2Km : function( miles ){
return miles * 1.60934;
}
}
@ -1561,12 +1575,10 @@ $(function() {
});
$(document).on('click', '.button-submitorder', function() {
App.isDeliveryAddressOk = false;
App.cart.submit($(this));
});
$(document).on('click', '.button-submitorder-form', function() {
App.isDeliveryAddressOk = false;
App.cart.submit($(this),true);
});