Commit 8e5dd1af by dhn

Merge branch 'developer' of http://47.99.244.21:9999/root/joshine into Branch_developer

parents 6ada8e02 7c928340
/app/etc/config.php
/.gitignore
cache
composer_home
log
page_cache
view_preprocessed
static
errors
media
opt
/app/etc/env.php
generated
var
.idea
/.php_cs.cache
/app/design/frontend/Joshine/breeze/Magento_Theme/templates/root.phtml
/pub/feed
...@@ -8,7 +8,7 @@ use Magento\Framework\View\Element\Template; ...@@ -8,7 +8,7 @@ use Magento\Framework\View\Element\Template;
class Pager extends \Magento\Theme\Block\Html\Pager class Pager extends \Magento\Theme\Block\Html\Pager
{ {
const DEFAULT_PAGE_SIZE = 3; const DEFAULT_PAGE_SIZE = 5;
/** /**
* @var string * @var string
*/ */
......
...@@ -108,7 +108,7 @@ class Images extends \Magento\Framework\View\Element\Template ...@@ -108,7 +108,7 @@ class Images extends \Magento\Framework\View\Element\Template
*/ */
public function getResizedImagePath($item): string public function getResizedImagePath($item): string
{ {
return $this->imageHelper->resize($item->getPath(), self::REVIEW_COVER_WIDTH * 2); return $this->imageHelper->resize($item->getPath(), self::REVIEW_COVER_WIDTH);
} }
/** /**
......
<?php
namespace Joshine\Review\Data\Form\Element;
/**
* Class Image - add multiple file upload
*/
class Image extends \Magento\Framework\Data\Form\Element\Image
{
/**
* @return string
*/
public function getElementHtml()
{
$html = parent::getElementHtml();
$html = str_replace('type="file"', 'type="file" multiple accept="image/*" ', $html);
return $html;
}
}
<?php
namespace Joshine\Review\Model\Repository;
use Joshine\Review\Block\Images;
use Magento\Framework\Api\SearchCriteriaInterface;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Exception\CouldNotDeleteException;
use Magento\Framework\Exception\CouldNotSaveException;
use Joshine\Review\Model\ResourceModel;
use Joshine\Review\Model\ImagesFactory;
use Magento\Framework\Api\Search\FilterGroup;
use Magento\Ui\Api\Data\BookmarkSearchResultsInterfaceFactory;
use Magento\Framework\Api\SortOrder;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\App\Filesystem\DirectoryList;
use Joshine\Review\Helper\ImageHelper;
class ImagesRepository
{
/**
* @var array
*/
private $images = [];
/**
* @var ResourceModel\Images
*/
private $imagesResource;
/**
* @var ImagesFactory
*/
private $imagesFactory;
/**
* @var ResourceModel\Images\CollectionFactory
*/
private $imagesCollectionFactory;
/**
* @var \Magento\Framework\Filesystem\Io\File
*/
private $ioFile;
/**
* @var null|string
*/
private $folderPath = null;
/**
* @var \Magento\Framework\Filesystem
*/
private $filesystem;
public function __construct(
\Joshine\Review\Model\ResourceModel\Images $imagesResource,
\Joshine\Review\Model\ImagesFactory $imagesFactory,
\Joshine\Review\Model\ResourceModel\Images\CollectionFactory $imagesCollectionFactory,
\Magento\Framework\Filesystem $filesystem,
\Magento\Framework\Filesystem\Io\File $ioFile
) {
$this->imagesResource = $imagesResource;
$this->imagesFactory = $imagesFactory;
$this->imagesCollectionFactory = $imagesCollectionFactory;
$this->ioFile = $ioFile;
$this->filesystem = $filesystem;
}
/**
* {@inheritdoc}
*/
public function get($imageId)
{
if (!isset($this->images[$imageId])) {
/** @var \Joshine\Review\Model\Images $image */
$image = $this->imagesFactory->create();
$this->imagesResource->load($image, $imageId);
if (!$image->getImageId()) {
throw new NoSuchEntityException(__('Rule with specified ID "%1" not found.', $imageId));
}
$this->images[$imageId] = $image;
}
return $this->images[$imageId];
}
/**
* @return string
*/
private function getFolderPath()
{
if ($this->folderPath === null) {
$this->folderPath = $this->filesystem->getDirectoryRead(
DirectoryList::MEDIA
)->getAbsolutePath(
ImageHelper::IMAGE_PATH
);
}
return $this->folderPath;
}
/**
* {@inheritdoc}
*/
public function delete( $image)
{
try {
$this->ioFile->rm($this->getFolderPath() . $image->getPath());
$this->ioFile->rm(
$this->getFolderPath() . 'resized/' . Images::REVIEW_COVER_WIDTH
);
$this->imagesResource->delete($image);
unset($this->images[$image->getId()]);
} catch (\Exception $e) {
if ($image->getImageId()) {
throw new CouldNotDeleteException(
__('Unable to remove image with ID %1. Error: %2', [$image->getImageId(), $e->getMessage()])
);
}
throw new CouldNotDeleteException(__('Unable to remove image. Error: %1', $e->getMessage()));
}
return true;
}
/**
* {@inheritdoc}
*/
public function deleteById($imageId)
{
$model = $this->get($imageId);
$this->delete($model);
return true;
}
}
<?php
namespace Joshine\Review\Plugin\Review\Block\Adminhtml\Edit;
use Joshine\Review\Helper\BlockHelper as BlockHelper;
use Joshine\Review\Model\Repository\VoteRepository;
use Magento\Backend\Block\Widget\Form\Generic as MagentoForm;
class Form
{
/**
* @var \Magento\Framework\Registry
*/
private $registry;
/**
* @var VoteRepository
*/
private $voteRepository;
/**
* @var BlockHelper
*/
private $blockHelper;
/**
* @var \Magento\Framework\DataObjectFactory
*/
private $dataObjectFactory;
public function __construct(
BlockHelper $blockHelper,
\Magento\Framework\Registry $registry,
VoteRepository $voteRepository,
\Magento\Framework\DataObjectFactory $dataObjectFactory
) {
$this->registry = $registry;
$this->voteRepository = $voteRepository;
$this->blockHelper = $blockHelper;
$this->dataObjectFactory = $dataObjectFactory;
}
/**
* @param MagentoForm $subject
* @param \Magento\Framework\Data\Form $form
* @return array
*/
public function beforeSetForm(
MagentoForm $subject,
\Magento\Framework\Data\Form $form
) {
$fieldset = $form->getElement('review_details') ?: $form->getElement('add_review_form');
$review = $this->registry->registry('review_data') ?: $this->dataObjectFactory->create();
$fieldset->addField(
'size_fits',
'select',
[
'label' =>__('Size Fits'),
'required' => false,
'values' => [
['value' => 0, 'label'=> __('---select---')],
['value' => 1, 'label'=> __('Small')],
['value' => 2, 'label'=> __('True to Size')],
['value' => 3, 'label'=> __('Large')],
] ,
'name' => 'size_fits',
'value' => (int)$review->getData('size_fits')
]
);
$form->setData('enctype', 'multipart/form-data');
$imageHtml = trim($this->blockHelper->getReviewImagesHtml($review->getId(), 8575));
$addImageTitle = __('Customer Images');
if ($imageHtml) {
$fieldset->addField(
'added_images',
'note',
[
'label' => __('Customer Images'),
'required' => false,
'name' => 'added_images',
'after_element_html' => $imageHtml
]
);
$addImageTitle = '';
}
$fieldset->addField(
'review_images',
\Joshine\Review\Data\Form\Element\Image::class,
[
'label' => $addImageTitle,
'name' => 'review_images[]',
'before_element_html' => __('Add new images')
]
);
return [$form];
}
/**
* @param $review
* @return \Magento\Framework\Phrase
*/
private function getReviewHelpfulness($review)
{
$vote = $this->voteRepository->getVotesCount($review->getId());
return __('%1 people found this helpful; %2 found this unhelpful.', $vote['plus'], $vote['minus']);
}
}
<?php
namespace Joshine\Review\Plugin\Review\Controller\Adminhtml\Product\Review;
use Magento\Review\Controller\Adminhtml\Product\Save as MagentoReview;
class Save
{
private $imagesRepository;
public function __construct(
\Joshine\Review\Model\Repository\ImagesRepository $imagesRepository
) {
$this->imagesRepository = $imagesRepository;
}
/**
* @param MagentoReview $subject
* @param $result
* @return mixed
*/
public function afterExecute(
MagentoReview $subject,
$result
) {
$this->removeImages($subject);
return $result;
}
/**
* @param MagentoReview $subject
*/
private function removeImages(MagentoReview $subject)
{
$images = $subject->getRequest()->getParam('review_remove_image', []);
if (is_array($images)) {
foreach ($images as $id => $image) {
$this->imagesRepository->deleteById($id);
}
}
}
}
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Review\Block\Adminhtml\Edit\Form">
<plugin name="Joshine_Review::add-answer-field"
type="Joshine\Review\Plugin\Review\Block\Adminhtml\Edit\Form"/>
</type>
<type name="Magento\Review\Block\Adminhtml\Add\Form">
<plugin name="Joshine_Review::add-module-fields"
type="Joshine\Review\Plugin\Review\Block\Adminhtml\Edit\Form"/>
</type>
<type name="Magento\Review\Controller\Adminhtml\Product\Save">
<plugin name="Joshine_Review::add-module-fields::remove-image"
type="Joshine\Review\Plugin\Review\Controller\Adminhtml\Product\Review\Save"/>
</type>
</config>
<?php
/** @var \Joshine\Review\Block\Images $block */
$collection = $block->getCollection();
// phpcs:ignoreFile
?>
<style>
.review-images {
display: flex;
flex-wrap: wrap;
}
.review-slider-item {
position: relative;
flex-shrink: 0;
width: 150px;
height: 150px;
line-height: 150px;
overflow: hidden;
margin-right: 5px;
margin-bottom: 0.2em;
vertical-align: middle;
border: 1px solid #9E9E9E;
}
.review-slider-item img {
width: 100%;
height: 100%;
object-fit: cover;
}
.review-remove-image {
line-height: normal;
position: absolute;
top: .3rem;
left: .3rem;
color: white;
font-weight: lighter;
padding: .3em;
background-color:rgba(0,0,0,0.5);
}
</style>
<?php if ($collection->getSize()) : ?>
<div id="review-id-<?= $block->escapeHtmlAttr($block->getReviewId()); ?>"
class="review-images">
<?php foreach ($collection as $item) : ?>
<div class="review-slider-item" data-review-js="slider-item">
<a href="<?= $block->getFullImagePath($item); ?>" target="_blank" class="review-image-link" data-review-js="review-image">
<img class="review-image"
src="<?= /* @noEscape */ $block->getResizedImagePath($item);?>"
title="<?= $block->escapeHtml(__('Review image')); ?>"
alt="<?= $block->escapeHtml(__('Review image')); ?>"
/>
</a>
<label class="review-remove-image" title="<?= $block->escapeHtml(__('Remove image')); ?>">
<input class="review-checkbox"
value="1"
type="checkbox"
name="review_remove_image[<?= /* @noEscape */ (int)$item->getId();?>]"
style="margin-top: 0;"
>
<?= $block->escapeHtml(__('Remove'));?>
</label>
</div>
<?php endforeach; ?>
</div>
<?php endif;?>
...@@ -291,7 +291,7 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId()); ...@@ -291,7 +291,7 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId());
.j-modal .j-modal-dialog { .j-modal .j-modal-dialog {
position: relative; position: relative;
width: 530px; width: 530px;
margin: 30px auto; margin: 7rem auto;
} }
.j-modal .j-modal-content { .j-modal .j-modal-content {
...@@ -472,6 +472,137 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId()); ...@@ -472,6 +472,137 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId());
overflow: hidden; overflow: hidden;
border: 1px solid #efefef; border: 1px solid #efefef;
} }
.joshine-mobile-image-box {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
height: 100%;
z-index: 1000;
background: rgba(0,0,0);
}
.joshine-mobile-image-box .scroll-wrapper {
transition-duration: 0ms;
transform: translate3d(0px, 0px, 0px);
position: relative;
width: 100%;
height: 100%;
z-index: 1;
display: -webkit-box;
display: flex;
-webkit-transition-property: -webkit-transform;
transition-property: transform,-webkit-transform;
-webkit-box-sizing: content-box;
box-sizing: content-box;
}
.joshine-mobile-image-box .scroll-wrapper .scroll-wrapper-item {
flex-shrink: 0;
width: 100%;
height: 100%;
position: relative;
-webkit-transition-property: -webkit-transform;
transition-property: -webkit-transform;
transition-property: transform;
transition-property: transform,-webkit-transform;
display: -webkit-box;
display: flex;
display: -ms-flexbox;
-webkit-box-align: center;
align-items: center;
-webkit-box-pack: center;
justify-content: center;
}
.joshine-mobile-image-box .scroll-wrapper-item img {
width: 100%;
max-height: 100%;
}
.joshine-mobile-image-box-bottom {
padding: .7em;
position: absolute;
height: 9rem;
left: 0;
color: #fff;
bottom: 0;
width: 100%;
overflow: hidden;
z-index: 1;
font-size: 1rem;
line-height: 1.2rem;
background: -webkit-gradient(linear,left top,left bottom,from(#0000003b),to(rgba(0,0,0,.1)));
background: linear-gradient(180deg,#0000003b,rgb(0 0 .1));
}
.joshine-mobile-image-wrapper {
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-align-items: center;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
}
.joshine-mobile-image-box-container {
margin-left: auto;
margin-right: auto;
position: relative;
overflow: hidden;
list-style: none;
padding: 0;
z-index: 1;
height: 100%;
}
.joshine-mobile-image-box-content {
color: #fff;
height: 100%;
overflow: auto;
margin-bottom: 0.32rem;
}
.image-box-content-title {
margin-bottom: .3rem;
line-height: .8rem;
color: hsla(0,0%,100%,.8);
}
.joshine-mobile-image-box .close {
color: white;
position: absolute;
right: 1rem;
top: 1rem;
color: #000;
-webkit-text-stroke: 0.02rem #fff;
font-weight: 400;
}
.joshine-mobile-image-box .close svg {
width: 2.5rem;
height: 2.5rem;
}
.joshine-review-pic-item {
cursor:pointer;
}
.review-box-size {
font-size: .7rem;
}
.review-box-content {
font-size: .9rem;
}
.review-box-title {
font-size: .8rem;
}
</style> </style>
<div class="joshine-model-warp joshine-hidden"> <div class="joshine-model-warp joshine-hidden">
...@@ -480,7 +611,9 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId()); ...@@ -480,7 +611,9 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId());
<div class="j-modal-dialog"> <div class="j-modal-dialog">
<div class="j-modal-content"> <div class="j-modal-content">
<div class="j-modal-header"> <div class="j-modal-header">
<span class="joshine-close">x</span> <span class="joshine-close">
<svg t="1678760827915" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2762" width="200" height="200"><path d="M579.888 512l190.064-190.064a48 48 0 0 0-67.888-67.872L512 444.112 321.936 254.064a48 48 0 1 0-67.872 67.872L444.112 512 254.064 702.064a48 48 0 1 0 67.872 67.872L512 579.888l190.064 190.064a48 48 0 0 0 67.872-67.888L579.888 512z" fill="#dbdbdb" p-id="2763" data-spm-anchor-id="a313x.7781069.0.i3" class="selected"></path></svg>
</span>
</div> </div>
<div class="j-modal-body"> <div class="j-modal-body">
<div class="modal-reviews-details row"> <div class="modal-reviews-details row">
...@@ -531,6 +664,31 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId()); ...@@ -531,6 +664,31 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId());
</div> </div>
</div> </div>
<div class="joshine-mobile-image-box joshine-hidden">
<div class="joshine-mobile-image-box-container">
<div class="joshine-mobile-image-wrapper">
<div class="scroll-wrapper">
</div>
</div>
<div class="joshine-mobile-image-box-bottom">
<div class="joshine-mobile-image-box-content">
<div class="image-box-content-title">
<input type="hidden" id="review-box-id">
<p class="review-box-title"></p>
<span class="review-box-size"></span>
</div>
<span class="review-box-content"></span>
</div>
</div>
<div class="joshine-mobile-image-box-top">
</div>
<div class="close">
<svg t="1678760827915" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2762" width="200" height="200"><path d="M579.888 512l190.064-190.064a48 48 0 0 0-67.888-67.872L512 444.112 321.936 254.064a48 48 0 1 0-67.872 67.872L444.112 512 254.064 702.064a48 48 0 1 0 67.872 67.872L512 579.888l190.064 190.064a48 48 0 0 0 67.872-67.888L579.888 512z" fill="#dbdbdb" p-id="2763" data-spm-anchor-id="a313x.7781069.0.i3" class="selected"></path></svg>
</div>
</div>
</div>
<script type="text/javascript"> <script type="text/javascript">
require([ require([
'jquery','ko' 'jquery','ko'
...@@ -689,7 +847,6 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId()); ...@@ -689,7 +847,6 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId());
$('.image-full-wrapper').html(html); $('.image-full-wrapper').html(html);
} }
}); });
$(".joshine-close").on('click', function () { $(".joshine-close").on('click', function () {
...@@ -784,5 +941,213 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId()); ...@@ -784,5 +941,213 @@ $imagesBlock = $helper->getReviewImagesBlock(15, $block->getProductId());
return review; return review;
} }
var $galleryElement = document.querySelector(".joshine-mobile-image-wrapper .scroll-wrapper");
let distanceScrollOne = $(window).width();
//照片切换阈值
let threshold = {
time: 400,
distance: parseInt(distanceScrollOne / 2)
};
let start = {};
let scrollIdx = 0;
let maxScrollIdx = 1;
let current = getTranslateXY($galleryElement);
$galleryElement.addEventListener('pointerdown', galleryStartHandler, false);
// 阻止移动端默认行为
$galleryElement.addEventListener(
'touchstart',
evt => {
evt.preventDefault();
},
false
);
$(".joshine-review-container-mobile .joshine-review-pic-item").on('click', function(evt){
var reviewId = $(this).data('reviews-id');
var productId = $(this).data('product-id');
var image_id = $(this).data('image-id');
var formKey = $.mage.cookies.get('form_key');
var data = 'review_id='+ reviewId +'&form_key=' + formKey + '&product_id=' + productId;
$.ajax({
url: '/joshine_review/ajax/reviewinfo',
data: data,
type: 'GET',
dataType: 'json',
success: function (response) {
reviewList = response.data;
displayScrollItem(response);
$(".joshine-mobile-image-box").removeClass('joshine-hidden');
}
});
function displayScrollItem(response) {
var html = '';
var image_index = 0;
var data = response.data;
for (let i = 0; i < data.length; i++) {
for (let j = 0; j < data[i].images.full.length; j++) {
html += `
<div class="scroll-wrapper-item" data-review-id="${data[i].review_id}" data-img-index="${image_index}" data-image-id="${data[i].images.full[j].image_id}">
<img src="${data[i].images.full[j].url}" alt="">
</div>
`;
image_index++;
}
}
maxScrollIdx = image_index - 1;
$(".joshine-mobile-image-wrapper .scroll-wrapper").html(html);
let idx = findGoScrollIdx(image_id);
goScrollMove(idx);
}
function findGoScrollIdx(image_id) {
let res = 0;
$(".scroll-wrapper-item").each(function (index, ele) {
if ($(ele).data('image-id') == image_id) {
res = $(ele).data('img-index');
}
});
return res;
}
});
$(".joshine-mobile-image-box .close").on('click', function(evt){
$(".joshine-mobile-image-box").addClass('joshine-hidden');
});
function galleryStartHandler(evt) {
evt.preventDefault();
start.time = new Date().getTime();
start.x = evt.pageX;
document.addEventListener('pointermove', galleryChangeHandler, false);
document.addEventListener('pointerup', galleryEndHandler, false);
document.addEventListener('pointercancel', galleryEndHandler, false);
}
function galleryChangeHandler(evt) {
evt.preventDefault();
$galleryElement.style.transition = 'transform 0s ease 0s';
let deltaAbs = Math.abs(getScrollDelta(evt).x);
let direct = getScrollDirection(getScrollDelta(evt));
if (direct == "left") {
var deltaX = current.translateX - deltaAbs;
} else {
var deltaX = current.translateX - 0 + deltaAbs;
}
$galleryElement.style.transform = `translate3d(${deltaX}px, 0px, 0px)`;
}
function galleryEndHandler(evt) {
evt.preventDefault();
let delta = getScrollDelta(evt);
//达到划过阈值
if (shouldScroll(delta)) {
goScroll(delta);
return;
}
rollBackScroll(delta);
}
function shouldScroll(delta)
{
let direction = getScrollDirection(delta);
if (direction == 'left' && scrollIdx == maxScrollIdx) {
return false;
}
if (direction == 'right' && scrollIdx == 0) {
return false;
}
//1.如果过半,直接滑过
if (Math.abs(delta.x) > threshold.distance) {
return true;
}
//2.未过半,500ms内滑过1/4,也滑过
if (delta.time < threshold.time && Math.abs(delta.x) > parseInt(threshold.distance / 4)) {
return true;
}
return false;
}
//获取滑动方向
function getScrollDirection(delta)
{
if (delta.x > 0) {
return 'right';
}
return 'left';
}
function getScrollDelta(evt)
{
let delta = {};
delta.time = new Date().getTime() - start.time;
delta.x = evt.pageX - start.x;
return delta;
}
function rollBackScroll(delta)
{
let $scroll = document.querySelector(".scroll-wrapper");
let distance = distanceScrollOne * scrollIdx;
$scroll.style.transition = 'transform .2s ease 0s';
$scroll.style.transform = `translate3d(-${distance}px, 0px, 0px)`;
}
function goScroll(delta)
{
let $scroll = document.querySelector(".scroll-wrapper");
$scroll.style.transition = 'transform .5s ease 0s';
let direction = getScrollDirection(delta);
//右话滑向后
if (direction == 'left') {
scrollIdx++;
} else {
scrollIdx--;
}
let distance = distanceScrollOne * scrollIdx;
$scroll.style.transform = `translate3d(-${distance}px, 0px, 0px)`;
current.translateX = -distance;
dealReviewContent(scrollIdx);
}
function goScrollMove(idx)
{
scrollIdx = idx;
let distance = distanceScrollOne * scrollIdx;
$galleryElement.style.transform = `translate3d(-${distance}px, 0px, 0px)`;
current.translateX = -distance;
dealReviewContent(scrollIdx);
}
function getTranslateXY(element) {
const style = window.getComputedStyle(element)
const matrix = new DOMMatrixReadOnly(style.transform)
return {
translateX: matrix.m41,
translateY: matrix.m42
}
}
function dealReviewContent(idx)
{
var shouldReviewId;
$(".scroll-wrapper-item").each(function (index, ele) {
if ($(ele).data('img-index') == idx) {
shouldReviewId = $(ele).data('review-id');
}
});
let curReviewId = $('#modal-current-review-id').data("review-id");
if (shouldReviewId != curReviewId) {
let review = findReviewById(shouldReviewId);
$(".review-box-title").html(review.title);
let fits_text = fitsTranslate(review.size_fits);
$(".review-box-size").html("Size Fits:"+ fits_text);
$(".review-box-content").html(review.detail);
$("#review-box-id").val(review.review_id);
}
}
}); });
</script> </script>
\ No newline at end of file
...@@ -85,7 +85,6 @@ ...@@ -85,7 +85,6 @@
width: calc(100% - 288px); width: calc(100% - 288px);
display: -webkit-box; display: -webkit-box;
display: flex; display: flex;
padding-right: 150px;
} }
.joshine-review-container .joshine-review-list-item .joshine-review-detail { .joshine-review-container .joshine-review-list-item .joshine-review-detail {
padding-right: 40px; padding-right: 40px;
...@@ -94,6 +93,7 @@ ...@@ -94,6 +93,7 @@
.joshine-review-container .joshine-review-list-item .joshine-review-pics { .joshine-review-container .joshine-review-list-item .joshine-review-pics {
width: 50%; width: 50%;
display: flex; display: flex;
flex-wrap: wrap;
} }
.joshine-review-container .joshine-review-list-item .joshine-review-pic-item { .joshine-review-container .joshine-review-list-item .joshine-review-pic-item {
position: relative; position: relative;
...@@ -103,6 +103,7 @@ ...@@ -103,6 +103,7 @@
line-height: 108px; line-height: 108px;
overflow: hidden; overflow: hidden;
margin-right: 5px; margin-right: 5px;
margin-bottom: .2em;
} }
.joshine-review-container .joshine-review-list-item .joshine-review-des-title { .joshine-review-container .joshine-review-list-item .joshine-review-des-title {
......
...@@ -28,7 +28,11 @@ endif; ...@@ -28,7 +28,11 @@ endif;
.sparsh-free-shipping-bar-goal-message{ .sparsh-free-shipping-bar-goal-message{
width: 100%; width: 100%;
height: 60px; height: 60px;
background-image: url("<?= $block->getImgUrl($barData['background_img']) ?>"); <?php
if ($barData['background_img']){
echo 'background-image: url("' . $block->getImgUrl($barData['background_img']) .'");';
}
?>
line-height: 60px; line-height: 60px;
background-size: 100% 100%!important; background-size: 100% 100%!important;
background-repeat: no-repeat; background-repeat: no-repeat;
...@@ -36,7 +40,11 @@ endif; ...@@ -36,7 +40,11 @@ endif;
@media (max-width: 768px) { @media (max-width: 768px) {
.sparsh-free-shipping-bar-goal-message{ .sparsh-free-shipping-bar-goal-message{
background-image: url("<?= $block->getImgUrl($barData['background_img_phone']) ?>"); <?php
if ($barData['background_img_phone']){
echo 'background-image: url("' . $block->getImgUrl($barData['background_img_phone']) .'");';
}
?>
width: 100%; width: 100%;
height: 40px; height: 40px;
line-height: 40px; line-height: 40px;
......
...@@ -16,6 +16,7 @@ if ($isActive == 1): ?> ...@@ -16,6 +16,7 @@ if ($isActive == 1): ?>
</script> </script>
<?php endif; ?> <?php endif; ?>
<script> <script>
var sparsh_mfp_wrap = document.getElementsByClassName('sparsh-mfp-wrap'); require(['jquery'],function ($){
sparsh_mfp_wrap[0].removeAttribute("style"); $('.sparsh-mfp-wrap').attr('style','');
});
</script> </script>
...@@ -40,9 +40,9 @@ $schema = ($block->getZone() == 'item_view') ? true : false; ...@@ -40,9 +40,9 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
<?php <?php
$seller = number_format((1 - number_format($finalPriceModel->getAmount()->getValue() / $priceModel->getAmount()->getValue(),2)) *100,0) ?> $seller = number_format((1 - number_format($finalPriceModel->getAmount()->getValue() / $priceModel->getAmount()->getValue(),2)) *100,0) ?>
<?php if (!$block->isProductList()) :?> <?php if (!$block->isProductList()) :?>
<span style="background-color: #ee0000;height: 20px;color: #ffffff;font-size: 16px;font-weight: 600;margin-left: 10px;padding: 2px;">SAVE <?=$seller?>%</span> <span class="product-info-promotion-span">- <?=$seller?>%</span>
<?php else :?> <?php else :?>
<span style="position: absolute;left: 15px;top: 15px;z-index: 1;color: #ffffff;background-color: #ee0000;font-size: 16px;font-weight: 600;">SAVE <?=$seller?>%</span> <span class="product-list-promotion-span">- <?=$seller?>%</span>
<?php endif; ?> <?php endif; ?>
<?php else :?> <?php else :?>
......
...@@ -35,7 +35,7 @@ $schema = ($block->getZone() == 'item_view') ? true : false; ...@@ -35,7 +35,7 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
</span> </span>
<?php <?php
$seller = number_format((1 - number_format($finalPriceModel->getAmount()->getValue() / $priceModel->getAmount()->getValue(),2)) *100,0) ?> $seller = number_format((1 - number_format($finalPriceModel->getAmount()->getValue() / $priceModel->getAmount()->getValue(),2)) *100,0) ?>
<span style="position: absolute;left: 15px;top: 15px;z-index: 1;color: #ffffff;background-color: #ee0000;font-size: 16px;font-weight: 600;">SAVE <?=$seller?>%</span> <span class="product-list-promotion-span">- <?=$seller?>%</span>
<?php endif; ?> <?php endif; ?>
...@@ -51,7 +51,7 @@ $schema = ($block->getZone() == 'item_view') ? true : false; ...@@ -51,7 +51,7 @@ $schema = ($block->getZone() == 'item_view') ? true : false;
</span> </span>
<?php <?php
$seller = number_format((1 - number_format($finalPriceModel->getAmount()->getValue() / $priceModel->getAmount()->getValue(),2)) *100,0) ?> $seller = number_format((1 - number_format($finalPriceModel->getAmount()->getValue() / $priceModel->getAmount()->getValue(),2)) *100,0) ?>
<span style="background-color: #ee0000;height: 20px;color: #ffffff;font-size: 16px;font-weight: 600;margin-left: 10px;padding: 2px;">SAVE <?=$seller?>%</span> <span class="product-info-promotion-span">- <?=$seller?>%</span>
<?php endif; ?> <?php endif; ?>
<?php if ($block->showMinimalPrice()) : ?> <?php if ($block->showMinimalPrice()) : ?>
......
...@@ -1621,7 +1621,7 @@ footer{ ...@@ -1621,7 +1621,7 @@ footer{
@media(min-width: 1024px){ @media(min-width: 1024px){
& { & {
margin-left: 25%; margin-left: 20%;
} }
.navigation{ .navigation{
...@@ -2905,6 +2905,50 @@ strong#block-related-heading,strong#block-upsell-heading{ font-weight: 600; colo ...@@ -2905,6 +2905,50 @@ strong#block-related-heading,strong#block-upsell-heading{ font-weight: 600; colo
z-index: 10; z-index: 10;
display: none; display: none;
} }
.block .product-info-promotion-span{
position: absolute;
left: 1px;
top: 12px;
}
.product-info-promotion-span{
background-color: #ee0000;
height: 20px;
color: #ffffff;
font-size: 16px;
font-weight: 600;
margin-left: 10px;
padding: 2px 12px;
line-height: 18px;
}
.product-list-promotion-span{
position: absolute;
left: 15px;
top: 15px;
z-index: 1;
color: #ffffff;
background-color: #ee0000;
font-size: 16px;
font-weight: 600;
padding: 0 10px;
}
@media (max-width: 768px) {
.product-info-promotion-span{
font-size: 12px;
font-weight: bold;
}
.product-list-promotion-span{
font-size: 12px;
font-weight: bold;
}
}
/*导入Joshine工具类*/ /*导入Joshine工具类*/
@import "./_joshine_col"; @import "./_joshine_col";
@import "./_joshine_utils"; @import "./_joshine_utils";
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment