Skip to content

Commit

Permalink
First commit
Browse files Browse the repository at this point in the history
  • Loading branch information
Fedor50 committed Dec 18, 2024
1 parent e29cf6e commit d244d6b
Show file tree
Hide file tree
Showing 45 changed files with 4,615 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
# php-plugin-woocommerce
# php-plugin-woocommerce wordpress
3 changes: 3 additions & 0 deletions assets/css/payneteasy-settings-page-style.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
h2, #woocommerce_wc_payneteasy_section_separator {
font-size: 1.5em;
}
156 changes: 156 additions & 0 deletions assets/js/payneteasy-order-page-script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
document.addEventListener('DOMContentLoaded', function() {
// Проверяем, находимся ли мы на странице редактирования заказа
if (document.querySelector('body.post-type-shop_order')) {

/*
* *** Добавление функционала актуализации статуса оплаты
*/
// Находим блоки с классом order_data_column
const orderDataColumns = document.querySelectorAll('.order_data_column');

/*
Выбираем второй блок с классом order_data_column, если он существует.
Если второго блока нет, используем первый блок.
*/
let targetColumn = orderDataColumns[1]; // Индекс 1 соответствует второму блоку
if (!targetColumn) {
targetColumn = orderDataColumns[0]; // Индекс 0 соответствует первому блоку
}

// Создаем HTML-код для кнопки
const buttonHtml = `
<p class="form-field form-field-wide">
<label for="payneteasy-button-check-status">Для проверки состояния заказа в платежной системе PAYNET, пожалуйста, нажмите кнопку:</label>
<button class="button custom-action" id="payneteasy-button-check-status">Проверить статус</button>
</p>
`;

// Проверяем условие добавления кнопки
if (targetColumn) {
// Добавляем кнопку в выбранный блок
targetColumn.insertAdjacentHTML('beforeend', buttonHtml);

const button = document.getElementById('payneteasy-button-check-status');

if (button) {
button.addEventListener('click', function(event) {
event.preventDefault();

const orderID = window.location.href.match(/post=([0-9]+)/)[1];

// Создаем объект FormData для сбора данных формы
const formData = new FormData();
formData.append('action', 'check_status');
formData.append('nonce', payneteasy_ajax_var.nonce);
formData.append('order_id', orderID);

// Выполняем AJAX-запрос к веб-хуку плагина wc-payneteasy
fetch(payneteasy_ajax_var.api_url, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success && confirm(data.message)) {
location.reload();
} else {
alert(data.message);
}
})
.catch(error => {
console.error('Ошибка запроса:', error);
alert('Произошла ошибка при выполнении запроса.');
});
});
}
}


/**
* *** Добавление функционала возрата
*/
const originalButton = document.querySelector('.refund-actions button.do-manual-refund'); // Находим оригинальную кнопку

if (originalButton) {
// Создаем копию кнопки
const copyButton = originalButton.cloneNode(true);
copyButton.id = 'do-manual-refund-copy';
copyButton.classList.remove('do-manual-refund'); // Удаляем класс do-manual-refund у копии

// Скрываем оригинальную кнопку
originalButton.style.display = 'none';

// Вставляем копию кнопки после оригинальной кнопки
originalButton.parentNode.insertBefore(copyButton, originalButton.nextSibling);

// Функция для синхронизации атрибутов и текста копии с оригиналом
function synchronizeButtons() {
copyButton.innerHTML = originalButton.innerHTML;
copyButton.disabled = originalButton.disabled;
// При необходимости синхронизировать другие атрибуты
}

// Синхронизация при изменении атрибутов и текста оригинала
const observer = new MutationObserver(synchronizeButtons);
observer.observe(originalButton, { childList: true, attributes: true, subtree: true });

// Добавление функционала возврата на копию кнопки
copyButton.addEventListener('click', function(event) {
event.preventDefault(); // Предотвращаем выполнение остальных действий

// Получаем таблицу с классом woocommerce_order_items
const table = document.querySelector('#woocommerce-order-items');

if (table) {
// Идентификатор текущего заказа
const orderID = window.location.href.match(/post=([0-9]+)/)[1];

// Создаем объект FormData для сбора данных формы
const formData = new FormData();
formData.append('action', 'refund');
formData.append('nonce', payneteasy_ajax_var.nonce);
formData.append('order_id', orderID);

// Получаем все инпуты с именами, начинающимися с "refund_"
const refundInputs = table.querySelectorAll('input[name^="refund_"]');

// Добавляем данные в FormData
refundInputs.forEach(input => {
formData.append(input.name, input.value);
});

// Запрос подтверждения у пользователя
if (confirm('Выполнить возврат в платёжной системе PAYNET?')) {
// Отправляем AJAX-запрос с помощью fetch
fetch(payneteasy_ajax_var.api_url, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert(`Платёжная система PAYNET: ${data.message}`);
originalButton.click();
} else {
if (confirm(`Платёжная система PAYNET: ${data.message}. Продолжит возврат в WordPress?`)) {
originalButton.click();
}
}
})
.catch(error => {
console.error('Ошибка запроса:', error);
if (confirm('Произошла ошибка при возврате в платёжной системе PAYNET. Продолжит возврат в WordPress?')) {
originalButton.click();
}
});
} else {
originalButton.click();
}

} else {
console.error('Таблица с классом woocommerce_order_items не найдена.');
}
});
}
}
});
96 changes: 96 additions & 0 deletions form_fields.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php
return [
'enabled' => [
'title' => __('Enable/Disable', 'woocommerce'),
'type' => 'checkbox',
'label' => __('Enable Payment system PAYNET', 'wc-payneteasy'),
'default' => 'yes'
],
'title' => [
'title' => __('Title', 'woocommerce'),
'type' => 'text',
'description' => __('This controls the title which the user sees during checkout.', 'woocommerce'),
'default' => __('Payment system PAYNET', 'wc-payneteasy'),
'desc_tip' => true,
],
'description' => [
'title' => __('Customer Message', 'wc-payneteasy'),
'type' => 'textarea',
'css' => 'width:500px;',
'default' => __('Pay with PaynetEasy payment', 'wc-payneteasy'),
'description' => __('The message which you want it to appear to the customer in the checkout page.', 'wc-payneteasy'),
],
'endpoint_id' => [
'title' => __('Endpoint id', 'wc-payneteasy') . ' <span style="color:red;">*<span/>',
'type' => 'text',
'description' => __('Merchant\'s Endpoint id is required to call the API.', 'wc-payneteasy'),
'placeholder' => __('Enter Endpoint id', 'wc-payneteasy'),
'custom_attributes' => ['required' => 'required'],
],
'login' => [
'title' => __('Login', 'wc-payneteasy') . ' <span style="color:red;">*<span/>',
'type' => 'text',
'description' => __('Merchant\'s Login is required to call the API.', 'wc-payneteasy'),
'placeholder' => __('Enter Login', 'wc-payneteasy'),
'custom_attributes' => ['required' => 'required'],
],
'control_key' => [
'title' => __('Control key', 'wc-payneteasy') . ' <span style="color:red;">*<span/>',
'type' => 'text',
'description' => __('Merchant\'s Control key is required to call the API.', 'wc-payneteasy'),
'placeholder' => __('Enter Control key', 'wc-payneteasy'),
'custom_attributes' => ['required' => 'required'],
],
'payment_method' => [
'title' => __('Payment method', 'wc-payneteasy'),
'type' => 'select',
'description' => __('', 'wc-payneteasy'),
'placeholder' => __('Enter Payment method', 'wc-payneteasy'),
'options' => [
'form' => __('Form', 'wc-payneteasy'),
'direct' => __('Direct', 'wc-payneteasy')
],
'desc_tip' => true,
'default' => 'form'
],
'sandbox' => [
'title' => __('Sandbox mode', 'wc-payneteasy'),
'type' => 'checkbox',
'label' => __('Enable sandbox mode', 'wc-payneteasy'),
'description' => __('In this mode, the payment for the goods is not charged.', 'wc-payneteasy'),
'default' => 'no'
],
'logging' => [
'title' => __('Logging', 'wc-payneteasy'),
'type' => 'checkbox',
'label' => __('Enable logging', 'wc-payneteasy'),
'description' => __('Logging is used to debug plugin performance by storing API request data.', 'wc-payneteasy'),
'default' => 'no'
],
'three_d_secure' => [
'title' => __('3D Secure', 'wc-payneteasy'),
'type' => 'checkbox',
'label' => __('Enable 3D Secure', 'wc-payneteasy'),
'description' => __('3D Secure or Non 3D Secure (WORK ONLY WITH DIRECT INTEGRATION METHOD)', 'wc-payneteasy'),
'default' => 'no'
],
'live_url' => [
'title' => __('Gateway url (LIVE)', 'wc-payneteasy'),
'type' => 'text',
'description' => __("https://gate.payneteasy.com/ etc.", 'wc-payneteasy'),
'placeholder' => __('Enter live url.', 'wc-payneteasy'),
],
'sandbox_url' => [
'title' => __('Gateway url (SANDBOX)', 'wc-payneteasy'),
'type' => 'text',
'description' => __("https://sandbox.payneteasy.com/ etc.", 'wc-payneteasy'),
'placeholder' => __('Enter sandbox url.', 'wc-payneteasy'),
],
'transaction_end' => [
'title' => __('Successful transaction order status', 'wc-payneteasy'),
'type' => 'select',
'options' => wc_get_order_statuses(),
'description' => __('Select the order status to be displayed after successful payment.', 'wc-payneteasy'),
'default' => 'wc-processing'
]
];
108 changes: 108 additions & 0 deletions hooks.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?php
/**
* Функция add_payneteasy_gateway
*
* Добавляет платёжный метод "WC_Payneteasy" в список доступных платёжных методов WooCommerce.
*
* @param array $methods - Список доступных платёжных методов
* @return array - Модифицированный список платёжных методов с добавлением WC_Payneteasy
*/
function add_payneteasy_gateway(array $methods): array
{
$methods[] = 'WC_Payneteasy';
global $wpdb;

$charset_collate = $wpdb->get_charset_collate();

$sql = "CREATE TABLE IF NOT EXISTS {$wpdb->prefix}payneteasy_payments (
`id` int(11) NOT NULL AUTO_INCREMENT,
`paynet_order_id` int(11) NOT NULL,
`merchant_order_id` int(11) NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";

require_once( ABSPATH . 'wp-admin/includes/upgrade.php' );
dbDelta( $sql );

return $methods;
}
add_filter('woocommerce_payment_gateways', 'add_payneteasy_gateway');


