Merge branch 'bootstrap' of https://github.com/PrestaShop/PrestaShop into bootstrap
Conflicts: modules/themeconfigurator/themeconfigurator.php
@@ -128,6 +128,22 @@
|
||||
<dd><a href="http://www.prestashop.com/en/contact-us?utm_source=backoffice_dashboard" target="_blank">{l s="Go to prestashop.com"}</a></dd>
|
||||
</dl>
|
||||
</section>
|
||||
|
||||
<section class="dash_simulation panel">
|
||||
<h3><i class="icon-link"></i> {l s="Simulation Mode"}</h3>
|
||||
<span class="switch prestashop-switch">
|
||||
<input id="PS_DASHBOARD_SIMULATION_on" class="ps_dashboard_simulation" type="radio" checked="checked" value="1" name="PS_DASHBOARD_SIMULATION">
|
||||
<label class="radioCheck" for="PS_DASHBOARD_SIMULATION_on">
|
||||
<i class="icon-check-sign color_success"></i> {l s='Yes'}
|
||||
</label>
|
||||
<input id="PS_DASHBOARD_SIMULATION_off" class="ps_dashboard_simulation" type="radio" value="0" name="PS_DASHBOARD_SIMULATION">
|
||||
<label class="radioCheck" for="PS_DASHBOARD_SIMULATION_off">
|
||||
<i class="icon-ban-circle color_danger"></i> {l s='No'}
|
||||
</label>
|
||||
<span class="slide-button btn btn-default"></span>
|
||||
</span>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -24,7 +24,7 @@
|
||||
*}
|
||||
<div class="page-head">
|
||||
<h2 class="page-title">
|
||||
{l s='Configure'} : {$module_display_name} ({$module_name}}
|
||||
{l s='Configure:'} {$module_display_name} ({$module_name})
|
||||
</h2>
|
||||
<div class="page-bar toolbarBox">
|
||||
<div class="btn-toolbar">
|
||||
|
||||
@@ -309,7 +309,13 @@ class AdminDashboardControllerCore extends AdminController
|
||||
|
||||
die(Tools::jsonEncode(Hook::exec('dashboardData', $params, $id_module, true, true, (int)Tools::getValue('dashboard_use_push'))));
|
||||
}
|
||||
|
||||
|
||||
public function ajaxProcessSetSimulationMode()
|
||||
{
|
||||
Configuration::updateValue('PS_DASHBOARD_SIMULATION', (int)Tools::getValue('PS_DASHBOARD_SIMULATION'));
|
||||
die ('k'.Configuration::get('PS_DASHBOARD_SIMULATION').'k');
|
||||
}
|
||||
|
||||
public function ajaxProcessGetBlogRss()
|
||||
{
|
||||
$return = array('has_errors' => false, 'rss' => array());
|
||||
|
||||
@@ -321,13 +321,16 @@ abstract class InstallControllerHttp
|
||||
*/
|
||||
public function getPhone()
|
||||
{
|
||||
if (InstallSession::getInstance()->support_phone != null)
|
||||
return InstallSession::getInstance()->support_phone;
|
||||
if ($this->phone === null)
|
||||
{
|
||||
$this->phone = $this->language->getInformation('phone', false);
|
||||
if ($iframe = Tools::file_get_contents('http://api.prestashop.com/iframe/install.php?lang='.$this->language->getLanguageIso()))
|
||||
if ($iframe = Tools::file_get_contents('http://api.prestashop.com/iframe/install.php?lang='.$this->language->getLanguageIso(), false, null, 3))
|
||||
if (preg_match('/<img.+alt="([^"]+)".*>/Ui', $iframe, $matches) && isset($matches[1]))
|
||||
$this->phone = $matches[1];
|
||||
}
|
||||
InstallSession::getInstance()->support_phone = $this->phone;
|
||||
return $this->phone;
|
||||
}
|
||||
|
||||
|
||||
@@ -67,6 +67,7 @@ UPDATE `PREFIX_configuration` SET value = '1' WHERE name = 'BLOCK_CATEG_NBR_COLU
|
||||
UPDATE `PREFIX_configuration` SET value = '' WHERE name = 'UPGRADER_BACKUPDB_FILENAME';
|
||||
UPDATE `PREFIX_configuration` SET value = '' WHERE name = 'UPGRADER_BACKUPFILES_FILENAME';
|
||||
UPDATE `PREFIX_configuration` SET value = '40' WHERE name = 'CONF_AVERAGE_PRODUCT_MARGIN';
|
||||
UPDATE `PREFIX_configuration` SET value = '1' WHERE name = 'PS_DASHBOARD_SIMULATION';
|
||||
|
||||
/* No right column */
|
||||
DELETE FROM `PREFIX_hook_module` WHERE id_hook = (SELECT id_hook FROM `PREFIX_hook` WHERE name = 'displayRightColumn');
|
||||
|
||||
@@ -781,5 +781,11 @@ Country</value>
|
||||
<configuration id="PS_ATTRIBUTE_ANCHOR_SEPARATOR" name="PS_ATTRIBUTE_ANCHOR_SEPARATOR">
|
||||
<value>-</value>
|
||||
</configuration>
|
||||
<configuration id="CONF_AVERAGE_PRODUCT_MARGIN" name="CONF_AVERAGE_PRODUCT_MARGIN">
|
||||
<value>40</value>
|
||||
</configuration>
|
||||
<configuration id="PS_DASHBOARD_SIMULATION" name="PS_DASHBOARD_SIMULATION">
|
||||
<value>1</value>
|
||||
</configuration>
|
||||
</entities>
|
||||
</entity_configuration>
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
/*
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Open Software License (OSL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/osl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
// Change logo
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
/*
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Open Software License (OSL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/osl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
// Check database configuration
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
/*
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Open Software License (OSL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/osl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
$('#mainForm').submit(function()
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
/*
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Open Software License (OSL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/osl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
// Desactivate next button if licence checkbox is not checked
|
||||
|
||||
@@ -1,3 +1,27 @@
|
||||
/*
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Open Software License (OSL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/osl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
var is_installing = false;
|
||||
$(document).ready(function()
|
||||
{
|
||||
|
||||
@@ -1,10 +1,29 @@
|
||||
$(document).ready(function()
|
||||
{
|
||||
// Submit change of language
|
||||
$('#langList').change(function()
|
||||
{
|
||||
var form = $('#mainForm');
|
||||
form.attr('action', form.attr('action')+'#licenses-agreement');
|
||||
form.submit();
|
||||
/*
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Open Software License (OSL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/osl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
|
||||
$(document).ready(function() {
|
||||
$('#langList').change(function() {
|
||||
$('#mainForm').submit();
|
||||
});
|
||||
});
|
||||
@@ -289,4 +289,18 @@ $(document).ready( function () {
|
||||
getBlogRss();
|
||||
bindSubmitDashConfig();
|
||||
bindCancelDashConfig();
|
||||
|
||||
$('.ps_dashboard_simulation').change(function(e) {
|
||||
$.ajax({
|
||||
url : dashboard_ajax_url,
|
||||
data : {
|
||||
ajax:true,
|
||||
action:'setSimulationMode',
|
||||
PS_DASHBOARD_SIMULATION: $(this).val()
|
||||
},
|
||||
success : function(result) {
|
||||
refreshDashboard(false, false);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<div class="container">
|
||||
<a href="{$banner_link}" title="{$banner_desc}">
|
||||
{if isset($banner_img)}
|
||||
<img src="{$module_dir}{$banner_img}" alt=""/>
|
||||
<img class="img-responsive" src="{$module_dir}{$banner_img}" alt=""/>
|
||||
{else}
|
||||
{$banner_desc}
|
||||
{/if}
|
||||
|
||||
@@ -490,13 +490,13 @@ class Blocktopmenu extends Module
|
||||
if ($category->level_depth == 2)
|
||||
{
|
||||
$files = scandir(_PS_CAT_IMG_DIR_);
|
||||
$this->_menu .= '<div id="category-thumbnail">';
|
||||
$this->_menu .= '<li id="category-thumbnail">';
|
||||
|
||||
foreach ($files as $file)
|
||||
if (preg_match('/'.$category->id.'-([0-9])?_thumb.jpg/i', $file) === 1)
|
||||
$this->_menu .= '<div>'.ImageManager::thumbnail(_PS_CAT_IMG_DIR_.$file, 'category_'.$file, 100, 'jpg', true, true).'</div>';
|
||||
|
||||
$this->_menu .= '</div>';
|
||||
$this->_menu .= '</li>';
|
||||
}
|
||||
|
||||
$this->_menu .= '</ul>';
|
||||
|
||||
@@ -97,6 +97,45 @@ class Dashactivity extends Module
|
||||
|
||||
public function hookDashboardData($params)
|
||||
{
|
||||
if (Configuration::get('PS_DASHBOARD_SIMULATION'))
|
||||
{
|
||||
$days = round((strtotime($params['date_to']) - strtotime($params['date_from'])) / 3600 / 24);
|
||||
$online_visitor = round(rand(10, 50));
|
||||
$visits = round(rand(200, 2000) * $days);
|
||||
|
||||
return array(
|
||||
'data_value' => array(
|
||||
'pending_orders' => round(rand(0, 5)),
|
||||
'return_exchanges' => round(rand(0, 5)),
|
||||
'abandoned_cart' => round(rand(5, 50)),
|
||||
'products_out_of_stock' => round(rand(1, 10)),
|
||||
'new_messages' => round(rand(1, 10) * $days),
|
||||
'order_inquires' => 42,
|
||||
'product_reviews' => round(rand(5, 50) * $days),
|
||||
'new_customers' => round(rand(1, 5) * $days),
|
||||
'online_visitor' => $online_visitor,
|
||||
'active_shopping_cart' => round($online_visitor / 10),
|
||||
'new_registrations' => round(rand(1, 5) * $days),
|
||||
'total_suscribers' => round(rand(200, 2000)),
|
||||
'visits' => $visits,
|
||||
'unique_visitors' => round($visits * 0.6),
|
||||
),
|
||||
'data_trends' => array(
|
||||
'orders_trends' => array('way' => 'down', 'value' => 0.42),
|
||||
),
|
||||
'data_list_small' => array(
|
||||
'dash_traffic_source' => array('prestashop.com' => round($visits / 2), 'google.com' => round($visits / 3), 'Direct Traffic' => round($visits / 4))
|
||||
),
|
||||
'data_chart' => array(
|
||||
'dash_trends_chart1' => array('chart_type' => 'pie_chart_trends', 'data' => array(
|
||||
array('key' => 'prestashop.com', 'y' => round($visits / 2)),
|
||||
array('key' => 'google.com', 'y' => round($visits / 3)),
|
||||
array('key' => 'Direct Traffic', 'y' => round($visits / 4))
|
||||
))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$gapi = Module::isInstalled('gapi') ? Module::getInstanceByName('gapi') : false;
|
||||
if (Validate::isLoadedObject($gapi) && $gapi->isConfigured())
|
||||
{
|
||||
@@ -353,14 +392,14 @@ class Dashactivity extends Module
|
||||
$fields_form['form']['input'][] = array(
|
||||
'label' => $this->l('Cart abandoned (min)'),
|
||||
'desc' => $this->l('Default time range (min) to consider a Shopping cart as abandoned (default 24hrs)'),
|
||||
'name' => 'DASHACTIVITY_CART_ABANDONED_MIN',
|
||||
'name' => 'DASHACTIVITY_CART_ABANDONED',
|
||||
'type' => 'text',
|
||||
'suffix' => $this->l('hrs'),
|
||||
);
|
||||
$fields_form['form']['input'][] = array(
|
||||
'label' => $this->l('Cart abandoned (max)'),
|
||||
'desc' => $this->l('Default time range (max) to consider a Shopping cart as abandoned (default 48hrs)'),
|
||||
'name' => 'DASHACTIVITY_CART_ABANDONED_MAX',
|
||||
'name' => 'DASHACTIVITY_CART_ABANDONED',
|
||||
'type' => 'text',
|
||||
'suffix' => $this->l('hrs'),
|
||||
);
|
||||
|
||||
@@ -75,11 +75,30 @@ class Dashtrends extends Module
|
||||
'total_expenses' => array()
|
||||
);
|
||||
|
||||
$tmp_data['visits'] = AdminStatsControllerCore::getVisits(false, $date_from, $date_to, 'day');
|
||||
$tmp_data['orders'] = AdminStatsControllerCore::getOrders($date_from, $date_to, 'day');
|
||||
$tmp_data['total_paid_tax_excl'] = AdminStatsControllerCore::getTotalSales($date_from, $date_to, 'day');
|
||||
$tmp_data['total_purchases'] = AdminStatsControllerCore::getPurchases($date_from, $date_to, 'day');
|
||||
$tmp_data['total_expenses'] = AdminStatsControllerCore::getExpenses($date_from, $date_to, 'day');
|
||||
if (Configuration::get('PS_DASHBOARD_SIMULATION'))
|
||||
{
|
||||
$from = strtotime($date_from.' 00:00:00');
|
||||
$to = min(time(), strtotime($date_to.' 23:59:59'));
|
||||
for ($date = $from; $date <= $to; $date = strtotime('+1 day', $date))
|
||||
{
|
||||
$tmp_data['visits'][$date] = round(rand(2000, 20000));
|
||||
$tmp_data['conversion_rate'][$date] = rand(80, 250) / 100;
|
||||
$tmp_data['average_cart_value'][$date] = round(rand(60, 200), 2);
|
||||
$tmp_data['orders'][$date] = round($tmp_data['visits'][$date] * $tmp_data['conversion_rate'][$date] / 100);
|
||||
$tmp_data['total_paid_tax_excl'][$date] = $tmp_data['orders'][$date] * $tmp_data['average_cart_value'][$date];
|
||||
$tmp_data['total_purchases'][$date] = $tmp_data['total_paid_tax_excl'][$date] * rand(50, 70) / 100;
|
||||
$tmp_data['total_expenses'][$date] = $tmp_data['total_paid_tax_excl'][$date] * rand(0, 10) / 100;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
$tmp_data['visits'] = AdminStatsControllerCore::getVisits(false, $date_from, $date_to, 'day');
|
||||
$tmp_data['orders'] = AdminStatsControllerCore::getOrders($date_from, $date_to, 'day');
|
||||
$tmp_data['total_paid_tax_excl'] = AdminStatsControllerCore::getTotalSales($date_from, $date_to, 'day');
|
||||
$tmp_data['total_purchases'] = AdminStatsControllerCore::getPurchases($date_from, $date_to, 'day');
|
||||
$tmp_data['total_expenses'] = AdminStatsControllerCore::getExpenses($date_from, $date_to, 'day');
|
||||
}
|
||||
|
||||
return $tmp_data;
|
||||
}
|
||||
|
||||
@@ -93,7 +112,10 @@ class Dashtrends extends Module
|
||||
'conversion_rate' => array(),
|
||||
'net_profits' => array()
|
||||
);
|
||||
$from = max(strtotime(_PS_CREATION_DATE_.' 00:00:00'), strtotime($date_from.' 00:00:00'));
|
||||
|
||||
$from = strtotime($date_from.' 00:00:00');
|
||||
if (!Configuration::get('PS_DASHBOARD_SIMULATION'))
|
||||
$from = max(strtotime(_PS_CREATION_DATE_.' 00:00:00'), $from);
|
||||
$to = min(time(), strtotime($date_to.' 23:59:59'));
|
||||
for ($date = $from; $date <= $to; $date = strtotime('+1 day', $date))
|
||||
{
|
||||
|
||||
|
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
@@ -1,16 +1,13 @@
|
||||
<div id="htmlcontent">
|
||||
<h2>{$htmlcontent.info.name} (v.{$htmlcontent.info.version})</h2>
|
||||
|
||||
{if $error}
|
||||
{if isset($error) && $error}
|
||||
{include file="{$htmlcontent.admin_tpl_path}messages.tpl" id="main" text=$error class='error'}
|
||||
{/if}
|
||||
{if $confirmation}
|
||||
{if isset($confirmation) && $confirmation}
|
||||
{include file="{$htmlcontent.admin_tpl_path}messages.tpl" id="main" text=$confirmation class='conf'}
|
||||
{/if}
|
||||
|
||||
<!-- New -->
|
||||
{include file="{$htmlcontent.admin_tpl_path}new.tpl"}
|
||||
<!-- Slides -->
|
||||
{include file="{$htmlcontent.admin_tpl_path}items.tpl"}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
@@ -9,7 +9,7 @@
|
||||
<div id="items-{$lang}" class="lang-content" style="display:{if $lang == $htmlitems.lang.default.id_lang}block{else}none{/if};">
|
||||
{foreach name=hooks from=$langItems key=hook item=hookItems}
|
||||
|
||||
<h4 class="hook-title">{l s='Hook' mod='tmhtmlcontent'} "{$hook}"</h4>
|
||||
<h4 class="hook-title">{l s='Hook' mod='themeconfigurator'} "{$hook}"</h4>
|
||||
{if $hookItems}
|
||||
<ul id="items">
|
||||
{foreach name=items from=$hookItems item=hItem}
|
||||
@@ -17,37 +17,37 @@
|
||||
<span class="item-order">{if $hItem.item_order le 9}0{/if}{$hItem.item_order}</span>
|
||||
<!--<i class="icon-sort"></i>-->
|
||||
<span class="item-title">{$hItem.title}</span>
|
||||
<span class="button btn btn-default button-edit pull-right"><i class="icon-edit"></i>{l s='Edit' mod='tmhtmlcontent'}</span>
|
||||
<span class="button btn btn-default button-close pull-right"><i class="icon-remove"></i>{l s='Close' mod='tmhtmlcontent'}</span>
|
||||
<span class="button btn btn-default button-edit pull-right"><i class="icon-edit"></i>{l s='Edit' mod='themeconfigurator'}</span>
|
||||
<span class="button btn btn-default button-close pull-right"><i class="icon-remove"></i>{l s='Close' mod='themeconfigurator'}</span>
|
||||
|
||||
<div class="item-container">
|
||||
<form method="post" action="{$htmlitems.postAction}" enctype="multipart/form-data" class="item-form defaultForm form-horizontal">
|
||||
<input type="hidden" name="lang_id" value="{$lang}" />
|
||||
<input type="hidden" name="id_lang" value="{$lang}" />
|
||||
<input type="hidden" name="item_id" value="{$hItem.id_item}" />
|
||||
<input type="hidden" name="item_order" value="{$hItem.item_order}" />
|
||||
<div class="image-display item-field form-group">
|
||||
<img src="{$module_dir}images/{$hItem.image}" alt="" title="" style="width:{$hItem.image_w}px; height:{$hItem.image_h}px;{if !$hItem.image} display:none;{/if}" class="preview" />
|
||||
</div>
|
||||
<div class="active item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Active' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Active' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="checkbox" name="item_active" value="1"{if $hItem.active == 1} checked="checked"{/if} />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Title' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Title' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="text" name="item_title" size="48" value="{$hItem.title}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title_use item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Use title in front' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Use title in front' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="checkbox" name="item_title_use" value="1"{if $hItem.title_use == 1} checked="checked"{/if} />
|
||||
</div>
|
||||
</div>
|
||||
<div class="hook item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Hook' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Hook' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<select name="item_hook" default="home">
|
||||
<option value="home"{if $hItem.hook == 'home'} selected="selected"{/if}>home</option>
|
||||
@@ -59,45 +59,45 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="image item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Image' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Image' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="file" name="item_img" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="image_w item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Image width' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Image width' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input name="item_img_w" type="text" maxlength="4" size="4" value="{$hItem.image_w}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="image_h item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Image height' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Image height' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input name="item_img_h" type="text" maxlength="4" size="4" value="{$hItem.image_h}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="url item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='URL' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='URL' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="text" name="item_url" size="48" value="{$hItem.url}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="target item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Target blank' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Target blank' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="checkbox" name="item_target" value="1"{if $hItem.target == 1} checked="checked"{/if} />
|
||||
</div>
|
||||
</div>
|
||||
<div class="html item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='HTML' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='HTML' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<textarea name="item_html" cols="65" rows="12">{$hItem.html}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-9 col-lg-offset-3">
|
||||
<button type="submit" name="removeItem" class="button btn btn-default button-remove" onClick="this.form.submit();"><i class="icon-remove-sign"></i>{l s='Remove' mod='tmhtmlcontent'}</button>
|
||||
<button type="submit" name="updateItem" class="button btn btn-default button-save" onClick="this.form.submit();"><i class="icon-save"></i>{l s='Save' mod='tmhtmlcontent'}</button>
|
||||
<button type="submit" name="removeItem" class="button btn btn-default button-remove" onClick="this.form.submit();"><i class="icon-remove-sign"></i>{l s='Remove' mod='themeconfigurator'}</button>
|
||||
<button type="submit" name="updateItem" class="button btn btn-default button-save" onClick="this.form.submit();"><i class="icon-save"></i>{l s='Save' mod='themeconfigurator'}</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
@@ -107,7 +107,7 @@
|
||||
</ul>
|
||||
{else}
|
||||
<div class="item">
|
||||
{l s='No items available' mod='tmhtmlcontent'}
|
||||
{l s='No items available' mod='themeconfigurator'}
|
||||
</div>
|
||||
{/if}
|
||||
{/foreach}
|
||||
@@ -1,12 +1,12 @@
|
||||
<div class="new-item">
|
||||
<div class="form-group clearfix">
|
||||
<span class="button btn btn-default new-item"><i class="icon-plus-sign"></i>{l s='Add item' mod='tmhtmlcontent'}</span>
|
||||
<span class="button btn btn-default new-item"><i class="icon-plus-sign"></i>{l s='Add item' mod='themeconfigurator'}</span>
|
||||
</div>
|
||||
<div class="item-container">
|
||||
<form method="post" action="{$htmlitems.postAction}" enctype="multipart/form-data" class="item-form defaultForm form-horizontal">
|
||||
<div class="panel">
|
||||
<div class="language item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Language' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Language' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" >
|
||||
{foreach from=$htmlitems.lang.all item=lang}
|
||||
@@ -19,21 +19,21 @@
|
||||
<li id="lang-{$lang.id_lang}" class="new-lang-flag"><a href="javascript:hideOtherLanguage({$lang.id_lang});">{$lang.name}</a></li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
<input type="hidden" id="lang-id" name="lang_id" value="{$htmlitems.lang.default.id_lang}" />
|
||||
<input type="hidden" id="lang-id" name="id_lang" value="{$htmlitems.lang.default.id_lang}" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title item-field form-group">
|
||||
<label class="control-label col-lg-3 ">{l s='Title' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3 ">{l s='Title' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input class="form-control" type="text" name="item_title" size="48" value="" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="title_use item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Use title in front' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Use title in front' mod='themeconfigurator'}</label>
|
||||
<input type="checkbox" name="item_title_use" value="1" />
|
||||
</div>
|
||||
<div class="hook item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Hook' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Hook' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<select class="form-control" name="item_hook" default="home">
|
||||
<option value="home">home</option>
|
||||
@@ -45,44 +45,44 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="image item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Image' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Image' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="file" name="item_img" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="image_w item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Image width' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Image width' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input name="item_img_w" type="text" maxlength="4" size="4" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="image_h item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Image height' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Image height' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input name="item_img_h" type="text" maxlength="4" size="4" value=""/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="url item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='URL' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='URL' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="text" name="item_url" size="48" value="http://" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="target item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='Target blank' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='Target blank' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<input type="checkbox" name="item_target" value="1" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="html item-field form-group">
|
||||
<label class="control-label col-lg-3">{l s='HTML' mod='tmhtmlcontent'}</label>
|
||||
<label class="control-label col-lg-3">{l s='HTML' mod='themeconfigurator'}</label>
|
||||
<div class="col-lg-7">
|
||||
<textarea name="item_html" cols="65" rows="12"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<div class="col-lg-9 col-lg-offset-3">
|
||||
<button type="submit" name="newItem" class="button-save btn btn-default" onClick="this.form.submit();">{l s='Save' mod='tmhtmlcontent'}</button>
|
||||
<button type="submit" name="newItem" class="button-save btn btn-default" onClick="this.form.submit();">{l s='Save' mod='themeconfigurator'}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,7 +1,7 @@
|
||||
{if isset($htmlitems.items) && $htmlitems.items}
|
||||
<div id="htmlcontent_home">
|
||||
{if isset($htmlitems) && $htmlitems}
|
||||
<div id="htmlcontent_{$hook}">
|
||||
<ul class="htmlcontent-home clearfix row">
|
||||
{foreach name=items from=$htmlitems.items item=hItem}
|
||||
{foreach name=items from=$htmlitems item=hItem}
|
||||
<li class="htmlcontent-item col-xs-4">
|
||||
{if $hItem.url}
|
||||
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
|
||||
@@ -1,36 +1,10 @@
|
||||
<?php
|
||||
/*
|
||||
* 2007-2013 PrestaShop
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License (AFL 3.0)
|
||||
* that is bundled with this package in the file LICENSE.txt.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* http://opensource.org/licenses/afl-3.0.php
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to http://www.prestashop.com for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2013 PrestaShop SA
|
||||
|
||||
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*/
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
header("Location: ../");
|
||||
|
||||
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
|
||||
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
|
||||
|
||||
header('Cache-Control: no-store, no-cache, must-revalidate');
|
||||
header('Cache-Control: post-check=0, pre-check=0', false);
|
||||
header('Pragma: no-cache');
|
||||
|
||||
header('Location: ../../../../');
|
||||
exit;
|
||||
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<module>
|
||||
<name>tmhtmlcontent</name>
|
||||
<displayName><![CDATA[TM HTML content]]></displayName>
|
||||
<version><![CDATA[1.0]]></version>
|
||||
<description><![CDATA[]]></description>
|
||||
<author><![CDATA[TemplateMonster]]></author>
|
||||
<tab><![CDATA[other]]></tab>
|
||||
<is_configurable>1</is_configurable>
|
||||
<need_instance>1</need_instance>
|
||||
<limited_countries></limited_countries>
|
||||
</module>
|
||||
|
Before Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 136 KiB |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 121 KiB |
@@ -1,8 +0,0 @@
|
||||
<?php
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
header("Location: ../");
|
||||
exit;
|
||||
@@ -1,387 +0,0 @@
|
||||
<?php
|
||||
if(!defined('_PS_VERSION_'))
|
||||
exit;
|
||||
|
||||
class TmHtmlContent extends Module {
|
||||
|
||||
protected $maxImageSize = 1048576;
|
||||
private $_html = '';
|
||||
protected $_defaultLanguage;
|
||||
protected $_languages;
|
||||
|
||||
public function __construct() {
|
||||
$this->name = 'tmhtmlcontent'; // Defines module name
|
||||
$this->tab = 'other'; // Defines module tab name/module category in the admin panel
|
||||
$this->author = 'TemplateMonster'; // Defines module author
|
||||
$this->version = '1.0'; // Defines module version
|
||||
$this->secure_key = Tools::encrypt($this->name);
|
||||
$this->bootstrap = true;
|
||||
|
||||
$this->_defaultLanguage = Language::getLanguage(Configuration::get('PS_LANG_DEFAULT'));
|
||||
$this->_languages = Language::getLanguages();
|
||||
|
||||
parent::__construct();
|
||||
|
||||
$this->displayName = $this->l('TM HTML content');
|
||||
$this->desctiption = $this->l('Module for HTML content with images and links.');
|
||||
|
||||
// Paths
|
||||
$this->module_path = _PS_MODULE_DIR_.$this->name.'/';
|
||||
$this->uploads_path = _PS_MODULE_DIR_.$this->name.'/images/';
|
||||
$this->admin_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/admin/';
|
||||
$this->hooks_tpl_path = _PS_MODULE_DIR_.$this->name.'/views/templates/hooks/';
|
||||
}
|
||||
|
||||
private function installDB() {
|
||||
|
||||
Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'tmhtmlcontent`');
|
||||
|
||||
if (!Db::getInstance()->Execute('
|
||||
CREATE TABLE `'._DB_PREFIX_.'tmhtmlcontent` (
|
||||
`id_item` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`id_shop` int(10) unsigned NOT NULL,
|
||||
`id_lang` int(10) unsigned NOT NULL,
|
||||
`item_order` int(10) unsigned NOT NULL,
|
||||
`title` VARCHAR(100),
|
||||
`title_use` tinyint(1) unsigned NOT NULL DEFAULT \'0\',
|
||||
`hook` VARCHAR(100),
|
||||
`url` VARCHAR(100),
|
||||
`target` tinyint(1) unsigned NOT NULL DEFAULT \'0\',
|
||||
`image` VARCHAR(100),
|
||||
`image_w` VARCHAR(10),
|
||||
`image_h` VARCHAR(10),
|
||||
`html` TEXT,
|
||||
`active` tinyint(1) unsigned NOT NULL DEFAULT \'1\',
|
||||
PRIMARY KEY (`id_item`)
|
||||
) ENGINE = '._MYSQL_ENGINE_.' DEFAULT CHARSET=UTF8;'))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function install() {
|
||||
/* Adds Module */
|
||||
if (!parent::install() ||
|
||||
$this->installDB() &&
|
||||
!$this->registerHook('displayHeader') ||
|
||||
!$this->registerHook('displayTop') ||
|
||||
!$this->registerHook('displayLeftColumn') ||
|
||||
!$this->registerHook('displayRightColumn') ||
|
||||
!$this->registerHook('displayHome') ||
|
||||
!$this->registerHook('displayFooter') ||
|
||||
!$this->registerHook('displayBackOfficeHeader'))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public function uninstall() {
|
||||
|
||||
$images = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent`');
|
||||
foreach ($images as $image)
|
||||
$this->_deleteImages($image);
|
||||
|
||||
|
||||
if (!Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'tmhtmlcontent`') OR
|
||||
!parent::uninstall())
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getContent() {
|
||||
$this->context->smarty->assign('error', 0);
|
||||
$this->context->smarty->assign('confirmation', 0);
|
||||
|
||||
if (Tools::isSubmit('newItem')){
|
||||
$this->_addItem();
|
||||
} elseif (Tools::isSubmit('updateItem')){
|
||||
$this->_updateItem();
|
||||
} elseif (Tools::isSubmit('removeItem')) {
|
||||
$this->_removeItem();
|
||||
}
|
||||
return $this->_displayForm();
|
||||
}
|
||||
|
||||
private function _displayForm() {
|
||||
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$items = array();
|
||||
|
||||
$this->context->smarty->assign('htmlcontent', array(
|
||||
'admin_tpl_path' => $this->admin_tpl_path,
|
||||
'hooks_tpl_path' => $this->hooks_tpl_path,
|
||||
|
||||
'info' => array(
|
||||
'module' => $this->name,
|
||||
'name' => $this->displayName,
|
||||
'version' => $this->version,
|
||||
'psVersion' => _PS_VERSION_,
|
||||
'context' => (Configuration::get('PS_MULTISHOP_FEATURE_ACTIVE') == 0) ? 1 : ($this->context->shop->getTotalShops() != 1) ? $this->context->shop->getContext() : 1
|
||||
)
|
||||
));
|
||||
|
||||
foreach ($this->_languages as $language) {
|
||||
$hooks[$language['id_lang']] = array('home', 'top', 'left', 'right', 'footer');
|
||||
foreach ($hooks[$language['id_lang']] as $hook) {
|
||||
$items[$language['id_lang']][$hook] = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$language['id_lang'].' AND hook = \''.$hook.'\' ORDER BY item_order ASC');
|
||||
}
|
||||
}
|
||||
|
||||
$this->context->smarty->assign('htmlitems', array(
|
||||
'items' => $items,
|
||||
'lang' => array(
|
||||
'default' => $this->_defaultLanguage,
|
||||
'all' => $this->_languages,
|
||||
'lang_dir' => _THEME_LANG_DIR_,
|
||||
'user' => $this->context->language->id
|
||||
),
|
||||
'postAction' => 'index.php?tab=AdminModules&configure='.$this->name.'&token='.Tools::getAdminTokenLite('AdminModules').'&tab_module=other&module_name='.$this->name.'',
|
||||
'id_shop' => $id_shop
|
||||
));
|
||||
|
||||
return $this->display(__FILE__, 'views/templates/admin/admin.tpl');
|
||||
}
|
||||
|
||||
|
||||
private function _addItem() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$lastOrder = Db::getInstance()->ExecuteS('SELECT item_order FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.(int)Tools::getValue('lang_id').' AND hook = \''.Tools::getValue('item_hook').'\' ORDER BY item_order DESC LIMIT 1');
|
||||
$currentOrder = ($lastOrder) ? $lastOrder[0]['item_order']+1 : 1 ;
|
||||
|
||||
$image_w = (is_numeric(Tools::getValue('item_img_w'))) ? intval(Tools::getValue('item_img_w')) : '';
|
||||
$image_h = (is_numeric(Tools::getValue('item_img_h'))) ? intval(Tools::getValue('item_img_h')) : '';
|
||||
|
||||
if(!empty($_FILES['item_img']['name'])){
|
||||
$image = $this->_uploadImage($_FILES['item_img'], $image_w, $image_h);
|
||||
if(empty($image))
|
||||
return false;
|
||||
} else {
|
||||
$image = '';
|
||||
$image_w = '';
|
||||
$image_h = '';
|
||||
}
|
||||
|
||||
$insert = Db::getInstance()->Execute('
|
||||
INSERT INTO `'._DB_PREFIX_.'tmhtmlcontent` (
|
||||
`id_shop`, `id_lang`, `item_order`, `title`, `title_use`, `hook`, `url`, `target`, `image`, `image_w`, `image_h`, `html`, `active`
|
||||
) VALUES (
|
||||
\''.$id_shop.'\',
|
||||
\''.(int)Tools::getValue('lang_id').'\',
|
||||
\''.$currentOrder.'\',
|
||||
\''.Tools::getValue('item_title').'\',
|
||||
\''.(int)Tools::getValue('item_title_use').'\',
|
||||
\''.Tools::getValue('item_hook').'\',
|
||||
\''.Tools::getValue('item_url').'\',
|
||||
\''.(int)Tools::getValue('item_target').'\',
|
||||
\''.$image.'\',
|
||||
\''.$image_w.'\',
|
||||
\''.$image_h.'\',
|
||||
\''.str_replace("'", "´", Tools::getValue('item_html')).'\',
|
||||
1)
|
||||
');
|
||||
|
||||
if(!$insert){
|
||||
$this->_deleteImages($image);
|
||||
$this->context->smarty->assign('error', $this->l('An error occured while saving data.'));
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->context->smarty->assign('confirmation', $this->l('New item added successfull.'));
|
||||
}
|
||||
|
||||
private function _updateItem() {
|
||||
|
||||
$newImage = '';
|
||||
|
||||
$image_w = (is_numeric(Tools::getValue('item_img_w'))) ? intval(Tools::getValue('item_img_w')) : '';
|
||||
$image_h = (is_numeric(Tools::getValue('item_img_h'))) ? intval(Tools::getValue('item_img_h')) : '';
|
||||
|
||||
if(!empty($_FILES['item_img']['name'])){
|
||||
if ($oldImage = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_item = '.(int)Tools::getValue('item_id')))
|
||||
$this->_deleteImages($oldImage[0]);
|
||||
|
||||
$image = $this->_uploadImage($_FILES['item_img'], $image_w, $image_h);
|
||||
if(empty($image))
|
||||
return false;
|
||||
$newImage = 'image = \''.$image.'\',';
|
||||
} else {
|
||||
$image_w = '';
|
||||
$image_h = '';
|
||||
}
|
||||
$update = Db::getInstance()->Execute('
|
||||
UPDATE `'._DB_PREFIX_.'tmhtmlcontent` SET
|
||||
title = \''.Tools::getValue('item_title').'\',
|
||||
title_use = \''.(int)Tools::getValue('item_title_use').'\',
|
||||
hook = \''.Tools::getValue('item_hook').'\',
|
||||
url = \''.Tools::getValue('item_url').'\',
|
||||
target = \''.(int)Tools::getValue('item_target').'\',
|
||||
'.$newImage.'
|
||||
image_w = \''.$image_w.'\',
|
||||
image_h = \''.$image_h.'\',
|
||||
active = \''.(int)Tools::getValue('item_active').'\',
|
||||
html = \''.str_replace("'", "´", Tools::getValue('item_html')).'\'
|
||||
WHERE id_item = '.(int)Tools::getValue('item_id'));
|
||||
|
||||
if(!$update){
|
||||
if ($newImage = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_item = '.(int)Tools::getValue('item_id')))
|
||||
$this->_deleteImages($oldImage[0]);
|
||||
$this->context->smarty->assign('error', $this->l('An error occured while saving data.'));
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->context->smarty->assign('confirmation', $this->l('Saved succsessfull.'));
|
||||
|
||||
}
|
||||
|
||||
public function _removeItem() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
if ($delImage = Db::getInstance()->ExecuteS('SELECT image FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_item = '.(int)Tools::getValue('item_id')))
|
||||
$this->_deleteImages($delImage[0]);
|
||||
|
||||
Db::getInstance()->delete(_DB_PREFIX_.'tmhtmlcontent', 'id_item = '.(int)Tools::getValue('item_id'));
|
||||
|
||||
if(Db::getInstance()->Affected_Rows() == 1){
|
||||
Db::getInstance()->Execute('
|
||||
UPDATE `'._DB_PREFIX_.'tmhtmlcontent`
|
||||
SET item_order = item_order-1
|
||||
WHERE (
|
||||
item_order > '.Tools::getValue('item_order').' AND
|
||||
id_shop = '.$id_shop.' AND
|
||||
hook = \''.Tools::getValue('item_hook').'\')
|
||||
');
|
||||
|
||||
$this->context->smarty->assign('confirmation', $this->l('Deleted succsessfull.'));
|
||||
}else{
|
||||
$this->context->smarty->assign('error', $this->l('Cant delete slide data from database.'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function _uploadImage($image, $image_w = '', $image_h = '') {
|
||||
/* Uploads image */
|
||||
|
||||
$type = @strtolower(substr(strrchr($image['name'], '.'), 1));
|
||||
$imagesize = array();
|
||||
$imagesize = @getimagesize($image['tmp_name']);
|
||||
Configuration::set('PS_IMAGE_QUALITY','png_all');
|
||||
$salt = sha1(microtime());
|
||||
|
||||
if (isset($image) &&
|
||||
isset($image['tmp_name']) &&
|
||||
!empty($image['tmp_name']) &&
|
||||
!empty($imagesize) &&
|
||||
in_array(strtolower(substr(strrchr($imagesize['mime'], '/'), 1)), array('jpg', 'gif', 'jpeg', 'png')) &&
|
||||
in_array($type, array('jpg', 'gif', 'jpeg', 'png')))
|
||||
{
|
||||
$temp_name = tempnam(_PS_TMP_IMG_DIR_, 'PS');
|
||||
|
||||
if ($error = ImageManager::validateUpload($image))
|
||||
$errors[] = $error;
|
||||
elseif (!$temp_name || !move_uploaded_file($image['tmp_name'], $temp_name))
|
||||
return false;
|
||||
elseif (ImageManager::resize($temp_name, dirname(__FILE__).'/images/'.Tools::encrypt($image['name'].$salt).'.'.$type, $image_w, $image_h))
|
||||
return Tools::encrypt($image['name'].$salt).'.'.$type;
|
||||
else
|
||||
$this->context->smarty->assign('error', $this->l('An error occurred during the image upload.'));
|
||||
if (isset($temp_name))
|
||||
@unlink($temp_name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private function _deleteImages($image) {
|
||||
if ($image && $image['image']!='' && is_file($this->uploads_path.$image['image']))
|
||||
unlink($this->uploads_path.$image['image']);
|
||||
}
|
||||
|
||||
|
||||
|
||||
public function hookDisplayBackOfficeHeader() {
|
||||
// Check if module is loaded
|
||||
if (Tools::getValue('configure') != $this->name)
|
||||
return false;
|
||||
|
||||
// CSS
|
||||
$this->context->controller->addCSS($this->_path.'views/css/admin.css');
|
||||
// JS
|
||||
$this->context->controller->addJquery();
|
||||
$this->context->controller->addJS($this->_path.'views/js/admin.js');
|
||||
}
|
||||
|
||||
|
||||
public function hookdisplayHeader($params) {
|
||||
$this->context->controller->addCss($this->_path.'views/css/hooks.css', 'all');
|
||||
}
|
||||
|
||||
|
||||
public function hookDisplayTop() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$id_lang = $this->context->language->id;
|
||||
$hook_name = 'top';
|
||||
$items = array();
|
||||
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
|
||||
|
||||
$this->context->smarty->assign('htmlitems', array(
|
||||
'items' => $items
|
||||
));
|
||||
|
||||
return $this->display(__FILE__, 'views/templates/hooks/top.tpl');
|
||||
}
|
||||
|
||||
|
||||
public function hookDisplayHome() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$id_lang = $this->context->language->id;
|
||||
$hook_name = 'home';
|
||||
$items = array();
|
||||
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
|
||||
|
||||
$this->context->smarty->assign('htmlitems', array(
|
||||
'items' => $items
|
||||
));
|
||||
|
||||
return $this->display(__FILE__, 'views/templates/hooks/home.tpl');
|
||||
}
|
||||
|
||||
public function hookDisplayLeftColumn() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$id_lang = $this->context->language->id;
|
||||
$hook_name = 'left';
|
||||
$items = array();
|
||||
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
|
||||
|
||||
$this->context->smarty->assign('htmlitems', array(
|
||||
'items' => $items
|
||||
));
|
||||
|
||||
return $this->display(__FILE__, 'views/templates/hooks/left.tpl');
|
||||
}
|
||||
|
||||
public function hookDisplayRightColumn() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$id_lang = $this->context->language->id;
|
||||
$hook_name = 'right';
|
||||
$items = array();
|
||||
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
|
||||
|
||||
$this->context->smarty->assign('htmlitems', array(
|
||||
'items' => $items
|
||||
));
|
||||
|
||||
return $this->display(__FILE__, 'views/templates/hooks/right.tpl');
|
||||
}
|
||||
|
||||
public function hookDisplayFooter() {
|
||||
$id_shop = (int)$this->context->shop->id;
|
||||
$id_lang = $this->context->language->id;
|
||||
$hook_name = 'footer';
|
||||
$items = array();
|
||||
$items = Db::getInstance()->ExecuteS('SELECT * FROM `'._DB_PREFIX_.'tmhtmlcontent` WHERE id_shop = '.$id_shop.' AND id_lang = '.$id_lang.' AND hook = \''.$hook_name.'\' AND active = 1 ORDER BY item_order ASC');
|
||||
|
||||
$this->context->smarty->assign('htmlitems', array(
|
||||
'items' => $items
|
||||
));
|
||||
|
||||
return $this->display(__FILE__, 'views/templates/hooks/footer.tpl');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
header("Location: ../");
|
||||
|
||||
exit;
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
header("Location: ../");
|
||||
|
||||
exit;
|
||||
@@ -1,27 +0,0 @@
|
||||
{if isset($htmlitems.items) && $htmlitems.items}
|
||||
<div id="htmlcontent_footer">
|
||||
<ul class="htmlcontent-home clearfix row">
|
||||
{foreach name=items from=$htmlitems.items item=hItem}
|
||||
<li class="htmlcontent-item col-xs-4">
|
||||
{if $hItem.url}
|
||||
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
|
||||
{/if}
|
||||
{if $hItem.image}
|
||||
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
|
||||
{/if}
|
||||
{if $hItem.title && $hItem.title_use == 1}
|
||||
<h3 class="item-title">{$hItem.title}</h3>
|
||||
{/if}
|
||||
{if $hItem.html}
|
||||
<div class="item-html">
|
||||
{$hItem.html} <i class="icon-double-angle-right"></i>
|
||||
</div>
|
||||
{/if}
|
||||
{if $hItem.url}
|
||||
</a>
|
||||
{/if}
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -1,27 +0,0 @@
|
||||
{if isset($htmlitems.items) && $htmlitems.items}
|
||||
<div id="htmlcontent_left">
|
||||
<ul class="htmlcontent-home clearfix row">
|
||||
{foreach name=items from=$htmlitems.items item=hItem}
|
||||
<li class="htmlcontent-item span4">
|
||||
{if $hItem.url}
|
||||
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
|
||||
{/if}
|
||||
{if $hItem.image}
|
||||
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
|
||||
{/if}
|
||||
{if $hItem.title && $hItem.title_use == 1}
|
||||
<h3 class="item-title">{$hItem.title}</h3>
|
||||
{/if}
|
||||
{if $hItem.html}
|
||||
<div class="item-html">
|
||||
{$hItem.html} <i class="icon-double-angle-right"></i>
|
||||
</div>
|
||||
{/if}
|
||||
{if $hItem.url}
|
||||
</a>
|
||||
{/if}
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -1,27 +0,0 @@
|
||||
{if isset($htmlitems.items) && $htmlitems.items}
|
||||
<div id="htmlcontent_right">
|
||||
<ul class="htmlcontent-home clearfix row">
|
||||
{foreach name=items from=$htmlitems.items item=hItem}
|
||||
<li class="htmlcontent-item col-xs-4">
|
||||
{if $hItem.url}
|
||||
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
|
||||
{/if}
|
||||
{if $hItem.image}
|
||||
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
|
||||
{/if}
|
||||
{if $hItem.title && $hItem.title_use == 1}
|
||||
<h3 class="item-title">{$hItem.title}</h3>
|
||||
{/if}
|
||||
{if $hItem.html}
|
||||
<div class="item-html">
|
||||
{$hItem.html} <i class="icon-double-angle-right"></i>
|
||||
</div>
|
||||
{/if}
|
||||
{if $hItem.url}
|
||||
</a>
|
||||
{/if}
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -1,27 +0,0 @@
|
||||
{if isset($htmlitems.items) && $htmlitems.items}
|
||||
<div id="htmlcontent_top">
|
||||
<ul class="htmlcontent-home clearfix row">
|
||||
{foreach name=items from=$htmlitems.items item=hItem}
|
||||
<li class="htmlcontent-item col-xs-4">
|
||||
{if $hItem.url}
|
||||
<a href="{$hItem.url}" class="item-link"{if $hItem.target == 1} target="_blank"{/if}>
|
||||
{/if}
|
||||
{if $hItem.image}
|
||||
<img src="{$module_dir}images/{$hItem.image}" class="item-img" alt="" />
|
||||
{/if}
|
||||
{if $hItem.title && $hItem.title_use == 1}
|
||||
<h3 class="item-title">{$hItem.title}</h3>
|
||||
{/if}
|
||||
{if $hItem.html}
|
||||
<div class="item-html">
|
||||
{$hItem.html} <i class="icon-double-angle-right"></i>
|
||||
</div>
|
||||
{/if}
|
||||
{if $hItem.url}
|
||||
</a>
|
||||
{/if}
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
|
||||
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
|
||||
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
|
||||
header("Cache-Control: no-store, no-cache, must-revalidate");
|
||||
header("Cache-Control: post-check=0, pre-check=0", false);
|
||||
header("Pragma: no-cache");
|
||||
header("Location: ../");
|
||||
|
||||
exit;
|
||||
@@ -2,6 +2,19 @@
|
||||
/*** ESSENTIAL STYLES ***/
|
||||
.sf-contener {
|
||||
clear: both;
|
||||
float: left;
|
||||
width: 100%;
|
||||
margin: 50px 0 0;
|
||||
}
|
||||
@media (min-width: 480px) and (max-width: 767px) {
|
||||
.sf-contener {
|
||||
margin-top: 80px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 479px) {
|
||||
.sf-contener {
|
||||
margin-top: 70px;
|
||||
}
|
||||
}
|
||||
|
||||
.sf-menu, .sf-menu * {
|
||||
@@ -11,30 +24,28 @@
|
||||
}
|
||||
|
||||
.sf-menu {
|
||||
margin: 50px 0 0;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
border-bottom: 3px solid #e9e9e9;
|
||||
background: #f6f6f6;
|
||||
}
|
||||
@media (min-width: 480px) and (max-width: 767px) {
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu {
|
||||
margin-top: 80px;
|
||||
}
|
||||
}
|
||||
@media (max-width: 479px) {
|
||||
.sf-menu {
|
||||
margin-top: 70px;
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.sf-menu ul {
|
||||
position: absolute;
|
||||
top: -999em;
|
||||
width: 10em;
|
||||
/* left offset of submenus need to match (see below) */
|
||||
background: white;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu ul {
|
||||
position: relative;
|
||||
}
|
||||
}
|
||||
|
||||
.sf-menu ul li {
|
||||
width: 100%;
|
||||
@@ -45,15 +56,32 @@
|
||||
/* fixes IE7 'sticky bug' */
|
||||
}
|
||||
|
||||
.sf-menu li {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.sf-menu > li {
|
||||
float: left;
|
||||
border-right: 1px solid #d6d4d4;
|
||||
margin-bottom: -3px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu > li {
|
||||
float: none;
|
||||
position: relative;
|
||||
border-right: none;
|
||||
}
|
||||
.sf-menu > li span {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
top: 20px;
|
||||
display: none;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
z-index: 2;
|
||||
}
|
||||
.sf-menu > li span:after {
|
||||
font-family: "FontAwesome";
|
||||
content: "";
|
||||
font-size: 26px;
|
||||
}
|
||||
}
|
||||
.sf-menu > li > a {
|
||||
font: 600 18px/22px "Open Sans", sans-serif;
|
||||
text-transform: uppercase;
|
||||
@@ -62,14 +90,25 @@
|
||||
padding: 17px 20px;
|
||||
border-bottom: 3px solid #e9e9e9;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu > li > a.sf-with-ul:after {
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
top: 18px;
|
||||
font-family: "FontAwesome";
|
||||
content: "";
|
||||
font-size: 26px;
|
||||
z-index: 1;
|
||||
}
|
||||
}
|
||||
.sf-menu > li.sfHover > a, .sf-menu > li > a:hover, .sf-menu > li.sfHoverForce > a {
|
||||
background: #333333;
|
||||
border-bottom-color: #666666;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.sf-menu li li a {
|
||||
display: block;
|
||||
.sf-menu li li li a {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
color: #777777;
|
||||
font-size: 13px;
|
||||
@@ -77,13 +116,13 @@
|
||||
font-weight: bold;
|
||||
padding-bottom: 10px;
|
||||
}
|
||||
.sf-menu li li a:before {
|
||||
.sf-menu li li li a:before {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
font-family: "FontAwesome";
|
||||
padding-right: 10px;
|
||||
}
|
||||
.sf-menu li li a:hover {
|
||||
.sf-menu li li li a:hover {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
@@ -93,12 +132,34 @@
|
||||
top: 59px;
|
||||
/* match top ul list item height */
|
||||
z-index: 99;
|
||||
width: 220px;
|
||||
padding: 25px 30px;
|
||||
padding: 12px 0px 18px 0px;
|
||||
-webkit-box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 13px;
|
||||
-moz-box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 13px;
|
||||
box-shadow: rgba(0, 0, 0, 0.2) 0px 5px 13px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu li ul {
|
||||
top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.sf-menu li li ul {
|
||||
position: static;
|
||||
display: block !important;
|
||||
opacity: 1 !important;
|
||||
background: none;
|
||||
-webkit-box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;
|
||||
-moz-box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;
|
||||
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px;
|
||||
}
|
||||
|
||||
.sf-menu li li li ul {
|
||||
padding: 0 0 0 20px;
|
||||
}
|
||||
|
||||
.sf-menu li li li ul {
|
||||
width: 220px;
|
||||
}
|
||||
|
||||
ul.sf-menu li:hover li ul,
|
||||
ul.sf-menu li.sfHover li ul {
|
||||
@@ -123,3 +184,113 @@ ul.sf-menu li li li.sfHover ul {
|
||||
/* match ul width */
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.sf-menu > li > ul {
|
||||
padding: 26px 30px 31px;
|
||||
width: 100%;
|
||||
}
|
||||
.sf-menu > li > ul > li > a {
|
||||
text-transform: uppercase;
|
||||
font: 600 16px/20px "Open Sans", sans-serif;
|
||||
color: #333333;
|
||||
}
|
||||
.sf-menu > li > ul > li > a:hover {
|
||||
color: #515151;
|
||||
}
|
||||
|
||||
.sf-menu > li > ul > li:not(#category-thumbnail) {
|
||||
float: left;
|
||||
width: 20%;
|
||||
padding-right: 15px;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu > li > ul > li:not(#category-thumbnail) {
|
||||
width: 50%;
|
||||
}
|
||||
}
|
||||
@media (max-width: 479px) {
|
||||
.sf-menu > li > ul > li:not(#category-thumbnail) {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
@media (min-width: 768px) {
|
||||
.sf-menu > li > ul > li:not(#category-thumbnail).first-in-line-lg {
|
||||
clear: left;
|
||||
}
|
||||
}
|
||||
@media (min-width: 480px) and (max-width: 767px) {
|
||||
.sf-menu > li > ul > li:not(#category-thumbnail).first-in-line-xs {
|
||||
clear: left;
|
||||
}
|
||||
}
|
||||
|
||||
.sf-menu > li > ul > li#category-thumbnail {
|
||||
width: 100%;
|
||||
clear: both;
|
||||
overflow: hidden;
|
||||
}
|
||||
.sf-menu > li > ul > li#category-thumbnail > div {
|
||||
float: left;
|
||||
padding-left: 10px;
|
||||
width: 33.333%;
|
||||
}
|
||||
@media (max-width: 479px) {
|
||||
.sf-menu > li > ul > li#category-thumbnail > div {
|
||||
width: 100%;
|
||||
padding-left: 0;
|
||||
padding-top: 10px;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
.sf-menu > li > ul > li#category-thumbnail > div:first-child {
|
||||
padding-left: 0;
|
||||
}
|
||||
.sf-menu > li > ul > li#category-thumbnail > div img {
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.cat-title {
|
||||
display: none;
|
||||
}
|
||||
@media (max-width: 767px) {
|
||||
.cat-title {
|
||||
display: block;
|
||||
font: 600 18px/22px "Open Sans", sans-serif;
|
||||
text-transform: uppercase;
|
||||
color: #484848;
|
||||
display: block;
|
||||
padding: 17px 20px;
|
||||
border-bottom: 3px solid #e9e9e9;
|
||||
background: #f6f6f6;
|
||||
position: relative;
|
||||
}
|
||||
.cat-title:hover {
|
||||
background: #333333;
|
||||
border-bottom-color: #666666;
|
||||
color: white;
|
||||
}
|
||||
.cat-title:after {
|
||||
display: block;
|
||||
font-family: "FontAwesome";
|
||||
content: "";
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
top: 18px;
|
||||
font-size: 26px;
|
||||
}
|
||||
.cat-title.active:after {
|
||||
content: "";
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 767px) {
|
||||
.sf-menu > li.sfHover > a.sf-with-ul:after, .sf-menu > li.sfHoverForce > a.sf-with-ul:after {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.sf-menu > li.sfHover > span, .sf-menu > li.sfHoverForce > span {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,7 +78,7 @@ function accordion(status){
|
||||
}
|
||||
|
||||
|
||||
function resposiveResize(){
|
||||
function responsiveResize(){
|
||||
if ($(document).width() <= 767 && responsiveflag == false){
|
||||
accordion('enable'),
|
||||
accordionFooter('enable'),
|
||||
@@ -91,8 +91,8 @@ function resposiveResize(){
|
||||
}
|
||||
}
|
||||
|
||||
$(document).ready(resposiveResize);
|
||||
$(window).resize(resposiveResize);
|
||||
$(document).ready(responsiveResize);
|
||||
$(window).resize(responsiveResize);
|
||||
|
||||
//replace top banner to top of page, before #header
|
||||
$(document).ready(function(){
|
||||
|
||||
@@ -1,84 +1,114 @@
|
||||
(function($){
|
||||
/* hoverIntent by Brian Cherne */
|
||||
$.fn.hoverIntent = function(f,g) {
|
||||
// default configuration options
|
||||
var cfg = {
|
||||
sensitivity: 7,
|
||||
interval: 100,
|
||||
timeout: 0
|
||||
};
|
||||
// override configuration options with user supplied object
|
||||
cfg = $.extend(cfg, g ? { over: f, out: g } : f );
|
||||
/**
|
||||
* hoverIntent is similar to jQuery's built-in "hover" method except that
|
||||
* instead of firing the handlerIn function immediately, hoverIntent checks
|
||||
* to see if the user's mouse has slowed down (beneath the sensitivity
|
||||
* threshold) before firing the event. The handlerOut function is only
|
||||
* called after a matching handlerIn.
|
||||
*
|
||||
* hoverIntent r7 // 2013.03.11 // jQuery 1.9.1+
|
||||
* http://cherne.net/brian/resources/jquery.hoverIntent.html
|
||||
*
|
||||
* You may use hoverIntent under the terms of the MIT license. Basically that
|
||||
* means you are free to use hoverIntent as long as this header is left intact.
|
||||
* Copyright 2007, 2013 Brian Cherne
|
||||
*
|
||||
* // basic usage ... just like .hover()
|
||||
* .hoverIntent( handlerIn, handlerOut )
|
||||
* .hoverIntent( handlerInOut )
|
||||
*
|
||||
* // basic usage ... with event delegation!
|
||||
* .hoverIntent( handlerIn, handlerOut, selector )
|
||||
* .hoverIntent( handlerInOut, selector )
|
||||
*
|
||||
* // using a basic configuration object
|
||||
* .hoverIntent( config )
|
||||
*
|
||||
* @param handlerIn function OR configuration object
|
||||
* @param handlerOut function OR selector for delegation OR undefined
|
||||
* @param selector selector OR undefined
|
||||
* @author Brian Cherne <brian(at)cherne(dot)net>
|
||||
**/
|
||||
(function($) {
|
||||
$.fn.hoverIntent = function(handlerIn,handlerOut,selector) {
|
||||
|
||||
// instantiate variables
|
||||
// cX, cY = current X and Y position of mouse, updated by mousemove event
|
||||
// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
|
||||
var cX, cY, pX, pY;
|
||||
// default configuration values
|
||||
var cfg = {
|
||||
interval: 100,
|
||||
sensitivity: 7,
|
||||
timeout: 0
|
||||
};
|
||||
|
||||
// A private function for getting mouse position
|
||||
var track = function(ev) {
|
||||
cX = ev.pageX;
|
||||
cY = ev.pageY;
|
||||
};
|
||||
if ( typeof handlerIn === "object" ) {
|
||||
cfg = $.extend(cfg, handlerIn );
|
||||
} else if ($.isFunction(handlerOut)) {
|
||||
cfg = $.extend(cfg, { over: handlerIn, out: handlerOut, selector: selector } );
|
||||
} else {
|
||||
cfg = $.extend(cfg, { over: handlerIn, out: handlerIn, selector: handlerOut } );
|
||||
}
|
||||
|
||||
// A private function for comparing current and previous mouse position
|
||||
var compare = function(ev,ob) {
|
||||
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
|
||||
// compare mouse positions to see if they've crossed the threshold
|
||||
if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
|
||||
$(ob).unbind("mousemove",track);
|
||||
// set hoverIntent state to true (so mouseOut can be called)
|
||||
ob.hoverIntent_s = 1;
|
||||
return cfg.over.apply(ob,[ev]);
|
||||
} else {
|
||||
// set previous coordinates for next time
|
||||
pX = cX; pY = cY;
|
||||
// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
|
||||
ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
|
||||
}
|
||||
};
|
||||
// instantiate variables
|
||||
// cX, cY = current X and Y position of mouse, updated by mousemove event
|
||||
// pX, pY = previous X and Y position of mouse, set by mouseover and polling interval
|
||||
var cX, cY, pX, pY;
|
||||
|
||||
// A private function for delaying the mouseOut function
|
||||
var delay = function(ev,ob) {
|
||||
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
|
||||
ob.hoverIntent_s = 0;
|
||||
return cfg.out.apply(ob,[ev]);
|
||||
};
|
||||
// A private function for getting mouse position
|
||||
var track = function(ev) {
|
||||
cX = ev.pageX;
|
||||
cY = ev.pageY;
|
||||
};
|
||||
|
||||
// A private function for handling mouse 'hovering'
|
||||
var handleHover = function(e) {
|
||||
// next three lines copied from jQuery.hover, ignore children onMouseOver/onMouseOut
|
||||
var p = (e.type == "mouseover" ? e.fromElement : e.toElement) || e.relatedTarget;
|
||||
while ( p && p != this ) { try { p = p.parentNode; } catch(e) { p = this; } }
|
||||
if ( p == this ) { return false; }
|
||||
// A private function for comparing current and previous mouse position
|
||||
var compare = function(ev,ob) {
|
||||
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
|
||||
// compare mouse positions to see if they've crossed the threshold
|
||||
if ( ( Math.abs(pX-cX) + Math.abs(pY-cY) ) < cfg.sensitivity ) {
|
||||
$(ob).off("mousemove.hoverIntent",track);
|
||||
// set hoverIntent state to true (so mouseOut can be called)
|
||||
ob.hoverIntent_s = 1;
|
||||
return cfg.over.apply(ob,[ev]);
|
||||
} else {
|
||||
// set previous coordinates for next time
|
||||
pX = cX; pY = cY;
|
||||
// use self-calling timeout, guarantees intervals are spaced out properly (avoids JavaScript timer bugs)
|
||||
ob.hoverIntent_t = setTimeout( function(){compare(ev, ob);} , cfg.interval );
|
||||
}
|
||||
};
|
||||
|
||||
// copy objects to be passed into t (required for event object to be passed in IE)
|
||||
var ev = jQuery.extend({},e);
|
||||
var ob = this;
|
||||
// A private function for delaying the mouseOut function
|
||||
var delay = function(ev,ob) {
|
||||
ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t);
|
||||
ob.hoverIntent_s = 0;
|
||||
return cfg.out.apply(ob,[ev]);
|
||||
};
|
||||
|
||||
// cancel hoverIntent timer if it exists
|
||||
if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
|
||||
// A private function for handling mouse 'hovering'
|
||||
var handleHover = function(e) {
|
||||
// copy objects to be passed into t (required for event object to be passed in IE)
|
||||
var ev = jQuery.extend({},e);
|
||||
var ob = this;
|
||||
|
||||
// else e.type == "onmouseover"
|
||||
if (e.type == "mouseover") {
|
||||
// set "previous" X and Y position based on initial entry point
|
||||
pX = ev.pageX; pY = ev.pageY;
|
||||
// update "current" X and Y position based on mousemove
|
||||
$(ob).bind("mousemove",track);
|
||||
// start polling interval (self-calling timeout) to compare mouse coordinates over time
|
||||
if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
|
||||
// cancel hoverIntent timer if it exists
|
||||
if (ob.hoverIntent_t) { ob.hoverIntent_t = clearTimeout(ob.hoverIntent_t); }
|
||||
|
||||
// else e.type == "onmouseout"
|
||||
} else {
|
||||
// unbind expensive mousemove event
|
||||
$(ob).unbind("mousemove",track);
|
||||
// if hoverIntent state is true, then call the mouseOut function after the specified delay
|
||||
if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
|
||||
}
|
||||
};
|
||||
// if e.type == "mouseenter"
|
||||
if (e.type == "mouseenter") {
|
||||
// set "previous" X and Y position based on initial entry point
|
||||
pX = ev.pageX; pY = ev.pageY;
|
||||
// update "current" X and Y position based on mousemove
|
||||
$(ob).on("mousemove.hoverIntent",track);
|
||||
// start polling interval (self-calling timeout) to compare mouse coordinates over time
|
||||
if (ob.hoverIntent_s != 1) { ob.hoverIntent_t = setTimeout( function(){compare(ev,ob);} , cfg.interval );}
|
||||
|
||||
// bind the function to the two event listeners
|
||||
return this.mouseover(handleHover).mouseout(handleHover);
|
||||
};
|
||||
|
||||
// else e.type == "mouseleave"
|
||||
} else {
|
||||
// unbind expensive mousemove event
|
||||
$(ob).off("mousemove.hoverIntent",track);
|
||||
// if hoverIntent state is true, then call the mouseOut function after the specified delay
|
||||
if (ob.hoverIntent_s == 1) { ob.hoverIntent_t = setTimeout( function(){delay(ev,ob);} , cfg.timeout );}
|
||||
}
|
||||
};
|
||||
|
||||
// listen for mouseenter and mouseleave
|
||||
return this.on({'mouseenter.hoverIntent':handleHover,'mouseleave.hoverIntent':handleHover}, cfg.selector);
|
||||
};
|
||||
})(jQuery);
|
||||
@@ -1,124 +1,257 @@
|
||||
|
||||
/*
|
||||
* Superfish v1.4.8 - jQuery menu widget
|
||||
* Copyright (c) 2008 Joel Birch
|
||||
* jQuery Superfish Menu Plugin - v1.7.4
|
||||
* Copyright (c) 2013 Joel Birch
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
* CHANGELOG: http://users.tpg.com.au/j_birch/plugins/superfish/changelog.txt
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
;(function($){
|
||||
$.fn.superfish = function(op){
|
||||
;(function ($) {
|
||||
"use strict";
|
||||
|
||||
var sf = $.fn.superfish,
|
||||
c = sf.c,
|
||||
$arrow = $(['<span class="',c.arrowClass,'"> »</span>'].join('')),
|
||||
over = function(){
|
||||
var $$ = $(this), menu = getMenu($$);
|
||||
clearTimeout(menu.sfTimer);
|
||||
$$.showSuperfishUl().siblings().hideSuperfishUl();
|
||||
var methods = (function () {
|
||||
// private properties and methods go here
|
||||
var c = {
|
||||
bcClass: 'sf-breadcrumb',
|
||||
menuClass: 'sf-js-enabled',
|
||||
anchorClass: 'sf-with-ul',
|
||||
menuArrowClass: 'sf-arrows'
|
||||
},
|
||||
out = function(){
|
||||
var $$ = $(this), menu = getMenu($$), o = sf.op;
|
||||
clearTimeout(menu.sfTimer);
|
||||
menu.sfTimer=setTimeout(function(){
|
||||
o.retainPath=($.inArray($$[0],o.$path)>-1);
|
||||
$$.hideSuperfishUl();
|
||||
if (o.$path.length && $$.parents(['li.',o.hoverClass].join('')).length<1){over.call(o.$path);}
|
||||
},o.delay);
|
||||
ios = (function () {
|
||||
var ios = /iPhone|iPad|iPod/i.test(navigator.userAgent);
|
||||
if (ios) {
|
||||
// iOS clicks only bubble as far as body children
|
||||
$(window).load(function () {
|
||||
$('body').children().on('click', $.noop);
|
||||
});
|
||||
}
|
||||
return ios;
|
||||
})(),
|
||||
wp7 = (function () {
|
||||
var style = document.documentElement.style;
|
||||
return ('behavior' in style && 'fill' in style && /iemobile/i.test(navigator.userAgent));
|
||||
})(),
|
||||
toggleMenuClasses = function ($menu, o) {
|
||||
var classes = c.menuClass;
|
||||
if (o.cssArrows) {
|
||||
classes += ' ' + c.menuArrowClass;
|
||||
}
|
||||
$menu.toggleClass(classes);
|
||||
},
|
||||
getMenu = function($menu){
|
||||
var menu = $menu.parents(['ul.',c.menuClass,':first'].join(''))[0];
|
||||
sf.op = sf.o[menu.serial];
|
||||
return menu;
|
||||
setPathToCurrent = function ($menu, o) {
|
||||
return $menu.find('li.' + o.pathClass).slice(0, o.pathLevels)
|
||||
.addClass(o.hoverClass + ' ' + c.bcClass)
|
||||
.filter(function () {
|
||||
return ($(this).children(o.popUpSelector).hide().show().length);
|
||||
}).removeClass(o.pathClass);
|
||||
},
|
||||
addArrow = function($a){ $a.addClass(c.anchorClass).append($arrow.clone()); };
|
||||
|
||||
return this.each(function() {
|
||||
var s = this.serial = sf.o.length;
|
||||
var o = $.extend({},sf.defaults,op);
|
||||
o.$path = $('li.'+o.pathClass,this).slice(0,o.pathLevels).each(function(){
|
||||
$(this).addClass([o.hoverClass,c.bcClass].join(' '))
|
||||
.filter('li:has(ul)').removeClass(o.pathClass);
|
||||
});
|
||||
sf.o[s] = sf.op = o;
|
||||
|
||||
$('li:has(ul)',this)[($.fn.hoverIntent && !o.disableHI) ? 'hoverIntent' : 'hover'](over,out).each(function() {
|
||||
if (o.autoArrows) addArrow( $('>a:first-child',this) );
|
||||
})
|
||||
.not('.'+c.bcClass)
|
||||
.hideSuperfishUl();
|
||||
|
||||
var $a = $('a',this);
|
||||
$a.each(function(i){
|
||||
var $li = $a.eq(i).parents('li');
|
||||
$a.eq(i).focus(function(){over.call($li);}).blur(function(){out.call($li);});
|
||||
});
|
||||
o.onInit.call(this);
|
||||
|
||||
}).each(function() {
|
||||
menuClasses = [c.menuClass];
|
||||
if (sf.op.dropShadows && !($.browser.msie && $.browser.version < 7)) menuClasses.push(c.shadowClass);
|
||||
$(this).addClass(menuClasses.join(' '));
|
||||
});
|
||||
};
|
||||
toggleAnchorClass = function ($li) {
|
||||
$li.children('a').toggleClass(c.anchorClass);
|
||||
},
|
||||
toggleTouchAction = function ($menu) {
|
||||
var touchAction = $menu.css('ms-touch-action');
|
||||
touchAction = (touchAction === 'pan-y') ? 'auto' : 'pan-y';
|
||||
$menu.css('ms-touch-action', touchAction);
|
||||
},
|
||||
applyHandlers = function ($menu, o) {
|
||||
var targets = 'li:has(' + o.popUpSelector + ')';
|
||||
if ($.fn.hoverIntent && !o.disableHI) {
|
||||
$menu.hoverIntent(over, out, targets);
|
||||
}
|
||||
else {
|
||||
$menu
|
||||
.on('mouseenter.superfish', targets, over)
|
||||
.on('mouseleave.superfish', targets, out);
|
||||
}
|
||||
var touchevent = 'MSPointerDown.superfish';
|
||||
if (!ios) {
|
||||
touchevent += ' touchend.superfish';
|
||||
}
|
||||
if (wp7) {
|
||||
touchevent += ' mousedown.superfish';
|
||||
}
|
||||
$menu
|
||||
.on('focusin.superfish', 'li', over)
|
||||
.on('focusout.superfish', 'li', out)
|
||||
.on(touchevent, 'a', o, touchHandler);
|
||||
},
|
||||
touchHandler = function (e) {
|
||||
var $this = $(this),
|
||||
$ul = $this.siblings(e.data.popUpSelector);
|
||||
|
||||
var sf = $.fn.superfish;
|
||||
sf.o = [];
|
||||
sf.op = {};
|
||||
sf.IE7fix = function(){
|
||||
var o = sf.op;
|
||||
if ($.browser.msie && $.browser.version > 6 && o.dropShadows && o.animation.opacity!=undefined)
|
||||
this.toggleClass(sf.c.shadowClass+'-off');
|
||||
if ($ul.length > 0 && $ul.is(':hidden')) {
|
||||
$this.one('click.superfish', false);
|
||||
if (e.type === 'MSPointerDown') {
|
||||
$this.trigger('focus');
|
||||
} else {
|
||||
$.proxy(over, $this.parent('li'))();
|
||||
}
|
||||
}
|
||||
},
|
||||
over = function () {
|
||||
var $this = $(this),
|
||||
o = getOptions($this);
|
||||
clearTimeout(o.sfTimer);
|
||||
$this.siblings().superfish('hide').end().superfish('show');
|
||||
},
|
||||
out = function () {
|
||||
var $this = $(this),
|
||||
o = getOptions($this);
|
||||
if (ios) {
|
||||
$.proxy(close, $this, o)();
|
||||
}
|
||||
else {
|
||||
clearTimeout(o.sfTimer);
|
||||
o.sfTimer = setTimeout($.proxy(close, $this, o), o.delay);
|
||||
}
|
||||
},
|
||||
close = function (o) {
|
||||
o.retainPath = ($.inArray(this[0], o.$path) > -1);
|
||||
this.superfish('hide');
|
||||
|
||||
if (!this.parents('.' + o.hoverClass).length) {
|
||||
o.onIdle.call(getMenu(this));
|
||||
if (o.$path.length) {
|
||||
$.proxy(over, o.$path)();
|
||||
}
|
||||
}
|
||||
},
|
||||
getMenu = function ($el) {
|
||||
return $el.closest('.' + c.menuClass);
|
||||
},
|
||||
getOptions = function ($el) {
|
||||
return getMenu($el).data('sf-options');
|
||||
};
|
||||
|
||||
return {
|
||||
// public methods
|
||||
hide: function (instant) {
|
||||
if (this.length) {
|
||||
var $this = this,
|
||||
o = getOptions($this);
|
||||
if (!o) {
|
||||
return this;
|
||||
}
|
||||
var not = (o.retainPath === true) ? o.$path : '',
|
||||
$ul = $this.find('li.' + o.hoverClass).add(this).not(not).removeClass(o.hoverClass).children(o.popUpSelector),
|
||||
speed = o.speedOut;
|
||||
|
||||
if (instant) {
|
||||
$ul.show();
|
||||
speed = 0;
|
||||
}
|
||||
o.retainPath = false;
|
||||
o.onBeforeHide.call($ul);
|
||||
$ul.stop(true, true).animate(o.animationOut, speed, function () {
|
||||
var $this = $(this);
|
||||
o.onHide.call($this);
|
||||
});
|
||||
}
|
||||
return this;
|
||||
},
|
||||
show: function () {
|
||||
var o = getOptions(this);
|
||||
if (!o) {
|
||||
return this;
|
||||
}
|
||||
var $this = this.addClass(o.hoverClass),
|
||||
$ul = $this.children(o.popUpSelector);
|
||||
|
||||
o.onBeforeShow.call($ul);
|
||||
$ul.stop(true, true).animate(o.animation, o.speed, function () {
|
||||
o.onShow.call($ul);
|
||||
});
|
||||
return this;
|
||||
},
|
||||
destroy: function () {
|
||||
return this.each(function () {
|
||||
var $this = $(this),
|
||||
o = $this.data('sf-options'),
|
||||
$hasPopUp;
|
||||
if (!o) {
|
||||
return false;
|
||||
}
|
||||
$hasPopUp = $this.find(o.popUpSelector).parent('li');
|
||||
clearTimeout(o.sfTimer);
|
||||
toggleMenuClasses($this, o);
|
||||
toggleAnchorClass($hasPopUp);
|
||||
toggleTouchAction($this);
|
||||
// remove event handlers
|
||||
$this.off('.superfish').off('.hoverIntent');
|
||||
// clear animation's inline display style
|
||||
$hasPopUp.children(o.popUpSelector).attr('style', function (i, style) {
|
||||
return style.replace(/display[^;]+;?/g, '');
|
||||
});
|
||||
// reset 'current' path classes
|
||||
o.$path.removeClass(o.hoverClass + ' ' + c.bcClass).addClass(o.pathClass);
|
||||
$this.find('.' + o.hoverClass).removeClass(o.hoverClass);
|
||||
o.onDestroy.call($this);
|
||||
$this.removeData('sf-options');
|
||||
});
|
||||
},
|
||||
init: function (op) {
|
||||
return this.each(function () {
|
||||
var $this = $(this);
|
||||
if ($this.data('sf-options')) {
|
||||
return false;
|
||||
}
|
||||
var o = $.extend({}, $.fn.superfish.defaults, op),
|
||||
$hasPopUp = $this.find(o.popUpSelector).parent('li');
|
||||
o.$path = setPathToCurrent($this, o);
|
||||
|
||||
$this.data('sf-options', o);
|
||||
|
||||
toggleMenuClasses($this, o);
|
||||
toggleAnchorClass($hasPopUp);
|
||||
toggleTouchAction($this);
|
||||
applyHandlers($this, o);
|
||||
|
||||
$hasPopUp.not('.' + c.bcClass).superfish('hide', true);
|
||||
|
||||
o.onInit.call(this);
|
||||
});
|
||||
}
|
||||
};
|
||||
sf.c = {
|
||||
bcClass : 'sf-breadcrumb',
|
||||
menuClass : 'sf-js-enabled',
|
||||
anchorClass : 'sf-with-ul',
|
||||
arrowClass : 'sf-sub-indicator',
|
||||
shadowClass : 'sf-shadow'
|
||||
};
|
||||
sf.defaults = {
|
||||
hoverClass : 'sfHover',
|
||||
pathClass : 'overideThisToUse',
|
||||
pathLevels : 1,
|
||||
delay : 800,
|
||||
animation : {opacity:'show'},
|
||||
speed : 'fast',
|
||||
autoArrows : false,
|
||||
dropShadows : false,
|
||||
disableHI : false, // true disables hoverIntent detection
|
||||
onInit : function(){}, // callback functions
|
||||
onBeforeShow: function(){},
|
||||
onShow : function(){},
|
||||
onHide : function(){}
|
||||
};
|
||||
$.fn.extend({
|
||||
hideSuperfishUl : function(){
|
||||
var o = sf.op,
|
||||
not = (o.retainPath===true) ? o.$path : '';
|
||||
o.retainPath = false;
|
||||
var $ul = $(['li.',o.hoverClass].join(''),this).add(this).not(not).removeClass(o.hoverClass)
|
||||
.find('>ul').hide().css('visibility','hidden');
|
||||
o.onHide.call($ul);
|
||||
return this;
|
||||
},
|
||||
showSuperfishUl : function(){
|
||||
var o = sf.op,
|
||||
sh = sf.c.shadowClass+'-off',
|
||||
$ul = this.addClass(o.hoverClass)
|
||||
.find('>ul:hidden').css('visibility','visible');
|
||||
sf.IE7fix.call($ul);
|
||||
o.onBeforeShow.call($ul);
|
||||
$ul.animate(o.animation,o.speed,function(){ sf.IE7fix.call($ul); o.onShow.call($ul); });
|
||||
return this;
|
||||
})();
|
||||
|
||||
$.fn.superfish = function (method, args) {
|
||||
if (methods[method]) {
|
||||
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
||||
}
|
||||
else if (typeof method === 'object' || ! method) {
|
||||
return methods.init.apply(this, arguments);
|
||||
}
|
||||
else {
|
||||
return $.error('Method ' + method + ' does not exist on jQuery.fn.superfish');
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.superfish.defaults = {
|
||||
popUpSelector: 'ul,.sf-mega', // within menu context
|
||||
hoverClass: 'sfHover',
|
||||
pathClass: 'overrideThisToUse',
|
||||
pathLevels: 1,
|
||||
delay: 800,
|
||||
animation: {opacity: 'show'},
|
||||
animationOut: {opacity: 'hide'},
|
||||
speed: 'normal',
|
||||
speedOut: 'fast',
|
||||
cssArrows: true,
|
||||
disableHI: false,
|
||||
onInit: $.noop,
|
||||
onBeforeShow: $.noop,
|
||||
onShow: $.noop,
|
||||
onBeforeHide: $.noop,
|
||||
onHide: $.noop,
|
||||
onIdle: $.noop,
|
||||
onDestroy: $.noop
|
||||
};
|
||||
|
||||
// soon to be deprecated
|
||||
$.fn.extend({
|
||||
hideSuperfishUl: methods.hide,
|
||||
showSuperfishUl: methods.show
|
||||
});
|
||||
|
||||
})(jQuery);
|
||||
jQuery(function(){
|
||||
jQuery('ul.sf-menu').superfish();
|
||||
});
|
||||
})(jQuery);
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
<!-- Menu -->
|
||||
<div class="sf-contener clearfix">
|
||||
<ul class="sf-menu clearfix">
|
||||
<div class="cat-title">{l s="Categories" mod="blocktopmenu"}</div>
|
||||
<ul class="sf-menu clearfix menu-content">
|
||||
{$MENU}
|
||||
{if $MENU_SEARCH}
|
||||
<li class="sf-search noBack" style="float:right">
|
||||
@@ -20,4 +21,58 @@
|
||||
</div>
|
||||
|
||||
<!--/ Menu -->
|
||||
{/if}
|
||||
{literal}
|
||||
<script type="text/javascript">
|
||||
$(document).ready(function() {
|
||||
categoryMenu = $('ul.sf-menu'); //var rich menu
|
||||
categoryMenu.superfish(); //menu initialization
|
||||
$('.sf-menu > li > ul').addClass('container'); //add class for width define
|
||||
i = 0;
|
||||
$('.sf-menu > li > ul > li:not(#category-thumbnail)').each(function() { //add classes for clearing
|
||||
i++;
|
||||
if(i%2==1)
|
||||
$(this).addClass('first-in-line-xs');
|
||||
else if (i%5==1)
|
||||
$(this).addClass('first-in-line-lg');
|
||||
});
|
||||
});
|
||||
|
||||
// accordion for definition smaller that 767px
|
||||
|
||||
responsiveflagMenu = false;
|
||||
function menuChange(status){
|
||||
if(status == 'enable'){
|
||||
$('.sf-menu > li > ul').removeAttr('style');
|
||||
$('.sf-menu').removeAttr('style');
|
||||
$('.sf-contener .cat-title').on('click', function(){
|
||||
$(this).toggleClass('active').parent().find('ul.menu-content').stop().slideToggle('medium');
|
||||
}),
|
||||
$('.sf-menu > li:has(ul)').each(function() {
|
||||
$(this).prepend('<span></span>'),
|
||||
$(this).find('span').on('click touchend', function(){
|
||||
categoryMenu.superfish('hide');
|
||||
});
|
||||
});
|
||||
}else{
|
||||
$('.sf-contener .cat-title').off();
|
||||
$('.sf-menu').removeAttr('style');
|
||||
$('.sf-menu > li > ul').removeAttr('style');
|
||||
$('.sf-contener .cat-title').removeClass('active');
|
||||
}
|
||||
}
|
||||
|
||||
function responsiveMenu(){
|
||||
if ($(document).width() <= 767 && responsiveflagMenu == false){
|
||||
menuChange('enable'),
|
||||
responsiveflagMenu = true
|
||||
}
|
||||
else if ($(document).width() >= 768){
|
||||
menuChange('disable'),
|
||||
responsiveflagMenu = false
|
||||
}
|
||||
}
|
||||
$(document).ready(responsiveMenu);
|
||||
$(window).resize(responsiveMenu);
|
||||
</script>
|
||||
{/literal}
|
||||
{/if}
|
||||
|
||||
@@ -2,6 +2,15 @@
|
||||
/*** ESSENTIAL STYLES ***/
|
||||
.sf-contener {
|
||||
clear:both;
|
||||
float:left;
|
||||
width:100%;
|
||||
margin: 50px 0 0;
|
||||
@media (min-width: $screen-xs) and (max-width: $screen-xs-max) { // min 480px max 767px
|
||||
margin-top:80px;
|
||||
}
|
||||
@media (max-width: $screen-xs - 1) { // max 479px
|
||||
margin-top:70px;
|
||||
}
|
||||
}
|
||||
.sf-right {
|
||||
}
|
||||
@@ -11,23 +20,22 @@
|
||||
list-style: none;
|
||||
}
|
||||
.sf-menu {
|
||||
margin: 50px 0 0;
|
||||
position: relative;
|
||||
padding: 0;
|
||||
width: 100%;
|
||||
border-bottom: 3px solid #e9e9e9;
|
||||
background: #f6f6f6;
|
||||
@media (min-width: $screen-xs) and (max-width: $screen-xs-max) { // min 480px max 767px
|
||||
margin-top:80px;
|
||||
}
|
||||
@media (max-width: $screen-xs - 1) { // max 479px
|
||||
margin-top:70px;
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
display:none;
|
||||
}
|
||||
}
|
||||
.sf-menu ul {
|
||||
position: absolute;
|
||||
top: -999em;
|
||||
width: 10em; /* left offset of submenus need to match (see below) */
|
||||
background: $light-background;
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
position:relative;
|
||||
}
|
||||
}
|
||||
.sf-menu ul li {
|
||||
width: 100%;
|
||||
@@ -35,14 +43,31 @@
|
||||
.sf-menu li:hover {
|
||||
visibility: inherit; /* fixes IE7 'sticky bug' */
|
||||
}
|
||||
.sf-menu li {
|
||||
position: relative;
|
||||
}
|
||||
.sf-menu > li {
|
||||
float: left;
|
||||
border-right: 1px solid $base-border-color;
|
||||
margin-bottom: -3px;
|
||||
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
float:none;
|
||||
position:relative;
|
||||
border-right:none;
|
||||
|
||||
span {
|
||||
position:absolute;
|
||||
right:6px;
|
||||
top:20px;
|
||||
display:none;
|
||||
width:30px;
|
||||
height:30px;
|
||||
z-index:2;
|
||||
|
||||
&:after {
|
||||
font-family:$font-icon;
|
||||
content:"";
|
||||
font-size:26px;
|
||||
}
|
||||
}
|
||||
}
|
||||
> a {
|
||||
font: 600 18px/22px $font-custom;
|
||||
text-transform: uppercase;
|
||||
@@ -50,6 +75,19 @@
|
||||
display: block;
|
||||
padding: 17px 20px;
|
||||
border-bottom: 3px solid #e9e9e9;
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
&.sf-with-ul {
|
||||
&:after {
|
||||
position:absolute;
|
||||
right:15px;
|
||||
top:18px;
|
||||
font-family:$font-icon;
|
||||
content:"";
|
||||
font-size:26px;
|
||||
z-index:1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&.sfHover > a, > a:hover, &.sfHoverForce > a {
|
||||
@@ -58,8 +96,8 @@
|
||||
color: $light-text-color;
|
||||
}
|
||||
}
|
||||
.sf-menu li li a {
|
||||
display: block;
|
||||
.sf-menu li li li a {
|
||||
display: inline-block;
|
||||
position: relative;
|
||||
color: #777777;
|
||||
font-size: 13px;
|
||||
@@ -83,9 +121,24 @@
|
||||
left: 0;
|
||||
top: 59px; /* match top ul list item height */
|
||||
z-index: 99;
|
||||
width: 220px;
|
||||
padding: 25px 30px;
|
||||
padding: 12px 0px 18px 0px;
|
||||
@include box-shadow(rgba(black, 0.20) 0px 5px 13px);
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
top:0;
|
||||
}
|
||||
}
|
||||
.sf-menu li li ul {
|
||||
position:static;
|
||||
display:block !important;
|
||||
opacity:1 !important;
|
||||
background:none;
|
||||
@include box-shadow(rgba(black, 0) 0px 0px 0px);
|
||||
}
|
||||
.sf-menu li li li ul {
|
||||
padding:0 0 0 20px;
|
||||
}
|
||||
.sf-menu li li li ul {
|
||||
width: 220px;
|
||||
}
|
||||
ul.sf-menu li:hover li ul,
|
||||
ul.sf-menu li.sfHover li ul {
|
||||
@@ -105,3 +158,100 @@ ul.sf-menu li li li.sfHover ul {
|
||||
left: 200px; /* match ul width */
|
||||
top: 0;
|
||||
}
|
||||
.sf-menu > li > ul {
|
||||
padding:26px 30px 31px;
|
||||
width:100%;
|
||||
|
||||
> li {
|
||||
> a {
|
||||
text-transform:uppercase;
|
||||
font:600 16px/20px $font-custom;
|
||||
color:$base-text-color;
|
||||
|
||||
&:hover {
|
||||
color:$link-hover-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.sf-menu > li > ul > li:not(#category-thumbnail) {
|
||||
float:left;
|
||||
width:20%;
|
||||
padding-right:15px;
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
width:50%;
|
||||
}
|
||||
@media (max-width: $screen-xs - 1) { // max 479px
|
||||
width:100%;
|
||||
}
|
||||
@media (min-width: $screen-sm) { // min 768px
|
||||
&.first-in-line-lg {clear:left;}
|
||||
}
|
||||
@media (min-width: $screen-xs) and (max-width: $screen-xs-max) { // min 480px max 767px
|
||||
&.first-in-line-xs {clear:left;}
|
||||
}
|
||||
}
|
||||
.sf-menu > li > ul > li#category-thumbnail {
|
||||
width:100%;
|
||||
clear:both;
|
||||
overflow:hidden;
|
||||
|
||||
> div {
|
||||
float:left;
|
||||
padding-left:10px;
|
||||
width:33.333%;
|
||||
@media (max-width: $screen-xs - 1) { // max 479px
|
||||
width:100%;
|
||||
padding-left:0;
|
||||
padding-top:10px;
|
||||
text-align:center;
|
||||
}
|
||||
|
||||
&:first-child {padding-left:0;}
|
||||
img {
|
||||
max-width:100%;
|
||||
width:100%;
|
||||
display:block;
|
||||
}
|
||||
}
|
||||
}
|
||||
.cat-title {
|
||||
display:none;
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
display: block;
|
||||
font: 600 18px/22px $font-custom;
|
||||
text-transform: uppercase;
|
||||
color: #484848;
|
||||
display: block;
|
||||
padding: 17px 20px;
|
||||
border-bottom: 3px solid #e9e9e9;
|
||||
background: #f6f6f6;
|
||||
position:relative;
|
||||
|
||||
&:hover {
|
||||
background: $dark-background;
|
||||
border-bottom-color: #666666;
|
||||
color: $light-text-color;
|
||||
}
|
||||
&:after {
|
||||
display:block;
|
||||
font-family:$font-icon;
|
||||
content:"";
|
||||
position:absolute;
|
||||
right:15px;
|
||||
top:18px;
|
||||
font-size:26px;
|
||||
}
|
||||
&.active:after{
|
||||
content:"";
|
||||
}
|
||||
}
|
||||
}
|
||||
@media (max-width: $screen-xs-max) { // max 767px
|
||||
.sf-menu > li.sfHover > a.sf-with-ul:after, .sf-menu > li.sfHoverForce > a.sf-with-ul:after {
|
||||
display:none;
|
||||
}
|
||||
.sf-menu > li.sfHover > span, .sf-menu > li.sfHoverForce > span {
|
||||
display:block;
|
||||
}
|
||||
}
|
||||