first commit

This commit is contained in:
2024-10-25 23:02:37 +02:00
commit faeb2e52e8
7653 changed files with 1095335 additions and 0 deletions

View File

@@ -0,0 +1,223 @@
<div class="panel mb50 panel-primary">
<div class="panel-heading">
<span class="panel-title">Masowa edycja produktów</span>
</div>
<div class="panel-body">
<button class="btn btn-dark select-all">Zaznacz wszystkie</button>
<button class="btn btn-default btn-outline-dark deselect-all">Odznacz wszystkie</button>
</div>
<div class="panel-body">
<div class="form-group mb10">
<label class="col-lg-3 control-label" for="inputDefault">Ustaw cenę promocyjną (minus X procent)</label>
<div class="col-lg-9">
<div class="bs-component">
<div class="input-group">
<input class="form-control" type="text" id="discount_percent" name="discount_percent">
<span class="input-group-addon cursor" field-id="discount_percent">
<i class="fa fa-save"></i>
</span>
</div>
</div>
</div>
</div>
</div>
<div class="panel-body">
<div class="row">
<div class="col-lg-6">
<? foreach ( $this -> products as $key => $product ):?>
<div class="checkbox-custom fill mb5">
<input type="checkbox" name="products[]" id="product<?= $key;?>" value="<?= $key;?>">
<label for="product<?= $key;?>"><?= $product;?></label>
</div>
<? endforeach;?>
</div>
<div class="col-lg-6">
<div class="menu_sortable">
<ol class="sortable" id="sortable">
<? if ( is_array( $this -> categories ) ): foreach ( $this -> categories as $category ):?>
<li id="list_<?= $category['id'];?>" class="category_<?= $category['id'];?>" category="<?= $category['id'];?>">
<div class="context_0 content content_menu">
<span class="disclose"><span></span></span>
<? if ( !$category['status'] ) echo '<i class="fa fa-ban fa-lg text-danger" title="Kategoria nieaktywna"></i>';?>
<b><?= $category['languages'][$this -> dlang]['title'];?></b>
</div>
<?= \Tpl::view( 'shop-product/subcategories-list', [
'categories' => \admin\factory\ShopCategory::subcategories( $category['id'] ),
'level' => $this -> level + 1,
'dlang' => $this -> dlang
] );?>
</li>
<? endforeach; endif;?>
</ol>
</div>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="/libraries/jquery-nested-sortable/jquery.mjs.nestedSortable.js"></script>
<script type="text/javascript">
$( document ).ready( function()
{
$( 'ol.sortable' ).nestedSortable(
{
forcePlaceholderSize: true,
handle: 'div',
helper: 'clone',
items: 'li',
opacity: .9,
placeholder: 'placeholder',
revert: 250,
tabSize: 45,
tolerance: 'pointer',
toleranceElement: '> div',
maxLevels: 4,
isTree: true,
expandOnHover: 700,
protectRoot: false
});
$( '.disclose' ).on( 'click', function()
{
$( this ).closest( 'li' ).toggleClass( 'sort-collapsed' ).toggleClass( 'sort-expanded' );
});
$( '.disclose' ).mousedown( function(e) {
if ( e.which === 1 ) {
var category_id = $( this ).parent( 'div' ).parent( 'li' ).attr( 'id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/ajax.php',
data: {
a: 'cookie_categories',
category_id: category_id
}
});
}
});
<?php
$array = unserialize( $_COOKIE[ 'cookie_categories' ] );
if ( is_array( $array ) ): foreach ( $array as $key => $val ):
if ( $val ):
?>$( '#<?= $key;?>' ).children( 'div' ).children( 'span.disclose' ).click();<?
endif;
endforeach; endif;
?>
$( '.select-all' ).click( function()
{
$( '.checkbox-custom input' ).prop( 'checked', true );
});
$( '.deselect-all' ).click( function()
{
$( '.checkbox-custom input' ).prop( 'checked', false );
});
$( 'body' ).on( 'click', '#sortable input[type="checkbox"]', function(){
if ( $( this ).is( ':checked' ) ) {
$.ajax({
url: '/admin/shop_product/get_products_by_category/',
type: 'post',
data: {
category_id: $( this ).val()
},
success: function(data) {
data = JSON.parse(data);
if ( data.status == 'ok' ) {
$.each( data.products, function( key, value ) {
$( '#product' + value ).prop( 'checked', true );
});
}
}
})
} else {
$.ajax({
url: '/admin/shop_product/get_products_by_category/',
type: 'post',
data: {
category_id: $( this ).val()
},
success: function(data) {
data = JSON.parse(data);
if ( data.status == 'ok' ) {
$.each( data.products, function( key, value ) {
$( '#product' + value ).prop( 'checked', false );
});
}
}
})
}
});
$( 'body' ).on( 'click', 'span[field-id="discount_percent"]', function()
{
$( '.ajax-msg' ).remove();
var discount_percent = $( '#discount_percent' ).val();
var products = [];
$( 'input[name="products[]"]:checked' ).each( function(){
products.push( $( this ).val() );
});
function saveProduct(index) {
if (index < products.length) {
$.ajax({
url: '/admin/shop_product/mass_edit_save/',
type: 'post',
data: {
discount_percent: discount_percent,
products: [products[index]]
},
success: function(data) {
data = JSON.parse(data);
if ( data.status == 'ok') {
if ( data.price_brutto_promo )
$( 'label[for="product' + products[index] + '"]' ).append( ' <span class="ajax-msg text-success">cena promocyjna: ' + data.price_brutto_promo + ' zł, cena zwykła: ' + data.price_brutto + '</span>' );
else
$( 'label[for="product' + products[index] + '"]' ).append( ' <span class="ajax-msg text-success">cena zwykła: ' + data.price_brutto + '</span>' );
} else {
alert('Błąd przy zapisie produktu: ', products[index]);
}
// Wywołanie dla następnego produktu
saveProduct(index + 1);
},
error: function(err) {
alert('Błąd przy zapisie produktu: ', err);
// Można dodać obsługę błędu lub przerwać proces
}
});
} else {
$.alert({
title: 'Informacja',
content: 'Zakończono zapisywanie produktów',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-close',
typeAnimated: true,
animation: 'opacity',
autoClose: 'confirm|10000',
useBootstrap: false,
theme: 'modern',
autoClose: 'cancel|10000',
icon: 'fa fa-exclamation',
buttons:
{
confirm:
{
text: 'Zamknij',
btnClass: 'btn-blue',
keys: ['enter'],
action: function() {}
}
}
});
}
}
if (products.length > 0) {
saveProduct(0); // Rozpoczęcie od pierwszego produktu
}
});
});
</script>

