Jump to content

Edit History

TinoArts

TinoArts

No problem, but as I said, this is an ugly solution, no use of controllers, only plain PHP with some ajax workarounds.

I've added an <input> field for my 'fixed_price' to pricing.html.twig template.

<input type="text" id="fixed_price" name="fixed_price" class="form-control" value="0">

I created a new table 'ps_product_fixed_price' to store my fixed prices. But this can be done by adding a column to 'ps_product' table as well.

CREATE TABLE ps_product_fixed_price (id_product INT UNSIGNED NOT NULL, fixed_price DECIMAL, PRIMARY KEY (id_product))

Then, I've added a simple script to retrieve the fixed price and update my custom field value with a simple ajax call (the script should be loaded in Product BO page).

$(function() {
  /* Retrieve fixed price with AJAX */
  let id_product = {{ id_product }};

  $.ajax({
    url: '/themes/my_theme/inc/get-fixed-price.php',
    data: { id_product: id_product },
    type: 'GET',
    success: function(result) {
      $('#fixed_price').val(result);
    }
  });
});

The content of "get-fixed-price.php" file:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_GET['id_product'];

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);

if($fixed_price) {
    echo $fixed_price;
} else {
    echo 0;
}

Another script is used to save the inserted value to database with another ajax call. The script is triggered on Presta BO 'Save' product button. It pauses the PS default save events, perform the fixed price update and then finish the default PS events (the script should be loaded in Product BO page).

let fixed_price_saved = 0;
    let default_save_performed = 0;

    $('body').on("click", '#submit', function(e) {

      // If default save already performed, change fixed_price_saved back to 0
      if(default_save_performed) {
        fixed_price_saved = 0;
        default_save_performed = 0;
      }

      // Block default save event if fixed price is not saved yet
      if(!fixed_price_saved) {
        e.preventDefault();

        let id_product = {{ id_product }};
        let fixed_price = $('#fixed_price').val();

        $.ajax({
          url: '/themes/my_theme/inc/set-fixed-price.php',
          data: { id_product: id_product, fixed_price: fixed_price },
          type: 'POST',
          success: function(result) {
            console.log(result);
          }
        });

        // Allow default save event and click the save button again
        fixed_price_saved = 1;
        $(this).click();

      } else {
        default_save_performed = 1;
      }
    });

The set-fixed-price.php file content is here:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_POST['id_product'];
$fixed_price = $_POST['fixed_price'];

Db::getInstance()->execute("INSERT INTO `ps_product_fixed_price` (`id_product`, `fixed_price`) VALUES(" . $id_product . "," . $fixed_price . ") ON DUPLICATE KEY UPDATE  `fixed_price` = " . $fixed_price);

echo "Fixed price successfully stored";

Now I had a working way of loading and storing my custom field value in my custom table/column. Last thing I had to do was to override the default PS price calculation. I did it by adding this piece of code to Product.php. I've added it to the getPriceStatic() method, just before the return statement.

// Fixed price
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int) $id_product, $context));
$product_tax_calculator = $tax_manager->getTaxCalculator();

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);
if($fixed_price) {
  $fixed_price = $product_tax_calculator->addTaxes($fixed_price);
  return $fixed_price;
}

 

As I said, this is an ugly workaround made by a person that does not work with PS at all. I'm aware it should be done by modifying controllers and classes and I will certainly rebuild it in the near future, but for the moment it is working as expected and I'm happy with it.

TinoArts

TinoArts

No problem, but as I said, this is an ugly solution, no use of controllers, only plain PHP with some ajax workarounds.

I've added an <input> field for my 'fixed_price' to pricing.html.twig template.

<input type="text" id="fixed_price" name="fixed_price" class="form-control" value="0">

I created a new table 'ps_product_fixed_price' to store my fixed prices. But this can be done by adding a column to 'ps_product' table as well.

CREATE TABLE ps_product_fixed_price (id_product INT UNSIGNED NOT NULL, fixed_price FLOAT, PRIMARY KEY (id_product))

Then, I've added a simple script to retrieve the fixed price and update my custom field value with a simple ajax call (the script should be loaded in Product BO page).

$(function() {
  /* Retrieve fixed price with AJAX */
  let id_product = {{ id_product }};

  $.ajax({
    url: '/themes/my_theme/inc/get-fixed-price.php',
    data: { id_product: id_product },
    type: 'GET',
    success: function(result) {
      $('#fixed_price').val(result);
    }
  });
});

