Советы и рекомендации для разработчиков

Опубликовано Опубликовано в рубрике prestashop, Русская документация PrestaShop 1.6, Учебник разработчика PrestaShop 1.6

Советы и рекомендации для разработчиков

Содержание

  • Советы и рекомендации для разработчиков
    • Как проверить, зарегистрирован ли пользователь в PrestaShop или нет
    • Как найти узкое место на узле скорости на сайте
    • Как получить идентификатор перевозчика
    • Как получить идентификатор корзины
    • Как импортировать продукты из XML-файла

Советы и рекомендации для разработчиков

Как проверить, зарегистрирован ли пользователь в PrestaShop или нет

Вы можете легко выполнить эту проверку, используя isLoggedBack() метод, представленный в классе Employee (/classes/Employee.php).

В этом примере предполагается, что ваш файл находится в папке администратора:

<?php
define('_PS_ADMIN_DIR_', getcwd());
include(_PS_ADMIN_DIR_.'/../config/config.inc.php');
if (Context::getContext()->employee->isLoggedBack())
{
   /* Your code here, user is logged */
}
?>

isLoggedBack() метод был расположен в Cookie классе в PrestaShop 1.4.x, и был перемещен в Employee класс в v1.5.x.

Как найти узкое место в скорости на сайте

Попробуйте включить функцию профилирования, она подсвечивает, какая часть кода замедляет ваш сервер.

  1. Переведите ваш магазин в режим обслуживания
  2. В вашем магазине PrestaShop v1.5.x отредактируйте /config/defines.inc.php файл.
  3. В строке 44 замените define('_PS_DEBUG_PROFILING_', false); на define('_PS_DEBUG_PROFILING_', true);
  4. Перейдите на домашнюю страницу магазина и перезагрузите страницу.

Теперь вы должны понимать, сколько времени занимает каждая функция и SQL-запрос.

Как получить идентификатор доставки

В PrestaShop 1.4 вы можете использовать {id_carrier}:

{if $id_carrier == "1"}
  {* Do some stuff here *}
{/if}

Тот же результат может быть достигнут в PrestaShop 1.5 с {$cart->id_carrier}:

{if isset($cart->id_carrier) && $cart->id_carrier == 1}
   {* Do some stuff here *}
{/if}

Как получить идентификатор корзины

У вас есть несколько способов получить идентификатор корзины от текущего посетителя, самым простым из них является использование контекста.

Step 1

Откройте /modules/blockcart/ajax-cart.js файл и найдите эту строку:

$(document).ready(function(){

Ниже этой строки добавьте следующее:

$.ajax({
    type: 'GET',
    url: baseDir + 'modules/blockcart/ajax.php' '?retrieve_cart_id=1',
    success: function(result_cart_id)
    {
        alert(result_cart_id);
        /* my_id_cart = parseInt(result_cart_id); Uncomment this line to store the value into a JS variable */
    }
});

Step 2

Создайте файл с именем ajax.php в /modules/blockcart/ со следующим кодом внутри:

<?php
include(dirname(__FILE__).'/../../config/config.inc.php');
include(dirname(__FILE__).'/../../init.php');
$context = Context::getContext();
if (Tools::getValue('retrieve_cart_id') == 1)
    echo isset($context->cookie->id_cart) ? (int)$context->cookie->id_cart : 0;

Вы должны подумать о том, что, получив это значение в JavaScript, оно будет общедоступным для посетителя. В зависимости от того, насколько безопасны ваш код и модули оплаты, это может быть проблемой.

Как импортировать продукты из XML-файла

С PrestaShop вы можете легко импортировать свои данные, используя один из следующих вариантов:

  1. Используя «CSV Import» feature в Back-office
  2. Используя PrestaShop Web-service (требуется индивидуальная разработка)
  3. Используя существующие классы (требуется специальная разработка)

Ниже приведен фрагмент быстрого кода, который работает с конкретным XML-документом (stored as a heredoc string). Он будет создавать или обновлять все продукты и учитывать их цену, доступность, название, описание, вес и т. Д.

Обратите внимание, что:

  • Этот код ДОЛЖЕН быть адаптирован к вашим собственным потребностям
  • Этот код не предназначен для работы с комбинациями (цвет, размеры и т. Д.).
  • Этот код не создает для вас категории и добавляет все продукты в категорию «Главная»
<?php
include(dirname(__FILE__).'/config/config.inc.php');
include(dirname(__FILE__).'/init.php');
$xml_string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<Document>
  <Products>
    <Reference>1101TEST</Reference>
    <Valid_internet_product>1</Valid_internet_product>
    <Products_name>Test product</Products_name>
    <Price>49.99</Price>
    <Active_product>1</Active_product>
    <SupplierNo>8</SupplierNo>
    <Weight>5</Weight>
    <Description>My long product description</Description>
    <Short_Description>Product desc.</Short_Description>
    <MinOrderQty>1</MinOrderQty>
    <Categories>
      <Category>
        <CategoryID>3</CategoryID>
          <CategoryName>Home\Prod</CategoryName>
          <Active_category>1</Active_category>
          <Changed>0</Changed>
      </Category>
    </Categories>
    <Tax_Class_ID>1</Tax_Class_ID>
    <Discount>
      <Discount_percentage>percentage</Discount_percentage>
      <discountprice_ex_vat>0</discountprice_ex_vat>
      <Discountprice_include_vat>0</Discountprice_include_vat>
      <Pct_ReductionPercent>0</Pct_ReductionPercent>
    </Discount>
  </Products>
</Document>
XML;
$xml = simplexml_load_string($xml_string);
foreach ($xml->Products as $product_xml)
{
    if ($product_xml->Valid_internet_product == 1)
    {
        /* Update an existing product or Create a new one */
        $id_product = (int)Db::getInstance()->getValue('SELECT id_product FROM '._DB_PREFIX_.'product WHERE reference = \''.pSQL($product_xml->Reference).'\'');
        $product = $id_product ? new Product((int)$id_product, true) : new Product();
        $product->reference = $product_xml->Reference;
        $product->price = (float)$product_xml->Price;
        $product->active = (int)$product_xml->Active_product;
        $product->weight = (float)$product_xml->Weight;
        $product->minimal_quantity = (int)$product_xml->MinOrderQty;
        $product->id_category_default = 2;
        $product->name[1] = utf8_encode($product_xml->Products_name);
        $product->description[1] = utf8_encode($product_xml->Description);
        $product->description_short[1] = utf8_encode($product_xml->Short_Description);
        $product->link_rewrite[1] = Tools::link_rewrite($product_xml->Products_name);
        if (!isset($product->date_add) || empty($product->date_add))
            $product->date_add = date('Y-m-d H:i:s');
        $product->date_upd = date('Y-m-d H:i:s');
        $id_product ? $product->updateCategories(array(2)) : $product->addToCategories(array(2));
        $product->save();
        echo 'Product <b>'.$product->name[1].'</b> '.($id_product ? 'updated' 'created').'<br />';
    }
}