Данные БД из расширения

Список разделов phpBBex 2.x (заброшен) Поддержка 2.x

Описание: У вас проблемы с phpBBex 2.x и вам необходима помощь? Спрашивайте здесь!
Правила раздела: Одна тема — один вопрос или группа связанных вопросов. Обязательно формируйте внятный заголовок, максимально отражающий суть вопроса. Подробно описывайте проблему. Не забудьте указать версию phpBBex и какие моды установлены, по возможности добавьте скриншоты проблемы или ссылку на страницу с проблемой.
Модератор: Поддержка

Сообщение #1 vbnm » 28.07.2016, 22:14

Сори, туплю. Нек старые расширения, что работали в версии 2.0.1,- перестали пахать в 2.0.4.
Ну да лано, это решаемо.
Вопрос.
Нужно простое расширение с ед целью,- подсоединиться к БД и выдать сообщение об успехе, или же отказе. Пока все.
Там еще какие-то моветоны по работе с БД с помощью средств "Симфоне",- эт тож вопрос, но пока второстепенный.
Так что скиньте, если у кого есть, иль кто может через СТК быстренько сваять такое, буду признателен.
Последний раз редактировалось vbnm 29.07.2016, 03:06, всего редактировалось 1 раз.
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #2 Sumanai » 29.07.2016, 01:11

Соединение с БД уже есть, зачем ещё одно?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #3 vbnm » 29.07.2016, 01:56

Sumanai:Соединение с БД уже есть, зачем ещё одно?
мож. не правильно выразился
допустим мне нужно сначала:

Спойлер
Код: Выделить всё
$link = mysql_connect('localhost', 'root', '');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
echo 'Ура successfully';


а затем:

Спойлер
Код: Выделить всё
printf ("<br>");

mysql_select_db("phpbbex2.0.3",$link);
$result = mysql_query("SELECT * FROM phpbb_users, phpbb_posts",$link);

$myrow = mysql_fetch_array($result);

do
{
printf ("%s<br>%s<br><br>",$myrow['username'],$myrow['post_text']);

}
while ($myrow = mysql_fetch_array($result));



mysql_close($link);

вроде все перед глазами, а не догоняю
смотрю, как это делается в других расширениях и не врубаюсь
некоторые креативят доп. папки с доп файлами (Коо, Джоб), нек все прописывают в Ивент
все же разбросанно по файлам и в голове общей картинки не возникает, что и откуда береться и куда затем идет

Мне просто нужно понять на простом примере с нуля
Допустим задание:
- Вытащить из таблицы юзер все ники.

для того, чтобы затем пошагово лопатить те расширения, которые почему-то не пашут
а там все начинается с этого,- имеет ли расширение доступ к БД, а уж потом смотреть выборку данных
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #4 Sumanai » 29.07.2016, 02:01

Код: Выделить всё
$result = mysql_query("SELECT * FROM phpbb_users, phpbb_posts",$link);
Во- первых, нужно добавить в зависимости БД, во- вторых, использовать стандартные команды для выборки.
Ещё раз- подключаться не нужно, выбирать БД не нужно, всё уже сделано.
vbnm:все же разбросанно по файлам и в голове общей картинки не возникает, что и откуда берётся и куда затем идет
Прочти мануал с гуру.
vbnm:для того, чтобы затем пошагово лопатить те расширения, которые почему-то не пашут
Всё должно работать. Какие расширения не работают?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #5 vbnm » 29.07.2016, 02:11

Sumanai:Во- первых, нужно добавить в зависимости БД, во- вторых, использовать стандартные команды для выборки.
Ещё раз- подключаться не нужно, выбирать БД не нужно, всё уже сделано.
это я понимаю, просто привел, как пример азов
так же понимаю, как работать с Ивентами в шаблонах ХТМЛ
но, как скажем, сделат выборку из БД,- тут затык на первом шаге,- проверит, имеет ли расширение доступ к БД
т.е попадаю ли я в БД из своего расширения

а не пашет:
"name": "ppk/bb3topics",
Спойлер
"type": "phpbb-extension",
"description": "Расширение добавляет возможность вывода новых тем, объявлений, голосований, просматриваемых, случайных, 'персональных', важных, прилепленных и популярных тем на страницах форума",
в 2.0.1 работает нормально, а в 2.0.4 нет.

Добавлено спустя 2 минуты 30 секунд:
Вот это не понимаю,-
$this->auth = $auth;
$this->config = $config;
$this->db = $db;

вроде эти три параметра должны давать желаемое

