W Presta Shop atrybuty podzielone są na grupy atrybutów. W każdej grupie są pojedyncze wartości atrybutów. Taką pojedynczą wartość atrybutu możemy deklarować w zależności od typu grupy. Wtedy do dyspozycji mamy różne pola.

Jeśli grupa atrybutu jest “listą rozwijaną” lub “przyciskami jednokrotnego wyboru” do dyspozycji mamy pola:

  1. Listę grupy do wyboru (obowiązkowe)
  2. Wartość (obowiązkowe)
  3. URL
  4. Meta-tytuł

Natomiast jeśli grupa atrybutu jest typu “kolor lub tekstura” mamy także powyższe pola do wyboru oraz dodatkowo punkt 5) i 6) :

  1. Listę grupy do wyboru (obowiązkowe)
  2. Wartość (obowiązkowe)
  3. URL
  4. Meta-tytuł
  5. Wybór koloru (z palety)
  6. Tekstura

Czasem w celach programistycznych gdy chcemy dodać dodatkową funkcjonalność (np. opis, lub inną cechę reprezentującą pojedynczą wartość atrybutu) – potrzebne jest dodatkowe pole. W tym tutorialu pokażemy jak dodać dodatkowe pole z ceną.

Oczywiście ma się ono nijak do cen ustalanych przez kombinacje produktów. Było nam ono potrzebne w SmartProjects.pl przy realizacji jednego sklepu do specyficznego wyliczania ceny.

Pole nie będzie miało możliwości tłumaczenia na inne języki. Aby dodać tę funkcjonalność konieczne są inne modyfikacje. My się tutaj skupimy jak w ogóle to zrobić.

I. Modyfikacja bazy danych.

Logujemy się do programy PhpMyAdmin, wskazujemy naszą bazę danych i otwieramy tabelę ps_attribute. Jeśli mamy inny prefix w naszej inslalacji niż “ps_” oczywiście nazwa tabeli będzie inna. Następnie poprzez zakładkę Struktura dodajemy kolejne pole o nazwie price. Pole będzie typu Decimal i będzie miało Długość/Wartość o wartości “6,2“. Oznacza to, że dopuszczamy 6 cyfr przed przeciniem i 2 za przecinkiem.

Możemy to wykonać za pośrednictwem poniższego kodu SQL:


ALTER TABLE `ps_attribute` ADD `price` DECIMAL( 6, 2 ) NOT NULL ;

II. Modyfikacje plików PHP

Otwieramy plik:


classes/Attribute.php

Na początku klasy AttributeCore deklarujemy dodatkową zmienną publiczną. Zamieniamy kod:


public $name;
public $color;
public $position;
public $default;

na:


public $name;
public $price;
public $color;
public $position;
public $default;

Określamy definicję tego pola. Zamieniamy kod:


'name' =>                array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128),

Na:


'price' =>               array('type' => self::TYPE_STRING, 'lang' => false, 'validate' => 'isFloat', 'required' => false, 'size' => 128),
'name' =>                array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 128),

Jak widać nowe pole jest bez możliwości tłumaczenia, musi być polem typu Float i nie jest obowiązkowe.

Modyfikujemy metodę (funkcję obiektową w PHP) o nazwie getAttributes(). Zamieniamy kod SQL:


SELECT DISTINCT ag.*, agl.*, a.`id_attribute`, al.`name`, agl.`name` AS `attribute_group`

Na:


SELECT DISTINCT ag.*, agl.*, a.`id_attribute`, a.`price`, al.`name`, agl.`name` AS `attribute_group`

Modyfikujemy plik:


controllers/admin/AdminAttributesGroupsController.php

W metodzie o nazwie renderFormAttributes() znajdujemy tablicę o nazwie:


$this->fields_form

Na jej końcu dodajemy kolejny element. Zamieniamy kod:


array(
'type' => 'text',
'label' => $this->l('Value'),
'name' => 'name',
'lang' => true,
'required' => true,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
)

Na:


array(
'type' => 'text',
'label' => $this->l('Value'),
'name' => 'name',
'lang' => true,
'required' => true,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
),
array(
'type' => 'text',
'label' => $this->l('Price'),
'name' => 'price',
'lang' => false,
'required' => false,
'hint' => $this->l('Invalid characters:').' <>;=#{}'
)

Gotowe! Po zapisaniu plików i przeładowaniu cache sklepu (Parametry zaawansowane >> Wydajność >> Wyczyść pamięć podręczną) powinniśmy podczas edycji wartości atrybutu (oraz co ważne – przy dodawaniu nowej wartości) zobaczyć nasze pole:

Presta Shop Kraków - projektowanie stron smartprojects.pl

 

