Вызов переменной в foreach с метода

205
30 сентября 2017, 23:35

Привет всем. Задача вроде как несложная, но не могу найти решение. Это 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);
    }
}
Answer 1

Примерно вот так:

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'])) {
        ...
    }
    ...
}

Передав вторым параметров кол-во записей в базе, он вытащит сразу все данные.

READ ALSO
Перенаправленние на GET запрос / .htaccess

Перенаправленние на GET запрос / .htaccess

Добрый вечере, уважаемые программистыПоявилась такая задача, все запросы типа:

214
Подключение к БД Oracle (ORA-12514)

Подключение к БД Oracle (ORA-12514)

При попытке подключения к удаленному серверу через oci_connect появляется ошибка: ORA-12514: TNS:listener does not currently know of service requested in connect descriptorПараметры...

371
Использование единственного Redirect&#39;а к динамическим страницам

Использование единственного Redirect'а к динамическим страницам

ЗдравствуйтеУ меня генерируются страницы через ajax-запросы + history

186
preg_replace заменить ближайшее вхождение

preg_replace заменить ближайшее вхождение

Есть выражение: <xx></xx><xx><tt>ZZZ</tt></xx>

207