Spade
Mini Shell
| Directory:~$ /home/lmsyaran/public_html/j3/components/com_sppagebuilder/addons/pricelist/ |
| [Home] [System Details] [Kill Me] |
<?php
/**
* @package SP Page Builder
* @author JoomShaper https://www.joomshaper.com
* @copyright Copyright (c) 2010 - 2023 JoomShaper
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
*/
use Joomla\CMS\Uri\Uri;
// No direct access
defined('_JEXEC') or die('Restricted access');
class SppagebuilderAddonPricelist extends SppagebuilderAddons
{
/**
* The addon frontend render method.
* The returned HTML string will render to the frontend page.
*
* @return string The HTML string.
* @since 1.0.0
*/
public function render()
{
$settings = $this->addon->settings;
$class = (isset($settings->class) && $settings->class) ?
$settings->class : '';
$title = (isset($settings->title) && $settings->title) ?
$settings->title : '';
// Options
$text = (isset($settings->text) && $settings->text) ?
$settings->text : '';
$price_position = (isset($settings->price_position) &&
$settings->price_position) ? $settings->price_position :
'right-to-title';
$price = (isset($settings->price) && $settings->price) ?
$settings->price : '$20.00';
$discount_price = (isset($settings->discount_price) &&
$settings->discount_price) ? $settings->discount_price :
'';
$add_line = (isset($settings->add_line) &&
$settings->add_line) ? $settings->add_line : 0;
$line_style = (isset($settings->line_style) &&
$settings->line_style) ? $settings->line_style : 'solid';
$line_position = (isset($settings->line_position) &&
$settings->line_position) ? $settings->line_position :
'center';
$add_number_or_image = (isset($settings->add_number_or_image)
&& $settings->add_number_or_image) ?
$settings->add_number_or_image : 0;
$number_or_image_left = (isset($settings->number_or_image_left)
&& $settings->number_or_image_left) ?
$settings->number_or_image_left : 'image';
$image = (isset($settings->image) && $settings->image) ?
$settings->image : '';
$image_src = isset($image->src) ? $image->src : $image;
$image_width = (isset($image->width) && $image->width) ?
$image->width : '';
$image_height = (isset($image->height) && $image->height) ?
$image->height : '';
$image_tag = (isset($settings->image_tag) &&
$settings->image_tag) ? $settings->image_tag : '';
$image_tag_text = (isset($settings->image_tag_text) &&
$settings->image_tag_text) ? $settings->image_tag_text :
'';
$image_tag_radius = (isset($settings->image_tag_radius) &&
$settings->image_tag_radius) ? $settings->image_tag_radius :
'';
$number_text = (isset($settings->number_text) &&
$settings->number_text) ? $settings->number_text : 1;
// Lazy load image
$placeholder = $image_src == '' ? false :
$this->get_image_placeholder($image_src);
if (strpos($image_src, "http://") !== false ||
strpos($image_src, "https://") !== false)
{
$image = $image_src;
}
else
{
$image = Uri::base() . $image_src;
}
$content_alignment = '';
if ($price_position == "content-bottom")
{
$content_alignment = 'sppb-text-alignment';
}
$split_price = preg_split("/[\.]+/", $price);
$price_text = '';
$price_zero = '';
if ($split_price)
{
$price_text = isset($split_price[0]) ? $split_price[0] : '';
$price_zero = isset($split_price[1]) ? '.' . $split_price[1] :
'';
}
$dis_split_price = preg_split("/[\.]+/", $discount_price);
$dis_price_text = '';
$dis_price_zero = '';
if ($dis_split_price)
{
$dis_price_text = isset($dis_split_price[0]) ? $dis_split_price[0] :
'';
$dis_price_zero = isset($dis_split_price[1]) ? '.' .
$dis_split_price[1] : '';
}
// Building price
$price_output = '';
$dis_price_output = '';
$line_style_output = '';
$discount_class = '';
if ($price_position && $discount_price)
{
$discount_class = 'discounted-price';
}
if ($price_position && $price)
{
$price_output = '<span class="pricelist-price ' .
$discount_class . '">' . $price_text . '<span
class="pricelist-point-zero">' . $price_zero .
'</span></span>';
}
if ($price_position && $discount_price)
{
$dis_price_output = '<span
class="pricelist-price">' . $dis_price_text .
'<span class="pricelist-point-zero">' .
$dis_price_zero . '</span></span>';
}
if ($add_line && $line_style)
{
if ($line_position == 'title-bottom')
{
$line_style_output .= '<span class="pricelist-line
title-bottom"><span class="pricelist-line-style-' .
$line_style . '"></span></span>';
}
else
{
$line_style_output .= '<span
class="pricelist-line"><span
class="pricelist-line-style-' . $line_style .
'"></span></span>';
}
}
//Output
$output = '';
$output .= '<div class="sppb-addon sppb-addon-pricelist
' . $class . '">';
if ($add_number_or_image)
{
$output .= '<div
class="pricelist-left-image">';
if ($number_or_image_left == 'image')
{
$alt_text = ($title) ? $title : '';
$output .= '<img ' . ($placeholder ?
'class="sppb-element-lazy"' : '') . '
src="' . ($placeholder ? $placeholder : $image) . '"
alt="' . $alt_text . '" ' . ($placeholder ?
'data-large="' . $image . '"' : '')
. ' ' . ($image_width ? 'width="' . $image_width .
'"' : '') . ' ' . ($image_height ?
'height="' . $image_height . '"' :
'') . ' loading="lazy">';
if ($image_tag && $image_tag_text)
{
$tag_class = ($image_tag_radius) ? 'tag-radius' :
'';
$output .= '<span class="pricelist-tag ' .
$tag_class . '">' . $image_tag_text .
'</span>';
}
}
else
{
$output .= '<div
class="pricelist-left-number">';
$output .= $number_text;
$output .= '</div>';
}
$output .= '</div>';
}
$output .= '<div class="pricelist-text-content ' .
$content_alignment . '">';
if ($title)
{
$output .= '<div class="sppb-addon-title"
style="display: block;">';
$output .= '<span
class="pricelist-title-content">';
$output .= '<span class="pricelist-title">' .
$title;
if ($price_position == 'with-title')
{
$output .= '<span
class="pricelist-price-with-title">' . $price_output .
' ' . $dis_price_output . '</span>';
}
$output .= '</span>';
if ($line_position != 'title-bottom' &&
$price_position == 'right-to-title')
{
$output .= $line_style_output;
}
if ($price_position == 'right-to-title')
{
$output .= '<span
class="pricelist-price-content">' . $price_output .
' ' . $dis_price_output . '</span>';
}
$output .= '</span>';
$output .= '</div>';
}
if ($line_position == 'title-bottom')
{
$output .= $line_style_output;
}
$output .= '<div class="sppb-addon-content">';
$output .= $text;
$output .= '</div>';
if ($price_position == 'content-bottom')
{
$output .= '<span class="pricelist-price-content
bottom-of-content">' . $price_output . ' ' .
$dis_price_output . '</span>';
}
if ($line_position != 'title-bottom' && $price_position
== 'content-bottom')
{
$output .= $line_style_output;
}
$output .= '</div>';
$output .= '</div>';
return $output;
}
/**
* Generate the CSS string for the frontend page.
*
* @return string The CSS string for the page.
* @since 1.0.0
*/
public function css()
{
$css = '';
$settings = $this->addon->settings;
$addon_id = '#sppb-addon-' . $this->addon->id;
$cssHelper = new CSSHelper($addon_id);
$priceListTypographyStyle = $cssHelper->typography(
'.sppb-addon-content',
$settings,
'content_typography',
[
'font' => 'text_font_family',
'size' => 'text_fontsize',
'line_height' => 'text_lineheight',
'weight' => 'text_fontweight',
]
);
$lineProps = [
'line_size' => $settings->add_line ?
'border-bottom-width' : null,
'line_color' => $settings->add_line ?
'border-bottom-color' : null,
];
$lineStyle = $cssHelper->generateStyle('.pricelist-line
span', $settings, $lineProps, ['line_color' => false]);
$lineBottomProps = [
'line_top_gap' => $settings->add_line &&
$settings->line_position === 'title-bottom' ?
'margin-top' : null,
'line_bottom_gap' => $settings->add_line &&
$settings->line_position === 'title-bottom' ?
'margin-bottom' : null,
];
$linePositionStyle =
$cssHelper->generateStyle('.pricelist-line', $settings,
['line_position' => $settings->add_line ?
['-webkit-box-align', '-ms-flex-align',
'align-items'] : null,], false);
$lineBottomStyle =
$cssHelper->generateStyle('.pricelist-line.title-bottom',
$settings, $lineBottomProps);
$priceContentStyle =
$cssHelper->generateStyle('.pricelist-price-content.bottom-of-content',
$settings, ['price_top_gap' => 'margin-top',
'price_bottom_gap' => 'margin-bottom']);
$priceTitleTypographyStyle =
$cssHelper->typography('.pricelist-price-content.bottom-of-content',
$settings, 'title_typography', [
'font' => 'font_family',
'size' => 'title_fontsize',
'line_height' => 'title_lineheight',
'letter_spacing' => 'title_letterspace',
'uppercase' => 'title_font_style.uppercase',
'italic' => 'title_font_style.italic',
'underline' => 'title_font_style.underline',
'weight' => 'title_font_style.weight',
]);
$zeroPositionStyle =
$cssHelper->generateStyle('.pricelist-point-zero', $settings,
['zero_position' => 'vertical-align'], false);
$discountPriceStyle =
$cssHelper->generateStyle('.pricelist-price.discounted-price',
$settings, ['discount_price_position' =>
'vertical-align'], false);
$priceStyle =
$cssHelper->generateStyle('.pricelist-price-content',
$settings, ['price_color' => 'color',], false);
$priceTypographyStyle = $cssHelper->typography(
'.pricelist-price-content',
$settings,
'price_typography',
[
'font' => 'price_font_family',
'size' => 'price_fontsize',
'weight' => 'price_fontweight',
]
);
$contentPositionStyle =
$cssHelper->generateStyle('.sppb-text-alignment', $settings,
['content_position' => 'text-align'], false);
$positionMap = ['left' => 'flex-start',
'right' => 'flex-end', 'center' =>
'center'];
if (!empty($settings->content_position_original))
{
if (\is_object($settings->content_position_original))
{
$settings->content_position_alt =
\json_decode(\json_encode($settings->content_position_original));
foreach ($settings->content_position_original as $key =>
$position)
{
$settings->content_position_alt->$key =
isset($positionMap[$position]) ? $positionMap[$position] : '';
}
}
}
$titlePositionStyle =
$cssHelper->generateStyle('.pricelist-title-content',
$settings, ['content_position_alt' =>
'justify-content'], false);
$tagStyle = $cssHelper->generateStyle(
'.pricelist-tag',
$settings,
[
'image_tag_bg' => $settings->image_tag ?
'background-color' : null,
'image_tag_radius' => $settings->image_tag ?
'border-radius' : null,
'image_tag_top_margin' => $settings->image_tag ?
'top' : null,
'image_tag_left_margin' => $settings->image_tag ?
'left' : null
],
['image_tag_bg' => false]
);
if ($settings->add_number_or_image)
{
$numberOrImageStyle =
$cssHelper->generateStyle('.pricelist-left-image', $settings,
['image_width' => ['-ms-flex: 0 0 %s', 'flex: 0
0 %s', 'max-width'], 'image_gutter' =>
'padding-right'], ['image_width' => '%']);
$settings->image_width =
AddonUtils::parseDeviceData($settings->image_width,
SpPgaeBuilderBase::$defaultDevice);
if (!isset($settings->image_width))
{
$settings->image_width = 15;
}
$settings->content_width = 100 - (int) $settings->image_width;
$imageWidthGutterStyle =
$cssHelper->generateStyle('.pricelist-text-content',
$settings, ['content_width' => ['-ms-flex: 0 0 %s',
'flex: 0 0 %s', 'max-width: %s'],
'image_gutter' => 'padding-left'],
['content_width' => '%']);
$css .= $numberOrImageStyle;
$css .= $imageWidthGutterStyle;
}
$imageBorderRadiusStyle =
$cssHelper->generateStyle('.pricelist-left-number,.pricelist-left-image
img', $settings, ['image_border_radius' =>
'border-radius']);
$numberStyle = $cssHelper->generateStyle(
'.pricelist-left-number',
$settings,
[
'number_bg_color' => 'background-color',
'number_color' => 'color',
'number_top_padding' => 'padding-top',
'number_bottom_padding' => 'padding-bottom',
],
['number_bg_color' => false, 'number_color' =>
false]
);
$numberTypographyStyle = $cssHelper->typography(
'.pricelist-left-number',
$settings,
'number_typography',
[
'font' => 'number_font_family',
'size' => 'number_fontsize',
'italic' => 'number_fontstyle',
'weight' => 'number_fontweight',
]
);
$css .= $tagStyle;
$css .= $lineStyle;
$css .= $priceStyle;
$css .= $numberStyle;
$css .= $lineBottomStyle;
$css .= $zeroPositionStyle;
$css .= $linePositionStyle;
$css .= $priceContentStyle;
$css .= $titlePositionStyle;
$css .= $discountPriceStyle;
$css .= $contentPositionStyle;
$css .= $priceTypographyStyle;
$css .= $numberTypographyStyle;
$css .= $imageBorderRadiusStyle;
$css .= $priceListTypographyStyle;
$css .= $priceTitleTypographyStyle;
return $css;
}
/**
* Generate the lodash template string for the frontend editor.
*
* @return string The lodash template string.
* @since 1.0.0
*/
public static function getTemplate()
{
$lodash = new Lodash('#sppb-addon-{{ data.id }}');
$output = '
<#
let split_price = _.split(data.price, ".");
let price_text = "";
let price_zero = "";
if(split_price){
price_text = !_.isEmpty(split_price[0]) ? split_price[0] :
"";
price_zero = !_.isEmpty(split_price[1]) ? "."+split_price[1]
: "";
}
let dis_split_price = _.split(data.discount_price, ".");
let dis_price_text = "";
let dis_price_zero = "";
if(dis_split_price){
dis_price_text = !_.isEmpty(dis_split_price[0]) ? dis_split_price[0] :
"";
dis_price_zero = !_.isEmpty(dis_split_price[1]) ?
"."+dis_split_price[1] : "";
}
let discount_class = "";
let price_output = "";
let dis_price_output = "";
let line_style_output = "";
if(data.price_position && data.discount_price){
discount_class = "discounted-price";
}
if(data.price_position && data.price){
price_output = \'<span class="pricelist-price \' +
discount_class + \'">\'+ price_text + \'<span
class="pricelist-point-zero">\'+price_zero+\'</span></span>\';
}
if(data.price_position && data.discount_price){
dis_price_output = \'<span
class="pricelist-price">\'+dis_price_text+\'<span
class="pricelist-point-zero">\'+dis_price_zero+\'</span></span>\';
}
if(data.add_line && data.line_style){
if(data.line_position == "title-bottom"){
line_style_output += \'<span class="pricelist-line
title-bottom"><span
class="pricelist-line-style-\'+data.line_style+\'"></span></span>\';
} else {
line_style_output += \'<span
class="pricelist-line"><span
class="pricelist-line-style-\'+data.line_style+\'"></span></span>\';
}
}
let content_alignment = "";
if(data.price_position == "content-bottom"){
content_alignment = "sppb-text-alignment";
}
#>
<style type="text/css">';
// Content
$contentTypographyFallbacks = [
'font' => 'data.text_font_family',
'size' => 'data.text_fontsize',
'line_height' => 'data.text_lineheight',
'weight' => 'data.text_fontweight',
];
$output .= $lodash->typography('.sppb-addon-content',
'data.content_typography', $contentTypographyFallbacks);
$output .= $lodash->unit('border-bottom-width',
'.pricelist-line span', 'data.line_size',
'px');
$output .= '<# if (data.add_line || data.price_position) {
#>';
$output .= $lodash->border('border-bottom-width',
'.pricelist-line span', 'data.line_size');
$output .= $lodash->border('border-bottom-color',
'.pricelist-line span', 'data.line_color');
$output .= $lodash->unit('-webkit-box-align',
'.pricelist-line', 'data.line_position', false);
$output .= $lodash->unit('-ms-flex-align',
'.pricelist-line', 'data.line_position', false);
$output .= $lodash->unit('align-items',
'.pricelist-line', 'data.line_position', false);
$output .= '<# if (data.line_position ==
"title-bottom") { #>';
$output .= $lodash->unit('margin-top',
'.pricelist-line.title-bottom', 'data.line_top_gap',
'px');
$output .= $lodash->unit('margin-bottom',
'.pricelist-line.title-bottom', 'data.line_bottom_gap',
'px');
$output .= '<# } #>';
$output .= '<# } #>';
$output .= '<# if (data.price_top_gap || data.price_bottom_gap) {
#>';
$output .= '#sppb-addon-{{data.id}}
.pricelist-price-content.bottom-of-content { display: block; }';
$output .= $lodash->unit('margin-top',
'.pricelist-price-content.bottom-of-content',
'data.price_top_gap', 'px');
$output .= $lodash->unit('margin-bottom',
'.pricelist-price-content.bottom-of-content',
'data.price_bottom_gap', 'px');
$output .= $lodash->unit('font-family',
'.pricelist-price-content.bottom-of-content',
'data.font_family', '');
$output .= '<# } #>';
$output .= '<# if (data.add_number_or_image) { #>';
$output .= $lodash->flex('-ms-flex',
'.pricelist-left-image', 'data.image_width',
'%');
$output .= $lodash->flex('flex',
'.pricelist-left-image', 'data.image_width',
'%');
$output .= $lodash->unit('max-width',
'.pricelist-left-image', 'data.image_width',
'%');
$output .= $lodash->unit('padding-right',
'.pricelist-left-image', 'data.image_gutter',
'px');
$output .= $lodash->flex('-ms-flex',
'.pricelist-text-content', '(100 - data.image_width)',
'%');
$output .= $lodash->flex('flex',
'.pricelist-text-content', '(100 - data.image_width)',
'%');
$output .= $lodash->unit('max-width',
'.pricelist-text-content', '(100 - data.image_width)',
'%');
$output .= $lodash->unit('padding-left',
'.pricelist-text-content', 'data.image_gutter',
'px');
$output .= '<# } #>';
$output .= $lodash->color('color',
'.pricelist-price-content', 'data.price_color');
$output .= '<# if (data.number_text &&
data.number_or_image_left=="number") { #>';
$output .= $lodash->color('background-color',
'.pricelist-left-number', 'data.number_bg_color');
$output .= $lodash->color('color',
'.pricelist-left-number', 'data.number_color');
$output .= $lodash->unit('padding-top',
'.pricelist-left-number', 'data.number_top_padding',
'px');
$output .= $lodash->unit('padding-bottom',
'.pricelist-left-number', 'data.number_bottom_padding',
'px');
$output .= '<# } #>';
$output .= $lodash->color('color',
'.pricelist-price.discounted-price',
'data.discount_price_color');
$output .= '<# if (data.discount_price_position) { #>';
$output .= $lodash->unit('vertical-align',
'.pricelist-price.discounted-price ',
'data.discount_price_position', '', false);
$output .= '<# } #>';
$output .= $lodash->unit('border-radius',
'.pricelist-left-number, .pricelist-left-image img',
'data.image_border_radius', '%');
$output .= $lodash->unit('border-radius',
'.pricelist-tag', 'data.image_tag_radius',
'px');
$output .= $lodash->unit('top', '.pricelist-tag',
'data.image_tag_top_margin', 'px');
$output .= $lodash->unit('left', '.pricelist-tag',
'data.image_tag_left_margin', 'px');
$output .= $lodash->color('background-color',
'.pricelist-tag', 'data.image_tag_bg');
$output .=
$lodash->flexAlignment('.pricelist-title-content',
'data.content_position');
$output .= '<# if (data.zero_position) { #>';
$output .= $lodash->unit('vertical-align',
'.pricelist-point-zero', 'data.zero_position',
'', false);
$output .= '<# } #>';
// Title
$titleTypographyFallbacks = [
'font' => 'data.font_family',
'size' => 'data.title_fontsize',
'line_height' => 'data.title_lineheight',
'letter_spacing' => 'data.title_letterspace',
'uppercase' =>
'data.title_font_style?.uppercase',
'italic' =>
'data.title_font_style?.italic',
'underline' =>
'data.title_font_style?.underline',
'weight' =>
'data.title_font_style?.weight',
];
$output .= $lodash->typography('.pricelist-title-content',
'data.title_typography', $titleTypographyFallbacks);
// Price
$priceTypographyFallbacks = [
'font' => 'data.price_font_family',
'size' => 'data.price_fontsize',
'weight' => 'data.price_fontweight',
];
$output .= $lodash->typography('.pricelist-price-content',
'data.price_typography', $priceTypographyFallbacks);
// Number
$numberTypographyFallbacks = [
'font' => 'data.number_font_family',
'size' => 'data.number_fontsize',
'italic' => 'data.number_fontstyle',
'weight' => 'data.number_fontweight',
];
$output .= $lodash->typography('.pricelist-left-number',
'data.number_typography', $numberTypographyFallbacks);
$output .= '
</style>
<div class="sppb-addon sppb-addon-pricelist
{{data.class}}">
<# if(data.add_number_or_image){ #>
<div class="pricelist-left-image">
<# if(data.number_or_image_left=="image") {
var priceListImg = {}
if (typeof data.image !== "undefined" && typeof
data.image.src !== "undefined") {
priceListImg = data.image
} else {
priceListImg = {src: data.image}
}
if(priceListImg.src.indexOf("http://") == -1 &&
priceListImg.src.indexOf("https://") == -1){ #>
<img class="sppb-img-responsive" src=\'{{
pagebuilder_base + priceListImg.src }}\'>
<# } else { #>
<img class="sppb-img-responsive" src=\'{{
priceListImg.src }}\'>
<# }
if(data.image_tag && data.image_tag_text){
let tag_class = "";
if (data.image_tag_radius !== undefined &&
data.image_tag_radius) {
tag_class = "tag-radius";
};
#>
<span class="pricelist-tag
{{tag_class}}">{{data.image_tag_text}}</span>
<# }
} else { #>
<div class="pricelist-left-number">
{{data.number_text}}
</div>
<# } #>
</div>
<# } #>
<div class="pricelist-text-content
{{content_alignment}}">
<# if (data.title) { #>
<div class="sppb-addon-title" style="display:
block;">
<span class="pricelist-title-content">
<span class="pricelist-title">
<span class="sp-inline-editable-element"
data-id={{data.id}} data-fieldName="title"
contenteditable="true">{{{data.title}}}</span>
<# if(data.price_position=="with-title"){ #>
<span
class="pricelist-price-with-title">{{{price_output}}}
{{{dis_price_output}}}</span>
<# } #>
</span>
<# if(data.line_position !== "title-bottom" &&
data.price_position=="right-to-title"){ #>
{{{line_style_output}}}
<# } #>
<# if(data.price_position=="right-to-title"){ #>
<span
class="pricelist-price-content">{{{price_output}}}
{{{dis_price_output}}}</span>
<# } #>
</span>
</div>
<# } #>
<# if (data.line_position == "title-bottom") { #>
{{{line_style_output}}}
<# } #>
<div class="sppb-addon-content sp-editable-content"
id="addon-text-{{data.id}}" data-id={{data.id}}
data-fieldName="text">
{{{data.text}}}
</div>
<# if (data.price_position=="content-bottom") { #>
<span class="pricelist-price-content
bottom-of-content">{{{price_output}}}
{{{dis_price_output}}}</span>
<# } #>
<# if(data.line_position !== "title-bottom" &&
data.price_position=="content-bottom"){ #>
{{{line_style_output}}}
<# } #>
</div>
</div>';
return $output;
}
}