У модуля commerce_order есть хук тема, определяющая подсчет суммы
<?php
/**
* Implements hook_theme().
*/
function commerce_order_theme($existing, $type, $theme, $path) {
return [
'commerce_order_total_summary' => [
'variables' => [
'order_entity' => NULL,
'totals' => NULL,
],
],
];
}
?>
И соответсвенно есть template twig, который выводит это все дело. (commerce-order-total-summary.html.twig)
<?php
{#
/**
* @file
* Default order total summary template.
*
* Available variables:
* - attributes: HTML attributes for the wrapper.
* - order_entity: The order entity.
* - totals: An array of order totals values with the following keys:
* - subtotal: The order subtotal price.
* - adjustments: The adjustments:
* - type: The adjustment type.
* - label: The adjustment label.
* - amount: The adjustment amount.
* - percentage: The decimal adjustment percentage, when available. For example, "0.2" for a 20% adjustment.
* - total: The order total price.
*
* @ingroup themeable
*/
?>
Вывод:
<?php
{% for adjustment in totals.adjustments %}
<div class="order-total-line order-total-line__adjustment order-total-line__adjustment--{{ adjustment.type|clean_class }}">
<span class="order-total-line-label">{{ adjustment.label }} </span><span class="order-total-line-value">{{ adjustment.amount|commerce_price_format }}</span>
</div>
{% endfor %}
?>
Хука препроцессинга у данного модуля нету, чтобы я variables.totals подправил
Мне нужно чтобы вместо adjustment.label встал элемент формы , вот так я его задаю:
<?php
Функция parcel_order_form_views_form_commerce_cart_form_default_alter {
$form['is_extra_protection'] = [
'#type' => 'checkbox',
'#title_display' => 'before',
"#weight" => 0,
'#title' => t('Extra Protection'),
'#default_value'=>$default,
'#ajax' => [
'callback' => 'parcel_order_change_extra_protection',
'disable-refocus' => TRUE,
'effect' => 'fade',
'progress' => [
'type' => 'throbber',
],
],
];
}
?>
И выводить он отдельно, а мне нужно чтобы он в labels провалился.
Само отображение order_totals подгружается из view в футере.
По верстке все корректно, только нужно прокинуть одно в другое.
Как раз таблица это список полей с view, js-field это то что мы прокинуть как checkbox, и третье это подгруженный компонент в футере view.
Как и на каком уровне мне прокинуть корректно вообще не понимаю.
Либо смотреть в сторону view, либо пытаться ловить preprocessing поля, либо что то думать с переопределением commerce_order_total_summary
Подскажите пожалуйста
Комментарии
У вас там довольно серьёзные правки планируются, поэтому я бы советовал полностью переопределить плагин футера таблицы. Вот это стандартный https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/modules/order...
А вам надо сделать свой похожий.
Насколько я понял нужно отнаследоваться от
<?phpclass OrderTotal extends AreaPluginBase {?>
, будет<?phpclass MyCustomOrderTotal extends AreaPluginBase {?>
Вот создам этот класс и дальше что, где его заменить, или в самом вью, где вывожу order total нужно заменить на свой?
Либо скиньте пожалуйста про плагины инфу
Надо поменять айдишник плагина и тогда в настройках вьюса вместо стандартного плагина можно будет выбрать этот. Про плагины инфу можно смотреть на https://niklan.net/
Получилось, осталось понять, как вставить элемент формы, если нету элемента формы $form
<?php
$form['is_extra_protection'] = [
'#type' => 'checkbox',
'#title_display' => 'before',
"#weight" => 0,
'#title' => t('Extra Protection'),
'#default_value'=>$default,
'#ajax' => [
'callback' => 'parcel_order_change_extra_protection',
'disable-refocus' => TRUE,
'effect' => 'fade',
'progress' => [
'type' => 'throbber',
],
],
];
}
$form['#attached']['library'][] = 'parcel_order/parcel_order_cart_form';
?>
На этапе рендеринга, просто вставлять так и выводить, и он поймет что это checkbox?
<?php public function render($empty = FALSE) {
if (!$empty || !empty($this->options['empty'])) {
foreach ($this->view->argument as $name => $argument) {
// First look for an order_id argument.
if (!$argument instanceof NumericArgument) {
continue;
}
if (!in_array($argument->getField(), ['commerce_order.order_id', 'commerce_order_item.order_id'])) {
continue;
}
/** @var \Drupal\commerce_order\Entity\OrderInterface $order */
if ($order = $this->orderStorage->load($argument->getValue())) {
$order_total = $order->get('total_price')->view([
'label' => 'hidden',
'type' => 'commerce_order_total_summary',
'weight' => $this->position,
]);
$order_total['#prefix'] = '<div data-drupal-selector="order-total-summary GEEEE">';
$order_total['#suffix'] = '</div>';
kpr($order_total);
return $order_total;
}
}
}
return [];
}?>