Привет всем. Задача вроде как несложная, но не могу найти решение. Это Telegram-бот, поэтому не всё так просто.
В базе есть таблица models
, в таблице models
есть поле photo
в которой хранится названия файла в папке на сервере.
Теперь, есть класс, который осуществляет пагинацию по всем элементам и выводит данные каждого элемента на странице.
Нужно получить поле photo
для каждой страницы.
Метод getPaginationContent
проводит разбор по всем данным в таблице и выводит их в тексте. Но поле photo
мне нужно получить в методе execute
.
Заранее спасибо!
Надеюсь, объяснил понятно, если будут вопросы - спрашивайте.
<?php
namespace Longman\TelegramBot\Commands\AdminCommands;
use Longman\TelegramBot\Commands\UserCommand;
use Longman\TelegramBot\Entities\CallbackQuery;
use Longman\TelegramBot\Request;
use TelegramBot\InlineKeyboardPagination\Exceptions\InlineKeyboardPaginationException;
use TelegramBot\InlineKeyboardPagination\InlineKeyboardPagination;
class GirlsCommand extends UserCommand
{
protected $name = 'girls';
protected $description = 'Каталог моделей - девушки.';
protected $usage = '/girls';
protected $version = '1.0.0';
protected static $per_page = 1;
public static function callbackHandler(CallbackQuery $query)
{
$params = InlineKeyboardPagination::getParametersFromCallbackData($query->getData());
if ($params['command'] !== 'girls') {
return null;
}
$data = [
'chat_id' => $query->getMessage()->getChat()->getId(),
'message_id' => $query->getMessage()->getMessageId(),
'text' => 'Empty',
];
// Using pagination
if ($pagination = self::getInlineKeyboardPagination($params['newPage'])) {
$data['text'] = self::getPaginationContent($pagination['items']);
$data['reply_markup'] = [
'inline_keyboard' => [$pagination['keyboard']],
];
}
return Request::editMessageText($data);
}
public static function getModels()
{
// Получаем список моделей с базы
return DB::getPdo()->query('SELECT * FROM `models_girls`')->fetchAll(PDO::FETCH_ASSOC);
}
public static function getPaginationContent(array $items)
{
$text = '';
foreach ($items as $row) {
$text .= "Имя: $row['id']\n";
$text .= "Параметры: $row['name']\n";
$text .= "Размер одежды: $row['message']\n";
}
return $text;
}
public static function getInlineKeyboardPagination($page = 1)
{
$models = self::getModels();
if (empty($models)) {
return null;
}
// Define inline keyboard pagination.
$ikp = new InlineKeyboardPagination($models, 'girls', $page, self::$per_page);
// If item count changes, take wrong page clicks into account.
try {
$pagination = $ikp->getPagination();
} catch (InlineKeyboardPaginationException $e) {
$pagination = $ikp->getPagination(1);
}
return $pagination;
}
public function execute()
{
$data = [
'chat_id' => $this->getMessage()->getChat()->getId(),
'text' => 'Empty',
];
/**
*
*/
if ($pagination = self::getInlineKeyboardPagination(1)) {
$data['text'] = self::getPaginationContent($pagination['items']);
$data['reply_markup'] = [
'inline_keyboard' => [$pagination['keyboard']],
];
}
return Request::sendMessage($data);
}
}
Примерно вот так:
public function execute()
{
$data = [
'chat_id' => $this->getMessage()->getChat()->getId(),
'text' => 'Empty',
];
$request = DB::getPdo()->prepare('SELECT count(*) as count FROM `models_girls`')->fetch(PDO::FETCH_ASSOC);
$pages = $request['count']/self::$per_page;
foreach($pages as $page){
if ($pagination = self::getInlineKeyboardPagination($page)) {
$data[]=[
'text'=>self::getPaginationContent($pagination['items']),
'reply_markup'=>[
'inline_keyboard' => [$pagination['keyboard']],
];
];
}
}
return Request::sendMessage($data);
}
Получаем кол-во записей, делем на количетво отображаемых на страницу, получаем кол-во страниц, проходим циклом что бы получить данные с всех страниц, и заносим в массив (тут уж не знаю в каком види вам они там нужны)
Ну или измените ваш метод self::getInlineKeyboardPagination
добавив вторым параметром кол-во записей на страницу:
public static function getInlineKeyboardPagination($page = 1, $per_page=null)
{
$per_page = empty($per_page)?self::$per_page:$per_page;
...
$ikp = new InlineKeyboardPagination($models, 'girls', $page, $per_page);
...
}
public function execute()
{
...
$request = DB::getPdo()->prepare('SELECT count(*) as count FROM `models_girls`')->fetch(PDO::FETCH_ASSOC);
...
if ($pagination = self::getInlineKeyboardPagination($request['count'])) {
...
}
...
}
Передав вторым параметров кол-во записей в базе, он вытащит сразу все данные.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Добрый вечере, уважаемые программистыПоявилась такая задача, все запросы типа:
При попытке подключения к удаленному серверу через oci_connect появляется ошибка: ORA-12514: TNS:listener does not currently know of service requested in connect descriptorПараметры...
ЗдравствуйтеУ меня генерируются страницы через ajax-запросы + history