У Ajax подгруженного товара не работают commerce ajax кнопки

Аватар пользователя tolykot

Есть вьюха продуктов. У каждого товара кнопка commerce "Купить" с ajax. Ajax-ом подгружаю новый товары.

Первой проблемой было то что id у кнопок дублировалось. Начал передавать колбеку ID последней кнопки.

// В ajax запросе передаю последней ID, чтобы вышло так
$_POST['ajax_html_ids'][0] = 'edit-submit--13';

// Настройка вьюхи
$view views_get_view($viewName);
$view->set_display($display);    
$view->set_exposed_input($filters);  
$view->set_items_per_page(12);   
$view->is_cacheable FALSE;
$view->execute();
$content =  $view->preview();

$javascript drupal_add_js(NULLNULL);
$settings FALSE;

if(isset(

$javascript['settings'])) {
      
$settings call_user_func_array('array_merge_recursive'$javascript['settings']['data']);
}

$commands = array();
$commands[] = ajax_command_settings($settingsTRUE);
$commands[] = ajax_command_append('.view-search-product .view-content ul'$content);
print 
ajax_render($commands);
drupal_exit();
?>

Второй проблемой является, попытка нажать "Купить". В ответ ошибка, и обновление страницы.
В консоли "ajax.js?v=7.57:204 Uncaught Error: URL-адрес обратного вызова не является локальным и доверенным: /commerce/ajax/submit"

Отличия в ответе Drupal.settings.ajax.

C ajax нету element

Есть ли способ кошернее получать уникальные ID кнопок?
Как запустить commerce кнопки, есть вьюха загружена ajaxом?

Спасибо.

Тип материала:
Версия Drupal:
0 Thanks

Комментарии

Аватар пользователя VasyOK
VasyOK 2 месяца назад

Если в настройках производительности все отключить (Буст, Адваг, кеширование), тогда идшники дублируются?

Аватар пользователя sas@drupal.org
sas@drupal.org 2 месяца назад

>Есть ли способ кошернее получать уникальные ID кнопок?
drupal_html_id

Аватар пользователя tolykot
tolykot 2 месяца назад

VasyOK, кеш не включен. Этот функционал еще на локалке.
sas@drupal.org, $_POST['ajax_html_ids'][0] специально для drupal_html_id()

Аватар пользователя tolykot
tolykot 2 месяца назад

Для теста, закомментировал строки где получаю ошибки в ajax.js

// Bind the ajaxSubmit function to the element event.
  $(ajax.element).bind(element_settings.event, function (event) {
    //if (!Drupal.settings.urlIsAjaxTrusted[ajax.url] && !Drupal.urlIsLocal(ajax.url)) {
     // throw new Error(Drupal.t('The callback URL is not local and not trusted: !url', {'!url': ajax.url}));
    //}
    return ajax.eventResponse(this, event);
  });

В консоли POST http://192.168.1.50/commerce/ajax/submit 404 (Not Found)
Сайт в папке, если что.

Аватар пользователя gun_dose
gun_dose 2 месяца назад

А каким модулем вы повесили аякс на корзинку?

Аватар пользователя tolykot
tolykot 2 месяца назад

gun_dose, сайт делал не я. Есть костомный модуль для этих целей. При клике появляется вьюха со списком товаров и кнопками "продолжить покупки" и "перейти в корзину".

Аватар пользователя gun_dose
gun_dose 2 месяца назад

Скорее всего в этом и проблема. Есть модуль  Commerce Ajax Add to Cart. С его помощью это решается безо всяких проблем.

Аватар пользователя VasyOK
VasyOK 2 месяца назад

Кроме кеша, может быть еще Буст и Адваг. У вас точно ничего такого нет? Точно все отключено в производительности?

Аватар пользователя tolykot
tolykot 2 месяца назад

VasyOK, да

Аватар пользователя VasyOK
VasyOK 2 месяца назад

А во вьюхе выводящей товары кеш отключен? Модулей производительности точно нет?

Аватар пользователя tolykot
tolykot 2 месяца назад

Кеш отключен

Аватар пользователя tolykot
tolykot 2 месяца назад

Решено

Чтобы не дублировались id кнопок, передал в колбек последний id.
В PHP будет так $_POST['ajax_html_ids'][0]. Данные нужны функции drupal_html_id().

var lastId = $(".view-search-product .view-content ul li:last-child").find('button').attr('id');
$.ajax({
type: "POST",
            data: {
                ajax_html_ids : {0: lastId},
            },
});

Чтобы ноды фильтровались с учетом языка пользователя, в моем случаем пришлось сделать так

$.ajax({
            url: Drupal.settings.basePath + Drupal.settings.pathPrefix + 'ajax_pager',    
});

Чтобы кнопки отрабатывали Ajax Drupal

(function ($) {
  Drupal.behaviors.commerceAjaxButton = {
    attach: function (context, settings) {
      $('.use-fast-ajax-submit:not(.ajax-processed)').addClass('ajax-processed').each(function () {
        var base = $(this).attr('id');
        Drupal.ajax[base] = new Drupal.ajax(base, this, {
          url: settings.basePath +  'commerce/ajax/submit',
          event: 'click',
          progress: {'type':'throbber'}
        });
      });
    }
  };
})(jQuery);