在产品 Prestashop 1.7 中添加字段

Posted

技术标签:

【中文标题】在产品 Prestashop 1.7 中添加字段【英文标题】:Add field in product Prestashop 1.7 【发布时间】:2017-09-26 07:20:57 【问题描述】:

为什么 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>

谢谢

【问题讨论】:

您是否尝试过删除缓存的类文件并重新建立索引? Prestashop 1.7 没有缓存类文件 当我在 PS 1.7 中创建类覆盖时,我会删除这个缓存的类文件:app/cache/dev/class_index.php如果您处于开发模式,否则:app/cache/prod/class_index.php 【参考方案1】:

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

在你的 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>

【讨论】:

表单构建器数组中有一个重复的数组键“必需”。您的示例中似乎没有使用这两个类: PrestaShopBundle\Form\Admin\Type\FormattedTextareaType; Symfony\Component\Form\Extension\Core\Type\TextareaType; 嗨,我无法保存产品。【参考方案2】:

我已成功在管理产品页面中添加了一个额外的选项卡。 它工作正常。我认为更好的方法是创建一个模块以使修改更易于维护。

或者你可以使用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

【讨论】:

很好的答案塞巴斯蒂安。它应该被标记为正确的。感谢您的帮助。 @Sébastien 我在 Presta 1.7 中的模块中使用了 actionProductUpdate 挂钩,但它没有用,我在 AdminProductController.php 中搜索挂钩,它仅用于 ajaxProcessProductQuantity 方法,这很奇怪 @SébastienGicquel 我使用了钩子和覆盖机制,因为修改 Prestashop 核心让我感到困惑。您的解决方案提出了这个想法:-) 再次感谢。 嗨@whitelettersinblankpapers,我猜不可能覆盖/src/Prestashop中的任何表单,但是可以使用钩子机制来扩展功能。 @SébastienGicquel 非常感谢,一切正常。虽然我在 1.7.4.4 上,但存在一些差异,特别是现在位于 PrestaShopBundle/Resources/views/Admin/Product/ProductPage/Panels 的文件 form.html.twig 的本地化(您可以在选项之间进行选择、必需品等)。

以上是关于在产品 Prestashop 1.7 中添加字段的主要内容,如果未能解决你的问题,请参考以下文章

在结帐 prestashop 1.7 中添加字段

Prestashop 1.7 - 覆盖 Symfony 表单约束

如何在 prestashop 中添加自定义产品“排序依据”字段?

如何通过Prestashop API使用python请求更新字段?在Prestashop 1.7

如何在 prestashop 1.7 中添加 Mobile_Detect.php?

prestashop 1.7 新模块