/**
* Функция load_payneteasy_textdomain
*
* Загружает локализацию (текстовый перевод) для плагина WC_Payneteasy.
*/
function load_payneteasy_textdomain(): void
{
load_plugin_textdomain('wc-payneteasy', false, dirname(plugin_basename(__FILE__)) . '/languages');
}
add_action('plugins_loaded', 'load_payneteasy_textdomain');

/**
* Функция get_payneteasy_field_options
*
* Возвращает список доступных опций для полей настроек WC_Payneteasy на основе идентификатора поля.
*
* @param string $field_id - Идентификатор поля настроек
* @return array - Список опций для поля
*/
function get_payneteasy_field_options($field_id): array
{
$options = [
'-' => __('Select an option', 'wc-payneteasy')
];
// Определяет опции для конкретного поля
switch ($field_id) {
case 'payneteasy_payment_method':
$options = array_merge($options, [
'form' => __('Form', 'wc-payneteasy'),
'direct' => __('Direct', 'wc-payneteasy')
]);
break;
}

return $options;
}

/**
* Функция adding_payneteasy_button_to_orders_page
*
* Добавляет скрипты и стили к странице заказов и настройкам WC_Payneteasy в административной части.
*
* @param string $hook - Идентификатор страницы в административной части WordPress
*/
function adding_payneteasy_button_to_orders_page($hook): void
{
// Проверяет наличие настроек WC_Payneteasy и условия для добавления скриптов и стилей
$payneteasy_settings = get_option('woocommerce_wc_payneteasy_settings');
global $post;

if (
($hook == 'post-new.php' || $hook == 'post.php') &&
!empty($post) && $post->post_type === 'shop_order'
) {
$order_id = $post->ID;
$order = wc_get_order($order_id);
$order_status = $order->get_status();
$payment_method = $order->get_payment_method();

if (
$order_status !== 'failed' &&
$order_status !== 'refunded' &&
$order_status !== 'cancelled' &&
$payment_method === 'wc_payneteasy'
) {
// Подключает скрипт для работы с заказами WC_Payneteasy
wp_enqueue_script('payneteasy-order-page-script', plugins_url('/assets/js/payneteasy-order-page-script.js', __FILE__), ['jquery'], '1.0', true);
wp_localize_script(
'payneteasy-order-page-script',
'payneteasy_ajax_var', [
'nonce' => wp_create_nonce('payneteasy-ajax-nonce'),
'api_url' => home_url('/wc-api/wc_payneteasy_ajax')
]);
}
}
}
add_action('admin_enqueue_scripts', 'adding_payneteasy_button_to_orders_page');
2 changes: 2 additions & 0 deletions index.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?php
// Silence is golden
Loading

0 comments on commit d244d6b

Please sign in to comment.