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 answers
Волнистые скобки используются для экранирования имен таблиц в drupal. Для случаев, когда у вас несколько сайтов в одной базе данных.
Я предполагаю, что у вас есть префикс бд, настроенный для всех ваших таблиц Drupal как drupal_
Вы можете установить это для подключения к бд перед $result = $query->execute();
с помощью метода setprefix
Что-то вроде
$query->setprefix(array(
'default' => 'drupal_',
'perf_users' => ''));
непроверенный код
Может это сделать. Однако вы, скорее всего, захотите изменить свой settings.php файл и установите там префиксы таблиц