Вход

Просмотр полной версии : Нужна помощь с калькулятором


Bod
19.09.2011, 19:08
Ребята. С JS только-только первые шаги. В основном стараюсь разобраться во всем сам. Но иногда нужно направить на путь истинный. Есть проблема с калькулятором по атрибутам товара на jquery. Я сделал подмену значения для цены товара если выбран такой-то атрибут.
Н появилась проблемма. Если атрибутов много (они перечисляются на странице) то нужно вместо цены поставить сумму цен атрибутов.
Вот код со скриптом:
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>

<?php
// User is not allowed to see a price or there is no price
if( !$auth['show_prices'] || !isset($price_info["product_price_id"] )) {

$link = $sess->url( $_SERVER['PHP_SELF'].'?page=shop.ask&amp;product_id='.$product_id.'&amp;subjec t='. urlencode( $VM_LANG->_('PHPSHOP_PRODUCT_CALL').": $product_name") );
echo vmCommonHTML::hyperLink( $link, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') );
}
?>

<?php
// DISCOUNT: Show old price!
if(!empty($discount_info["amount"])) {
?>
<span class="product-Old-Price">
<?php echo $CURRENCY_DISPLAY->getFullValue($undiscounted_price); ?></span>

<br/>
<?php
}
?>
<?php
if( !empty( $price_info["product_price_id"] )) { ?>

<script type="text/javascript">
jQuery(function() {
jQuery('option').click(function() {
if(jQuery(this).attr("title") != '') {
jQuery('span.productPrice').replaceWith('<span class="productPrice">' + jQuery(this).attr("title") + '</span>');
}
else {
jQuery('span.productPrice').replaceWith('<span class="productPrice"><?php echo $CURRENCY_DISPLAY->getFullValue($base_price) ?></span>');
}
return false;
});
});
</script>
<span class="productPrice">
<?php echo $CURRENCY_DISPLAY->getFullValue($base_price) ?> <?php echo $base_price ?>
<?php echo $text_including_tax ?>
</span>
<?php
}
echo $price_table;
?>


<?php
// DISCOUNT: Show the amount the customer saves
if(!empty($discount_info["amount"])) {
echo "<br />";
echo $VM_LANG->_('PHPSHOP_PRODUCT_DISCOUNT_SAVE').": ";
if($discount_info["is_percent"]==1) {
echo $discount_info["amount"]."%";
}
else {
echo $CURRENCY_DISPLAY->getFullValue($discount_info["amount"]);
}
}
?>

Здесь код формирования аттрибутов:


<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );

