我正在尝试更改Magento Reviews扩展程序的默认行为,以便允许不进行投票,但前提是附加了评论。我已经做了足够的研究来知道在哪里更改代码,并且我添加了“取消评级”功能,但它没有完全按预期工作,我似乎无法弄清楚如何检查是否评级是本。
以下是定义无线电的HTML部分。
<div class="right" id="ratings-right">
<?php $countRatings = count($this->getRatings()); ?>
<?php foreach ($this->getRatings() as $_rating): ?>
<?php if ( $countRatings > 1 ): ?>
<div class="rating-code" id="ratings-code[<?php echo $_rating->getRatingCode(); ?>]"</div>
<?php endif; ?>
<ul>
<?php $sizeOptions = sizeof($_rating->getOptions()); $index=0; ?>
<li class="value">
<div class="rating-cancel"></div>
<input type="radio" value="0" name="cancel[<?php echo $_rating->getId() ?>]" id="<?php echo $this->escapeHtml($_rating->getRatingCode()) ?>C<?php echo $_rating->getId() ?>" class="radio" /></li>
<?php foreach ($_rating->getOptions() as $_option): $index++;?>
<li class="value">
<div class="separate-rating-star"></div>
<input type="radio" <?php if ( $sizeOptions == $index ) :?><?php endif; ?>name="ratings[<?php echo $_rating->getId() ?>]" id="<?php echo $this->escapeHtml($_rating->getRatingCode()) ?>_<?php echo $_option->getValue() ?>" value="<?php echo $_option->getId() ?>" class="radio" />
</li>
<?php endforeach; ?>
</ul>
<?php endforeach; ?>
<input type="hidden" name="validate_rating" class="validate-rating" value="" />
</div>
这是验证和重置发生的JavaScript部分
Validation.addAllThese(
[
['validate-rating', '<?php echo $this->__('Please select a rating above OR write your Review below') ?>', function(v) {
var ratingContainer = document.getElementById('ratings-right');
var ratings = ratingContainer.getElementsByClassName('rating-code');
var values;
var star;
var error = 1;
window.console&&console.log("START");
for (r=0;r < ratings.length; r++ ) {
values = ratings.getElementsByClassName('value');
stars = values.getElementsByTagName('radio');
for (s=0; s < stars.length; s++ ) {
console.log("Checking star %d.", s);
if (stars[s].checked == true) {
error = 0;
window.console&&console.log("Radio %d is checked.\n", s);
}
}
var review = $('review_field').length;
window.console&&console.log("Review size %d.", review);
if ( review > 5 ) {
error = 0;
window.console&&console.log("Review size (%d) greater than 5.", review);
}
if( error != 0 ) {
window.console&&console.log("Failed.\n");
return false;
} else {
window.console&&console.log("Passed.\n");
error = 1;
}
}
return true;
}]
]
);
$(".overall-raiting ul li").click(
function(){
var tthis = this;
var done = 0;
var $li = $(tthis).parent().children('li');
$li.removeClass('active');
$li.each(function(){
if( done < 1 ) $(this).addClass('active');
if ( tthis == this ) done++;
if( done != 1 ) $(this).prop('checked', false);
})
if ( done > 0 ) return false;
$(this).find('input.radio').attr('checked',true);
}
);
我无法让控制台始终如一地报告值,尽管在这里阅读有关在firefox和firebug和Chrome中使用delete window['console'];
方法的问题。但似乎我的.onclick功能正在将所有无线电更改为未选中,包括应检查的无线电。我尽量接近我在验证部分中没有选择无线电,我尝试使用.val()和.value属性,但这段代码是我最近的尝试。
我想要的只是点击保持已检查所有其他未选中的广播,并通过确定是否已选中(包括取消)或如果textarea'review_field'包含任何内容来验证。
我的最终答案如下。它比我的第一个解决方案更优雅,但我希望这有助于将来的某个人。
答案 0 :(得分:0)
根据你想做的事情
所有其他未经检查并通过确定是否已检查(包括取消)或如果textarea'review_field'包含任何内容来验证
此功能可能会有所帮助:
function isValidForm() {
var numRadios = $('#ratings-right input:radio:checked').length,
reviewContents = $('#review_field').val(),
isValid = numRadios == 1 || reviewContents != '';
return isValid;
}
答案 1 :(得分:0)
首先,通过回答此问题解决了我的Javascript日志问题:JavaScript console log in Magento
jQuery(document).ready(function(){
window.console = jQuery('<iframe>').hide().appendTo('body')[0].contentWindow.console;
});
这显然只有在使用jQuery时才有效。
我的问题的其余部分通过实施bbird代码的变体来解决:
var rated = 0;
var ratingValue = $('#ratings-right input:radio:checked');
var reviewArea = $('#review_field');
var reviewContents = "";
for (i=0; i<reviewArea.length; i++) {
reviewContents += reviewArea[i].value;
}
for (i=0; i<ratingValue.length; i++) {
if (ratingValue[i].value.length == 1 )
rated = 1;
}
console.log("%s", rated);
console.log("%s", reviewContents);
var isValid = rated > 0 || reviewContents != '';
console.log("%s", isValid);
return isValid;
对于单选按钮本身,在Magento的数据库中,我添加了一个零星形值,optionId为99999.此评级首先显示在评级选项中,在控制器中为此,我检查的值是否小于9999这样可以确保零星评级不会计算到汇总中。
这也允许所有单选按钮是相同的类和名称,因此不再需要以编程方式取消选中任何内容。单选按钮的默认行为是,只允许检查具有相同名称的组中的一个无线电。
现在是单选按钮的实现:
<div <?php if ($_option->getValue() == "0" ) echo "class=\"rating-cancel\""; else echo "class=\"separate-rating-star\"" ?>></div>
<input type="radio" <?php if ( $sizeOptions == $index ) :?><?php endif; ?>name="ratings[<?php echo $_rating->getId() ?>]" id="<?php echo $this->escapeHtml($_rating->getRatingCode()) ?>_<?php echo $_option->getValue() ?>" value="<?php echo $_option->getId() ?>" class="radio" />
这样第一个选项,其值为0,可以通过css风格化为某种取消按钮,其余的将是星星。