The content of "get-fixed-price.php" file:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_GET['id_product'];

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);

if($fixed_price) {
    echo $fixed_price;
} else {
    echo 0;
}

Another script is used to save the inserted value to database with another ajax call. The script is triggered on Presta BO 'Save' product button. It pauses the PS default save events, perform the fixed price update and then finish the default PS events (the script should be loaded in Product BO page).

let fixed_price_saved = 0;
    let default_save_performed = 0;

    $('body').on("click", '#submit', function(e) {

      // If default save already performed, change fixed_price_saved back to 0
      if(default_save_performed) {
        fixed_price_saved = 0;
        default_save_performed = 0;
      }

      // Block default save event if fixed price is not saved yet
      if(!fixed_price_saved) {
        e.preventDefault();

        let id_product = {{ id_product }};
        let fixed_price = $('#fixed_price').val();

        $.ajax({
          url: '/themes/my_theme/inc/set-fixed-price.php',
          data: { id_product: id_product, fixed_price: fixed_price },
          type: 'POST',
          success: function(result) {
            console.log(result);
          }
        });

        // Allow default save event and click the save button again
        fixed_price_saved = 1;
        $(this).click();

      } else {
        default_save_performed = 1;
      }
    });

The set-fixed-price.php file content is here:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_POST['id_product'];
$fixed_price = $_POST['fixed_price'];

Db::getInstance()->execute("INSERT INTO `ps_product_fixed_price` (`id_product`, `fixed_price`) VALUES(" . $id_product . "," . $fixed_price . ") ON DUPLICATE KEY UPDATE  `fixed_price` = " . $fixed_price);

echo "Fixed price successfully stored";

Now I had a working way of loading and storing my custom field value in my custom table/column. Last thing I had to do was to override the default PS price calculation. I did it by adding this piece of code to Product.php. I've added it to the getPriceStatic() method, just before the return statement.

// Fixed price
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int) $id_product, $context));
$product_tax_calculator = $tax_manager->getTaxCalculator();

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);
if($fixed_price) {
  $fixed_price = $product_tax_calculator->addTaxes($fixed_price);
  return $fixed_price;
}

 

As I said, this is an ugly workaround made by a person that does not work with PS at all. I'm aware it should be done by modifying controllers and classes and I will certainly rebuild it in the near future, but for the moment it is working as expected and I'm happy with it.

TinoArts

TinoArts

No problem, but as I said, this is an ugly solution, no use of controllers, only plain PHP with some ajax workarounds.

I've added an <input> field for my 'fixed_price' to pricing.html.twig template.

<input type="text" id="fixed_price" name="fixed_price" class="form-control" value="0">

I created a new table 'ps_product_fixed_price' to store my fixed prices. But this can be done by adding a column to 'ps_product' table as well.

CREATE TABLE ps_product_fixed_price (id_product INT UNSIGNED NOT NULL, fixed_price FLOAT, PRIMARY KEY (id_product))

Then, I've added a simple script to retrieve the fixed price and update my custom field value with a simple ajax call (the script should be loaded in Product BO page).

$(function() {
  /* Retrieve fixed price with AJAX */
  let id_product = {{ id_product }};

  $.ajax({
    url: '/themes/my_theme/inc/get-fixed-price.php',
    data: { id_product: id_product },
    type: 'GET',
    success: function(result) {
      $('#fixed_price').val(result);
    }
  });
});

The content of "get-fixed-price.php" file:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_GET['id_product'];

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);

if($fixed_price) {
    echo $fixed_price;
} else {
    echo 0;
}

Another script is used to save the inserted value to database with another ajax call. The script is triggered on Presta BO 'Save' product button. It pauses the PS default save events, perform the fixed price update and then finish the default PS events (the script should be loaded in Product BO page).

let fixed_price_saved = 0;
    let default_save_performed = 0;

    $('body').on("click", '#submit', function(e) {

      // If default save already performed, change fixed_price_saved back to 0
      if(default_save_performed) {
        fixed_price_saved = 0;
        default_save_performed = 0;
      }

      // Block default save event if fixed price is not saved yet
      if(!fixed_price_saved) {
        e.preventDefault();

        let id_product = {{ id_product }};
        let fixed_price = $('#fixed_price').val();

        $.ajax({
          url: '/themes/my_theme/inc/set-fixed-price.php',
          data: { id_product: id_product, fixed_price: fixed_price },
          type: 'POST',
          success: function(result) {
            console.log(result);
          }
        });

        // Allow default save event and click the save button again
        fixed_price_saved = 1;
        $(this).click();

      } else {
        default_save_performed = 1;
      }
    });

