Дополнительная обработка материала

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

Аватар пользователя ik3 ik3 12 августа 2009 в 9:14

У меня тут стоит такая задачка, умом понимаю как это сделать, но где и с чего начать.
Есть Продукт. У него я сделала поле Вес (делала в ручную, так как заказчик очень хотел оценки от 0 до 100, а как в weight от -50 до 50 не устраивало). Выставляет эту оценку тот кто вводит этот продукт. Теперь мне необходимо, тем продуктам чей вес от 90-100 выставить медальки. В буквальном смысле на изображение этого продукта с верху прикрепить картинку медали. Так вот вопрос: обработку этого включить в форме заведения самого материала, или node.tpl.php. Видимо все таки в форме самого материала? Да? Сталкивались с чем либо подобным?

Комментарии

Аватар пользователя thehil thehil 12 августа 2009 в 9:48

Была похожая задача.

Модуль:

function check_value($nid = NULL) {
        $html = '';
        $sql = 'SELECT ...
                  FROM node n
                ...
                 WHERE (n.type in (\'...\'))
                   AND (field.value BETWEEN 90 AND 100)
                   AND (...nid = '
.$nid.')';

        $result = db_query_range(db_rewrite_sql($sql), 0, 1);
        if (db_fetch_object($result)) {
                $html = '<div class="medal">'. ... .'</div>';
        }
        return $html;
}

Переопределить node-....tpl.php, и использовать check_value($node->nid).

Скорее всего это слишком сложно для вас - мне просто по другому это сделать было невозможно (слишком сложное условие для выборки).

Если проще - могу посоветовать использовать computed_field (вроде так называется), который позволяет рассчитывать поле на лету. Дальнейшая обработка - через CSS.

Аватар пользователя ik3 ik3 13 августа 2009 в 7:02

я сделала следуещее: 1.Эту функцию поместила в template.php прописав там запрос. 2. В main.css создала стиль medal. 3. Создала node-product.tpl.php и теперь не могу докумекать как вызвать функцию, откуда, когда именно? Понимаю что смешно, но утро вечера мудренее не оказалось, а может еще не проснулась. подскажите?

Аватар пользователя andriy.olischuk andriy.olischuk 12 августа 2009 в 13:13

Если не надо как-то сортировать/фильтровать, а просто выводить медальку на нужном продукте, то всё можно решить в шаблоне. В шаблон node-ваш_тип_контента.tpl.php как я понимаю у вас передаётся значение веса. Значит в самом шаблоне вставьте условную конструкцию - если вес больше нужного, то выводить HTML медальки.

Чтобы посмотреть в какой переменной хранится этот самый вес - сделайте print_r($node) в файле шаблона.

Аватар пользователя ik3 ik3 12 августа 2009 в 13:49

И еще вопрос, у меня создана страница в Views которая отображает мне все продукты, там ведь уже не будет видно медальки?

Аватар пользователя andriy.olischuk andriy.olischuk 12 августа 2009 в 16:56

Да, у представлений свои шаблоны. Если медалька будет выводится во многих местах, то вероятно имеет смысл написать модуль или функцию в template.php, в которую будет передаваться id ноды, а возвращаться HTML. Иначе, при изменении кода медальки есть шанс запутаться в туче шаблонов.

Аватар пользователя andriy.olischuk andriy.olischuk 13 августа 2009 в 11:08

Если в template.php написали функцию, скажем, phptemplate_get_medal(), то в шаблоне её так и вызывайте. А какой запрос вы там прописали? В эту функцию достаточно передавать вес из места вызова, а возвращать HTML.

Аватар пользователя ik3 ik3 13 августа 2009 в 11:18

как посоветывал предыдущий собеседник
function check_value($nid = NULL) {
$html = '';
$sql_query = 'SELECT * FROM content_type_product WHERE nid='.$nid.' AND (field_weight_value BETWEEN 90 AND 100)';
$result = db_query_range(db_rewrite_sql($sql_query), 0, 1);
if (db_fetch_object($result)) {

$html = '

'. ehf .'

';
}
return $html;

Аватар пользователя ik3 ik3 13 августа 2009 в 11:30

как я понимаю чтобы вызвать функцию необходимо какойто переменной передать значение получаемое с помощью функции. вот тут то и ступор. фактически я ведь ни чего не получаю а применяю класс в котором рисуется медалька. Так $как_ее_вызвать=check_value($nid) ????

Аватар пользователя ik3 ik3 13 августа 2009 в 11:49

[field_weight] => Array ( [0] => Array ( [value] => 97 [safe] => 97 [view] => 97 ) ) [field_condition] => Array ( [0] => Array ( [value] =>

[#printed] => 1 ) [field_weight] => Array ( [#type_name] => product [#context] => full [#field_name] => field_weight [#post_render] => Array ( [0] => content_field_wrapper_post_render ) [#weight] => 34 [field] => Array ( [#description] => [items] => Array ( [0] => Array ( [#formatter] => default [#node] => stdClass Object *RECURSION* [#type_name] => product [#field_name] => field_weight [#weight] => 0 [#theme] => text_formatter_default [#item] => Array ( [value] => 97 [safe] => 97 [#delta] => 0 )

Вот что он мне показал, выбрала только то что касается этого поля

Аватар пользователя ik3 ik3 13 августа 2009 в 11:50

наврала еще это
[#title] => [#description] => [#theme_used] => 1 [#printed] => 1 [#type] => [#value] => [#prefix] => [#suffix] => [#children] => 97 ) [#title] => [#description] => [#children] => 97 [#printed] => 1 ) [#single] => 1 [#attributes] => Array ( ) [#required] => [#parents] => Array ( ) [#tree] => [#context] => full [#page] => 1 [#field_name] => field_weight [#title] => Вес [#access] => 1 [#label_display] => above [#teaser] => [#node] => stdClass Object *RECURSION* [#type] => content_field [#children] => 97 [#printed] => 1 ) [#title] => [#description] => [#children] =>

Аватар пользователя andriy.olischuk andriy.olischuk 13 августа 2009 в 12:06

Если я верно понял то вес хранится в элементе $node->field_weight['value'].
Значит схема примерно такая:

1. В template.php завести функцию phptemplate_get_medal($value). Где не выполнять никаких запросов, а просто сравнивать, если $value >= 90, то возвращать HTML медальки (или наименование CSS класса, если медалька рисуется в CSS). Если меньше 90, то пустая строка или класс CSS без медальки.

2. В шаблоне node-product.tpl.php в нужном месте написать:


<?php echo phptemplate_get_medal($node->field_weight['value']); ?>

Собственно всё.

UPD: если делаете медальку в CSS, то примерно так:
<div class="<?php echo phptemplate_get_medal($node->field_weight['value']); ?>">
</div>
(а phptemplate_get_medal() при этом возвращает к примеру medal или nomedal - т.е. название класса).

Аватар пользователя ik3 ik3 13 августа 2009 в 12:03

ой спасибо, сейчас буду пробывать. Если что то не получиться буду плакать и молить о помощи

Аватар пользователя ik3 ik3 14 августа 2009 в 8:18

Вот так в template.php написала ,

function phptemplate_get_medal($value) {
if ($value >= 90) {
return 'medal';
}
}

как я понимаю в результате должна получиться строчка

<div class="medal">
</div>

Только он так не получается и ничего не показывает