首页 文章

在产品Prestashop 1.7中添加字段

提问于
浏览
3

为什么prestashop不将我的修改保存到数据库中?使用prestashop 1.7

/override/classes/Product.php

class Product extends ProductCore {
public $por_gan; public function __construct ($idProduct = null, $idLang = null, $idShop = null) {
$definition = self::$definition;
$definition['fields']['por_gan'] = array('type' => self::TYPE_INT, 'required' => false);

parent::__construct($idProduct, $idLang, $idShop); } }

在ProductInformation.php中

->add('por_gan', 'Symfony\Component\Form\Extension\Core\Type\NumberType', array(
        'required' => false,
        'label' => $this->translator->trans('Beneficio', [], 'Admin.Catalog.Feature'),
        'constraints' => array(
            new Assert\NotBlank(),
            new Assert\Type(array('type' => 'numeric'))
        ),          
    ))

在form.html.twing中

<div class="col-md-6">
        <label class="form-control-label">% de beneficio</label
        {{ form_widget(form.step1.por_gan) }}
</div>

谢谢

2 回答

  • 10

    我已成功在管理产品页面中添加了一个额外的标签 . 它工作正常 . 我认为更好的方法是创建一个模块,以便更容易维护 .

    或者你可以使用 displayAdminProductsExtra hook, actionProductUpdate hook and actionProductAdd

    额外的字段是:frais_a_prevoir

    我显示了要修改的所有文件,但你必须检查文件内部的修改位置(进行搜索,你会发现)

    覆盖 /classes/Product.php

    在课程 /classes/Product.php 中,有3个修改:

    1)

    /** @var string Frais à prévoir */
        public $frais_a_prevoir;
    

    2)

    'frais_a_prevoir' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'),
    

    3)

    $sql->select(
                'p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, pl.`description`, pl.`description_short`, pl.`frais_a_prevoir`, pl.`link_rewrite`, pl.`meta_description`,
                pl.`meta_keywords`, pl.`meta_title`, pl.`name`, pl.`available_now`, pl.`available_later`, image_shop.`id_image` id_image, il.`legend`, m.`name` AS manufacturer_name,
                (DATEDIFF(product_shop.`date_add`,
                    DATE_SUB(
                        "'.$now.'",
                        INTERVAL '.$nb_days_new_product.' DAY
                    )
                ) > 0) as new'
            );
    

    在/src/PrestaShopBundle/Resources/views/Admin/Product/form.html.twig

    <ul class="nav nav-tabs bordered">
                          <li id="tab_description_short" class="nav-item"><a href="#description_short" data-toggle="tab" class="nav-link description-tab active">{{ 'Summary'|trans({}, 'Admin.Catalog.Feature') }}</a></li>
                          <li id="tab_description" class="nav-item"><a href="#description" data-toggle="tab" class="nav-link description-tab">{{ 'Description'|trans({}, 'Admin.Global') }}</a></li>
                          <li id="tab_frais_a_prevoir" class="nav-item"><a href="#frais_a_prevoir" data-toggle="tab" class="nav-link description-tab">{{ 'frais_a_prevoir'|trans({}, 'Admin.Global') }}</a></li>
                        </ul>
    
                        <div class="tab-content bordered">
                          <div class="tab-pane panel panel-default active" id="description_short">
                            {{ form_widget(form.step1.description_short) }}
                          </div>
                          <div class="tab-pane panel panel-default " id="description">
                            {{ form_widget(form.step1.description) }}
                          </div>
                          <div class="tab-pane panel panel-default " id="frais_a_prevoir">
                            {{ form_widget(form.step1.frais_a_prevoir) }}
                          </div>
                        </div>
    

    在/src/PrestaShopBundle/Form/Admin/Product/productInformation.php

    ->add('frais_a_prevoir', 'PrestaShopBundle\Form\Admin\Type\TranslateType', array(
                        'type' => 'Symfony\Component\Form\Extension\Core\Type\TextareaType',
                        'options' => [
                            'attr' => array('class' => 'autoload_rte'),
                            'required' => false
                        ],
                        'locales' => $this->locales,
                        'hideTabs' => true,
                        'label' => $this->translator->trans('frais_a_prevoir', [], 'Admin.Global'),
                        'required' => false
                    ))
    

    在src / PrestaShopBundle / Model / Product / AdminModelAdapter.php中:

    $this->translatableKeys = array(
                'name',
                'description',
                'description_short',
                'frais_a_prevoir',
                'link_rewrite',
                'meta_title',
                'meta_description',
                'available_now',
                'available_later',
                'tags',
            );
    
            //define unused key for manual binding
            $this->unmapKeys = array('name',
                'description',
                'description_short',
                'frais_a_prevoir',
                'images',
                'related_products',
                'categories',
                'suppliers',
                'display_options',
                'features',
                'specific_price',
                'virtual_product',
                'attachment_product',
            );
    

    2)

    'frais_a_prevoir' => $this->product->frais_a_prevoir,
    

    在数据库中,在表product_lang中添加 frais_a_prevoir

  • 0

    这是使用模块执行此操作的选项,不会更改核心文件

    在你的MyModule.php中

    use PrestaShopBundle\Form\Admin\Type\TranslateType;
    use PrestaShopBundle\Form\Admin\Type\FormattedTextareaType;
    use Symfony\Component\Form\Extension\Core\Type\TextareaType;
    use Symfony\Component\Form\Extension\Core\Type\FormType;
    public function hookDisplayAdminProductsExtra($params)
    {
        $productAdapter = $this->get('prestashop.adapter.data_provider.product');
        $product = $productAdapter->getProduct($params['id_product']);
    
        $formData = [
           'ebay_reference' => $product->ebay_reference,
        ];
        $formFactory = $this->get('form.factory');
        $form = $formFactory->createBuilder(FormType::class, $formData)
            ->add('ebay_reference', TranslateType::class, array(
                'required' => false,
                'label' => 'Ebay reference',
                'locales' => Language::getLanguages(),
                'hideTabs' => true,
                'required' => false
            ))
        ->getForm()
        ;
        return $this->get('twig')->render(_PS_MODULE_DIR_.'MyModule/views/display-admin-products-extra.html.twig', [
            'form' => $form->createView()
        ]) ;
    
    }
    public function hookActionAdminProductsControllerSaveBefore($params)
    {
        $productAdapter = $this->get('prestashop.adapter.data_provider.product');
        $product = $productAdapter->getProduct($_REQUEST['form']['id_product']);
        foreach(Language::getLanguages() as $language){
            $product->ebay_reference[ $language['id_lang'] ] = 
                $_REQUEST['form']['ebay_reference'][$language['id_lang']];
        }
        $product->save();
    
    }
    

    在你的display-admin-products-extra.html.twig中

    <div class="row" >
        <div class="col-md-12">
            <div class="form-group">
                <h3>Ebay reference</h3>
                {{ form_errors(form.ebay_reference) }}
                {{ form_widget(form.ebay_reference) }}
            </div>
        </div>
    </div>
    

相关问题