Files
bio-concept-labo/web/modules/checkage/checkage.php
2019-11-20 07:44:43 +01:00

477 lines
19 KiB
PHP

<?php
/**
* 2017 Agence Bondaty and Co
*
* @author Agence Bondaty and Co <support@bondaty-and-co.fr>
* @copyright 2017 Agence Bondaty and Co
* @license single
* Agence Bondaty and Co
*/
if (!defined('_PS_VERSION_')) {
exit;
}
class Checkage extends Module
{
protected $html = '';
public function __construct()
{
$this->name = 'checkage';
$this->tab = 'front_office_features';
$this->version = '1.2.0';
$this->author = 'Bondaty and Co';
$this->module_key = '09df8563ef7512d79032862d2c9bc346';
$this->need_instance = 0;
parent::__construct();
$this->displayName = $this->l('Checking age for access to the shop');
$this->description = $this->l('Checking age for full shop access or certain categories only.');
$this->ps_versions_compliancy = array('min' => '1.7.0.0', 'max' => _PS_VERSION_);
include_once dirname(__FILE__).'/classes/CheckageClass.php';
$this->bootstrap = true;
}
public function check()
{
$checkOK = $this->context->cookie->checkOK;
if ($checkOK) {
return '1';
} else {
return '0';
}
}
public function install()
{
return parent::install() &&
$this->registerHook('displayHeader') &&
$this->registerHook('displayTop') &&
$this->installDB();
}
public function installDB()
{
$res = Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'checkage` (
`id_checkage` int(10) unsigned NOT NULL auto_increment,
`id_shop` int(10) unsigned NOT NULL,
`id_restriction` text NOT NULL,
`age_restriction` varchar(3) NOT NULL,
`format_date` int(10) NOT NULL,
`show_logo` int(10) NOT NULL,
`all_restriction` int(10) NOT NULL,
`best_sales` int(10) NOT NULL,
`new_products` int(10) NOT NULL,
`discount` int(10) NOT NULL,
`manufacturer` int(10) NOT NULL,
`supplier` int(10) NOT NULL,
`cms` int(10) NOT NULL,
PRIMARY KEY (`id_checkage`))
ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8');
if ($res) {
$res &= Db::getInstance()->execute('
CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'checkage_lang` (
`id_checkage` int(10) unsigned NOT NULL,
`id_lang` int(10) unsigned NOT NULL,
`checkage_message` text NOT NULL,
PRIMARY KEY (`id_checkage`, `id_lang`))
ENGINE='._MYSQL_ENGINE_.' DEFAULT CHARSET=utf8');
}
if ($res) {
foreach (Shop::getShops(false) as $shop) {
$res &= $this->createExampleCheckage($shop['id_shop']);
}
}
if (!$res) {
$res &= $this->uninstall();
}
return $res;
}
private function createExampleCheckage($id_shop)
{
$checkage = new CheckageClass();
$checkage->id_shop = (int)$id_shop;
$checkage->id_restriction = '';
$checkage->age_restriction = '18';
$checkage->format_date = '1';
$checkage->show_logo = '1';
$checkage->all_restriction = '1';
$checkage->best_sales = '0';
$checkage->new_products = '0';
$checkage->discount = '0';
$checkage->manufacturer = '0';
$checkage->supplier = '0';
$checkage->cms = '0';
foreach (Language::getLanguages(false) as $lang) {
$checkage->checkage_message[$lang['id_lang']] = '<p>Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore...</p>';
}
return $checkage->add();
}
public function uninstall()
{
$res = Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'checkage`');
$res &= Db::getInstance()->execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'checkage_lang`');
if (!$res || !parent::uninstall()) {
return false;
}
return true;
}
public function initForm()
{
$languages = Language::getLanguages(false);
foreach ($languages as $k => $language) {
$languages[$k]['is_default'] = (int)($language['id_lang'] == Configuration::get('PS_LANG_DEFAULT'));
}
$id_shop = (int)$this->context->shop->id;
$sql = 'SELECT `id_restriction` FROM `'._DB_PREFIX_.'checkage` WHERE `id_shop` ="'.(int)$id_shop.'"';
$id_restriction = Db::getInstance()->getValue($sql);
$rootCategory_id = (Shop::getContext() == Shop::CONTEXT_SHOP ? Category::getRootCategory()->id_category : 0);
$id_rcategories = new HelperTreeCategories('id_restriction');
$id_rcategories->setRootCategory($rootCategory_id)->setUseCheckBox(true)->setInputName('rcategories')->setSelectedCategories(explode('-', $id_restriction));
$helper = new HelperForm();
$helper->module = $this;
$helper->name_controller = 'checkage';
$helper->identifier = $this->identifier;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->languages = $languages;
$helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name;
$helper->default_form_language = (int)Configuration::get('PS_LANG_DEFAULT');
$helper->allow_employee_form_lang = true;
$helper->toolbar_scroll = true;
$helper->toolbar_btn = $this->initToolbar();
$helper->title = $this->displayName;
$helper->submit_action = 'submitUpdateCheckage';
$this->fields_form[0]['form'] = array(
'tinymce' => true,
'legend' => array(
'title' => $this->l('Settings'),
'icon' => 'icon-cogs'
),
'submit'=> array(
'name' => 'submitUpdateCheckage',
'title' => $this->l('Save'),
),
'input' => array(
array(
'type' => 'text',
'label' => $this->l('Age'),
'name' => 'age_restriction',
'class' => 'fixed-width-sm',
'desc' => $this->l('Minimum age'),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Show the logo of the shop'),
'name' => 'show_logo',
'desc' => $this->l('Yes = Show logo / No = Disable logo'),
'values' => array(
array(
'id' => 'show_logo_on',
'value' => 1,
),
array(
'id' => 'show_logo_off',
'value' => 0,
),
),
),
array(
'type' => 'textarea',
'label' => $this->l('Additional message'),
'name' => 'checkage_message',
'lang' => true,
'autoload_rte' => true,
'desc' => $this->l('Appears on top of the form under the logo of the shop'),
),
array(
'type' => 'radio',
'is_bool' => true,
'label' => $this->l('Date format'),
'name' => 'format_date',
'desc' => $this->l('Choice the date format to display'),
'values' => array(
array(
'id' => 'format_date',
'label' => $this->l('DD-MM-YYYY'),
'value' => 1,
),
array(
'id' => 'format_date',
'label' => $this->l('MM-DD-YYYY'),
'value' => 2,
),
array(
'id' => 'format_date',
'label' => $this->l('YYYY-MM-DD'),
'value' => 3,
),
),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the whole shop'),
'name' => 'all_restriction',
'desc' => $this->l('Yes = Checking the age on the whole shop (You do not need to select a category or page) / No = Select a category or page for checking'),
'values' => array(
array(
'id' => 'all_restriction_on',
'value' => 1,
),
array(
'id' => 'all_restriction_off',
'value' => 0,
),
),
),
array(
'type' => 'categories_select',
'label' => $this->l('Select a category'),
'name' => 'id_restriction',
'category_tree' => $id_rcategories->render(),
'desc' => $this->l('For verification only on certain categories check the desired categories, otherwise uncheck all categories for a check on the whole store'),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the best sales'),
'name' => 'best_sales',
'desc' => $this->l('Yes = Checking the age on the best sales / No = No checking'),
'values' => array(
array(
'id' => 'best_sales_on',
'value' => 1,
),
array(
'id' => 'best_sales_off',
'value' => 0,
),
),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the new products'),
'name' => 'new_products',
'desc' => $this->l('Yes = Checking the age on the new products / No = No checking'),
'values' => array(
array(
'id' => 'new_products_on',
'value' => 1,
),
array(
'id' => 'new_products_off',
'value' => 0,
),
),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the prices drop'),
'name' => 'discount',
'desc' => $this->l('Yes = Checking the age on the prices drop / No = No checking'),
'values' => array(
array(
'id' => 'discount_on',
'value' => 1,
),
array(
'id' => 'discount_off',
'value' => 0,
),
),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the manufacturer'),
'name' => 'manufacturer',
'desc' => $this->l('Yes = Checking the age on the manufacturer / No = No checking'),
'values' => array(
array(
'id' => 'manufacturer_on',
'value' => 1,
),
array(
'id' => 'manufacturer_off',
'value' => 0,
),
),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the supplier'),
'name' => 'supplier',
'desc' => $this->l('Yes = Checking the age on the supplier / No = No checking'),
'values' => array(
array(
'id' => 'supplier_on',
'value' => 1,
),
array(
'id' => 'supplier_off',
'value' => 0,
),
),
),
array(
'type' => 'switch',
'is_bool' => true,
'label' => $this->l('Checking the age on the cms pages'),
'name' => 'cms',
'desc' => $this->l('Yes = Checking the age on the cms pages / No = No checking'),
'values' => array(
array(
'id' => 'cms_on',
'value' => 1,
),
array(
'id' => 'cms_off',
'value' => 0,
),
),
),
),
);
return $helper;
}
private function initToolbar()
{
$this->toolbar_btn['save'] = array(
'href' => '#',
'desc' => $this->l('Save')
);
return $this->toolbar_btn;
}
public function getContent()
{
$this->html = '';
$this->context->controller->addjQueryPlugin('hoverIntent');
$this->context->controller->addJS($this->_path.'views/js/admin-app.js');
$this->postProcess();
$helper = $this->initForm();
$id_shop = (int)$this->context->shop->id;
$checkage = CheckageClass::getByIdShop((int)$id_shop);
if (!$checkage) {
$this->createExampleCheckage((int)$id_shop);
}
foreach ($this->fields_form[0]['form']['input'] as $input) {
$helper->fields_value[$input['name']] = $checkage->{$input['name']};
}
if ($checkage->all_restriction == '1') {
$this->html .= $this->allRestriction();
} else {
$this->html .= $this->selectRestriction();
}
$this->html .= $helper->generateForm($this->fields_form);
return $this->html;
}
public function postProcess()
{
$errors = array();
if (Tools::isSubmit('submitUpdateCheckage')) {
if (!Validate::isInt(Tools::getValue('age_restriction')) || (Tools::getValue('age_restriction') <= 0)) {
$errors[] = $this->l('Invalid minimum age.');
$this->html .= $this->displayError($errors);
} else {
$id_shop = (int)$this->context->shop->id;
$checkage = CheckageClass::getByIdShop((int)$id_shop);
$rcategories = Tools::getValue('rcategories', array());
$id_restriction = implode('-', $rcategories);
$checkage->copyFromPost();
$checkage->update();
$sql = 'UPDATE `'._DB_PREFIX_.'checkage` SET `id_restriction` = "'.(int)$id_restriction.'" WHERE `id_shop` = "'.(int)$id_shop.'"';
Db::getInstance()->execute($sql);
$this->html .= $this->displayConfirmation($this->l('Settings updated successfully.'));
}
}
}
public function allRestriction()
{
$tpl = $this->context->smarty->createTemplate(dirname(__FILE__).'/views/templates/admin/all-restriction.tpl');
return $tpl->fetch();
}
public function selectRestriction()
{
$tpl = $this->context->smarty->createTemplate(dirname(__FILE__).'/views/templates/admin/select-restriction.tpl');
return $tpl->fetch();
}
public function getPages()
{
$id_shop = (int)$this->context->shop->id;
$checkage = CheckageClass::getByIdShop((int)$id_shop);
$checkage = new CheckageClass((int)$checkage->id, (int)$this->context->language->id);
$page_name = Dispatcher::getInstance()->getController();
$page_restriction = '1';
if ($page_name == 'pricesdrop' && $checkage->discount == '1') {
return $page_restriction;
} elseif ($page_name == 'newproducts' && $checkage->new_products == '1') {
return $page_restriction;
} elseif ($page_name == 'bestsales' && $checkage->best_sales == '1') {
return $page_restriction;
} elseif ($page_name == 'manufacturer' && $checkage->manufacturer == '1') {
return $page_restriction;
} elseif ($page_name == 'supplier' && $checkage->supplier == '1') {
return $page_restriction;
} elseif ($page_name == 'cms' && $checkage->cms == '1') {
return $page_restriction;
}
}
public function getRestrictions()
{
$id_shop = (int)$this->context->shop->id;
$id_category = (int)Tools::getValue('id_category');
$id_product = (int)Tools::getValue('id_product');
$product = new Product((int)$id_product);
$show_restriction = '1';
$sql = 'SELECT `id_restriction` FROM `'._DB_PREFIX_.'checkage` WHERE `id_shop` ="'.(int)$id_shop.'"';
$ids_restrictions = Db::getInstance()->getValue($sql);
$id_restriction = explode('-', $ids_restrictions);
foreach ($id_restriction as $id_restriction) {
$restriction = $id_restriction;
if ($restriction && ($restriction == $id_category or $restriction == $product->id_category_default)) {
return $show_restriction;
}
}
}
public function hookdisplayTop($params)
{
$id_shop = (int)$this->context->shop->id;
$checkage = CheckageClass::getByIdShop((int)$id_shop);
$checkage = new CheckageClass((int)$checkage->id, (int)$this->context->language->id);
$id_restriction = $this->getRestrictions();
$page_restriction = $this->getPages();
$checkOK = $this->check();
if (Tools::usingSecureMode()) {
$urlbase = Tools::getShopDomainSsl(true);
} else {
$urlbase = Tools::getShopDomain(true);
}
$this->smarty->assign(array(
'checkage' => $checkage,
'id_restriction' => (int)$id_restriction,
'page_restriction' => (int)$page_restriction,
'checkOK' => (int)$checkOK,
'token' => Tools::getToken(false),
'url' => $urlbase.__PS_BASE_URI__,
'urlmodule' => $this->_path,
'default_lang' => (int)$this->context->language->id,
'id_lang' => (int)$this->context->language->id,
));
return $this->display(__FILE__, 'checkage.tpl');
}
public function hookdisplayHeader($params)
{
$this->context->controller->registerStylesheet('modules-checkage', 'modules/'.$this->name.'/views/css/checkage.css', ['media' => 'all', 'priority' => 150]);
}
}