feat(main): Old module

This commit is contained in:
2026-07-09 14:38:01 +02:00
parent 6ba576ed0d
commit 8424ad149e
51 changed files with 9755 additions and 0 deletions
+567
View File
@@ -0,0 +1,567 @@
<?php
/**
* 2007-2022 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-2022 PrestaShop SA
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
use PrestaShop\PrestaShop\Core\Domain\Customer\Exception\CustomerException;
use PrestaShop\PrestaShop\Core\Grid\Column\Type\DataColumn;
use PrestaShop\PrestaShop\Core\Grid\Definition\GridDefinitionInterface;
use PrestaShop\PrestaShop\Core\Grid\Filter\Filter;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
if (!defined('_PS_VERSION_')) {
exit;
}
include_once dirname(__FILE__) . '/models/PchCustomerfieldModel.php';
class Pchcustomerfield extends Module
{
protected $config_form = false;
private $tab_class = 'AdminPchCustomerFields';
public function __construct()
{
$this->name = 'pchcustomerfield';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Prestachamps';
$this->need_instance = 0;
/**
* Set $this->bootstrap to true if your module is compliant with bootstrap (PrestaShop 1.6)
*/
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('Additional Customer Field');
$this->description = $this->l('Display specialization field on the customer form');
$this->confirmUninstall = $this->l('Are you sure you want to uninstall the module?');
$this->ps_versions_compliancy = array('min' => '1.7', 'max' => _PS_VERSION_);
}
/**
* Don't forget to create update methods if needed:
* http://doc.prestashop.com/display/PS16/Enabling+the+Auto-Update
*/
public function install()
{
if (!$this->existsTab()) {
if (!$this->addTab()) {
return false;
}
}
Configuration::updateValue('PCHCUSTOMERFIELD_LIVE_MODE', false);
include dirname(__FILE__) . '/sql/install.php';
return parent::install() &&
$this->registerHook('backOfficeHeader') &&
$this->registerHook('displayAdminCustomers') &&
$this->registerHook('actionCustomerGridDefinitionModifier') &&
$this->registerHook('actionCustomerGridQueryBuilderModifier') &&
$this->registerHook('additionalCustomerFormFields') &&
$this->registerHook('actionCustomerFormBuilderModifier') &&
$this->registerHook('actionAfterCreateCustomerFormHandler') &&
$this->registerHook('actionAfterUpdateCustomerFormHandler') &&
$this->alterCustomerTable();
}
public function uninstall()
{
if (!$this->removeTab()) {
return false;
}
Configuration::deleteByName('PCHCUSTOMERFIELD_LIVE_MODE');
include dirname(__FILE__) . '/sql/uninstall.php';
return parent::uninstall() &&
$this->uninstallAlterCustomerTable();
}
private function addTab()
{
$return = true;
$tab = new Tab();
$tab->class_name = $this->tab_class;
$tab->id_parent = 0;
$tab->module = $this->name;
$tab->name[(int) Configuration::get('PS_LANG_DEFAULT')] = $this->l('Customer specialization fields');
$return &= $tab->add();
$subTab = new Tab();
$subTab->class_name = 'AdminPchCustomerfield';
$subTab->id_parent = $tab->id;
$subTab->module = $this->name;
$subTab->name[(int) Configuration::get('PS_LANG_DEFAULT')] = $this->l('Manage Customer specialization values');
if (true === Tools::version_compare(_PS_VERSION_, '1.7', '>=')) {
$subTab->icon = 'settings';
}
$return &= $subTab->add();
return $return;
}
private function removeTab()
{
$return = true;
$tabs = ['PchCustomerfield', $this->tab_class];
foreach ($tabs as $tab) {
if (Validate::isLoadedObject($tab = Tab::getInstanceFromClassName($tab))) {
return $return &= $tab->delete();
}
}
return $return;
}
public function existsTab()
{
$result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('SELECT id_tab AS id
FROM `' . _DB_PREFIX_ . 'tab` t WHERE LOWER(t.`class_name`) = \'' . pSQL($this->tab_class) . '\'');
if (count($result) == 0) {
return false;
}
return true;
}
/**
* Alter customer table, add module fields
*
* @return bool true if success or already done.
*/
protected function alterCustomerTable()
{
// check if the column already exists:
$column_exists = Db::getInstance()->getValue("SELECT COUNT(*) FROM INFORMATION_SCHEMA.COLUMNS WHERE
TABLE_SCHEMA = '" . pSQL(_DB_NAME_) . "' AND TABLE_NAME = '" . pSQL(_DB_PREFIX_) . "customer' AND
COLUMN_NAME = 'specialization'");
if((int) !$column_exists) {
$sql = 'ALTER TABLE `' . pSQL(_DB_PREFIX_) . 'customer` ADD `specialization` INT NOT NULL';
// CLEAN_INSTALATION 1/2 (if you want to delete all data after an installation)
// comment:
Db::getInstance()->execute($sql);
return true;
// and uncomment:
// return Db::getInstance()->execute($sql);
}
return true;
}
/**
* Uninstalls sample tables required for demonstration.
*
* @return bool
*/
private function uninstallAlterCustomerTable()
{
// CLEAN_INSTALATION 2/2 (if you want to delete all data after an installation)
// uncomment:
// $sql = 'ALTER TABLE `' . pSQL(_DB_PREFIX_) . 'customer` DROP `specialization`';
// return Db::getInstance()->execute($sql);
//
// and comment:
return true;
}
/**
* Load the configuration form
*/
public function getContent()
{
/**
* If values have been submitted in the form, process.
*/
if (((bool)Tools::isSubmit('submitPchcustomerfieldModule')) == true) {
$this->postProcess();
}
$output = $this->renderForm();
return $output;
}
/**
* Create the form that will be displayed in the configuration of your module.
*/
protected function renderForm()
{
$helper = new HelperForm();
$helper->show_toolbar = false;
$helper->table = $this->table;
$helper->module = $this;
$helper->default_form_language = $this->context->language->id;
$helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG', 0);
$helper->identifier = $this->identifier;
$helper->submit_action = 'submitPchcustomerfieldModule';
$helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false)
.'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name;
$helper->token = Tools::getAdminTokenLite('AdminModules');
$helper->tpl_vars = array(
'fields_value' => $this->getConfigFormValues(), /* Add values for your inputs */
'languages' => $this->context->controller->getLanguages(),
'id_language' => $this->context->language->id,
);
return $helper->generateForm(array($this->getConfigForm()));
}
/**
* Create the structure of your form.
*/
protected function getConfigForm()
{
return array(
'form' => array(
'legend' => array(
'title' => $this->l('Settings'),
'icon' => 'icon-cogs',
),
'input' => array(
array(
'type' => 'switch',
'label' => $this->l('Live mode'),
'name' => 'PCHCUSTOMERFIELD_LIVE_MODE',
'is_bool' => true,
'desc' => $this->l('Use this module in live mode'),
'values' => array(
array(
'id' => 'active_on',
'value' => true,
'label' => $this->l('Enabled')
),
array(
'id' => 'active_off',
'value' => false,
'label' => $this->l('Disabled')
)
),
),
),
'submit' => array(
'title' => $this->l('Save'),
),
),
);
}
/**
* Set values for the inputs.
*/
protected function getConfigFormValues()
{
return array(
'PCHCUSTOMERFIELD_LIVE_MODE' => Configuration::get('PCHCUSTOMERFIELD_LIVE_MODE', true),
);
}
/**
* Save form data.
*/
protected function postProcess()
{
$form_values = $this->getConfigFormValues();
foreach (array_keys($form_values) as $key) {
Configuration::updateValue($key, Tools::getValue($key));
}
}
/**
* Add the CSS & JavaScript files you want to be loaded in the BO.
*/
public function hookBackOfficeHeader()
{
if (Tools::getValue('controller') == 'AdminCustomers') {
$this->context->controller->addJS($this->_path.'views/js/back.js');
}
}
/**
* This hook displays a new block on the admin customer page
*
* @param array $params
*
* @return string
*/
public function hookDisplayAdminCustomers(array $params)
{
if (isset($params['id_customer'])) {
if (!$specialization = PchCustomerfieldModel::getSpecializationByCustomerId($this->context->language->id, $params['id_customer'])) {
return;
}
$this->smarty->assign([
'specialization' => $specialization,
]);
return $this->fetch('module:pchcustomerfield/views/templates/hook/displayAdminCustomers.tpl');
}
}
/**
* Hook allows to modify Customers grid definition.
* This hook is a right place to add/remove columns or actions (bulk, grid).
*
* @param array $params
*/
public function hookActionCustomerGridDefinitionModifier(array $params)
{
if (empty($params['definition'])) {
return;
}
/** @var GridDefinitionInterface $definition */
$definition = $params['definition'];
$definition
->getColumns()
->addBefore(
'social_title',
(new DataColumn('specialization'))
->setName($this->l('Specialization'))
->setOptions([
'field' => 'specialization',
])
);
if (!$specializationFields = PchCustomerfieldModel::getSpecializationValues($this->context->language->id, true)) {
return;
}
$specializationFieldsKeys = array_column($specializationFields, 'id_pchcustomerfield');
$specializationFieldsValues = array_column($specializationFields, 'title');
$specializationFieldsKeyValues = array_flip(array_combine($specializationFieldsKeys, $specializationFieldsValues));
$definition->getFilters()->add(
(new Filter('specialization', ChoiceType::class))
->setTypeOptions([
'choices' => array_merge(['--' => 0], $specializationFieldsKeyValues),
'required' => false
])
->setAssociatedColumn('specialization')
);
}
/**
* Hook allows to modify Customers query builder and add custom sql statements.
*
* @param array $params
*/
public function hookActionCustomerGridQueryBuilderModifier(array $params)
{
/** @var QueryBuilder $searchQueryBuilder */
$searchQueryBuilder = $params['search_query_builder'];
/** @var CustomerFilters $searchCriteria */
$searchCriteria = $params['search_criteria'];
$id_lang = (int)Context::getContext()->language->id;
$select_specialization_sql = '(SELECT cfl.`title`
FROM `'._DB_PREFIX_.'pchcustomerfield_lang` cfl
WHERE c.specialization = cfl.id_pchcustomerfield AND cfl.id_lang = '.(int)$id_lang.')';
$searchQueryBuilder->addSelect(
'IF(' . $select_specialization_sql . ' IS NULL,"--",'.$select_specialization_sql.') AS `specialization`'
);
if ('specialization' === $searchCriteria->getOrderBy()) {
$searchQueryBuilder->orderBy('specialization', $searchCriteria->getOrderWay());
}
foreach ($searchCriteria->getFilters() as $filterName => $filterValue) {
if ('specialization' === $filterName) {
$searchQueryBuilder->andWhere('c.`specialization` = :specialization');
$searchQueryBuilder->setParameter('specialization', $filterValue);
//dump($filterValue);die();
if (!$filterValue) {
$searchQueryBuilder->orWhere('c.`specialization` IS NULL');
}
}
}
}
/**
* Hook allows to modify Customers form and add additional form fields as well as modify or add new data to the forms.
* FRONT_END
* @param array $params
* @return array
*/
public function hookAdditionalCustomerFormFields($params)
{
if (!Configuration::get('PCHCUSTOMERFIELD_LIVE_MODE')) {
return;
}
if (!$specializationFields = PchCustomerfieldModel::getSpecializationValues($this->context->language->id)) {
return;
}
$specializationFieldsKeys = array_column($specializationFields, 'id_pchcustomerfield');
$specializationFieldsValues = array_column($specializationFields, 'title');
$specializationFieldsKeyValues = array_combine($specializationFieldsKeys, $specializationFieldsValues);
$specializationField = [
(new FormField)
->setName('specialization')
->setType('select')
->setRequired(true) // is Required
->setAvailableValues($specializationFieldsKeyValues)
->setLabel($this->l('Specialization'))
];
// We want to insert it after Email
if (isset($params['fields'])) {
// Where is Email?
$position = (int)array_search('email', array_keys($params['fields']), null) + 1;
// How many fields do we have?
$fieldCount = count($params['fields']);
// Lets insert it...
$result = array_merge(
array_slice($params['fields'], 0, $position),
$specializationField,
array_slice($params['fields'], $position - $fieldCount)
);
$params['fields'] = $result;
return;
}
else {
return $specializationField;
}
}
/**
* Hook allows to modify Customers form and add additional form fields as well as modify or add new data to the forms.
* BACK_END
* @param array $params
*/
public function hookActionCustomerFormBuilderModifier(array $params)
{
/** @var FormBuilderInterface $formBuilder */
$formBuilder = $params['form_builder'];
if (!$specializationFields = PchCustomerfieldModel::getSpecializationValues($this->context->language->id, false)) {
return;
}
$specializationFieldsKeys = array_column($specializationFields, 'id_pchcustomerfield');
$specializationFieldsValues = array_column($specializationFields, 'title');
$specializationFieldsKeyValues = array_flip(array_combine($specializationFieldsKeys, $specializationFieldsValues));
$formBuilder->add('specialization', ChoiceType::class, [
'choices' => $specializationFieldsKeyValues,
'label' => $this->l('Specialization'),
'required' => true,
'placeholder' => $this->l('Please select'),
]);
$customer = new Customer($params['id']);
$params['data']['specialization'] = $customer->specialization;
$formBuilder->setData($params['data']);
}
/**
* Hook allows to modify Customers form and add additional form fields as well as modify or add new data to the forms.
*
* @param array $params
*
* @throws CustomerException
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAfterUpdateCustomerFormHandler(array $params)
{
$this->updateCustomerSpecialization($params);
}
/**
* Hook allows to modify Customers form and add additional form fields as well as modify or add new data to the forms.
*
* @param array $params
*
* @throws CustomerException
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
public function hookActionAfterCreateCustomerFormHandler(array $params)
{
$this->updateCustomerSpecialization($params);
}
/**
* Update / Create
*
* @param array $params
*
* @throws CustomerException
* @throws PrestaShopDatabaseException
* @throws PrestaShopException
*/
private function updateCustomerSpecialization(array $params)
{
$customerId = (int)$params['id'];
/** @var array $customerFormData */
$customerFormData = $params['form_data'];
$specialization = $customerFormData['specialization'];
try {
$customer = new Customer($customerId);
$customer->specialization = $specialization;
$customer->update();
} catch (CustomerException $exception) {
throw new CustomerException($exception);
} catch (PrestaShopDatabaseException $e) {
throw new PrestaShopDatabaseException($e);
} catch (PrestaShopException $e) {
throw new PrestaShopException($e);
}
}
public function getSpecializationBySpecializationId($specializationId)
{
if (!(int)$specializationId) {
return false;
}
return PchCustomerfieldModel::getSpecializationBySpecializationId($this->context->language->id, (int)$specializationId);
}
}