Skip to content

Commit

Permalink
Added radio product options #112
Browse files Browse the repository at this point in the history
Improved JS validation errors to remove alerts.
  • Loading branch information
Al Brookbanks committed Jan 27, 2015
1 parent 080add8 commit 6d2e7f8
Show file tree
Hide file tree
Showing 12 changed files with 63 additions and 40 deletions.
8 changes: 7 additions & 1 deletion admin/skins/default/js/admin.min.js 100755 → 100644

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions admin/skins/default/templates/products.options.php
Expand Up @@ -68,13 +68,13 @@
<h3>{$LANG.catalogue.title_option_attributes}</h3>
<div>
<select name="add-value[option_id]" id="select_group_id" rel="group_" class="field_select">
{foreach from=$GROUPS item=group}{if $group.type==0}
{foreach from=$GROUPS item=group}{if $group.type==0 || $group.type==4}
<option value="{$group.id}">{$group.name}</option>
{/if}{/foreach}
</select>
</div>
{foreach from=$GROUPS item=group}
{if $group.type==0}
{if $group.type==0 || $group.type==4}
<fieldset id="group_{$group.id}" class="field_select_target">
<legend>{$group.name}</legend>
<table width="100%">
Expand Down
7 changes: 4 additions & 3 deletions admin/sources/products.index.inc.php
Expand Up @@ -834,6 +834,7 @@
}

