Сохранение / создание горячих точек при создании нового изображения

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

Я использую этот видео-учебник в качестве основы https://vimeo.com/200502785

Отношение выглядит следующим образом - изображение имеет много горячих точек (отношение один ко многим), горячие точки имеют много продуктов (отношение многие ко многим)

Я использовал код из медиа-поиска, чтобы загрузить изображение в бэкэнд после того, как изображение загружено, пользователь может щелкнуть и добавить точку доступа

jQuery(document).ready(function($) {

   function updateHotspotPosition(hotspot){

      var l = ( 100 * parseFloat(hotspot.position().left / parseFloat(hotspot.parent().width())) ).toFixed(3);
      var t = ( 100 * parseFloat(hotspot.position().top / parseFloat(hotspot.parent().height())) ).toFixed(3);

      hotspot.css("left", l+'%');
      hotspot.css("top", t+'%');

      hotspot.attr('data-request-data', 'left:' + l + ',top:' + t );

   }

   $('#add-hotspot').click(function(e) {
      e.preventDefault();

      $('#hotspot-container').append('<div class="hotspotmarker" data-control="popup" data-handler="onLoadCreateHotspotForm" data-size="large" href="javascript:;" data-request-data="left:0,top:0"></div>');

      $('.hotspotmarker').draggable({
         containment: "#hotspot-container",
         scroll: false,
         stop: function(){
            updateHotspotPosition($(this));
         }
      });

   });


   $('#hotspot-container').on('click', function(e) {
      e.preventDefault();
      if (true) {}
      var parentOffset = $(this).parent().offset();
      //or $(this).offset(); if you really just want the current element's offset
      var l = ( 100 * parseFloat((e.pageX - parentOffset.left) / parseFloat($(this).width())) ).toFixed(3);
      var t = ( 100 * parseFloat((e.pageY- parentOffset.top) / parseFloat($(this).height())) ).toFixed(3);


      $(this).append('<div class="hotspotmarker" data-control="popup" data-handler="onLoadCreateHotspotForm" data-size="large" style="left:'+ l +'%;top:'+ t +'%" data-request-data="left:'+l+',top:'+t+'"></div>')

      $('.hotspotmarker').draggable({
            containment: "#hotspot-container",
            scroll: false,
            stop: function(){
            updateHotspotPosition($(this));
         }
      }).on('click', function(event) {
         event.preventDefault();
         /* Act on the event */
      });;
   });
});

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

Проблема заключается в создании горячей точки из контроллера изображений, где изображение еще не существует в базе данных

код для контроллера

<?php namespace Depcore\InspiracjeKludi\Controllers;

use Backend\Classes\Controller;
use BackendMenu;

class Images extends Controller
{
    public $implement = [
    'Backend\Behaviors\ListController',
    'Backend\Behaviors\FormController',
    'Backend\Behaviors\ReorderController'
    ];

    public $listConfig = 'config_list.yaml';
    public $formConfig = 'config_form.yaml';
    public $reorderConfig = 'config_reorder.yaml';

    public function __construct()
    {
        parent::__construct();
        BackendMenu::setContext('Depcore.InspiracjeKludi', 'inspiracje', 'side-menu-item');

        $this->itemFormWidget = $this->createProducsFormWidget();
    }

    protected $itemFormWidget;
    /**
     * Create a new hotspot form with products selection
     * @return null
     */
   public function onLoadCreateHotspotForm (  ){


      $this->itemFormWidget->setFormValues ( ['left'=>post ( 'left' ),'top'=>post ( 'top' )] );
      $this->vars['itemFormWidget'] = $this->itemFormWidget;


      return $this->makePartial ( 'hotspot_add');
    }

    protected function createProducsFormWidget (  ){
      $config = $this->makeConfig ( '$/depcore/inspiracjekludi/models/hotspot/fields.yaml' );
      $config->alias = 'productForm';
      $config->arrayName = 'products';
      $config->model = new \Depcore\InspiracjeKludi\Models\Hotspot;
      $widget = $this->makeWidget ( 'Backend\Widgets\Form', $config );
      $widget->bindToController (  );
      return $widget;
    }

    public function onCreateItem (  ) {

      // if  ( $hotspotID !== null ) find and update hotspot position and products relations
      // else {
         $data = $this->itemFormWidget->getSaveData (  );
         $model = new \Depcore\InspiracjeKludi\Models\Hotspot;
         $model->fill ( $data );

         // tutaj dodać defer save
         $model->save (  );
      // }
      return [
         'hotspotId' => $model->id,
      ];
    }


}

В учебном пособии ситуация несколько отличалась, поскольку элементы были добавлены в уже существующий заказ, здесь мне нужно назначить продукты для горячей точки и горячей точки для изображения перед сохранением его в базе данных (также есть логическая проблема, как прикрепите идентификатор горячей точки к элементу на странице после его создания, но это уже другая тема, я думаю).

0 ответов

Другие вопросы по тегам