Вопрос по кастомизации модуля, и общение между двумя модулями

Главные вкладки

Аватар пользователя maximturchenko maximturchenko 9 марта 2022 в 9:36

У модуля 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

Подскажите пожалуйста

Лучший ответ

Комментарии

Аватар пользователя gun_dose gun_dose 9 марта 2022 в 9:53
2

У вас там довольно серьёзные правки планируются, поэтому я бы советовал полностью переопределить плагин футера таблицы. Вот это стандартный https://git.drupalcode.org/project/commerce/-/blob/8.x-2.x/modules/order...
А вам надо сделать свой похожий.

Аватар пользователя maximturchenko maximturchenko 9 марта 2022 в 10:00

Насколько я понял нужно отнаследоваться от <?phpclass OrderTotal extends AreaPluginBase {?>, будет <?phpclass MyCustomOrderTotal extends AreaPluginBase {?>

Вот создам этот класс и дальше что, где его заменить, или в самом вью, где вывожу order total нужно заменить на свой?

Либо скиньте пожалуйста про плагины инфу

Аватар пользователя gun_dose gun_dose 9 марта 2022 в 15:26
1

Надо поменять айдишник плагина и тогда в настройках вьюса вместо стандартного плагина можно будет выбрать этот. Про плагины инфу можно смотреть на https://niklan.net/

Аватар пользователя maximturchenko maximturchenko 9 марта 2022 в 22:43

Получилось, осталось понять, как вставить элемент формы, если нету элемента формы $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 [];
  }
?>