Шаблоны кода 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
Если конкретно по приведенному участку кода, то:
- Избавиться от дублирования проверки условия. В одном месте проверяем и делаем все что нужно.
- В таком виде, как у вас, понять структуру массива - весьма непросто. Уверен, вы сами через месяц будете ломать голову, что где лежит. В итоге переписать можно так:
// формируем начальный массив с общими значениями
$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>';