foreach($attributes as $attribute) {
?>
<div class="vmAttribChildDetail" style="float: left;width:30%;text-align:right;margin:3px;"> бля
<label for="<?php echo $attribute['titlevar'] ?>_field"><?php echo $attribute['title'] ?></label>:
</div>
<div class="vmAttribChildDetail" style="float:left;width:60%;margin:3px;">
<select class="inputboxattrib" id="<?php echo $attribute['titlevar'] ?>_field" name="<?php echo $attribute['titlevar'].$attribute['product_id'] ?>"> <?php echo ($options_item) ?>
<?php foreach ( $attribute['options_list'] as $options_item ) : ?>
<?php if( isset( $options_item['display_price']) ) : ?>
<option title="<?php echo $options_item['display_price'] ?>" value="<?php echo $options_item['base_var'] ?>"><?php echo $options_item['base_value'] ?> (<?php echo $options_item['sign'].$options_item['display_price'] ?>)</option>
<?php else : ?>
<option value="<?php echo $options_item['base_var'] ?>"><?php echo $options_item['base_value'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<br style="clear:both;" />

<?php
} ?>

Как мне править скрипт чтобы выполнить данную операцию суммирования цен аттрибутов?

Тут результат
http://splitstore.ru/index.php?page=shop.product_details&category_id=134&flypage=flypage.tpl&product_id=560&option=com_virtuemart&Itemid=65&vmcchk=1&Itemid=65

DjDiablo
20.09.2011, 11:32
Оформляйте понятнее. А то мозг сломать можно.


<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>

<?php
// User is not allowed to see a price or there is no price
if( !$auth['show_prices'] || !isset($price_info["product_price_id"] )) {

$link = $sess->url( $_SERVER['PHP_SELF'].'?page=shop.ask&amp;product_id='.$product_id.'&amp;subjec t='. urlencode( $VM_LANG->_('PHPSHOP_PRODUCT_CALL').": $product_name") );
echo vmCommonHTML::hyperLink( $link, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') );
}
?>

<?php
// DISCOUNT: Show old price!
if(!empty($discount_info["amount"])) {
?>
<span class="product-Old-Price">
<?php echo $CURRENCY_DISPLAY->getFullValue($undiscounted_price); ?></span>

<br/>
<?php
}
?>
<?php
if( !empty( $price_info["product_price_id"] )) { ?>

<script type="text/javascript">
jQuery(function() {
jQuery('option').click(function() {
if(jQuery(this).attr("title") != '') {
jQuery('span.productPrice').replaceWith('<span class="productPrice">' + jQuery(this).attr("title") + '</span>');
}
else {
jQuery('span.productPrice').replaceWith('<span class="productPrice"><?php echo $CURRENCY_DISPLAY->getFullValue($base_price) ?></span>');
}
return false;
});
});
</script>
<span class="productPrice">
<?php echo $CURRENCY_DISPLAY->getFullValue($base_price) ?> <?php echo $base_price ?>
<?php echo $text_including_tax ?>
</span>
<?php
}
echo $price_table;
?>


<?php
// DISCOUNT: Show the amount the customer saves
if(!empty($discount_info["amount"])) {
echo "<br />";
echo $VM_LANG->_('PHPSHOP_PRODUCT_DISCOUNT_SAVE').": ";
if($discount_info["is_percent"]==1) {
echo $discount_info["amount"]."%";
}
else {
echo $CURRENCY_DISPLAY->getFullValue($discount_info["amount"]);
}
}
?>



<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );

foreach($attributes as $attribute) {
?>
<div class="vmAttribChildDetail" style="float: left;width:30%;text-align:right;margin:3px;"> бля
<label for="<?php echo $attribute['titlevar'] ?>_field"><?php echo $attribute['title'] ?></label>:
</div>
<div class="vmAttribChildDetail" style="float:left;width:60%;margin:3px;">
<select class="inputboxattrib" id="<?php echo $attribute['titlevar'] ?>_field" name="<?php echo $attribute['titlevar'].$attribute['product_id'] ?>"> <?php echo ($options_item) ?>
<?php foreach ( $attribute['options_list'] as $options_item ) : ?>
<?php if( isset( $options_item['display_price']) ) : ?>
<option title="<?php echo $options_item['display_price'] ?>" value="<?php echo $options_item['base_var'] ?>"><?php echo $options_item['base_value'] ?> (<?php echo $options_item['sign'].$options_item['display_price'] ?>)</option>
<?php else : ?>
<option value="<?php echo $options_item['base_var'] ?>"><?php echo $options_item['base_value'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<br style="clear:both;" />

<?php
} ?>


Дала пойдут быстрее если вы результирующий фрагмент html покажете. И js скрипт впридачу.
Кстатии ссылка пример не работает.

DjDiablo
20.09.2011, 11:53
особо вникать нестал, думаю как то так.

function getSumOptions(){
var sum=0;//локальная переменная недоступная за пределами функции
$(".inputboxattrib").find("option").each(function(){
//parseFloat должно вернуть число с точкой. если в value число, иначе nan, и весь расчёт на смарку ))
sum += parseFloat(this.val());
});
alert (sum);
};

Snek17
02.11.2012, 16:30
Добрый день. Та же ситуация, куда вставлять функцию помогите пожалуйста!

price.tpl.php
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>

<?php
// User is not allowed to see a price or there is no price
if( !$auth['show_prices'] || ( !isset($price_info["product_price_id"] ) && ( !$parent_has_children) ) ) {

$link = $sess->url( $_SERVER['PHP_SELF'].'?page=shop.ask&amp;product_id='.$product_id.'&amp;subjec t='. urlencode( $VM_LANG->_('PHPSHOP_PRODUCT_CALL').": $product_name") );
echo vmCommonHTML::hyperLink( $link, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') );
}
?>

<?php
// DISCOUNT: Show old price! Inline style specified for PDF creation, remove it if you don't need it
if(!empty($discount_info["amount"])) {
?>
<span class="product-Old-Price" style="color:red;text-decoration:line-through;">
<?php echo $CURRENCY_DISPLAY->getFullValue($undiscounted_price); ?></span>

<br/>
<?php
}
?>
<?php
if( !empty( $price_info["product_price_id"] )) { ?>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery(".inputboxattrib").change(function () {
jQuery('span.productPrice').replaceWith('<span class="productPrice">'+jQuery(".inputboxattrib option:selected").attr("title")+'</span>');
})
});
</script>
<span class="productPrice">
<?php echo $CURRENCY_DISPLAY->getFullValue($base_price) ?>
<?php echo $text_including_tax ?>
</span>
<?php
}
echo $price_table;
?>


<?php
// DISCOUNT: Show the amount the customer saves
if(!empty($discount_info["amount"])) {
echo "<br />";
echo $VM_LANG->_('PHPSHOP_PRODUCT_DISCOUNT_SAVE').": ";
if($discount_info["is_percent"]==1) {
echo $discount_info["amount"]."%";
}
else {
echo $CURRENCY_DISPLAY->getFullValue($discount_info["amount"]);
}
}
?>



addtocart_advanced_attribute.tpl.php
<?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );

