Ltim
10.Январь.2025 04:30:54
1
Здравствуйте! Есть вопрос. Почему ajax не обновляет контейнер
Делаю контейнер
<div id="edit_user_profile_{$profile.profile_id}">
<!--edit_user_profile_{$profile.profile_id}--></div>
В своем шаблоне custom_user_profiles
Пытаюсь обновить через ссылку с контроллером
<a class="cm-ajax ty-tiles__link edit_user_profile"
href="{"checkout.update_profile?profile_id=`$profile.profile_id`"|fn_url}"
data-ca-target-id="edit_user_profile_{$profile.profile_id}"
data-ca-dialog-title="{__("editing_profile_name", ['[name]' => $profile.profile_name])}"
>{__("edit")}</a>
И контроллер стандартный
if ($mode == 'update_profile') {
if (!defined('AJAX_REQUEST')) {
return [CONTROLLER_STATUS_REDIRECT, 'checkout.checkout'];
}
if (!empty($_REQUEST['profile_id'])) {
$user_profile = fn_get_user_info($auth['user_id'], true, $_REQUEST['profile_id']);
Tygh::$app['view']->assign([
'user_profile' => $user_profile,
'profile_id' => $_REQUEST['profile_id'],
'switch_after_update' => !empty($_REQUEST['switch_after_update']),
]);
}
$profile_fields = fn_get_profile_fields('O', $auth, CART_LANGUAGE, ['section' => ProfileFieldSections::SHIPPING_ADDRESS]);
$countries = fn_get_simple_countries(true, CART_LANGUAGE);
$states = fn_get_all_states();
Tygh::$app['view']->assign([
'countries' => $countries,
'states' => $states,
'profile_fields' => $profile_fields,
]);
Tygh::$app['view']->display('views/checkout/components/profile.tpl');
exit;
}
По идее Tygh::$app[‘view’]->display(‘views/checkout/components/profile.tpl’); должен был рендерить шаблон.
Делаю дебаги вижу ajax работает. В чем может быть проблема?
Если код вне блока Основное содержимое, попробуйте после cm-ajax добавить cm-ajax-full-render
А в шаблоне
views/checkout/components/profile.tpl
же нет контейнера
edit_user_profile_{$profile.profile_id}
?
Просто насколько я понимаю (могу ошибаться, поправьте), вызов ajax заменяет не содержимое внутри блока назначения, а старый блок на новый
Поэтому запрос должен возвращать что-то вида
<div id="edit_user_profile_{$profile.profile_id}">
{include file="views/checkout/components/profile.tpl"}
<!--edit_user_profile_{$profile.profile_id}--></div>
ecomlabs:
cm-ajax-full-render
век живи век делай открытия )
а я все время думал, этот класс для того, когда запрос возвращает целиком страницу - чтобы вытащить из нее нужные блоки )
Ltim
10.Январь.2025 08:02:09
5
<div class="litecheckout__profiles-list">
{foreach $user_profiles as $profile}
<div class="item">
<div class="ty-tiles litecheckout__field litecheckout__field--xsmall">
<input type="radio"
name="profile_id"
id="user_profile_{$profile.profile_id}"
class="ty-tiles__radio hidden js-lite-checkout-user-profile-radio {if !$profile.is_selectable}js-lite-checkout-edit-profile-popup-opener{else}js-lite-checkout-profile-selector{/if}"
data-ca-profile-id="{$profile.profile_id}"
value="{$profile.profile_id}"
{if $profile.profile_id == $cart.profile_id && $profile.is_selectable}checked{/if}
/>
<label id="user_profiles_{$profile.profile_id}"
class="ty-tiles__wrapper"
for="user_profile_{$profile.profile_id}"
>
<p class="ty-tiles__title">{if $auth.wholesale_user_group_id == true}{$profile.profile_name}{else}{$profile.s_address} {$profile.s_address_2}{/if}</p>
{if $profile.s_city || $profile.s_state_descr || $profile.s_zipcode}
<p class="ty-tiles__text">{if $profile.s_city}{$profile.s_city}, {/if}{if $profile.s_state_descr}{$profile.s_state_descr}, {/if}{if $profile.s_zipcode}{$profile.s_zipcode}{/if}</p>
{/if}
{if $profile.s_country_descr}
<p class="ty-tiles__text">{$profile.s_country_descr}</p>
{/if}
<div class="ty-tiles__actions">
<a class="cm-ajax cm-ajax-full-render ty-tiles__link edit_user_profile"
href="{"checkout.update_profile?profile_id=`$profile.profile_id`"|fn_url}"
data-ca-target-id="edit_user_profile_{$profile.profile_id}"
data-ca-dialog-title="{__("editing_profile_name", ['[name]' => $profile.profile_name])}"
>{__("edit")}</a>
{if !$profile.is_selectable}
<a class="cm-dialog-opener cm-dialog-auto-size cm-dialog-destroy-on-close hidden js-edit-profile-{$profile.profile_id}"
href="{"checkout.update_profile?profile_id=`$profile.profile_id`&switch_after_update=1"|fn_url}"
data-ca-target-id="edit_user_profile_{$profile.profile_id}"
data-ca-dialog-title="{__("editing_profile_name", ['[name]' => $profile.profile_name])}"
>{__("edit")}</a>
{/if}
</div>
</label>
</div>
</div>
<div id="edit_user_profile_{$profile.profile_id}">
<!--edit_user_profile_{$profile.profile_id}--></div>
{/foreach}
</div>
Так пытался. Ajax срабатывает но эффекта загрузки нет.
Ltim
10.Январь.2025 08:04:00
6
Если вызывать include и шаблон она показывает уже выбранные данные для кождого профиля. Так как не хватает profile_fields который обновляется через ajax.
Это так не работает
штука, которая вырезает result_ids и отдает их на фронт находится в классе Tygh\Ajax в __descrtuct методе.
Вот что нужно глянуть это получает ли оно там из ob_get_clean контент вашего шаблона.
Второе: в файле
views/checkout/components/profile.tpl
должен тоже быть контейнер с таким айдишником
так и есть, если есть этот класс то при аякс запросе отрендерит всю страницу и так же вернёт result_ids. Если класса нет, то рендерит только “Основное содержимое”, но не как блок, а просто как шаблончик.