Добавить товары в избранное

Всем привет.

У меня товары выводятся из базы данных в таблицы
{var $services = '!hookservicemain' | snippet}
{foreach $services as $service}
    <hr>
    <div class='service'>
        <table class='service'>
            <tr>
                <td class='service' id="name", value="{$service.name}"><b>{$service.name}</b></td>
                <td class='service' id="id_service", value="{$service.id_service}">{$service.id_service}</td>
                <td class='button category'>Категория: {$service.category}</td>
            </tr>
            <tr>
                <td class='service' id="cost", value="{$service.price}">Стоимость: {$service.price} ₽</td>
                <td class='service'>{$service.phone}</td>
                <td class='button'></td>
            </tr>
            <tr>
                <td class='service'>Время: {$service.time} минут</td>
                <td class='service' id="address", value="{$service.address}">{$service.address}</td>
                <td class='button'>
                     [[AjaxSnippet?
                        &snippet=`addfavorites`
                        &as_mode=`onclick`
                        &wrapper=`tpl.Favorite`
                    ]]
                </td>
            </tr>
            <tr>
                <td class='service'>Компания: {$service.mobilephone}</td>
                <td class='service'>{$service.city}</td>
                <td class='button'><button class="center">Записаться</button></td>
            </tr>
        </table>
    </div>
{/foreach}
Нужно при нажатии кнопки добавлять товар в таблицу в базе данных. Но я не понимаю, как получить данные именно того товара, у которого была нажата кнопка. Пыталась реализовать с помощью AjaxSnippet, но сниппет не вызывается.
Сниппет addfavorites (пока без запроса):
<?php
$modx->log(xPDO::LOG_LEVEL_ERROR,'Добавить в избранное');

$name = $hook->getValue('name');
$id_service = $hook->getValue('id_service');
$cost = $hook->getValue('cost');
$address = $hook->getValue('address');
$id_user = $modx->user->get('id');

$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($name, 1));
$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($id_service, 1));
$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($cost, 1));
$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($address, 1));
$modx->log(xPDO::LOG_LEVEL_ERROR, print_r($id_user, 1));

return true;
Чанк tpl.Favorite:
<button id="[[+key]]" class="center">В избранное</button>
Помогите, пожалуйста.
P.S. Я понимаю, что есть готовые компоненты, но у меня совсем нет времени в них разбираться
Амина
16 мая 2021, 12:01
modx.pro
583
0

Комментарии: 3

Николай Савин
16 мая 2021, 13:34
0
Отлавливайте клик средствами JS. Передайте куда нибудь в data атрибут идентификатор товара.
После того как поймаете клик по нужному товару — сформируйте ajax запрос на сайт.
Ловите запрос через плагин на событие onHandleRequest и далее уже средствами php как-нибудь запоминайте этот товар как избранный
    Евгений Шеронов
    16 мая 2021, 16:22
    0
    Тут человек AjaxForm путает с AjaxSnippet, поэтому твой совет не поможет (но комментарий привлёк меня, так что косвенно ты тоже помогаешь :))
    Там нет никакой формы и вообще ничто никуда не отправится.

    При этом сниппет addfavorites ведёт себя как хук для FormIt (хотя вполне себе можно без него, просто оперируя POST данными).

    Следовательно вызов в таблице должен быть таким:
    (чтобы не мешать синтаксис, ведь люди старались сделать всё изначально на Fenom)
    {$_modx->runSnippet('!AjaxForm', [
        'snippet' => 'FormIt',
        'form' => 'tpl.Favorite',
        'hooks' =>  'addfavorite',
        'fi.name' => $service.name,
        'fi.id_service' => $service.id_service,
        'fi.cost' => $service.cost,
        'fi.address' => $service.address
    ])}
    Параметры fi.name и т.д. нужны, чтобы прокинуть данные в форму. См. modx.pro/components/3342

    А чанк tpl.Favorite переделать хотя бы так:
    <form action="" method="post" class="ajax_form">
        <input type="hidden" name="name" value="[[+fi.name]]">
        <input type="hidden" name="id_service" value="[[+fi.id_service]]">
        <input type="hidden" name="cost" value="[[+fi.cost]]">
        <input type="hidden" name="address" value="[[+fi.address]]">
        <button type="submit" class="center">В избранное</button>
    </form>
    Это, конечно, не отменяет множество проблем в коде автора.
    Например строка $id_user = $modx->user->get('id'); будет работать только для авторизованных пользователей (для админа когда он проверяет). А на пользователях-гостях вполне себе будет падать.

    Ну и какой-то странный формат HTML вёрстки с запятой и разными кавычками)
    <td class='service' id="cost", value="{$service.price}">Стоимость: {$service.price} ₽</td>

    Мне немного страшно и интересно, как же будет выглядеть запрос, который положит данные в базу.
      Амина
      17 мая 2021, 16:04
      0
      Спасибо, что помогаете! Это мой первый и возможно последний опыт работы в modx и вообще в вебе (раньше только небольшие учебные задачки).

      AjaxSnippet использовала, потому что хотела вызывать сниппет по нажатию на кнопку и увидела такое решение на форуме modx.ru/vopros-otvet/info/1883/ Видимо не так поняла)

      Верстка тоже корявая, потому что глаз уже замылен.

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

      Еще раз спасибо!
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3