1. Приветствуем Вас на неофициальном форуме технической поддержки XenForo на русском языке. XenForo - коммерческий форумный движок от бывших создателей vBulletin, написанный на PHP.

1.1.0 Подключение к другой БД отличной от XenForo

Тема в разделе "Вопросы и ответы по XenForo Framework", создана пользователем lexikon, 05.12.2011.

Загрузка
  1. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    Вообщем работать работает, но не знаю верно ли(( по феншую ли? :D
    в Config.php прописал новые строчки:
    Код:
    $config['dbNew']['host'] = 'localhost';
    $config['dbNew']['port'] = '3306';
    $config['dbNew']['username'] = 'user';
    $config['dbNew']['password'] = 'pass';
    $config['dbNew']['dbname'] = 'NewDB';
    Далее открыл XenForo/Aplication.php и в фун-цию public function loadDefaultData()
    прописал после строки:
    Код:
    $this->addLazyLoader('db', array($this, 'loadDb'), $config->db);
    свою:
    Код:
    $this->addLazyLoader('dbNew', array($this, 'loadDb'), $config->dbNew);
    Далее в функцию public function loadDefaultConfig() прописал аналогично но для новой БД, получилось так:
    Код:
     'db' => array(
    'adapter' => 'mysqli',
    'host' => 'localhost',
    'port' => '3306',
    'username' => '',
    'password' => '',
    'dbname' => '',
    'adapterNamespace' => 'Zend_Db_Adapter'
    ),
      'dbNew' => array(
    'adapter' => 'mysqli',
    'host' => 'localhost',
    'port' => '3306',
    'username' => '',
    'password' => '',
    'dbname' => '',
    'adapterNamespace' => 'Zend_Db_Adapter'
      ),
    Ну и в моем аддоне конструкция $db = XenForo_Application::get('dbNew'); вроде как работает :confused: но не знаю верно ли))
    Знающих прошу помочь
     
  2. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    По идее правильно. Во всяком случае мешать работе дефолтной базы не будет.
     
  3. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    ну как видимо не мешает...ошибок не сыпет
    возник вопрос как вывести в шаблоне массив такого вида?
    Код:
    array(3) {
      [0] => array(1) {
        [0] => array(1) {
          ["COUNT(*)"] => int(161097)
        }
      }
      [1] => array(1) {
        [0] => array(1) {
          ["COUNT(*)"] => int(79694)
        }
      }
      [2] => array(1) {
        [0] => array(1) {
          ["COUNT(*)"] => int(72840)
        }
      }
    }
     
  4. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Примерно так:
    HTML:
    <div>{xen:helper dump, $variable}</div>
     
  5. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    в плане обработать его и вывести что подобает :) а именно числа 161097, 79694 и 72840
     
  6. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    Если в шабоне этот массив присутствует, то как-то так:
    HTML:
    <div>{$variable.0.count(*)}</div>
    <div>{$variable.1.count(*)}</div>
    <div>{$variable.2.count(*)}</div>
    
    Вот только я не уверен, что переменная с именем со скобками корректно обработается.
     
  7. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    А не проще этот массив обработать до необходимого вида еще до передачи его в шаблон?
     
  8. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    проще(( но не шарю как((
    вот инфа есть что c COUNT вообще не желательно работать
    http://xenforo.com/community/threads/mysql-queries-how-to-use-db-in-xenforo-small-notes.5444/
    у меня просто есть 3 запроса пока что
    Код:
     $allRec = $db->fetchAll( "SELECT COUNT(*) FROM `dbname`");
      $nbRec = $db->fetchAll( "SELECT COUNT(*) FROM `dbname` WHERE type='1'");
      $prRec = $db->fetchAll( "SELECT COUNT(*) FROM `dbname` WHERE type='0'");
    передаю просто массивом(( как его обработать подобающе? foreach?
     
  9. infis

    infis Местный

    Регистрация:
    27.06.11
    Сообщения:
    5 966
    Симпатии:
    3 548
    Версия XF:
    1.5.9
    В самих запросах можно указывать результирующее имя поля. Например:
    Код:
    SELECT COUNT(*) AS allRec FROM `dbname`
    Но еще проще использовать конструкцию вида:
    PHP:
    $rec['all'] = $db->fetchOne"SELECT COUNT(*) FROM `dbname`");
    $rec['nb'] = $db->fetchOne"SELECT COUNT(*) FROM `dbname` WHERE type='1'");
    $rec['pr'] = $db->fetchOne"SELECT COUNT(*) FROM `dbname` WHERE type='0'");
    Тогда Вы сразу получите один массив с тремя значениями, который уже будет проще использовать в шаблоне:
    HTML:
    <div>{$rec.all}</div>
    <div>{$rec.nb}</div>
    <div>{$rec.pr}</div>
    
    Ну и не забудьте его в шаблон передать.
     
    lexikon нравится это.
  10. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    огромное спасибо...попробую вечерком
     
  11. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Подключение к "левой" базе лучше осуществлять не в XenForo/Aplication.php, а в контроллере/моделе вашего дополнения.
    Иначе каждый раз после обновлений придётся таким ананизмом заниматься. http://framework.zend.com/manual/ru/zend.db.html
    Методы для данного класса можно наблюдать там же.
     
    lexikon нравится это.
  12. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    значить можно воспользоваться просто данным кодом в самом моделе аддона?
    Код:
    $db = new Zend_Db_Adapter_Pdo_Mysql(array(
    'host' => '127.0.0.1',
    'username' => 'webuser',
    'password' => 'xxxxxxxx',
    'dbname' => 'test'
    ));
    ?
    можно глуппый вопрос...необходимо ли закрывать соединения как-то, после всех манипуляций? типо mysql_close?
     
  13. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Используйте фабрику. Объект конфига доступен в реестре ксенфоро. Можно забрать оттуда.
    Нет, закрывать не надо. Читайте то, что указано по ссылке. Там есть ответы на все вопросы
     
    lexikon нравится это.
  14. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    воспользовался этим
     
  15. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Это и есть фабрика.
    Только вместо массива атрибутов подставьте объет Zend_config
     
  16. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    Зачем? Он потом все равно переводится в массив.
     
  17. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Зачем внутри кода писать атрибуты, если можно забрать из реестра объект конфига и уже выполнить метод toArray()?
     
  18. Pepelac

    Pepelac Продам луц в бутылках

    Регистрация:
    28.09.10
    Сообщения:
    1 794
    Симпатии:
    1 361
    А, упустил из виду, что там все в конфиге прописано, извиняюсь. Но если прописывать все в файле, где создается объект Зенд_Дб, тогда проще массивом.
     
  19. Desperado

    Desperado Местный

    Регистрация:
    23.10.10
    Сообщения:
    270
    Симпатии:
    98
    Версия XF:
    1.1.3
    Ну если прописывать в апликейшене, то придётся каждый раз после обновления его редактировать. Что совсем не вариант.
     
  20. lexikon

    lexikon Пользователь

    Регистрация:
    11.10.11
    Сообщения:
    65
    Симпатии:
    24
    Версия XF:
    1.1.0 Final
    Код:
            $config = new Zend_Config(
                array(
                    'database2' => array(
                        'adapter' => 'Mysqli',
                        'params' => array(
                            'host'    => 'localhost',
                            'dbname' => 'db',
                            'username' => 'user',
                            'password' => 'pass',
                        )
                    )
                )
            );
           
            $db = Zend_Db::factory($config->database2);
    работает..спасибо за советы)
    я так понимаю ничто не мешает мне указать настройки для коннекта в группе настроек в админке?
    ну предположим с точки зрения безопасности?
     

Поделиться этой страницей