## Product Options (Sets)
$select_types = array(0,4);
if (($set_products = $GLOBALS['db']->select('CubeCart_options_set_product', false, array('product_id' => $product_id))) !== false) {
foreach ($set_products as $set_product) {
if (($members = $GLOBALS['db']->select('CubeCart_options_set_member', false, array('set_id' => $set_product['set_id']))) !== false) {
Expand All @@ -842,14 +843,14 @@
foreach ($assigned as $assign) {
$group = (isset($group_list[$assign['option_id']])) ? $group_list[$assign['option_id']] : array();
$value = (isset($value_list[$assign['option_id']][$assign['value_id']])) ? $value_list[$assign['option_id']][$assign['value_id']] : array();
$group['display'] = ($group['option_type'] == 0) ? '<strong>'.$group['option_name'].':</strong> '.$value['value_name'] : $group['option_name'];
$group['display'] = in_array($group['option_type'], $select_types) ? '<strong>'.$group['option_name'].':</strong> '.$value['value_name'] : $group['option_name'];
$option_list[$member['option_id']][$member['value_id']] = array_merge($member, $assign, $group, $value, array('show_disable' => true));
$option_list[$assign['option_id']][$assign['value_id']]['from_assigned'] = true;
}
} else {
$group = (isset($group_list[$member['option_id']])) ? $group_list[$member['option_id']] : array();
$value = ($member['value_id'] > 0 && isset($value_list[$member['option_id']][$member['value_id']])) ? $value_list[$member['option_id']][$member['value_id']] : array();
$group['display'] = ($group['option_type'] == 0) ? '<strong>'.$group['option_name'].':</strong> '.$value['value_name'] : $group['option_name'];
$group['display'] = in_array($group['option_type'], $select_types) ? '<strong>'.$group['option_name'].':</strong> '.$value['value_name'] : $group['option_name'];
$assign = array('set_enabled' => '1', 'option_price' => number_format(0, 2), 'option_weight' => number_format(0, 2));

$option_list[$member['option_id']][$member['value_id']] = array_merge($member, $group, $value, $assign, array('show_disable' => true));
Expand All @@ -868,7 +869,7 @@
}
$group = (isset($group_list[$assign['option_id']])) ? $group_list[$assign['option_id']] : array();
$value = (isset($value_list[$assign['option_id']][$assign['value_id']])) ? $value_list[$assign['option_id']][$assign['value_id']] : array();
$group['display'] = ($group['option_type'] == 0) ? '<strong>'.$group['option_name'].':</strong> '.$value['value_name'] : $group['option_name'];
$group['display'] = in_array($group['option_type'], $select_types) ? '<strong>'.$group['option_name'].':</strong> '.$value['value_name'] : $group['option_name'];
$option_list[$assign['option_id']][$assign['value_id']] = array_merge($assign, $group, $value, array('show_disable' => false));
$option_list[$assign['option_id']][$assign['value_id']]['from_assigned'] = true;
$option_list[$assign['option_id']]['priority'] = $group['priority'];
Expand Down
4 changes: 2 additions & 2 deletions admin/sources/products.options.inc.php
Expand Up @@ -268,9 +268,9 @@

$optionTypes = array(
0 => $lang['catalogue']['option_type_select'],
4 => $lang['catalogue']['option_type_radio'],
1 => $lang['catalogue']['option_type_textbox'],
2 => $lang['catalogue']['option_type_textarea'],
# 3 => $lang['catalogue']['option_type_checkbox'],
2 => $lang['catalogue']['option_type_textarea']
);
$GLOBALS['smarty']->assign('OPTION_TYPES', $optionTypes);
$GLOBALS['smarty']->assign('OPTION_TYPE_JSON', json_encode($optionTypes));
Expand Down
7 changes: 4 additions & 3 deletions classes/catalogue.class.php
Expand Up @@ -573,7 +573,7 @@ public function getProductOptions($product_id = null) {
if ($group['option_required']) {
$this->_option_required = true;
}
if ($group['option_type'] == 0) {
if ($group['option_type'] == 0 || $group['option_type'] == 4) {
if (isset($set_values[$group['option_id']]) && !empty($set_values[$group['option_id']])) {
$value_id = $set_values[$group['option_id']];
}
Expand Down Expand Up @@ -623,7 +623,7 @@ public function getProductOptions($product_id = null) {
if ($category['option_required']) {
$this->_option_required = true;
}
if ($category['option_type'] == 0) {
if ($category['option_type'] == 0 || $category['option_type'] == 4) {
// Get Option Values
if (($values = $GLOBALS['db']->select('CubeCart_option_value', false, array('option_id' => $category['option_id'], 'value_id' => $mid), array('priority' => 'ASC', 'value_name' => 'ASC'))) !== false) {
foreach ($values as $value) {
Expand Down Expand Up @@ -799,7 +799,7 @@ public function getOptionData($option_id, $assign_id) {
}
} else {
$assigned = $GLOBALS['db']->select('CubeCart_option_assign', false, array('assign_id' => (int)$assign_id));
if ($category[0]['option_type'] == 0) {
if ($category[0]['option_type'] == 0 || $category[0]['option_type'] == 4) {
// Select
if (($value = $GLOBALS['db']->select('CubeCart_option_value', false, array('option_id' => $category[0]['option_id'], 'value_id' => $assigned[0]['value_id']))) !== false) {
return array_merge($category[0], $assigned[0], $value[0]);
Expand Down Expand Up @@ -1361,6 +1361,7 @@ public function displayProductOptions($product_id = null, $selected_options_arra
foreach ($optionArray as $type => $group) {
switch ($type) {
case self::OPTION_SELECT: ## Dropdown options
case self::OPTION_RADIO: ## Radio options
foreach ($group as $key => $option) {
$group_priority = $option['priority'];
unset ($option['priority']);
Expand Down
1 change: 1 addition & 0 deletions language/definitions.xml
Expand Up @@ -366,6 +366,7 @@
<string name="option_group_type" introduced="5.0.0"><![CDATA[Group Type]]></string>
<string name="option_type_checkbox" introduced="5.0.0"><![CDATA[Checkbox]]></string>
<string name="option_type_select" introduced="5.0.0"><![CDATA[Dropdown List]]></string>
<string name="option_type_radio" introduced="5.0.0"><![CDATA[Radio Button List]]></string>
<string name="option_type_textarea" introduced="5.0.0"><![CDATA[Textarea (Multiline)]]></string>
<string name="option_type_textbox" introduced="5.0.0"><![CDATA[Textbox (Single line)]]></string>
<string name="out_of_stock" introduced="5.0.0"><![CDATA[This product is currently out of stock]]></string>
Expand Down
11 changes: 8 additions & 3 deletions skins/foundation/js/cubecart.js
Expand Up @@ -93,9 +93,14 @@ jQuery(document).ready(function () {
$('form.add_to_basket').submit(function(e) {
var submit_form = true;
$("[name^=productOptions]").each(function () {
if ($(this).is("[required]") && $(this).val() == '') {
submit_form = false;
return false;
if ($(this).is("[required]")) {
if($(this).is(':radio') && !$(this).is(':checked')) {
submit_form = false;
return false;
} else if ($(this).val() == '') {
submit_form = false;
return false;
}
}
});

Expand Down
29 changes: 9 additions & 20 deletions skins/foundation/js/cubecart.validate.js
@@ -1,6 +1,14 @@
;jQuery(document).ready(function() {
$.validator.setDefaults({
errorElement: 'small'
errorElement: 'small',
errorPlacement: function(error, element) {
if (element.is(":radio") || element.is(":checkbox")) {
var errorLocation = element.attr('rel');
error.insertAfter('#'+errorLocation);
} else {
error.insertAfter(element);
}
}
});
$.validator.addMethod("phone", function(phone, element) {
phone = phone.replace(/\s+/g, "");
Expand Down Expand Up @@ -96,17 +104,6 @@
}
});
$("#checkout_form").validate({
errorPlacement: function(error, element) {
if (element.attr("name") == "gateway") {
element.removeClass("error");
alert(error.text());
} else if (element.attr("name") == "terms_agree") {
element.removeClass("error");
alert(error.text());
} else {
error.insertAfter(element);
}
},
rules: {
username: {
required: true,
Expand Down Expand Up @@ -305,14 +302,6 @@
}
});
$("#registration_form").validate({
errorPlacement: function(error, element) {
if (element.attr("name") == "terms_agree") {
element.removeClass("error");
alert(error.text());
} else {
error.insertAfter(element);
}
},
rules: {
first_name: {
required: true
Expand Down
2 changes: 1 addition & 1 deletion skins/foundation/templates/content.checkout.confirm.php
Expand Up @@ -110,7 +110,7 @@
</address>
{if $TERMS_CONDITIONS}
<div class="row">
<div class="small-12 large-8 columns"><input type="checkbox" id="reg_terms" name="terms_agree" value="1" {$TERMS_CONDITIONS_CHECKED}><label for="reg_terms">{$LANG.account.register_terms_agree_link|replace:'%s':{$TERMS_CONDITIONS}}</label></div>
<div class="small-12 large-8 columns"><span id="error_terms_agree"><input type="checkbox" id="reg_terms" name="terms_agree" value="1" {$TERMS_CONDITIONS_CHECKED} rel="error_terms_agree"><label for="reg_terms">{$LANG.account.register_terms_agree_link|replace:'%s':{$TERMS_CONDITIONS}}</label></span></div>
</div>
{/if}
{if $ALLOW_DELIVERY_ADDRESS}
Expand Down
4 changes: 2 additions & 2 deletions skins/foundation/templates/content.checkout.php
Expand Up @@ -32,10 +32,10 @@
<hr>
<div class="row">
<div class="small-12 columns">
<ul class="no-bullet center">
<ul class="no-bullet center" id="gateway_error">
{foreach from=$GATEWAYS item=gateway}
<li>
<input name="gateway" type="radio" value="{$gateway.folder}" id="{$gateway.folder}" required {$gateway.checked}><label for="{$gateway.folder}">{$gateway.description}</label>
<input name="gateway" type="radio" value="{$gateway.folder}" id="{$gateway.folder}" required {$gateway.checked} rel="gateway_error"><label for="{$gateway.folder}">{$gateway.description}</label>
{if !empty($gateway.help)}
<a href="{$gateway.help}" class="info" title="{$LANG.common.information}"><i class="fa fa-info-circle"></i></a>
{/if}
Expand Down
24 changes: 22 additions & 2 deletions skins/foundation/templates/content.product.php
Expand Up @@ -40,12 +40,32 @@
<div class="small-5 columns">
{if is_array($OPTIONS)}
{foreach from=$OPTIONS item=option}
{if $option.type == Catalogue::OPTION_SELECT}
{if $option.type == Catalogue::OPTION_RADIO}
<div class="row">
<div class="small-12 columns">
{* If we only have one required option replace with hidden field *}
{if $option.required && count($option.values)===1}
<label for="option_{$option.option_id}" class="return">{$option.option_name}{if $option.price} ({$option.symbol}{$option.price}){/if}{if $option.required} *{/if}</label>
{$option.values.0.value_name}{if $option.values.0.price} ({$option.values.0.symbol}{$option.values.0.price}){/if}
<input type="hidden" name="productOptions[{$option.option_id}]" id="option_{$option.option_id}" value="{$option.values.0.assign_id}">
{else}
<div>{$option.option_name}{if $option.price} ({$option.symbol}{$option.price}){/if}{if $option.required} *{/if}</div>
<span id="error_option_{$option.option_id}">
{foreach from=$option.values item=value}
<div><input type="radio" name="productOptions[{$option.option_id}]" id="option_{$value.assign_id}" value="{$value.assign_id}" class="nomarg" rel="error_option_{$option.option_id}" {if $option.required}required{/if}>
<label for="option_{$value.assign_id}" class="return">{$value.value_name}{if $value.price} ({$value.symbol}{$value.price}){/if}</label></div>
{/foreach}
</span>
{/if}
</div>
</div>
{elseif $option.type == Catalogue::OPTION_SELECT}
<div class="row">
<div class="small-12 columns">
<label for="option_{$option.option_id}" class="return">{$option.option_name}{if $option.price} ({$option.symbol}{$option.price}){/if}{if $option.required} *{/if}</label>
{* If we only have one required option replace with hidden field *}
{if $option.required && count($option.values)==1}
{if $option.required && count($option.values)===1}
{$option.values.0.value_name}{if $option.values.0.price} ({$option.values.0.symbol}{$option.values.0.price}){/if}
<input type="hidden" name="productOptions[{$option.option_id}]" id="option_{$option.option_id}" value="{$option.values.0.assign_id}">
{else}
Expand Down
2 changes: 1 addition & 1 deletion skins/foundation/templates/content.register.php
Expand Up @@ -42,7 +42,7 @@
{include file='templates/content.recaptcha.php'}
{if $TERMS_CONDITIONS}
<div class="row">
<div class="small-12 large-8 columns"><input type="checkbox" id="terms" name="terms_agree" value="1" {$TERMS_CONDITIONS_CHECKED}><label for="terms">{$LANG.account.register_terms_agree_link|replace:'%s':{$TERMS_CONDITIONS}}</label></div>
<div class="small-12 large-8 columns"><span id="error_terms_agree"><input type="checkbox" id="terms" name="terms_agree" value="1" {$TERMS_CONDITIONS_CHECKED} rel="error_terms_agree"><label for="terms">{$LANG.account.register_terms_agree_link|replace:'%s':{$TERMS_CONDITIONS}}</label></span></div>
</div>
{/if}
<div class="row">
Expand Down

0 comments on commit 6d2e7f8

Please sign in to comment.