Drupal 7: Отображение внешней SQL-таблицы в виде разбитого на страницы списка


Следующий код хорошо работает для отображения разбитого на страницы списка пользователей Drupal:

function generate_list() {
  $query = db_select('users', 'u')
    ->extend('PagerDefault')
    ->fields('u', array('name', 'uid'))
    ->orderBy('created', 'DESC')
    ->limit(20);

  $result = $query->execute();

  $list = array();
  foreach ($result as $row) {
    $list[] = sprintf('<a href="/user.php?id=DE%u">%s</a>', $row->uid, $row->name);
  }

  $theme_args = array('items' => $list, 'type' => 'ul');
  return theme('item_list', $theme_args) . theme('pager');
}

Но когда я пытаюсь извлечь данные из внешней SQL-таблицы под названием pref_users (мой сайт включает карточную игру, и некоторые пользователи приходят извне - через Facebook и другие социальные сети, поэтому мне приходится поддерживать некоторые SQL-таблицы, отличные от Drupal, в той же базе данных, где хранятся данные Drupal) с помощью этого кода:

function generate_list() {
  $query = db_select('pref_users', 'u')
    ->extend('PagerDefault')
    ->fields('u', array('first_name', 'id'))
    ->orderBy('created', 'DESC')
    ->limit(20);

  $result = $query->execute();

  $list = array();
  foreach ($result as $row) {
    $list[] = sprintf('<a href="/user.php?id=%s">%s</a>', $row->id, $row->first_name);
  }

  $theme_args = array('items' => $list, 'type' => 'ul');
  return theme('item_list', $theme_args) . theme('pager');
}

Тогда я, к сожалению, получаю ошибка:

PDOException: SQLSTATE[42P01]: Undefined table: 7 
ERROR: relation "drupal_pref_users" does not exist at character 67: 
SELECT COUNT(*) AS expression FROM (SELECT 1 AS expression 
FROM {pref_users} u) subquery; Array ( ) in method 
PagerDefault->execute() (line 75 in file includes/pager.inc).

Кто-нибудь, пожалуйста, знает способ сказать Drupal, чтобы он получал данные просто от pref_users, а не от {pref_users}, как, кажется, предполагается выше?

 1
Author: Free Radical, 2011-03-25

1 answers

Волнистые скобки используются для экранирования имен таблиц в drupal. Для случаев, когда у вас несколько сайтов в одной базе данных.

Я предполагаю, что у вас есть префикс бд, настроенный для всех ваших таблиц Drupal как drupal_

Вы можете установить это для подключения к бд перед $result = $query->execute(); с помощью метода setprefix

Что-то вроде

 $query->setprefix(array(
     'default'   => 'drupal_',
     'perf_users'     => ''));

непроверенный код

Может это сделать. Однако вы, скорее всего, захотите изменить свой settings.php файл и установите там префиксы таблиц

 1
Author: Jeremy French, 2011-03-25 13:58:20