Share This:

      • nowy says:

        A to przepraszam że w urlopie przeszkadzałem :). Dokładnie to wykorzystałem tą metodę aby dodać tooltip do atrybutu i nie mogę tego wyświetlić na stronie produktu. Powiedzmy że utworzyłem $tooltip i analogicznie do tego wszystko po kolei z tutoriala ale po wpisaniu np: w product.tpl, tam gdzie generują się atrubuty $tooltip nie wyświetla mi tekstu z tabeli. Do bazy danych zapisuje i pobiera do pola tekstowego w Adminie dane ale nie wiem jak to wyświetlić na stronie produktu? Dziękuję za pomoc. Pozdrawiam

          • admin
            admin says:

            To idąc za ciosem napisz co dokładnie przekazujesz w tej zmiennej do szablonu product.tpl poprzez PHP i metodę smarty assign? 🙂

          • nowy says:

            Po kolei, zmiany w pliku Attribute.php:

            /** @var string Name */
            public $name;
            public $tooltip;
            public $color;
            public $position;
            public $default;

            /**
            * @see ObjectModel::$definition
            */
            public static $definition = array(
            ‘table’ => ‘attribute’,
            ‘primary’ => ‘id_attribute’,
            ‘multilang’ => true,
            ‘fields’ => array(
            ‘id_attribute_group’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isUnsignedId’, ‘required’ => true),
            ‘color’ => array(‘type’ => self::TYPE_STRING, ‘validate’ => ‘isColor’),
            ‘position’ => array(‘type’ => self::TYPE_INT, ‘validate’ => ‘isInt’),

            ‘tooltip’ => array(‘type’ => self::TYPE_HTML, ‘lang’ => false, ‘validate’ => ‘isCleanHtml’,’required’ => false),
            ‘name’ => array(‘type’ => self::TYPE_STRING, ‘lang’ => true, ‘validate’ => ‘isGenericName’, ‘required’ => true, ‘size’ => 64),
            )
            );
            ———————-
            public static function getAttributes($id_lang, $not_null = false)
            {
            if (!Combination::isFeatureActive())
            return array();

            return Db::getInstance()->executeS(‘
            SELECT DISTINCT ag.*, agl.*, a.`id_attribute`, a.`tooltip`, al.`name`, agl.`name` AS `attribute_group`
            FROM `’._DB_PREFIX_.’attribute_group` ag
            LEFT JOIN `’._DB_PREFIX_.’attribute_group_lang` agl
            ON (ag.`id_attribute_group` = agl.`id_attribute_group` AND agl.`id_lang` = ‘.(int)$id_lang.’)
            LEFT JOIN `’._DB_PREFIX_.’attribute` a
            ON a.`id_attribute_group` = ag.`id_attribute_group`
            LEFT JOIN `’._DB_PREFIX_.’attribute_lang` al
            ON (a.`id_attribute` = al.`id_attribute` AND al.`id_lang` = ‘.(int)$id_lang.’)
            ‘.Shop::addSqlAssociation(‘attribute_group’, ‘ag’).’
            ‘.Shop::addSqlAssociation(‘attribute’, ‘a’).’
            ‘.($not_null ? ‘WHERE a.`id_attribute` IS NOT NULL AND al.`name` IS NOT NULL AND agl.`id_attribute_group` IS NOT NULL’ : ”).’
            ORDER BY agl.`name` ASC, a.`position` ASC
            ‘);
            }

            —————————–
            Zmiany w pliku AdminAttributeGroupsController.php

            public function renderFormAttributes()
            {
            $attributes_groups = AttributeGroup::getAttributesGroups($this->context->language->id);

            $this->table = ‘attribute’;
            $this->identifier = ‘id_attribute’;

            $this->fields_form = array(
            ‘legend’ => array(
            ‘title’ => $this->l(‘Values’),
            ‘image’ => ‘../img/admin/asterisk.gif’,
            ),
            ‘input’ => array(
            array(
            ‘type’ => ‘select’,
            ‘label’ => $this->l(‘Attribute group:’),
            ‘name’ => ‘id_attribute_group’,
            ‘required’ => true,
            ‘options’ => array(
            ‘query’ => $attributes_groups,
            ‘id’ => ‘id_attribute_group’,
            ‘name’ => ‘name’
            ),
            ‘desc’ => $this->l(‘Choose the group of the attribute’)
            ),
            array(
            ‘type’ => ‘text’,
            ‘label’ => $this->l(‘Value:’),
            ‘name’ => ‘name’,
            ‘lang’ => true,
            ‘size’ => 33,
            ‘required’ => true,
            ‘hint’ => $this->l(‘Invalid characters:’).’ ;=#{}’
            ),
            array(
            ‘type’ => ‘textarea’,
            ‘label’ => $this->l(‘Dodatkowy tekst’),
            ‘name’ => ‘tooltip’,
            ‘lang’ => false,
            ‘cols’ => 100,
            ‘rows’ => 15,
            ‘class’ => ‘rte’,
            ‘autoload_rte’ => true,
            ‘required’ => false
            )
            )
            );

            ————–
            Utworzona kolumna w ps_attribute tooltip -> varchar.

            To wszystko co dodałem i próbowałem wywołać to w product.tpl poprzez {$tooltip} ale nie działa.

  1. nowy says:

    Do końca nie znam kodu presty i nie wiem jak to wywołać np: w jednym atrybucie w tabeli jest tekst w postaci html przekazany z textarea jak widać w kodzie powyżej “dodatkowy tekst”. I chciałbym to wyświetlić jako tooltip na stronie produktu, pisałeś coś o smarty assign, czyli rozumiem że trzeba dodać $tooltip gdzieś do kontrollera tak? Dziękuję za pomoc.

    • nowy says:

      Witam, dalej nie znalazłem rozwiązania na powyższe rozwiązanie, można prosić o pomoc z dodaniem tego do product.tpl? Próbowałem dodać to do wiersza z $groups, tam gdzie pobiera dane typu nazwa z tej samej tabeli i nic. Prawdopodobnie trezba to dodać gdzie indziej za pomocą smarty->assign ale nie bardzo wiem gdzie :/. Pozdrawiam

  2. admin
    admin says:

    Czy problem udało się naprawić? Rozumiem, że nie działa pokazywanie tych zmiennych zaciąganych z atrybutów w pliku product.tpl a co za tym idzie na karcie produktu ? Napisz w jaki sposób przekazujesz dane (i jakie dane przekazujesz) w pliku controllers/front/ProductController.php. Jakbyś jeszcze zdradził którą wersję Presta Shop masz to też będzie nam łatwiej udzielić Ci wskazówki 🙂

Zostaw komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *