Пожалуйста, объясните схему Drupal и drupal_write_record - PullRequest
2 голосов
/ 21 апреля 2010

1) Где лучше всего заполнить новую таблицу базы данных, когда модуль впервые установлен, включен? Мне нужно пойти и получить некоторые данные из внешнего источника и сделать это прозрачно, когда пользователь устанавливает / включает мой пользовательский модуль.

Я создаю схему в {mymodule} _schema (), делаю drupal_install_schema ({tablename}); в hook_install. Затем я пытаюсь заполнить таблицу в hook_enable, используя drupal_write_record.

Я подтвердил, что таблица была создана, я не получаю ошибок при выполнении hook_enable, но когда я запрашиваю новую таблицу, я не получаю строк назад - она ​​пуста.

Вот один из вариантов кода, который я пробовал:

/**
* Implementation of hook_schema()
*/
function ncbi_subsites_schema() {
    // we know it's MYSQL, so no need to check
    $schema['ncbi_subsites_sites'] = array(
        'description' => 'The base table for subsites',
        'fields' => array(
            'site_id' => array(
                'description' => 'Primary id for site',
                'type' => 'serial',
                'unsigned' => TRUE,
                'not null' => TRUE,
            ), // end site_id
            'title' => array(
                'description' => 'The title of the subsite',
                'type' => 'varchar',
                'length' => 255,
                'not null' => TRUE,
                'default' => '',
            ), //end title field
            'url' => array(
                'description' => 'The URL of the subsite in Production',
                'type' => 'varchar',
                'length' => 255,
                'default' => '',
            ), //end url field
        ), //end fields
        'unique keys' => array(
            'site_id'=> array('site_id'),
            'title' => array('title'),
        ), //end unique keys
        'primary_key' => array('site_id'),
    ); // end schema

    return $schema;
}

Вот тут hook_install:

function ncbi_subsites_install() {
    drupal_install_schema('ncbi_subsites');
}

Вот здесь hook_enable:

function ncbi_subsites_enable() {
    drupal_get_schema('ncbi_subsites_site');

    // my helper function to get data for table (not shown)
    $subsites = ncbi_subsites_get_subsites(); 
    foreach( $subsites as $name=>$attrs ) {
        $record = new stdClass();
        $record->title = $name;
        $record->url = $attrs['homepage'];
        drupal_write_record( 'ncbi_subsites_sites', $record );
    }
}

Может кто-нибудь сказать мне, что мне не хватает?

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Я думаю, что ответ заключается в том, что drupal_write_record не предназначен для установки или включения хуков. Я думаю, что при включении или установке, вы должны написать SQL. Такое впечатление я получаю от чтения некоторых постов, в которых упоминается, что схема не доступна в этих хуках.

1 голос
/ 17 августа 2010

Прежде всего (при условии Drupal 6), drupal_write_record() не может быть вызван из hook_install (), потому что Drupal не найдет схему базы данных, определенную из модуля, который все еще будет установлен, ивключен.

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

Однако, если бы вы использовали (версию для разработки) Drupal 7, вы хотите вместо этого взглянуть на функцию db_insert().

1 голос
/ 21 апреля 2010

Если ncbi_subsites_get_subsites () отсутствует в файле .install, вам необходимо включить любой файл, входящий в его модуль. В противном случае он ничего не возвращает, в этом случае попробуйте сбросить $ subsites и выйти.

...