View File

@@ -0,0 +1,223 @@
<div class="g-container" data="table:order-details">
<div class="panel panel-info panel-border top">
<div class="panel-heading">
<span class="panel-title">Kobinacje produktu: <?= $this -> product['languages'][ $this -> default_language ]['name'];?></span>
</div>
<div class="panel-heading p10 pl15" id="g-menu" style="height: auto;">
<a class="btn btn btn-dark btn-sm mr5 btn-sm mr5" href="/admin/shop_product/view_list/"><i class="fa fa-reply mr5"></i>Wstecz</a>
</div>
<div class="panel-body">
<div class="row">
<div class="col-lg-7 col-xl-9">
<div class="table-responsive">
<table class="table table-hover table-bordered table-condensed">
<thead>
<tr>
<th></th>
<th>Kombinacja</th>
<th>SKU</th>
<th>Stan magazynowy</th>
<th>Cena netto</th>
<th>Zam. SM 0</th>
<th>Baselinker</th>
<th style="width: 100px;">Opcje</th>
</tr>
</thead>
<tbody>
<? if ( \S::is_array_fix( $this -> product_permutations ) ): foreach ( $this -> product_permutations as $product ):?>
<tr>
<td></td>
<td>
<?
$attributes = explode( '|', $product['permutation_hash'] );
foreach ( $attributes as $attribute ):
$attribute_tmp = explode( '-', $attribute );
echo \admin\factory\ShopAttribute::get_attribute_name_by_id( $attribute_tmp[0] ) . ' - <b>' . \admin\factory\ShopAttribute::get_attribute_value_by_id( $attribute_tmp[1] ) . '</b>';
if ( $attribute != end( $attributes ) )
echo ', ';
endforeach;
?>
</td>
<td>
<input type="text" name="sku" value="<?= $product['sku'];?>" class="form-control" style="max-width: 100px;" onchange="$.ajax({ type: 'POST', cache: false, url: '/admin/shop_product/product_combination_sku_save/', data: { product_id: <?= $product['id'];?>, sku: $( this ).val() } } );">
</td>
<td>
<input type="text" name="quantity" value="<?= $product['quantity'];?>" class="form-control" style="max-width: 100px;" onchange="$.ajax({ type: 'POST', cache: false, url: '/admin/shop_product/product_combination_quantity_save/', data: { product_id: <?= $product['id'];?>, quantity: $( this ).val() } } );">
</td>
<td>
<input type="text" name="price" value="<?= $product['price_netto'];?>" class="form-control" style="max-width: 100px;" onchange="$.ajax({ type: 'POST', cache: false, url: '/admin/shop_product/product_combination_price_save/', data: { product_id: <?= $product['id'];?>, price: $( this ).val() } } );">
</td>
<td>
<input type="checkbox" name="stock_0_buy" <? if ( $product['stock_0_buy'] ): echo 'checked="checked"'; endif;?> onchange="$.ajax({ type: 'POST', cache: false, url: '/admin/shop_product/product_combination_stock_0_buy_save/', data: { product_id: <?= $product['id'];?>, stock_0_buy: $( this ).is( ':checked' ) } } );">
</td>
<td>
<?
if ( $product['baselinker_product_name'] != "" )
echo "<span title='" . $product['baselinker_product_name'] . "'>" . substr( $product['baselinker_product_name'], 0, 25 ) . "...</span>";
else
echo "<span class='text-danger baselinker-product-search' product-id='" . $product['id'] . "'>nie przypisano <i class='fa fa-search'></i></span>";
?>
</td>
<td class="text-center">
<a href="/admin/shop_product/delete_combination/combination_id=<?= $product['id'];?>&product_id=<?= $product['parent_id'];?>" class="btn btn-danger btn-delete-permutation"><i class="fa fa-trash"></i></a>
</td>
</tr>
<? endforeach; endif;?>
</tbody>
</table>
</div>
</div>
<div class="col-lg-5 col-xl-3">
<form action="/admin/shop_product/generate_combination/product_id=<?= $this -> product['id'];?>" method="POST">
<button type="submit" class="btn btn-success" style="margin-bottom: 25px;">Wygeneruj kombinacje</button>
<? foreach ( $this -> attributes as $attribute ):?>
<div class="combination-attribute">
<div class="title">
<?= $attribute['languages'][ $this -> default_language ]['name'];?>
</div>
<ul class="values">
<? foreach ( $attribute['values'] as $value ):?>
<li>
<input type="checkbox" class="g-checkbox" name="attribute_<?= $attribute['id'];?>[]" value="<?= $value['id'];?>"> <?= $value['languages'][ $this -> default_language ]['name'];?>
</li>
<? endforeach;?>
</ul>
</div>
<? endforeach;?>
</form>
</div>
</div>
</div>
</div>
</div>
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/minimal/minimal.css">
<link rel="stylesheet" type="text/css" href="/libraries/grid/plugins/icheck/skins/minimal/blue.css">
<script type="text/javascript" src="/libraries/grid/plugins/icheck/icheck.min.js"></script>
<script type="text/javascript">
$( function()
{
$( '.g-checkbox, .g-radio' ).iCheck({
checkboxClass: 'icheckbox_minimal-blue',
radioClass: 'iradio_minimal-blue'
});
$( 'body' ).on( 'click', '.btn-delete-permutation', function(e)
{
e.preventDefault();
var href = $( this ).attr( 'href' );
$.alert(
{
title: 'Pytanie',
content: 'Na pewno chcesz usunąć wybraną kombinację?',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-question',
buttons: {
cancel: {
text: 'Nie',
btnClass: 'btn-dark',
action: function() {}
},
confirm: {
text: 'Tak',
btnClass: 'btn-danger',
keys: ['enter'],
action: function() {
document.location.href = href;
}
}
}
});
return false;
});
$( 'body' ).on( 'click', '.baselinker-product-search', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/shop_product/baselinker_product_search/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'SUCCESS' ) {
$('.baselinker-found-products').remove();
var html = '<div class="baselinker-found-products">';
html += '<p>Znaleziono ' + data.products.length + ' produktów</p>';
html += '<select class="form-control baselinker-product-select" product-id="' + product_id + '">';
$.each( data.products, function( index, value ) {
html += '<option value="' + value.product_id + '">' + value.name + ' SKU: ' + value.sku + '</option>';
});
html += '</select>';
html += '<button class="btn btn-success baselinker-product-select-save" product-id="' + product_id + '">Zapisz</button>';
html += '</div>';
$( 'span[product-id="' + product_id + '"]' ).closest( 'td' ).append( html );
} else if ( data.status == 'error' ) {
$.alert({
title: 'Błąd',
content: data.msg,
type: 'red',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-exclamation-triangle',
buttons: {
confirm: {
text: 'OK',
btnClass: 'btn-danger',
keys: ['enter'],
action: function() {}
}
}
});
}
}
});
});
$( 'body' ).on( 'click', '.baselinker-product-select-save', function(){
var product_id = $( this ).attr( 'product-id' );
var baselinker_product_id = $( '.baselinker-product-select[product-id="' + product_id + '"]' ).val();
var baselinker_product_name = $( '.baselinker-product-select[product-id="' + product_id + '"] option:selected' ).text();
$.ajax({
type: 'POST',
cache: false,
url: '/admin/shop_product/baselinker_product_select_save/',
data: {
product_id: product_id,
baselinker_product_id: baselinker_product_id,
baselinker_product_name: baselinker_product_name
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( '.baselinker-product-select[product-id="' + product_id + '"]' ).closest( '.baselinker-found-products' ).remove();
$( 'span[product-id="' + product_id + '"]' ).html( '<span title="' + baselinker_product_name + '">' + baselinker_product_name.substr( 0, 25 ) + '...</span>' ).removeClass( 'baselinker-product-search' ).removeClass( 'text-danger' );
}
}
});
});
});
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,136 @@
<? $i = ( $this -> current_page - 1 ) * 10 + 1;?>
<? foreach ( $this -> products as $product ):?>
<tr>
<td>
<?= $i++;?>
</td>
<td>
<div class="product-image">
<? if ( $product['images'][0]['src'] ):?>
<img src="<?= $product['images'][0]['src'];?>" alt="<?= $product['images'][0]['alt'];?>" class="img-responsive">
<? else:?>
<img src="/admin/layout/images/no-image.png" alt="Brak zdjęcia" class="img-responsive">
<? endif;?>
</div>
<div class="product-name">
<a href="/admin/shop_product/product_edit/id=<?= $product['id'];?>">
<?= $product['languages']['pl']['name'];?>
</a>
<a href="#" class="text-muted duplicate-product" product-id="<?= $product['id'];?>">duplikuj</a>
</div>
<small class="text-muted product-categories"><?= \admin\factory\ShopProduct::product_categories( $product['id'] );?></small>
<small class="text-muted product-categories">SKU: <?= $product['sku'];?>, EAN: <?= $product['ean'];?></small>
</td>
<td class="text-center">
<input type="text" class="product-price form-control text-right" product-id="<?= $product['id'];?>" value="<?= $product['price_brutto'];?>" style="width: 75px;">
</td>
<td class="text-center">
<input type="text" class="product-price-promo form-control text-right" product-id="<?= $product['id'];?>" value="<?= $product['price_brutto_promo'];?>" style="width: 75px;">
</td>
<td class="text-center">
<?= $product['promoted'] ? '<span class="text-success text-bold">tak</span>' : 'nie';?>
</td>
<td class="text-center">
<?= $product['status'] ? 'tak' : '<span class="text-danger text-bold">nie</span>';?>
</td>
<td class="text-center">
<span class="text-muted"><?= (int)\admin\factory\shopProduct::get_product_quantity_list( $product['id'] );?></span>
</td>
<? if ( $this -> baselinker_enabled ):?>
<td class="text-center">
<?
if ( $product['baselinker_product_name'] != "" ) {
echo "<span title='" . htmlspecialchars( $product['baselinker_product_name'] ) . "'>" . mb_substr( $product['baselinker_product_name'], 0, 25, 'UTF-8' ) . "...</span>";
echo "<br>";
echo "<span class='text-danger baselinker-delete-linking' product-id='" . $product['id'] . "'>";
echo "<i class='fa fa-times'></i>usuń powiązanie";
echo "</span>";
} else {
echo "<span class='text-danger baselinker-product-search' product-id='" . $product['id'] . "'>";
echo "nie przypisano <i class='fa fa-search'></i>";
echo "</span>";
}
?>
</td>
<? endif;?>
<? if ( $this -> apilo_enabled ):?>
<td class="text-center">
<?
if ( $product['apilo_product_name'] != "" ) {
echo "<span title='" . htmlspecialchars( $product['apilo_product_name'] ) . "'>" . mb_substr( $product['apilo_product_name'], 0, 25, "UTF-8" ) . "...</span>";
echo "<br>";
echo "<span class='text-danger apilo-delete-linking' product-id='" . $product['id'] . "'>";
echo "<i class='fa fa-times'></i>usuń powiązanie";
echo "</span>";
} else {
echo "<span class='text-danger apilo-product-search' product-id='" . $product['id'] . "'>";
echo "nie przypisano <i class='fa fa-search'></i>";
echo "</span>";
}
?>
</td>
<? endif;?>
<!-- sellasist -->
<? if ( $this -> sellasist_enabled ):?>
<td class="text-center">
<?
if ( $product['sellasist_product_name'] != "" ) {
echo "<span title='" . htmlspecialchars( $product['sellasist_product_name'] ) . "'>" . mb_substr( $product['sellasist_product_name'], 0, 25, "UTF-8" ) . "...</span>";
echo "<br>";
echo "<span class='text-danger sellasist-delete-linking' product-id='" . $product['id'] . "'>";
echo "<i class='fa fa-times'></i>usuń powiązanie";
echo "</span>";
} else {
echo "<span class='text-danger sellasist-product-search' product-id='" . $product['id'] . "'>";
echo "nie przypisano <i class='fa fa-search'></i>";
echo "</span>";
}
?>
</td>
<? endif;?>
<td>
<a href='/admin/shop_product/product_combination/product_id=<?= $product['id'];?>'>kombinacje (<?= \admin\factory\shopProduct::count_product_combinations( $product['id'] );?>)</a>
</td>
<td class="text-center">
<a href='/admin/shop_product/product_edit/id=<?= $product['id'];?>'>edytuj</a>
</td>
<td class="text-center">
<a href='/admin/shop_product/product_archive/product_id=<?= $product['id'];?>' class="product-delete">usuń</a>
</td>
</tr>
<? if ( $this -> show_xml_data ):?>
<tr>
<td colspan="12">
<div class="product-xml-data">
<!-- input nazwa produktu XML -->
<input type="text" class="form-control product_xml_name" value="<?= $product['languages']['pl']['xml_name'];?>" placeholder="Nazwa produktu XML (PL)" product-id="<?= $product['id'];?>" lang-id="pl">
<!-- input custom_label_0 -->
<div class="custom_label_0_container">
<input type="text" class="form-control custom_label_0" value="<?= $product['custom_label_0'];?>" placeholder="custom_label_0" product-id="<?= $product['id'];?>" label-type="custom_label_0">
<div class="custom_label_0_suggestions" label-type="custom_label_0"></div>
</div>
<!-- input custom_label_1 -->
<div class="custom_label_1_container">
<input type="text" class="form-control custom_label_1" value="<?= $product['custom_label_1'];?>" placeholder="custom_label_1" product-id="<?= $product['id'];?>" label-type="custom_label_1">
<div class="custom_label_1_suggestions" label-type="custom_label_1"></div>
</div>
<!-- input custom_label_2 -->
<div class="custom_label_2_container">
<input type="text" class="form-control custom_label_2" value="<?= $product['custom_label_2'];?>" placeholder="custom_label_2" product-id="<?= $product['id'];?>" label-type="custom_label_2">
<div class="custom_label_2_suggestions" label-type="custom_label_2"></div>
</div>
<!-- input custom_label_3 -->
<div class="custom_label_3_container">
<input type="text" class="form-control custom_label_3" value="<?= $product['custom_label_3'];?>" placeholder="custom_label_3" product-id="<?= $product['id'];?>" label-type="custom_label_3">
<div class="custom_label_3_suggestions" label-type="custom_label_3"></div>
</div>
<!-- input custom_label_4 -->
<div class="custom_label_4_container">
<input type="text" class="form-control custom_label_4" value="<?= $product['custom_label_4'];?>" placeholder="custom_label_4" product-id="<?= $product['id'];?>" label-type="custom_label_4">
<div class="custom_label_4_suggestions" label-type="custom_label_4"></div>
</div>
</div>
</td>
</tr>
<? endif;?>
<? endforeach;?>

