我对Drupal来说是全新的。遗憾的是,我继承了一个非常丑陋和不正确的代码。事实上,我想实现一个正确的登录与Facebook功能,这是完全错误的实现。它试图通过他们的电子邮件地址识别用户,但是,出于某种原因,在用Facebook登录时,用户使用错误的用户登录。我想基于Facebook ID识别用户,但是,数据库中没有用于此目的的列。
结果,我实现了一个小脚本,它在表示用户的表中添加了facebook_id和facebook_token。但是,引导程序中的drupal_get_schema
函数看不到这些新列。
如果我这样做:
$schema = drupal_get_schema("users");
echo var_dump($schema["fields"]);
它显示除两个新创建的字段之外的字段。这样就初始化了SchemaCache
个对象。我假设可以缓存模式。所以我尝试了不同的东西:
$schema = drupal_get_schema("users", true);
echo var_dump($schema["fields"]);
确保调用drupal_get_complete_schema(true)
。但是,这些领域也不是这样看的。有没有办法告诉Drupal承认两个新创建的列的存在?如果不是:我该怎么办?我应该从数据库表中删除两列并分别使用db_add_field("users", "facebook_id")
和d b_add_field("users", "facebook_token")
吗?如果是这样,我应该在哪里打电话?
很抱歉,如果问题太简单或者我误解了这些技术,但我已经尝试解决这个问题几个小时而且我不知所措,因为这是我的第一个drupal / bootstrap项目和使用这些的源代码根本没帮我。
编辑:
由于在撰写本文时我没有收到任何答案,除了没有解决我的问题的工具建议,我继续在该领域进行研究。我从数据库中删除了列,以Drupal方式创建它们。我在user.module中实现了这个功能:
function user_schema_alter() {
db_add_field('users', 'facebook_id', array(
'type' => 'varchar', //was initially a bigint, but Drupal generated a query which always crashed
'length' => 20,
'not null' => TRUE,
'default' => ".", //was initially -1, but Drupal generated a query which always crashed
));
db_add_field('users', 'facebook_token', array(
'type' => 'varchar',
'length' => 300,
'not null' => TRUE,
'default' => 'unavailable',
));
}
我从altconnect.module调用它,如下所示:
$schema = drupal_get_schema("users");
if (!isset($schema["fields"]["facebook_id"])) {
user_schema_alter();
}
它创建列,但稍后将不知道这些列的存在,随后将抛出错误,因为代码将尝试重新创建它们。除了事实上我已经失去了很多时间,直到我意识到Drupal无法支持bigint
作为默认值的-1
字段,我必须得出结论,通过这个解决方案,我完全相同我最初的情况,不同的是,如果列已经存在,那么使用这个Drupal解决方案我总是会遇到异常,因为架构不会意识到它们,因此代码将始终输入if。
我不明白为什么在Drupal中这么困难而且我完全不明白为什么要尝试
db_add_field('users', 'facebook_id', array(
'type' => 'bigint',
'length' => 20,
'not null' => TRUE,
'default' => -1,
));
由于语法错误而引发异常。也许我应该离开这个项目并告诉任何考虑使用Drupal重新考虑的人:)
答案 0 :(得分:0)
我能够找到答案,至少对于Drupal 6来说。
在user.install中,我们需要执行以下操作:
//...
function user_schema() {
//...
$schema['users'] = array(
//...
'fields' => array(
//...
'facebook_id' => array(
'type' => 'varchar',
'length' => 20,
'not null' => TRUE,
'default' => ".",
),
'facebook_token' => array(
'type' => 'varchar',
'length' => 300,
'not null' => TRUE,
'default' => 'unavailable',
),
//...
),
//...
}
//...
/**
* Adds two fields (the number is some kind of version number, should be the biggest so far for the module)
*/
function user_update_7919() {
db_add_field('users', 'facebook_id', array(
'type' => 'varchar',
'length' => 20,
'not null' => TRUE,
'default' => ".",
));
db_add_field('users', 'facebook_token', array(
'type' => 'varchar',
'length' => 300,
'not null' => TRUE,
'default' => 'unavailable',
));
}
完成后,请使用admin用户登录并转到http://example.com/update.php
在那里你会看到要更新的东西。运行。如果你想知道我们为什么要做这一切,为什么我们不直接运行一些脚本,那么答案就是这就是Drupal的运作方式。它让你的生活变得复杂,但不要担心,当你等到update.php进行更新时,如果它是你的脚本需要不到一秒的时间,你可以思考生命的意义,量子力学或者你可以试着找出Drupal中这么复杂的原因你可以出去散步。再次关注时,如果运气好,update.php已完成其工作,两列应位于数据库中。