CRM / UI 2.0 / не работают хуки backend_invoice, backend_invoice.action_button Есть решение

Написал плагин для генерации накладной из счета. Суть проста - есть счет - в нем есть специальный шаблон, в котором мне нужно только заменить слово "Счет" на "Наклданая" и сгенерировать PDF. В разделе счета, при открытии любого оплаченного счета мне нужно добавить кнопку "Распечатать накладную" (как я хочу - пример на скрине).

В plugin.php

<?php
return array(
    'name' => 'Waybill',
    'description' => 'Добавляет кнопку для скачивания накладной на странице счета',
    'version' => '1.0.0',
    //'img' => 'img/crmWaybill.png',
    'handlers' => array(
        //'backend_invoice' => 'actionButton', // пробовал и так
        'backend_invoice.action_button' => 'actionButton', // и так
    ),
);

В самом файле плагина

<?php
class crmWaybillPlugin extends waPlugin {

    public function actionButton($params) {
        ...
        return 'КОД КНОПКИ';
    }
}

но не работает. Я не знаю в чем причина.

/wa-apps/crm/templates/actions/invoice/InvoiceId.html тут код - вроде должно работать, но почему-то не работает

 <!-- plugin hook: 'backend_invoice.action_button' -->
{* @event backend_invoice.%plugin_id%.action_button *}
{if !empty($backend_invoice)}{foreach $backend_invoice as $_}{ifset($_.action_button)}{/foreach}{/if}

Подскажите пожалуйста как сделать правильно

5 ответов

  • 0
    ITSolutions 17 февраля 2025 19:42 #

    Вы документацию читали?

    public function actionButton($params)
    {
        return [
            'action_button' => 'кнопка',
        ];
    }
    

    и в plugin.php

    'handlers' => array(
        'backend_invoice' => 'actionButton',
    ),
    

  • 0
    konstantinsorokin 17 февраля 2025 20:00 #

    Читал, сделал как вы написали, но не отображается кнопка по прежнему.

    <?php
    class crmCrmWaybillPlugin extends waPlugin {
        public function actionButton($params) {
            $invoice_id = $params['invoice']['id'];
            $download_url = wa()->getAppUrl('crm') . 'invoice/' . $invoice_id . '/download-waybill/';
            return [
                //'action_button' => '<a href="' . $download_url . '" class="button green" style="margin-left: 10px;">Скачать накладную</a>', // мой код не работает
                'action_button' => '<input class="button" type="button" value="' . _wp('My action button') . '">', // код документации не работает
            ];
        }
    }

  • 2
    Михаил Ушенин 18 февраля 2025 09:17 # Решение

    Это в целом правильный вариант, он должен работать:

    'backend_invoice' => 'actionButton',

    Но для лучшей читаемости кода желательно назвать метод по названию хука:

    'backend_invoice' => 'backendInvoice',

    И в файле plugin.php, и в основном классе плагина надо использовать одинаковое имя метода: либо в обоих местах ваш вариант actionButton, либо в обоих местах вариант из примера выше — backendInvoice. Какое имя для метода вы выберете, не влияет на работу плагина — это имеет значение только для удобства чтения программного кода.

    Вот так делать неверно в данном случае:

    return 'КОД КНОПКИ';

    Обработчик этого хука должен возвращать массив, а не строку. В ключе массива 'action_button' надо вернуть HTML-код кнопки, которую вы хотите показывать на странице просмотра счёта:

    return [
        'action_button' => '<input class="button" type="button" value="' . _wp('My action button') . '">',
    ];

    Если у вас даже с такими изменениями плагин не работает, очистите кеш в приложении «Настройки» и включите там же режим отладки, если он у вас ещё не включён.

  • 0
    konstantinsorokin 18 февраля 2025 13:31 #

    Спасибо за ответ, но к сожалению вариант не рабочий.

    1. Режим отладки включен разумеется.
    2. Удаление wa-cache не помогает.

    Или есть какой-то баг в приложении что не работает, или я что-то делаю не так.

  • 0
    konstantinsorokin 18 февраля 2025 14:25 #

    Так и не понял что я поменял - но все заработало. Вопрос закрыт. Все выражаю благодарность.

Эта тема в архиве. Добавление комментариев к ней отключено.