View File

@@ -0,0 +1,851 @@
<div class="panel">
<div class="panel-body">
<a href="/admin/shop_product/product_edit/" class="btn btn-success">Dodaj produkt</a>
<!-- przycisk pokaż dane z XML -->
<? if ( !$this -> show_xml_data ):?>
<a href="/admin/shop_product/view_list/show_xml_data=true" class="btn btn-dark">Pokaż dane z XML</a>
<? else:?>
<a href="/admin/shop_product/view_list/show_xml_data=false" class="btn btn-danger">Ukryj dane z XML</a>
<? endif;?>
<? if ( $this -> shoppro_enabled ):?>
<a href="#" class="btn btn-danger btn-shoppro-product-import">Pobierz produkt z shopPRO</a>
<? endif;?>
</div>
<div class="panel-body pn">
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped mbn" id="table-products">
<thead>
<tr>
<th style="width: 10px;">#</th>
<th>Nazwa</th>
<th class="text-center" style="width: 100px;">Cena</th>
<th class="text-center" style="width: 100px;">Cena promocyjna</th>
<th class="text-center" style="width: 25px;">Promowany</th>
<th class="text-center" style="width: 25px;">Aktywny</th>
<th class="text-center" style="width: 75px;">Stan MG</th>
<? if ( $this -> baselinker_enabled ):?>
<th class="text-center" style="width: 100px;">Baselinker</th>
<? endif;?>
<? if ( $this -> apilo_enabled ):?>
<th class="text-center" style="width: 100px;">Apilo</th>
<? endif;?>
<? if ( $this -> sellasist_enabled ):?>
<th class="text-center" style="width: 100px;">Sellasist</th>
<? endif;?>
<th class="text-center" style="width: 100px;">Kombinacje</th>
<th class="text-center" style="width: 75px;">Edytuj</th>
<th class="text-center" style="width: 75px;">Archiwizuj</th>
</tr>
<tr>
<th></th>
<th>
<input type="text" class="form-control table-search" field_name="name|ean|sku" placeholder="szukaj..." value="<?= htmlspecialchars( $this -> query_array['name|ean|sku'], ENT_QUOTES, 'UTF-8');?>">
</th>
<th colspan="10"></th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<td colspan="12">
<ul class="pagination" pagination_max="<?= $this -> pagination_max;?>">
<li>
<a href="#" page="1" title="pierwsza strona">
<i class="fa fa-angle-double-left"></i>
</a>
</li>
<li>
<a href="#" class="previous" page="<?= ( $this -> current_page - 1 > 1 ) ? ( $this -> current_page - 1 ) : 1;?>" title="poprzednia strona">
<i class="fa fa-angle-left" title="poprzednia strona"></i>
</a>
</li>
<li>
<div>
Strona <span id="current-page"><?= $this -> current_page;?></span> z <span id="max_page"><?= $this -> pagination_max;?></span>
</div>
</li>
<li>
<a href="#" class="next" page="<?= ( $this -> current_page + 1 < $this -> pagination_max ) ? ( $this -> current_page + 1 ) : $this -> pagination_max;?>" title="następna strona">
<i class="fa fa-angle-right"></i>
</a>
</li>
<li>
<a href="#" class="last" page="<?= $this -> pagination_max;?>" title="ostatnia strona">
<i class="fa fa-angle-double-right"></i>
</a>
</li>
</ul>
</td>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
<script type="text/javascript">
$( function() {
ajax_load_products( <?= $this -> current_page;?>, null );
$( 'body' ).on( 'change', '.table-search', function() {
ajax_load_products( 1 );
});
$( 'body' ).on( 'click', '.pagination a', function() {
var current_page = $( this ).attr( 'page' );
ajax_load_products( current_page );
});
$( 'body' ).on( 'click', '.btn-shoppro-product-import', function(e)
{
e.preventDefault();
// show alert with form with product_id field
$.alert({
title: 'Import produktu',
content: 'Wprowadź ID produktu z shopPRO',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-8',
theme: 'material',
icon: 'fa fa-exclamation-triangle',
buttons: {
confirm: {
text: 'Importuj',
btnClass: 'btn-success',
keys: ['enter'],
action: function() {
var product_id = $( '#shoppro-product-id' ).val();
if ( product_id )
{
document.location.href = '/admin/integrations/shoppro_product_import/product_id=' + product_id;
}
}
},
cancel: {
text: 'Anuluj',
btnClass: 'btn-danger',
action: function() {}
}
},
onOpenBefore: function() {
this.setContent( '<input type="text" class="form-control" id="shoppro-product-id" placeholder="ID produktu z shopPRO">' );
}
});
});
$( 'body' ).on( 'click', '.product-delete', function(e) {
e.preventDefault();
var href = $( this ).attr( 'href' );
$.alert({
title: 'Pytanie',
content: 'Na pewno chcesz przenieść wybrany produkt do archiwum?',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'supervan',
icon: 'fa fa-question',
buttons: {
cancel: {
text: 'Nie',
btnClass: 'btn-success',
action: function() {}
},
confirm: {
text: 'Tak',
btnClass: 'btn-danger',
keys: ['enter'],
action: function() {
document.location.href = href;
}
}
}
});
return false;
});
$( 'body' ).on( 'change', '.product-price-promo', function(e)
{
var price = $( this ).val();
price = price.replace( ' ', '' );
price = parseFloat( price.replace( ',', '.' ) * 1 );
price = number_format( price, 2, '.', '' );
$( this ).val( price );
var product_id = $( this ).attr( 'product-id' );
$.ajax(
{
type: 'POST',
cache: false,
url: '/admin/shop_product/product_change_price_brutto_promo/',
data:
{
product_id: product_id,
price: price
},
beforeSend: function()
{
$( '#overlay' ).show();
},
success: function( data )
{
$( '#overlay' ).hide();
response = jQuery.parseJSON( data );
if ( response.status !== 'ok' )
create_error( response.msg );
}
});
});
$( 'body' ).on( 'change', '.product-price', function(e)
{
var price = $( this ).val();
price = price.replace( ' ', '' );
price = parseFloat( price.replace( ',', '.' ) * 1 );
price = number_format( price, 2, '.', '' );
$( this ).val( price );
var product_id = $( this ).attr( 'product-id' );
$.ajax(
{
type: 'POST',
cache: false,
url: '/admin/shop_product/product_change_price_brutto/',
data:
{
product_id: product_id,
price: price
},
beforeSend: function()
{
$( '#overlay' ).show();
},
success: function( data )
{
$( '#overlay' ).hide();
response = jQuery.parseJSON( data );
if ( response.status !== 'ok' )
create_error( response.msg );
}
});
});
$( 'body' ).on( 'click', '.duplicate-product', function(e)
{
e.preventDefault();
var product_id = $( this ).attr( 'product-id' );
$.alert({
title: 'Pytanie',
content: 'Na pewno chcesz wykonać duplikat produktu?',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-question',
buttons: {
confirm: {
text: 'Tak (produkt bez kombinacji)',
btnClass: 'btn-success',
keys: ['enter'],
action: function() {
document.location.href = '/admin/shop_product/duplicate_product/product-id=' + product_id;
}
},
confirm2: {
text: 'Tak (produkt z KOMBINACJAMI)',
btnClass: 'btn-primary',
keys: ['enter'],
action: function() {
document.location.href = '/admin/shop_product/duplicate_product/product-id=' + product_id + '&combination=1';
}
},
cancel: {
text: 'Nie',
btnClass: 'btn-dark',
action: function() {}
}
}
});
})
// sellasist product search
$( 'body' ).on( 'click', '.sellasist-product-search', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/sellasist_product_search/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'SUCCESS' ) {
var html = '<div class="sellasist-found-products">';
html += '<p>Znaleziono ' + data.products.length + ' produktów</p>';
html += '<select class="form-control sellasist-product-select" product-id="' + product_id + '">';
$.each( data.products, function( index, value ) {
html += '<option value="' + value.id + '">' + value.name + ' SKU: ' + value.symbol + '</option>';
});
html += '</select>';
html += '<button class="btn btn-success sellasist-product-select-save" product-id="' + product_id + '">Zapisz</button>';
html += '</div>';
$( 'span.sellasist-product-search[product-id="' + product_id + '"]' ).closest( 'td' ).append( html );
} else if ( data.status == 'error' ) {
$.alert({
title: 'Błąd',
content: data.msg,
type: 'red',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-exclamation-triangle',
buttons: {
confirm: {
text: 'OK',
btnClass: 'btn-danger',
keys: ['enter'],
action: function() {}
}
}
});
}
}
});
});
// apilo product search
$( 'body' ).on( 'click', '.apilo-product-search', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/apilo_product_search/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'SUCCESS' )
{
if ( data.products.length == 0 )
{
var html = '<div class="baselinker-found-products">';
html += '<p>Nie znaleziono produktów</p>';
// button to create product on baselinker
html += '<a href="/admin/integrations/apilo_create_product/product-id=' + product_id + '" class="btn btn-success btn_apilo_create_product" product_id="' + product_id + '">Utwórz produkt</a>';
html += '</div>';
$( 'span.apilo-product-search[product-id="' + product_id + '"]' ).closest( 'td' ).append( html );
}
else
{
var html = '<div class="apilo-found-products">';
html += '<p>Znaleziono ' + data.products.length + ' produktów</p>';
html += '<select class="form-control apilo-product-select" product-id="' + product_id + '">';
$.each( data.products, function( index, value ) {
html += '<option value="' + value.id + '">' + value.name + ' SKU: ' + value.sku + '</option>';
});
html += '</select>';
html += '<button class="btn btn-success apilo-product-select-save" product-id="' + product_id + '">Zapisz</button>';
html += '</div>';
$( 'span.apilo-product-search[product-id="' + product_id + '"]' ).closest( 'td' ).append( html );
}
}
else if ( data.status == 'error' )
{
$.alert({
title: 'Błąd',
content: data.msg,
type: 'red',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-exclamation-triangle',
buttons: {
confirm: {
text: 'OK',
btnClass: 'btn-danger',
keys: ['enter'],
action: function() {}
}
}
});
}
}
});
});
// sellasist product delete linking
$( 'body' ).on( 'click', '.sellasist-delete-linking', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/sellasist_product_select_delete/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( 'span.sellasist-delete-linking[product-id="' + product_id + '"]' ).closest('td').html( '<span class="text-danger sellasist-product-search" product-id="' + product_id + '">nie przypisano <i class="fa fa-search"></i></span>' );
}
}
});
});
// delete apilo product linking
$( 'body' ).on( 'click', '.apilo-delete-linking', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/apilo_product_select_delete/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( 'span.apilo-delete-linking[product-id="' + product_id + '"]' ).closest('td').html( '<span class="text-danger apilo-product-search" product-id="' + product_id + '">nie przypisano <i class="fa fa-search"></i></span>' );
}
}
});
});
// delete baselinker product linking
$( 'body' ).on( 'click', '.baselinker-delete-linking', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/baselinker_product_select_delete/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( 'span.baselinker-delete-linking[product-id="' + product_id + '"]' ).closest('td').html( '<span class="text-danger baselinker-product-search" product-id="' + product_id + '">nie przypisano <i class="fa fa-search"></i></span>' );
}
}
});
});
// aplio product create button click with alert confirmation
$( 'body' ).on( 'click', '.btn_apilo_create_product', function(e)
{
e.preventDefault();
var product_id = $( this ).attr( 'product_id' );
$.alert(
{
title: 'Pytanie',
content: 'Na pewno chcesz utworzyć produkt w bazie Apilo?',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-question',
buttons:
{
confirm:
{
text: 'Tak',
btnClass: 'btn-success',
keys: ['enter'],
action: function()
{
document.location.href = '/admin/integrations/apilo_create_product/product_id=' + product_id;
}
},
cancel:
{
text: 'Nie',
btnClass: 'btn-danger',
action: function() {}
}
}
});
});
// baselinker product create button click with alert confirmation
$( 'body' ).on( 'click', '.btn-create-product', function(e) {
e.preventDefault();
var product_id = $( this ).attr( 'product-id' );
$.alert({
title: 'Pytanie',
content: 'Na pewno chcesz utworzyć produkt w bazie Baselinker?',
type: 'orange',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-question',
buttons: {
confirm: {
text: 'Tak',
btnClass: 'btn-success',
keys: ['enter'],
action: function() {
document.location.href = '/admin/integrations/baselinker_create_product/product_id=' + product_id;
}
},
cancel: {
text: 'Nie',
btnClass: 'btn-danger',
action: function() {}
}
}
});
});
$( 'body' ).on( 'click', '.baselinker-product-search', function() {
var product_id = $( this ).attr( 'product-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/baselinker_product_search/',
data: {
product_id: product_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'SUCCESS' )
{
if ( data.products.length == 0 )
{
var html = '<div class="baselinker-found-products">';
html += '<p>Nie znaleziono produktów</p>';
// button to create product on baselinker
html += '<a href="/admin/integrations/baselinker_create_product/product-id=' + product_id + '" class="btn btn-success btn-create-product" product-id="' + product_id + '">Utwórz produkt</a>';
html += '</div>';
$( 'span.baselinker-product-search[product-id="' + product_id + '"]' ).closest( 'td' ).append( html );
}
else
{
var html = '<div class="baselinker-found-products">';
html += '<p>Znaleziono ' + data.products.length + ' produktów</p>';
html += '<select class="form-control baselinker-product-select" product-id="' + product_id + '">';
$.each( data.products, function( index, value ) {
html += '<option value="' + value.product_id + '">' + value.name + ' SKU: ' + value.sku + '</option>';
});
html += '</select>';
html += '<button class="btn btn-success baselinker-product-select-save" product-id="' + product_id + '">Zapisz</button>';
html += '</div>';
$( 'span.baselinker-product-search[product-id="' + product_id + '"]' ).closest( 'td' ).append( html );
}
}
else if ( data.status == 'error' )
{
$.alert({
title: 'Błąd',
content: data.msg,
type: 'red',
closeIcon: true,
closeIconClass: 'fa fa-times',
typeAnimated: true,
animation: 'opacity',
columnClass: 'col-12 col-lg-10',
theme: 'modern',
icon: 'fa fa-exclamation-triangle',
buttons: {
confirm: {
text: 'OK',
btnClass: 'btn-danger',
keys: ['enter'],
action: function() {}
}
}
});
}
}
});
});
// sellasist product select save
$( 'body' ).on( 'click', '.sellasist-product-select-save', function(){
var product_id = $( this ).attr( 'product-id' );
var sellasist_product_id = $( '.sellasist-product-select[product-id="' + product_id + '"]' ).val();
var sellasist_product_name = $( '.sellasist-product-select[product-id="' + product_id + '"] option:selected' ).text();
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/sellasist_product_select_save/',
data: {
product_id: product_id,
sellasist_product_id: sellasist_product_id,
sellasist_product_name: sellasist_product_name
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( '.sellasist-product-select[product-id="' + product_id + '"]' ).closest( '.sellasist-found-products' ).remove();
$( 'span.sellasist-product-search[product-id="' + product_id + '"]' ).html( '<span title="' + sellasist_product_name + '">' + sellasist_product_name.substr( 0, 25 ) + '...</span>' ).removeClass( 'sellasist-product-search' ).removeClass( 'text-danger' );
}
}
});
});
// apilo product select save
$( 'body' ).on( 'click', '.apilo-product-select-save', function(){
var product_id = $( this ).attr( 'product-id' );
var apilo_product_id = $( '.apilo-product-select[product-id="' + product_id + '"]' ).val();
var apilo_product_name = $( '.apilo-product-select[product-id="' + product_id + '"] option:selected' ).text();
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/apilo_product_select_save/',
data: {
product_id: product_id,
apilo_product_id: apilo_product_id,
apilo_product_name: apilo_product_name
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( '.apilo-product-select[product-id="' + product_id + '"]' ).closest( '.apilo-found-products' ).remove();
$( 'span.apilo-product-search[product-id="' + product_id + '"]' ).html( '<span title="' + apilo_product_name + '">' + apilo_product_name.substr( 0, 25 ) + '...</span>' ).removeClass( 'apilo-product-search' ).removeClass( 'text-danger' );
}
}
});
});
$( 'body' ).on( 'click', '.baselinker-product-select-save', function(){
var product_id = $( this ).attr( 'product-id' );
var baselinker_product_id = $( '.baselinker-product-select[product-id="' + product_id + '"]' ).val();
var baselinker_product_name = $( '.baselinker-product-select[product-id="' + product_id + '"] option:selected' ).text();
$.ajax({
type: 'POST',
cache: false,
url: '/admin/integrations/baselinker_product_select_save/',
data: {
product_id: product_id,
baselinker_product_id: baselinker_product_id,
baselinker_product_name: baselinker_product_name
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( '.baselinker-product-select[product-id="' + product_id + '"]' ).closest( '.baselinker-found-products' ).remove();
$( 'span.baselinker-product-search[product-id="' + product_id + '"]' ).html( '<span title="' + baselinker_product_name + '">' + baselinker_product_name.substr( 0, 25 ) + '...</span>' ).removeClass( 'baselinker-product-search' ).removeClass( 'text-danger' );
}
}
});
});
$( 'body' ).on( 'change', '.product_xml_name', function() {
var product_id = $( this ).attr( 'product-id' );
var product_xml_name = $( this ).val();
var lang_id = $( this ).attr( 'lang-id' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/shop_product/product_xml_name_save/',
data: {
product_id: product_id,
product_xml_name: product_xml_name,
lang_id: lang_id
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
$( '#overlay' ).hide();
}
});
});
// save custom_label on change
$( 'body' ).on( 'change', '.custom_label_0, .custom_label_1, .custom_label_2, .custom_label_3, .custom_label_4', function() {
var element = $( this );
var product_id = element.attr( 'product-id' );
var custom_label = element.val();
var label_type = element.attr( 'label-type' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/shop_product/product_custom_label_save/',
data: {
product_id: product_id,
custom_label: custom_label,
label_type: label_type
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
$( '#overlay' ).hide();
// hide after 1 seconds
setTimeout(function(){
element.parent( '.' + label_type + '_container' ).find( '.' + label_type + '_suggestions' ).hide();
}, 1000);
}
});
});
// on keyup
$( 'body' ).on( 'keyup', '.custom_label_0, .custom_label_1, .custom_label_2, .custom_label_3, .custom_label_4', function() {
var element = $( this );
var product_id = element.attr( 'product-id' );
var custom_label = element.val();
var label_type = element.attr( 'label-type' );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/shop_product/product_custom_label_suggestions/',
data: {
custom_label: custom_label,
label_type: label_type
},
beforeSend: function() {
},
success: function( response ) {
var data = jQuery.parseJSON( response );
var suggestions = "";
if ( data.suggestions.length > 0 ) {
for ( var i = 0; i < data.suggestions.length; i++ ) {
suggestions += "<div>" + data.suggestions[i].label + "</div>";
}
element.parent( '.' + label_type + '_container' ).find( '.' + label_type + '_suggestions' ).html( suggestions ).show();
} else {
element.parent( '.' + label_type + '_container' ).find( '.' + label_type + '_suggestions' ).hide();
}
}
});
});
});
$( 'body' ).on( 'click', '.custom_label_0_suggestions div, .custom_label_1_suggestions div, .custom_label_2_suggestions div, .custom_label_3_suggestions div, .custom_label_4_suggestions div', function(){
var element = $( this );
var label_type = element.parent().attr( 'label-type' );
var custom_label = element.html();
element.parents( '.' + label_type + '_container' ).find( 'input' ).val( custom_label );
// trigger change
element.parents( '.' + label_type + '_container' ).find( 'input' ).trigger( 'change' );
element.parents( '.' + label_type + '_container' ).find( '.' + label_type + '_suggestions' ).hide();
});
function ajax_load_products( current_page ) {
var pagination_max = parseInt( $( '.pagination' ).attr( 'pagination_max' ) );
var query = '';
$( '.table-search' ).each(function(){
query += $( this ).attr( 'field_name' ) + '=' + $( this ).val() + '&';
});
current_page = parseInt( current_page );
$.ajax({
type: 'POST',
cache: false,
url: '/admin/shop_product/ajax_load_products/',
data: {
current_page: current_page,
query: query
},
beforeSend: function() {
$( '#overlay' ).show();
},
success: function( response ) {
$( '#overlay' ).hide();
data = jQuery.parseJSON( response );
if ( data.status == 'ok' ) {
$( '#table-products tbody' ).html( data.html );
$( '.pagination .previous' ).attr( 'page', ( current_page - 1 > 1 ) ? ( current_page - 1 ) : 1 );
$( '.pagination .next' ).attr( 'page', ( current_page + 1 < pagination_max ) ? ( current_page + 1 ) : pagination_max );
$( '.pagination span' ).html( current_page );
if ( data.pagination_max ) {
$( '.pagination' ).attr( 'pagination_max', data.pagination_max );
$( '.pagination #max_page' ).html( data.pagination_max );
$( '.pagination .last' ).attr( 'page', data.pagination_max );
}
}
}
});
}
</script>