The set-fixed-price.php file content is here:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_POST['id_product'];
$fixed_price = $_POST['fixed_price'];

Db::getInstance()->execute("INSERT INTO `ps_product_fixed_price` (`id_product`, `fixed_price`) VALUES(" . $id_product . "," . $fixed_price . ") ON DUPLICATE KEY UPDATE  `fixed_price` = " . $fixed_price);

echo "Fixná cena bola uložená do databázy";

Now I had a working way of loading and storing my custom field value in my custom table/column. Last thing I had to do was to override the default PS price calculation. I did it by adding this piece of code to Product.php. I've added it to the getPriceStatic() method, just before the return statement.

// Fixed price
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int) $id_product, $context));
$product_tax_calculator = $tax_manager->getTaxCalculator();

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);
if($fixed_price) {
  $fixed_price = $product_tax_calculator->addTaxes($fixed_price);
  return $fixed_price;
}

 

As I said, this is an ugly workaround made by a person that does not work with PS at all. I'm aware it should be done by modifying controllers and classes and I will certainly rebuild it in the near future, but for the moment it is working as expected and I'm happy with it.

TinoArts

TinoArts

No problem, but as I said, this is an ugly solution, no use of controllers, only plain PHP with some ajax workarounds.

I've added an <input> field for my 'fixed_price' to pricing.html.twig template.

<input type="text" id="fixed_price" name="fixed_price" class="form-control" value="0">

I created a new table 'ps_product_fixed_price' to store my fixed prices. But this can be done by adding a column to 'ps_product' table as well.

CREATE TABLE ps_product_fixed_price (id_product INT UNSIGNED NOT NULL, fixed_price FLOAT, PRIMARY KEY (id_product))

Then, I've added a simple script to retrieve the fixed price and update my custom field value with a simple ajax call (the script should be loaded in Product BO page).

$(function() {
  /* Retrieve fixed price with AJAX */
  let id_product = {{ id_product }};

  $.ajax({
    url: '/themes/my_theme/inc/get-fixed-price.php',
    data: { id_product: id_product },
    type: 'GET',
    success: function(result) {
      $('#fixed_price').val(result);
    }
  });
});

The content of "get-fixed-price.php" file:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_GET['id_product'];

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);

if($fixed_price) {
    echo $fixed_price;
} else {
    echo 0;
}

Another script is used to save the inserted value to database with another ajax call. The script is triggered on Presta BO 'Save' product button. It pauses the PS default save events, perform the fixed price update and then finish the default PS events (the script should be loaded in Product BO page).

let fixed_price_saved = 0;
    let default_save_performed = 0;

    $('body').on("click", '#submit', function(e) {

      // If default save already performed, change ficked_price_saved back to 0
      if(default_save_performed) {
        fixed_price_saved = 0;
        default_save_performed = 0;
      }

      // Block default save event if fixed price is not saved yet
      if(!fixed_price_saved) {
        e.preventDefault();

        let id_product = {{ id_product }};
        let fixed_price = $('#fixed_price').val();

        $.ajax({
          url: '/themes/my_theme/inc/set-fixed-price.php',
          data: { id_product: id_product, fixed_price: fixed_price },
          type: 'POST',
          success: function(result) {
            console.log(result);
          }
        });

        // Allow default save event and click the save button again
        fixed_price_saved = 1;
        $(this).click();

      } else {
        default_save_performed = 1;
      }
    });

The set-fixed-price.php file content is here:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_POST['id_product'];
$fixed_price = $_POST['fixed_price'];

Db::getInstance()->execute("INSERT INTO `ps_product_fixed_price` (`id_product`, `fixed_price`) VALUES(" . $id_product . "," . $fixed_price . ") ON DUPLICATE KEY UPDATE  `fixed_price` = " . $fixed_price);

echo "Fixná cena bola uložená do databázy";

Now I had a working way of loading and storing my custom field value in my custom table/column. Last thing I had to do was to override the default PS price calculation. I did it by adding this piece of code to Product.php. I've added it to the getPriceStatic() method, just before the return statement.