Добавлено спустя 2 минуты 13 секунд:
В стандартном расширении, кот-е делается средствами СТК нет подключения к БД
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #6 Sumanai » 29.07.2016, 02:50

vbnm:,- проверит, имеет ли расширение доступ к БД
Не нужно. Если нет доступа к БД, до расширения дело не дойдёт, форум окочурится раньше.
vbnm:вроде эти три параметра должны давать желаемое
В общем объяснение работы расширений- это отдельная статья, было бы время, написал бы.
В общем и целом зависимости прописываются в /config/services.yml в arguments:- этот файл с настройками поясняет, какие зависимости требуются каждому классу в расширении.
Нижеследующий код подключает только БД:
Код: Выделить всё
services:
    vendor.extName.listener:
        class: vendor\extName\event\listener
        arguments:
            - @dbal.conn
        tags:
            - { name: event.listener }
Потом движок из этого файла вызывает нужные классы по наступившим событиям, например, /event/listener.php для событий движка или там крон. В конструктор этого класса передаются аргументы из services.yml, которые мы прописали. Необходимо получить эти аргументы и сохранить как переменные класса.
Нижеследующий код-пример для файла listener это делает:
Код: Выделить всё
<?php

namespace vendor\extName\event;

class listener
{
    // Делаем переменную класса защищённым
    protected $db;

    // Конструктор, получающий ссылку на экземпляр класса БД
    public function __construct(
        \phpbb\db\driver\driver_interface $db
    ) {
        // Сохраняем полученный экземпляр в переменную класса
        $this->db = $db;
    }
Так же в listener в специальной функции прописывается, на какие события движка мы подписываемся. Движок будет вызывать наш класс по наступлению нужных нам событий.
Например, данный код скажет движку вызывать наш класс после вызова функции page_header
Код: Выделить всё
    static public function getSubscribedEvents()
    {
        return array(
            'core.page_header_after'            => 'my_function',
        );
    }
Ну и само собой в классе listener должна существовать эта функция и быть доступной для вызова. Аргументом этой функции является массив $event с переменными движка, уникальные для каждого события. Их можно изменять, а можно и забить на них :smile:
Вот пример
Код: Выделить всё
    public function my_function($event)
    {
        // Здесь доступна наша $this->db, с которой можно делать выборки с синтаксисом движка phpBB.

    }
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #7 vbnm » 29.07.2016, 02:58

Sumanai, попробую догнать днем, счас чет бошка со :sad: всем уже не варит :biggrin:

А статью,- да, тебе лучше написать и желательно с простыми примерами по поводу событий ядра.
С событиями в шаблоне, как-то все просто, обозвал файл событием и твори в нем все, что хошь )))
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #8 Sumanai » 29.07.2016, 03:00

vbnm:а не пашет:
Ах да, оно работает. Просто там заумная настройка, так же нужно включить право доступа, в теме расширения у разработчика всё сказано:
http://www.ppkbb3cker.ru/viewtopic.php?f=67&t=3926
У меня на https://sumanai.ru/forum/ сейчас для зарегистрированных он должен работать.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #9 vbnm » 29.07.2016, 03:04

Sumanai:. Просто там заумная настройка, так же нужно включить право доступа, в теме расширения у разработчика всё сказано:
дык я не первый день его юзаю
даж пытаюсь перелопатить под свой стиль, но вот вышла затычка и подумал, что проще будет вытащить оттуль только нужное
а тут на-те, приходится с азов начинать и врубаться, как это все пашет

Добавлено спустя 4 минуты 17 секунд:
вообще, как в анекдоте про ишака и обезъяну с этим переходом на Симфони:
- "процесс все тот же, только писанины стало больше" )))
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #10 Sumanai » 29.07.2016, 03:17

vbnm:вообще, как в анекдоте про ишака и обезьяну с этим переходом на Симфони:
- "процесс все тот же, только писанины стало больше" )))
И безопаснее и более совместим и не требует правок в файлах.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #11 vbnm » 02.08.2016, 09:05

Sumanai:/event/listener.php для событий движка или там крон.
Так этот фаил отвечает только за Ивенты Ядра?
А Ивенты шаблона он не трогает.
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #12 Sumanai » 02.08.2016, 09:11

vbnm:Так этот фаил отвечает только за Ивенты Ядра?
Да. Хотя конечно можно наворотить страшную структуру, но большинство располагает там события ядра.
vbnm:А Ивенты шаблона он не трогает.
Он их может заполнять данными. То есть в шаблоне есть {MY_DATA}, а в листенёре определяется её содержимое
Код: Выделить всё
$this->template->assign_vars(array(
   'MY_DATA'   => $my_data,
));
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #13 vbnm » 02.08.2016, 09:11