View File

@@ -0,0 +1,70 @@
<script type="text/javascript" src="/libraries/framework/vendor/plugins/ckeditor/ckeditor.js"></script>
<script type="text/javascript" src="/libraries/framework/vendor/plugins/ckeditor/adapters/jquery.js"></script>
<?php
global $db;
ob_start();
if ( \S::is_array_fix( $this -> product -> permutations ) )
{
foreach ( $this -> product -> permutations as $permutation )
{
?>
<div class="form-group row">
<label class="col-lg-4 control-label default-value">
<?
$data = explode( '_', $permutation );
foreach ( $data as $row )
{
echo \shop\ProductAttribute::getAttributeNameByValue( $row, \front\factory\Languages::default_language()) . ': <span class="text-muted">' . \shop\ProductAttribute::getValueName( $row, \front\factory\Languages::default_language() ) . '</span>';
if ( $row !== end( $data ) )
echo ' | ';
}
echo '</label>';
echo '<div class="col-lg-8">';
echo '<input type="text" class="form-control" name="permutation_' . $permutation . '" value="' . \shop\Product::getPermutationQuantity( $this -> product -> id, $permutation ) . '">';
echo '</div>';
echo '</div>';
}
}
else
{
echo '<div class="form-group row">';
echo ' <label class="col-lg-4 control-label default-value">Produkt bez atrybutów (lub z 1 atrybutem i jedną wartością):</label>';
echo '<div class="col-lg-8">';
echo '<input type="text" class="form-control" name="permutation_0" value="' . \admin\factory\ShopProduct::permutation_quantity( $this -> product -> id, 0 ) . '">';
echo '</div>';
echo '</div>';
}
?>
<?php
$out = ob_get_clean();
$grid = new \gridEdit();
$grid -> id = 'stock';
$grid -> gdb_opt = $gdb;
$grid -> include_plugins = true;
$grid -> title = 'Stany magazynowe: <u>'.$this -> product -> language['name'].'</u>';
$grid -> fields = [
[
'db' => 'id',
'type' => 'hidden',
'value' => $this -> product -> id,
],
];
$grid -> actions = [
'save' => ['url' => '/admin/shop_product/stock_save/', 'back_url' => '/admin/shop_product/view_list/'],
'cancel' => ['url' => '/admin/shop_product/view_list/'],
];
$grid -> external_code = $out;
$grid -> persist_edit = true;
$grid -> id_param = 'id';
echo $grid -> draw();
?>
<script type="text/javascript">
$( function()
{
disable_menu();
});
</script>