// Fixed price
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int) $id_product, $context));
$product_tax_calculator = $tax_manager->getTaxCalculator();

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);
if($fixed_price) {
  $fixed_price = $product_tax_calculator->addTaxes($fixed_price);
  return $fixed_price;
}

 

As I said, this is an ugly workaround made by a person that does not work with PS at all. I'm aware it should be done by modifying controllers and classes and I will certainly rebuild it in the near future, but for the moment it is working as expected and I'm happy with it.

TinoArts

TinoArts

No problem, but as I said, this is an ugly solution, no use of controllers, only plain PHP with some ajax workarounds.

I've added an <input> field for my 'fixed_price' to pricing.html.twig template.

<input type="text" id="fixed_price" name="fixed_price" class="form-control" value="0">

I created a new table 'ps_product_fixed_price' to store my fixed prices. But this can be done by adding a column to 'ps_product' table as well.

CREATE TABLE ps_product_fixed_price (id_product INT UNSIGNED NOT NULL, fixed_price FLOAT, PRIMARY KEY (id_product))

Then, I've added a simple script to retrieve the fixed price and update my custom field value with a simple ajax call.

$(function() {
  /* Retrieve fixed price with AJAX */
  let id_product = {{ id_product }};

  $.ajax({
    url: '/themes/my_theme/inc/get-fixed-price.php',
    data: { id_product: id_product },
    type: 'GET',
    success: function(result) {
      $('#fixed_price').val(result);
    }
  });
});

The content of "get-fixed-price.php" file:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_GET['id_product'];

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);

if($fixed_price) {
    echo $fixed_price;
} else {
    echo 0;
}

Another script is used to save the inserted value to database with another ajax call. The script is triggered on Presta BO 'Save' product button. It pauses the PS default save events, perform the fixed price update and then finish the default PS events.

let fixed_price_saved = 0;
    let default_save_performed = 0;

    $('body').on("click", '#submit', function(e) {

      // If default save already performed, change ficked_price_saved back to 0
      if(default_save_performed) {
        fixed_price_saved = 0;
        default_save_performed = 0;
      }

      // Block default save event if fixed price is not saved yet
      if(!fixed_price_saved) {
        e.preventDefault();

        let id_product = {{ id_product }};
        let fixed_price = $('#fixed_price').val();

        $.ajax({
          url: '/themes/my_theme/inc/set-fixed-price.php',
          data: { id_product: id_product, fixed_price: fixed_price },
          type: 'POST',
          success: function(result) {
            console.log(result);
          }
        });

        // Allow default save event and click the save button again
        fixed_price_saved = 1;
        $(this).click();

      } else {
        default_save_performed = 1;
      }
    });

The set-fixed-price.php file content is here:

<?php

include(dirname(__FILE__).'/../../../config/config.inc.php');
include(dirname(__FILE__).'/../../../init.php');

$id_product = $_POST['id_product'];
$fixed_price = $_POST['fixed_price'];

Db::getInstance()->execute("INSERT INTO `ps_product_fixed_price` (`id_product`, `fixed_price`) VALUES(" . $id_product . "," . $fixed_price . ") ON DUPLICATE KEY UPDATE  `fixed_price` = " . $fixed_price);

echo "Fixná cena bola uložená do databázy";

Now I had a working way of loading and storing my custom field value in my custom table/column. Last thing I had to do was to override the default PS price calculation. I did it by adding this piece of code to Product.php. I've added it to the getPriceStatic() method, just before the return statement.

// Fixed price
$tax_manager = TaxManagerFactory::getManager($address, Product::getIdTaxRulesGroupByIdProduct((int) $id_product, $context));
$product_tax_calculator = $tax_manager->getTaxCalculator();

$fixed_price = Db::getInstance()->getValue("SELECT `fixed_price` FROM `ps_product_fixed_price` WHERE `id_product` = " . $id_product);
if($fixed_price) {
  $fixed_price = $product_tax_calculator->addTaxes($fixed_price);
  return $fixed_price;
}

 

As I said, this is an ugly workaround made by a person that does not work with PS at all. I'm aware it should be done by modifying controllers and classes and I will certainly rebuild it in the near future, but for the moment it is working as expected and I'm happy with it.

×
×
  • Create New...