Пользовательский атрибут для изображения продукта, Не отображающий Сохраненные значения в Форме администратора (Атрибут Медиа-галереи)


Аналогично приведенному ниже:

Как сохранить пользовательский атрибут изображения в magento 2

Последовали приведенному выше вопросу и добавили пользовательский атрибут текстовой области. До сих пор поле отображается для меня в разделе "Альтернативный текст", а затем проверенные значения сохраняются в БД для таблицы галереи мультимедиа, приведенной ниже:

select * from catalog_product_entity_media_gallery WHERE value_id = 17571;

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

В моем шаблоне для новой формы мультимедиа добавлено поле, которое выглядит следующим образом:

            <div class="admin__field field-image-custom_link">
                <label class="admin__field-label" for="custom_image_link-save">
                    <span><?= $block->escapeHtml(__('Custom Image Link')) ?></span>
                </label>
                <div class="admin__field-control">
                    <div class="admin__field admin__field-option">
                        <textarea type="text"
                               rows="2"
                               data-form-part="<?php /* @escapeNotVerified */ echo $formName ?>"
                               data-role="custom_image_link-save"
                               class="admin__control-text"
                               name="<?= $block->escapeHtmlAttr($elementName) ?>[<%- data.file_id %>][custom_image_link]"/><%- data.custom_image_link %></textarea>
                    </div>
                </div>
            </div>

Это измененная версия шаблона в другом вопросе, где custom_image_link - мой пользовательский текстовый атрибут. Поэтому я использовал <%- data.custom_image_link %>, чтобы, надеюсь, привести поле в форму, однако ничего не видно.

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

Author: harri, 2020-01-20

1 answers

Вот мой пример модуля из упомянутого вопроса/ответа на GitHub. Вы можете изучить фиксацию https://github.com/SiarheyUchukhlebau/Dcw_Vm/commit/baf4053dc1d9fa625122cddcfb0da05029bda41f{[10] } чтобы определить, как я добавил еще один атрибут для изображения медиагалереи под названием custom_iamge_link (имеющий тип text).

Я не знаю, что именно идет не так в вашем случае, потому что вы не добавили полный код, но, похоже, это проблема плагина\наблюдателя. Вот два части кода, в которых сохраняются и загружаются данные:

App/code/Dcw/Vm/Observer/ProductSaveAfter.php

Здесь мы сохраняем наше пользовательское значение (не знаю, почему это выглядит так странно, но это работает:)):

public function execute(\Magento\Framework\Event\Observer $observer)
{
    $data = $this->request->getPostValue();

    if (isset($data['product']['media_gallery']['images'])) {
        // print_r($images);exit;
        $connection   = $this->resource->getConnection();
        $tableName    = $this->resource->getTableName('catalog_product_entity_media_gallery'); //gives table name with prefix
        $product      = $observer->getProduct();
        $mediaGallery = $product->getMediaGallery();

        if (isset($mediaGallery['images'])) {
            foreach ($mediaGallery['images'] as $image) {
                //Update Data into table
                $vmValue = !empty($image['vm']) ? (int)$image['vm'] : 0;
                $customImageLinkValue = !empty($image['custom_image_link']) ? $image['custom_image_link'] : '';

                $sql     = "UPDATE " . $tableName . " SET vm = ?, custom_image_link = ? WHERE value_id = ?";
                $connection->query($sql, [$vmValue, $customImageLinkValue, $image['value_id']]);
            }
        }
    }
}

И плагин загрузки данных, который отвечает за передачу значений в нашу "форму редактирования продукта":

App/code/Dcw/Vm/Plugin/Product/Gallery.php

/**
 * Add new columns to the regular media gallery select
 *
 * @param \Magento\Catalog\Model\ResourceModel\Product\Gallery $subject
 * @param \Magento\Framework\DB\Select $select
 * @return \Magento\Framework\DB\Select
 */
public function afterCreateBatchBaseSelect(
    \Magento\Catalog\Model\ResourceModel\Product\Gallery $subject,
    \Magento\Framework\DB\Select $select
) {
    $select->columns(['vm', 'custom_image_link']);

    return $select;
}

Если две из этих частей кода работают должным образом, все они должны быть хорошо.

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

<div class="admin__field field-image-custom_link">
    <label class="admin__field-label" for="custom_image_link">
        <span><?= $block->escapeHtml(__('Custom Image Link')) ?></span>
    </label>
    <div class="admin__field-control">
        <div class="admin__field admin__field-option">
                        <textarea type="text"
                                  rows="2"
                                  data-role="custom_image_link"
                                  data-form-part="<?php /* @escapeNotVerified */ echo $formName ?>"
                                  class="admin__control-textarea"
                                  name="<?= /* @noEscape */ $elementName; ?>[<%- data.file_id %>][custom_image_link]"><%- data.custom_image_link %></textarea>
        </div>
    </div>
</div>

Вот как это выглядит на моей сцене:

example one example two

PS: не забудьте удалить косую черту (/>) в конце открывающего тега <textarea>, потому что у него есть закрывающий тег.

 2
Author: Siarhey Uchukhlebau, 2020-01-28 10:40:18