View File

@@ -0,0 +1,22 @@
<? if ( is_array( $this -> categories ) ):?>
<ol>
<? foreach ( $this -> categories as $category ):?>
<li id="list_<?= $category[ 'id' ];?>" class="list_<?= $category[ 'id' ];?>" category="<?= $category[ 'id' ];?>">
<div class="context_0 content content_menu">
<span class="disclose"><span></span></span>
<? if ( !$category[ 'status' ] ) echo '<i class="fa fa-ban fa-lg text-danger" title="Kategoria nieaktywna"></i>';?>
<input type="checkbox" class="g-checkbox" name="<?= $this -> name ? $this -> name : 'categories[]';?>" value="<?= $category[ 'id' ];?>" <? if ( is_array( $this -> product_categories ) and in_array( $category[ 'id' ], $this -> product_categories ) ):?>checked="checked"<? endif;?> />
<b><?= $category[ 'languages' ][ $this -> dlang ][ 'title' ];?></b>
</div>
<?=
\Tpl::view( 'shop-product/subcategories-list', [
'categories' => \admin\factory\ShopCategory::subcategories( $category[ 'id' ] ),
'product_categories' => $this -> product_categories,
'dlang' => $this -> dlang,
'name' => $this -> name
] );
?>
</li>
<? endforeach;?>
</ol>
<? endif;?>