Пользователь при регистации заполняет поле feild_address.
Создает материал в котором в одном из полей должна собираться ссылка используя значение этого поля. Собирается в скрытом режиме, но затем она видна другим при просмотре его материала.
Для себя разбил это на две задачи.
1. При создании материала автоматически вносить в скрытое поле значение с feild_address автора. Думал что это токенами лекго сделается. Но не выходит.
Пробовал:
[current-user:field_address]
%value[current-user:field_address]
!value[current-user:field_address]
value[current-user:field_address]
<?php
$first = '[current-user:field_address]';
&second = token_replace($first, $type = 'global', $object = NULL, $leading = '[', $trailing = ']');
print_r(&second);
?>
Ничего не вышло.
Как правильно ввыдить токены? Если можно пример кода полностью.
2. Затем собрать ссылку с помощью Computed Field
по образцу из модуля.
Computed Code(PHP)
$entity_field[0]['value'] = array_pop(array_pop(field_get_items($entity_type, $entity, 'field_a'))) + array_pop(array_pop(field_get_items($entity_type, $entity, 'field_b')));
Display Code (PHP)
$display_output = $entity_field_item['value'];
Все получаестя (с полем этой же ноды, конечно) но выдает ошибку:
Warning: array_pop(): The argument should be an array в функции eval() (строка 1 в файле /hsphere/local/home/xxxxx/xxxxx.org/sites/all/modules/computed_field/computed_field.module(394) : eval()'d code).
Может есть цельное решение?
(но по моему "пути" тоже если можно ответьте, так как по любому это надо знать)
Комментарии
Попробуйте так:
<?php
$user = user_load($entity->uid);
$entity_field[0]['value'] = l(t('Link text'), $user->feild_address['und'][0]['value']);
?>
Выдает ссылку на сайт.
Подправил. "Получилось" только таким образом.
<?php
global $user;
$user_fields = user_load($user->uid);
$entity_field[0]['value']= $user_fields->field_address['und']['0']['value'];
print_r($entity_field[0]['value']);
?>
но поле получается "динамическое". оно выдает данные по просматривающему в данным момент пользователю. А надо чтоб оно дало данные по автору материала.
ну и так "получилось" - не получается почему-то использовать данные этого для расчетов в других полях с помощью Computed field.
Пытаюсь извлечь его - выдает тип поля - "php_code"
это что за синтаксис?
с этим моментом надо принимать во внимание, что computed_field будет генерировать ссылку относительно текущего пользователя, а не автора ноды. Если только не установить флажок в свойствах поля computed_field для записи значения в бд.
[quote].это что за синтаксис?[quote].
да, конечно же было так:
<?php
$first = '[current-user:field_address]';
$second = token_replace($first, $type = 'global', $object = NULL, $leading = '[', $trailing = ']');
print_r($second);
?>
но выдало:
Recoverable fatal error: Argument 2 passed to token_replace() must be an array, string given, called in C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code on line 3 and defined в функции token_replace() (строка 79 в файле C:\OpenServer\domains\clean\includes\token.inc).
понял что это был пример для 5-го Друпала
для 7-го надо так
token_replace($text, array $data = array(), array $options = array())
так "получилось"
<?php
global $user;
$first = '[current-user:field_address]';
$second = token_replace($first, array('user' => $user));
print_r($second);
?>
но опять же идет привязка залогиненому ползователю и даже если убрать global $user;
и при этом еще выдает:
Notice: Undefined variable: user в функции eval() (строка 4 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code).
доступных токенов типа [node:author:field_address] - не было
$node = menu_get_object();
$author_adress = token_replace('[node:author:field_address]', array('node' => $node));
}
Спасибо. В PHP поле это сработало. В Computed Field - нет, сильно ругается (я уж было думал что прямо в нем собрать ссылку из данных полей автора и его материала).
Провал через токены также получить данные полей документа - получилось.
Собрал свою ссылку.
Если бы вы могли описать как работает подобная конструкция - вообще было бы чудесно.
В любом случае спасибо за содействие и если будет нужна помощь в активации ripple кошелька обращайтесь.
Единственно что выдает нотис.
Notice: Undefined variable: author_adress в функции eval() (строка 22 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code).
Notice: Undefined variable: node в функции eval() (строка 24 в файле C:\OpenServer\domains\clean\modules\php\php.module(80) : eval()'d code)
Как с этим бороться?
добавил в начало кода:
$node = 0;
$author_adress =0;
- помогло
Это нормальное решение?
мне кажется такие вещи лучше проверять в [man=isset]isset[/man]
хорошая конструкция :
<?phpif (arg(0) == 'node' && ctype_digit(arg(1))) {
$node = menu_get_object();
$author_adress = token_replace('[node:author:field_adress]', array('node' => $node));
?>
но в самом профайле пользователя не работает - не проходит по условию
пробовал без условия, работает но по стандартным токенам (current-page:url)
пробовал заменять токены на current-page:field_adress - не понимает
то в материале надо , то уже в профиле - определитесь
а то вы не зная ни php ни drupal api пытаетесь решать какие то непонятные и каждый раз разные задачи
для начала подробно опишите что конкретно у вас имеется и что нужно из этого получить
а то у вас то токены задействованы , то пытаетесь получить предпоследний элемент массива не зная что он содержит
и если полезли в код - научитесь его отлаживать , с помощью Xdebug , var_dump($vars) , print_r($vars) , dpm($vars) модуля devel
проверяйте каждую cтроку своего кода и все переменные - за вас никто этого не сделает , не обладая экстрасенсорными способностями и не зная что содержится в переменных которые вы бездумно пытаетесь передавать во все функции которые попадаются вам на глаза
Спасибо за предыдущий код, это помогло.
Надо и в материале и в профиле использовать значения полей в других полях для создания ссылок.
В профиле (и в пределах одной ноды) я их делал с помощью Computed Fiel. Он часто работает но дает ворнинг по типу переменной. И ответов нормальных нет даже у знатоков.
Раз уж есть возможность делать это на php то решил попробовать обойтись без модулей.
Научусь и отлаживать и кодить. Просто пока нужно решить эти ТРУДНОСТИ (и прототип проекта будет готов) о существовании которых можно было только догадываться.
Сама идея проекта исключает наемный труд, - только участие. Всем "приложившим руку" гарантируется пользование сервисом, (впрочем как и всем добрым людям)).