foreach($attributes as $attribute) {
?>
<div class="vmAttribChildDetail" style="float: left;text-align:right;margin:3px;">
<label for="<?php echo $attribute['titlevar'] ?>_field"><?php echo $attribute['title'] ?></label>:
</div>
<div class="vmAttribChildDetail" style="float:left;margin:3px;">
<select class="inputboxattrib" id="<?php echo $attribute['titlevar'] ?>_field" name="<?php echo $attribute['titlevar'].$attribute['product_id'] ?>">
<?php foreach ( $attribute['options_list'] as $options_item ) : ?>
<?php if( isset( $options_item['display_price']) ) : ?>
<option title="<?php echo $options_item['display_price'] ?>" value="<?php echo $options_item['base_var'] ?>"><?php echo $options_item['base_value'] ?> (<?php echo $options_item['sign'].$options_item['display_price'] ?>)</option>
<?php else : ?>
<option value="<?php echo $options_item['base_var'] ?>"><?php echo $options_item['base_value'] ?></option>
<?php endif; ?>
<?php endforeach; ?>
</select>
</div>
<br style="clear:both;" />

<?php
} ?>

DjDiablo
03.11.2012, 17:48
А при каком условии должно ?
быть может так ?

$(function(){

function getSumOptions(){
var sum=0;//локальная переменная недоступная за пределами функции
$(".inputboxattrib").find("option").each(function(){
//parseFloat должно вернуть число с точкой. если в value число, иначе nan, и весь расчёт на смарку ))
sum += parseFloat(this.val());
});
alert (sum);
}

//при изменении inputboxattrib, сработает расчёт
$('.inputboxattrib').change( getSumOptions );

//строка ниже посчитает цену при открытии страницы (ЕСЛИ НЕ НАДО ТО ЗАРЕМАРИТЬ)
getSumOptions ();
});

