Шаблоны кода PHP

интересует такой вопрос. Можно ли сделать какой-то шаблон для данного скрипта?

if ($result['role'] == "no_role") {
    $keyboard = [
                    "one_time" => false,
                    "buttons" => [
                [
                    ["action" => [
                    "type" => "text",
                    "label" => "Рассылка"],
                    "color" => "positive"]
                ]]];
} else {
    $keyboard = [
                    "one_time" => false,
                    "buttons" => [
                [
                    ["action" => [
                    "type" => "text",
                    "label" => "Помощь"],
                    "color" => "primary"]
                ],[
                    ["action" => [
                    "type" => "text",
                    "label" => "Информация"],
                    "color" => "primary"]
                ]]]; }

if ($result['role'] == "no_role") {
    $mk->send("Привет {$user_info->first_name}, рад тебя видеть.\n".
              "Список доступных команд:\n\n".
              "→ «Рассылка постов»\n".
              "→ «Помощь»\n", $keyboard, $user_id, $access_token);
} else {
    $mk->send("Привет {$user_info->first_name}, рад тебя видеть.\n".
              "Список доступных команд:\n\n".
              "→ «Рассылка постов»\n".
              "→ «Помощь»\n".
              "→ «TOOLS»", $keyboard, $user_id, $access_token); }

Так как данный код появляется N количество раз, хотелось бы его вынести и использовать по необходимости.


Ответы (2 шт):

Автор решения: Тимофей Кучербаев

Решение:

class Keyboard {
    private $keyboard;
    public function __construct($runtime) {
        $this->keyboard = array ('one_time' => $runtime, 'buttons' => array());
    }
    
    public function ButtonMore($label, $color, $i) {
        $button = [
            "action" => [
            "type" => "text",
            "label" => $label],
            "color" => $color];
        $this->keyboard['buttons'][$i][] = $button; }
    
    public function ButtonOne($label, $color) {
        $button = [
            "action" => [
            "type" => "text",
            "label" => $label],
            "color" => $color];
        $this->keyboard['buttons'][][] = $button; }
    
    public function getKeyboard () {
        return $this->keyboard; } }

$oKeyboard = new Keyboard(false);

if ($result['role'] == "no_role") {
    $oKeyboard->ButtonMore("Рассылка", "positive");
} else {
    $oKeyboard->ButtonMore("Помощь", "primary", 0);
    $oKeyboard->ButtonMore("Информация", "positive", 0);
    $oKeyboard->ButtonMore("Help", "negative", 1);
    $oKeyboard->ButtonMore("Gun", "positive", 1);
    $oKeyboard->ButtonOne("World", "negative");
}
$keyboard = $oKeyboard->getKeyboard();

На выходе получаем кнопки в таком расположении:

Помощь | Информация
Help | Gun
World
→ Ссылка
Автор решения: Максим Степанов

Если конкретно по приведенному участку кода, то:

  1. Избавиться от дублирования проверки условия. В одном месте проверяем и делаем все что нужно.
  2. В таком виде, как у вас, понять структуру массива - весьма непросто. Уверен, вы сами через месяц будете ломать голову, что где лежит. В итоге переписать можно так:
// формируем начальный массив с общими значениями
$keyboard = [
    "one_time" => false,
    "buttons" => [
        [
            [
                "action" => [
                    "type" => "text"
                ]
            ]
        ]
    ]
];

// сообщение
$msg = "Привет {$user_info->first_name}, рад тебя видеть.\n".
            "Список доступных команд:\n\n".
            "→ «Рассылка постов»\n".
            "→ «Помощь»\n";

// теперь один раз проверяем роль и дописываем массивы
if ($result['role'] == "no_role") {
    $keyboard['buttons'][0][0]['action']['label'] = "Рассылка";
    $keyboard['buttons'][0][0]['color'] = "positive";
} else {
    $keyboard['buttons'][0][0]['action']['label'] = "Помощь";
    $keyboard['buttons'][0][0]['color'] = "primary";
    $keyboard['buttons'][] = [
        [
            "action" => [
                "type" => "text",
                "label" => "Информация"
            ],
            "color" => "primary"
        ]
    ];
    $msg .= "→ «TOOLS»";    // здесь также дописываем сообщение
}

$mk->send($msg, $keyboard, $user_id, $access_token);

По поводу того, как этот участок кода использовать многократно. Все зависит от вашей архитектуры. Если вы по каким-то причинам не хотите выносить код в отдельный файл или создавать класс/классы, отвечающие за создание кнопок, то сделайте на этой же странице функцию, передавайте ей $result['role'] и $mk. Ну и вызывайте там, где нужно сколько хотите раз.

UPD. один из примеров организации кода:

<?php

//Для работы с клавиатурой создаем класс Keyboard
class Keyboard
{
    private $keyboard;
    
    // при создании объекта укажем ему runtime
    public function __construct($runtime)
    {
        $this->keyboard = array ('one_time' => $runtime, 'buttons' => array());
    }
    
    public function addButton($label, $color, $lvl)
    {
        $button = [
            "action" => [
                "type" => "text",
                "label" => $label
            ],
            "color" => $color
        ];
        $this->keyboard['buttons'][$lvl][] = $button;
    }
    
    public function getKeyboard()
    {
        return $this->keyboard;
    }
}

// Теперь где-то в коде нужны кнопки
// Создаем объект Keyboard
$oKeyboard = new Keyboard(false);

// в зависимости от роли добавляем кнопки:
if ($result['role'] == "no_role") {
    $oKeyboard->addButton("Рассылка", "positive", 0);
} else {
    $oKeyboard->addButton("Помощь", "primary", 0);
    $oKeyboard->addButton("Информация", "positive", 0);
    $oKeyboard->addButton("Help", "negative", 1);
    $oKeyboard->addButton("Gun", "positive", 1);
    $oKeyboard->addButton("World", "negative", 2);
}
// выводим массив с кнопками
$keyboard = $oKeyboard->getKeyboard();
echo '<pre>'.print_r($keyboard, true).'</pre>';
→ Ссылка