а сам
vbnm:listener
при этом является еще и классом?

Добавлено спустя 4 минуты 55 секунд:
Sumanai:Он их может заполнять данными. То есть в шаблоне есть {MY_DATA}, а в листенёре определяется её содержимое
ну, это то логично, а то нафига все эти танцы под водой, шоп потом не было видно результатов)))
с помощью Лиснера мы проводом операции внутри ядра, а потом выводим через ентот мостик в шаблон, если данные нам нужны публично
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #14 Sumanai » 02.08.2016, 09:25

vbnm:при этом является ещё и классом?
Да, это класс, на что как бы намекает его шапка. Впрочем, в 3.1 почти все файлы php являются классами в своих пространствах имён, только разве что переводы являются plain php.
vbnm:с помощью Лиснера мы проводом операции внутри ядра, а потом выводим через ентот мостик в шаблон, если данные нам нужны публично
Ага. Но это когда нужны свои данные на страницах форума.
Если нужна своя страница, то делают контролёр, который запускается на отдельной странице (цах).
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #15 vbnm » 02.08.2016, 12:43

угум, надо докумекать, от простого к сложному
создам простое расширение с привязкой с событием в шаблоне, потом попробую закинуть в него данные из лиснера
в виде простой переменной, потом уже моно разбираться с событиями ядра
надеюсь тут не обязательно должен быть массив
Sumanai:array(
'MY_DATA'
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #16 Sumanai » 02.08.2016, 13:18

vbnm:надеюсь тут не обязательно должен быть массив
Можно использовать любые поддерживаемые движком способы задания переменных шаблона.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #17 vbnm » 02.08.2016, 14:14

не вышло, че-то опят не догоняю
создал расширение
задал событие в шаблоне "overall_header_navbar_before" с созданием файла
все норм, работает
а вот с лиснера ниче не могу туда закинуть

Добавлено спустя 6 минут 53 секунды:
Sumanai:$this->template->assign_vars(array(
   'MY_DATA'   => $my_data,
));
такс, вот это обязательно быть внутри функции?
типо:
Код: Выделить всё
public function ляляля()
{
$this->template->assign_vars(array(
   'MY_DATA'   => $my_data,
));
}

Добавлено спустя 14 минут 59 секунд:
Sumanai, может покажешь
вот мой Лиснер сейчас
Спойлер
Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - qwer
* @copyright (c) 2016 vbnmD
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace vbnm\mycql\event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
* Event listener
*/
class listener implements EventSubscriberInterface
{
/**
* Assign functions defined in this class to event listeners in the core
*
* @return array
* @static
* @access public
*/
   static public function getSubscribedEvents()
   {
      return array(
      );
   }

   /** @var \phpbb\template\template */
   protected $template;

   //** @var string phpbb_root_path */
   protected $phpbb_root_path;

   /**
   * Constructor
   */
   public function __construct($phpbb_root_path, \phpbb\template\template $template)
   {
      $this->phpbb_root_path = $phpbb_root_path;
      $this->template = $template;
   }
}

что и где в нем писать, чтобы затем вывести через overall_header_navbar_before, ну скажем "Привет!"
?
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #18 Sumanai » 02.08.2016, 14:46

vbnm:такс, вот это обязательно быть внутри функции?
А как ещё?
Нужна функция, подписанное на какое- нибудь событие.
vbnm:что и где в нем писать, чтобы затем вывести через overall_header_navbar_before, ну скажем "Привет!"
Нужны ещё файлы конфига для подключение зависимости шаблона.
Проще сгененировать каркас.
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

Сообщение #19 vbnm » 02.08.2016, 14:56

Sumanai:Проще сгенерировать каркас
ну так вроде через СТК все это и делается?
Я это сделал, могу просто сюда в файлы запилит все расширение
Вложения
vbnm.zip
Скелет
(3.18 КБ) Скачиваний: 323
vbnm
Автор темы
Репутация: 108
С нами: 11 лет

Сообщение #20 Sumanai » 02.08.2016, 15:06

vbnm:ну так вроде через СТК все это и делается?
Там по моему настроек меньше.
vbnm:Я это сделал, могу просто сюда в файлы запилит все расширение
Конфиги не соответствуют слушателю. Зачем так сделал?
Sumanai M
Аватара
Репутация: 1677
С нами: 11 лет 2 месяца

След.

Вернуться в Поддержка 2.x