Snek17
03.11.2012, 19:41
Походу не правильно впихнул:
<?php
if( !empty( $price_info["product_price_id"] )) { ?>
<script type="text/javascript">
jQuery(document).ready(function(){
jQuery(".inputboxattrib").change(function () {

function getSumOptions(){
var sum=0;//локальная переменная недоступная за пределами функции
$(".inputboxattrib").find("option").each(function(){
//parseFloat должно вернуть число с точкой. если в value число, иначе nan, и весь расчёт на смарку ))
sum += parseFloat(this.val());
});
alert (sum);
}
//при изменении inputboxattrib, сработает расчёт
$('.inputboxattrib').change( getSumOptions );

jQuery('span.productPrice').replaceWith('<span class="productPrice">' + getSumOptions () + '</span>');
})
});
</script>
<span class="productPrice">
<?php echo $CURRENCY_DISPLAY->getFullValue($base_price) ?>
<?php echo $text_including_tax ?>
</span>
<?php
}
echo $price_table;
?>

Вот тут ведется война: http://mobilario.cleverhosting.org/index.php?page=shop.product_details&flypage=flypage_new.tpl&product_id=248&category_id=74&option=com_virtuemart&Itemid=1

Как видите есть несколько селектов с ценами, вот их и нужно подсчитать, помогите пожалуйста с решением задачи.

DjDiablo
06.11.2012, 09:01
$(".inputboxattrib") - ненаходит элементы
jQuery (".inputboxattrib") - находит

значит конфликт
так как у тебя джумла то конфликт происходит с mootools, mootools просто затирает $ с jQuery

1) сразу после загрузки jquery пропиши команду noConflict() (http://yandex.ru/yandsearch?text=%D0%BA%D0%BE%D0%BD%D1%84%D0%BB%D0% B8%D0%BA%D1%82+jQuery+c+mootools&clid=47640&lr=197)
2) используй конструкцию jQuery(function($){ внутри $- доступен несмотря на моотоолс })


//возможно что то подобное тебе надо
jQuery(function($){

function getSumOptions(){
var sum=0;//локальная переменная недоступная за пределами функцииТ
$(".inputboxattrib").find("option").each(function(){
//parseFloat должно вернуть число с точкой. если в value число, иначе nan, и весь расчёт на смарку ))
sum += parseFloat(this.val());
});
//alert (sum);
return sum;
}

//при изменении inputboxattrib, сработает расчёт
jQuery(".inputboxattrib").change(function(){
jQuery('span.productPrice').replaceWith('<span class="productPrice">' + getSumOptions () + '</span>');
});

})

irbis_teh
14.12.2012, 19:57
Нужна помощь в определении ошибки скрипта. сам только новичек в JS и на форуме тоже, поэтому своего поста создать немогу, а проблему решить надо. прошу прощения если что не так.
Вот мой скрипт:
<script type="text/javascript">
function calc(form) {
var K = eval(form.K.value);
var Rz = eval(form.Rz.value);
var Rx = eval(form.Rx.value);
var Ry = eval(form.Ry.value);
var D = eval(form.D.value);
var Ldet = eval(form.Ldet.value);
var phi1 = eval(form.phi1.value);
var phi2 = eval(form.phi2.value);
var l = eval(form.l.value);
var ap = eval(form.ap.value);
var gama = eval(form.gama.value);

form.Q.value = K*Math.sqrt(math.pow(Rz,2)+Math.pow(Ry-(Rx*D)/(2*Ldet),2))*Math.abs(1-Math.tan((90-gama/2)+phi1)*Math.tan((phi2)*3*l/ap)/Math.abs(Math.tan((90-gama/2)+Phi1)));
}
</script>
Внем при запуске редактора JS выводит ошибку. /*
Exception: syntax error
@Scratchpad:10
*/
На сайте тоже не работает. Что тут не так?

DjDiablo
14.12.2012, 20:22
сам только новичек в JS и на форуме тоже, поэтому своего поста создать немогу
Вы феноменально скромный человек :)

приведите пример кода вместе с формой.
затем выделите код и нажмите на кнопку вставить код html.
тоесть начнём с полного описания задачи и правильного её оформления.

ещё интересно какие данные попадают в eval.