[решено] Не работают токены для дефолтных полей профиля в WebForms

Главные вкладки

Аватар пользователя yorm yorm 30 октября 2009 в 20:33

На сайте через модуль WebForm в поля формы по умолчанию подставляются различные данные о пользователе, например e-mail через токен %useremail. И это работает. Работают также токены вида %get[ex], переменная из адресной строки легко подставляется.
При попытке же подставить любое поле из профиля — в форму подставляется сам токен.

В webform написано понятным по белому:
If you are using the profiles module, you can also access all profile data using the syntax %profile[form_name]. If you for example have a profile value named profile_city, add the variable %profile[profile_city].

Но все токены типа %profile[profile_surname], %profile[profile_name] и прочие выводятся в форме без подстановки значения. Просто, например, "%profile[profile_surname]".
Названия полей в профилях проверял, изменял, не помогает.

Никто не сталкивался?
Помогите, пожалуйста. Спасибо.

[решение]
Так как мне было очень нужно, на второй день нашел, как это правится ручными изменениями в модуле.
Информация [##604958]отсюда[/##]. Проблема, как выяснилось, нередкая.

Решается методом замены в файле webform.module вот этого:

 // User replacements.
  if (!array_key_exists('%username', $replacements['unsafe'])) {
    $replacements['unsafe']['%username'] = isset($user->name) ? $user->name : '';
    $replacements['unsafe']['%useremail'] = isset($user->mail) ? $user->mail : '';
    $replacements['unsafe']['%ip_address'] = ip_address();
    if ($user->uid && module_exists('profile')) {
      profile_load_profile($user);
    }
    $special_tokens['unsafe']['%profile'] = $user;

    // Doesn't really belong here with user things, but works.
    $special_tokens['unsafe']['%server'] = $_SERVER;
  }

На вот это:

  // User replacements.
  if (!array_key_exists('%username', $replacements['unsafe'])) {    $replacements['unsafe']['%username'] = isset($user->name) ? $user->name : '';
    $replacements['unsafe']['%useremail'] = isset($user->mail) ? $user->mail : '';
    $replacements['unsafe']['%ip_address'] = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];

    // Doesn't really belong here with user things, but works.    
    $special_tokens['unsafe']['%server'] = $_SERVER;
  }
  // if we have a user and module profile and the %profile key doesn't exist
  if ( $user->uid && module_exists('profile') && !array_key_exists('%profile', $replacements['unsafe']) ) {
    profile_load_profile($user);
    $special_tokens['safe']['%profile'] = $user;
  }

И все работает. Ждем обновлений.

Комментарии

Аватар пользователя PanDa777 PanDa777 31 октября 2009 в 11:43

А разве что-то поменялось?

Я вижу по существу только unsafe->safe. А это, вообще-то, для безопасности нехорошо, наверное...

Аватар пользователя yorm yorm 31 октября 2009 в 12:29

ансейф - небезопасный, сейф - безопасный, ансейф поменялся на сейф. это ужасно.

Да. Что-то поменялось. Теперь все работает в глючном модуле.
Не думаю, что это влияет на безопасность.

В любом случае я нифига не шарю в создании модулей для друпал, в апи друпала и прочем. Smile Пока что разбираюсь на уровне использования модулей. И на уровне решения проблем, которые так и прут.

Аватар пользователя PanDa777 PanDa777 1 ноября 2009 в 9:28

Вопрос в другом. Что изменилось? Почему вдруг заработало? Ибо на Drupal.org в патче используется ключ unsafe. Если safe поменять на unsafe, то перестаёт работать?

Аватар пользователя yorm yorm 22 ноября 2009 в 13:19

PanDa777 wrote:
Вроде бы в последей версии баг исправлен.

Возможно. К сожалению с Content profile он все равно не работает.