在Drupal 7模板中获取自定义用户字段的值?

时间:2011-11-14 15:45:59

标签: php drupal user-interface drupal-7 custom-fields

我正在用drupal构建我的第一个站点。我创建了一个自定义用户字段:全名。 现在我想在我的模板中获取此fild的值,说“Hello,%username%”。 我该怎么做?

4 个答案:

答案 0 :(得分:19)

克莱夫的答案是正确的,除非您应使用field_get_items来获取字段的值。它将为您处理语言。你还应该清理价值。

function THEME_preprocess_page() {
  global $user;
  $user = user_load($user->uid); // Make sure the user object is fully loaded
  $full_names = field_get_items('user', $user, 'field_full_name');
  if ($full_names) {
    $vars['full_name'] = check_plain($full_names[0]['value']);
  }
}

如果您的网站使用Entity API模块,您还可以使用此类实体元数据包装

function THEME_preprocess_page() {
  global $user;
  $user = user_load($user->uid); // Make sure the user object is fully loaded
  $wrapper = entity_metadata_wrapper('user', $user);
  $vars['full_name'] = $wrapper->field_full_name->get(0)->value(array('sanitize' => TRUE));
}

另见Writing robust code that uses fields, in Drupal 7

答案 1 :(得分:11)

取决于您的设置/字段名称,template.php中的类似内容(模板文件的预处理功能):

function mytheme_preprocess_page() {
  global $user;
  $user = user_load($user->uid); // Make sure the user object is fully loaded

  $vars['full_name'] = $user->field_full_name[LANGUAGE_NONE][0]['value'];
}

然后在page.tpl.php

中出现类似的情况
if (isset($full_name) && !empty($full_name)) :
  echo 'Hello ' . $full_name;
endif;

请注意,如果您正在运行多语言网站,则可能需要更改LANGUAGE_NONE

答案 2 :(得分:0)

我知道很久以前就问过这个问题,但我想发布一个替代方案。看起来您要将$ variables数组中$variables['name']的字段更改为您在自定义字段中的名称field_real_name。如果使用预处理函数,则无需引入全局$user对象。您可以访问$variables数组,因此您可以获取用户信息 - 它将加载与uid(see template_preprocess_username)相关的信息:

function mythemename_preprocess_username(&$variables) {
    $account = user_load($variables['account']->uid);
    ...more code will go here in a moment
}

如果您dpm($account)(或kpr($account),如果您未使用devel),您将看到您可以访问所有用户信息,而无需使用全局$user对象。

然后,您可以将$variables['name']的输出更改为field_real_name,如下所示:

function mythemename_preprocess_username(&$variables) {

  // Load user information with user fields
  $account = user_load($variables['account']->uid);

  // See if user has real_name set, if so use that as the name instead
  $real_name = $account->field_real_name[LANGUAGE_NONE][0]['safe_value'];
  if (isset($real_name)) {
    $variables['name'] = $real_name;
  }
}

答案 3 :(得分:0)

我们可以在模板文件的任何位置添加以下代码。

[STAThread]
static void Main()
{
    bool result;
    var mutex = new System.Threading.Mutex(true, "UniqueAppId", out result);

    if (!result)
    {
        MessageBox.Show("Another instance is already running.");
        return;
    }

    Application.Run(new Form1());

    GC.KeepAlive(mutex);                // mutex shouldn't be released - important line
}