Добрый день. Накопилось несколько вопросов, связанных с добавлением своих полей в вывод типа материала. Это при том, что в материале уже есть существующие cck поля.
- Допустим, тип материала reklam_group. Есть ли возможность добавлять в него новые поля (именно в вывод) не созданием файла node-reklam_group.tpl.php а из модуля? И как предпочтительнее?
- CCK поле выводится по принципу $node->ИмяCCKполя[0]['view'], а как вывести, например, дату создания, юзера-создателя материала?
- Как вывести, например, ссылку на юзера-создателя в определенном месте ноды, например, после уже существующего cck поля field_housenumber?
Комментарии
Если поля уже используются у других материалов и созданы через cck - то при добавлении в данным материал можете использовать их
Варианты могут быть разные, у node есть $node->created и $node->changed но выводить лучше например через format_date($node->created) , создатель theme('username', $node)
Можно использовать модуль contemplate
А где можно про это подробнее почитать, какие поля откуда берутся?
contemplate не ужился с views_attach.
Что это за оператор в API?
...
print format_date($node->created);
...
Почитать - modules\node\node.module
...
function theme_node_submitted($node) {
return t('Submitted by !username on datetime',
array(
'!username' => theme('username', $node),
'datetime' => format_date($node->created),
));
}
...
Нашел эти строки. Только если мне дата последнего изменения понадобится? Или дата регистрации этого самого пользователя? Или количество посещений (при включенном модуле статистики). В документации API есть табличка? Или по базе данных как-то, из таблицы такой-то...
Кстати как без contemplate расположить вставляемое поле? (не ужился с views_attach)
$node->changed
$author = user_load(array('uid'=>$node->uid));
print format_date($author->created);
node.tpl.php
sas@drupal.org, большое спасибо. А откуда вы информацию берете? Просто мало ли еще какие поля понадобятся? Или все из modules\node\node.module?
А если у меня уже есть cck поля, которые добавлены через cck форму? Их заново прописывать в node-xxx.tpl.php, или все таки есть возможность вставить собственное поле "Дата регистрации юзера" поверх какого-нибудь существующего поля весами?
Доступные поля
node.tpl.php
$node->content - в этом массиве они все видны, Вам остается сделать цикл по полям и сформировать свой $content для вывода, например так
$old_content = $content;
$content = '';
$elements_weight = array(
'page' => array(
array(
'#key'=>'#html',
'#value'=>'<div class="f-l w100p">'
),
array(
'#key'=>'content',
'#name'=> 'price',
'#view_name' => '#value',
),
array(
'#key'=>'content',
'#name'=> 'field_availability',
'#view_name'=> '#children',
),
array(
'#key'=>'links',
'#name'=> 'add-to-cart',
),
array(
'#key'=>'links',
'#name'=> 'view-cart',
),
array(
'#key'=>'#html',
'#value'=>'</div>'
),
array(
'#key'=>'#html',
'#value'=>'<div class="f-l w100p">'
),
array(
'#key'=>'content',
'#name'=> 'body',
),
array(
'#key'=>'#html',
'#value'=>'</div>'
),
),
'teaser' => array(
array(
'#key'=>'content',
'#name'=> 'field_multi_upload',
'#view_name' => '#children',
),
array(
'#key'=>'#html',
'#value'=>'<div class="f-l">'
),
array(
'#key'=>'content',
'#name'=> 'price',
'#view_name' => '#value',
),
array(
'#key'=>'content',
'#name'=> 'field_availability',
'#view_name'=> '#children',
),
array(
'#key'=>'links',
'#name'=> 'add-to-cart',
),
array(
'#key'=>'links',
'#name'=> 'view-cart',
),
array(
'#key'=>'#html',
'#value'=>'</div>'
),
)
);
$view_type = $teaser ? 'teaser' : 'page';
if(isset($elements_weight[$view_type])){
foreach($elements_weight[$view_type] as $field_name){
$node_field = array();
if(strpos($field_name['#key'],'#') === FALSE){
if(isset($node->$field_name['#key'])) $node_group = &$node->$field_name['#key'];
if(isset($node_group[$field_name['#name']])) {
$node_field = &$node_group[$field_name['#name']];
} else {
$node_field = array();
}
}
elseif($field_name['#key'] == '#html'){
$node_content[]['#value'] = $field_name['#value'];
}
if(!empty($node_field)) {
if($field_name['#key'] == 'links'){
if(!isset($node_field['href']) && isset($node_field['title'])){
$node_content[$field_name['#name']]['#children'] = '<div class="'.$field_name['#name'].'">'.$node_field['title'].'</div>';
} else {
$node_content[$field_name['#name']]['#children'] = '<div class="'.$field_name['#name'].'">'.l($node_field['title'],$node_field['href'],array('query'=>$node_field['query'],'attributes'=>$node_field['attributes'])).'</div>';
}
}
else {
$node_content[$field_name['#name']] = $node_field;
}
if(isset($field_name['#view_name'])){
$node_content[$field_name['#name']]['#view_name'] = $field_name['#view_name'];
}
unset($node_group[$field_name['#name']]);
}
}
$node_content = array_merge($node_content,$node->content);
}
foreach($node_content as $key => $value){
if(strpos($key,'#') === FALSE){
if(isset($node_content[$key]['#view_name']))
$content .= $node_content[$key][$node_content[$key]['#view_name']];
elseif(!empty($node_content[$key]['#children'])) $content .= $node_content[$key]['#children'];
elseif(!empty($node_content[$key]['#value'])) $content .= $node_content[$key]['#value'];
}
}
if($teaser) $node->teaser = $content ? $content : $old_content;
else
$node->body = $content ? $content : $old_content;
?>