Выборка из бд и вывод данных

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

Аватар пользователя Jluzya Jluzya 15 сентября 2014 в 16:00

Всем привет. Народ, помогите разобраться плз. Есть такая вот выборка...


<?php
$typecas
='article';
$select=db_select('node''n');
$select->join('field_data_field_top_article''tc''n.nid = tc.entity_id');
$select->fields('n', array('nid'));
$select->fields('tc', array('entity_id'));
$select->condition('n.status''1');
$select->condition('tc.field_top_article_value''1');
$select->condition('n.type'$typecas);
$select->range(0,3);
$res $select->execute();
 
foreach (
$res as $rowres) {
$load_node node_view(node_load($rowres->nid), 'teaser');
print 
drupal_render($load_node);
}
?>

Этим я вывожу 3 тизера основынх материалов (буду их так называть) с нужными данными (но только те материалы у которых в админке стоит галочка), у этих материалов есть свои подматериалы, и мне нужно подсчитать кол-во этих подматериалов, и отобразить в результатах вывода в тизере основного материала (как-то так). Не могу сообразить как это сделать, может кто-то подскажет какую-то лог. цепочку или что-то ещё? Был бы очень признателен

Комментарии

Аватар пользователя drupby drupby 15 сентября 2014 в 17:06

"Jluzya" wrote:
у этих материалов есть свои подматериалы

если reference поле то добавить связь по нему, группировку по n.nid и $query->addExpression('COUNT(*)', 'count');
в зависимости от того ссылаются материалы на подматериалы или наоборот, связь с этим полем по entity_id или по target_id

Аватар пользователя drupby drupby 15 сентября 2014 в 17:26

"Jluzya" wrote:
но только те материалы у которых в админке стоит галочка

а почему не использовать для этого $node->sticky ?

Аватар пользователя Jluzya Jluzya 15 сентября 2014 в 18:12

как такового поля reference нету.
Осн. материал и подматериал не ссылаются друг на друга, они оба ссылаются на одинаковый термин словаря и благодаря этому типа в связке...
при создании основного материала или подматериала, в каждом из них есть поле, в нём выбираешь термин из словаря таксономии. Значение поля Основного материала = значению поля подматериала, например если у основного материала выбрано Новости, то у подматериала тоже будет выбрано Новости. Может сделать так: на основе этого выводить нужный мне материал, загонять результат в масив и делать подсчет беря данные из этого масива...как-то так может? а может и как-то по-другому...какая-то сложная конструкция получается, возможно есть путь легче?

а насчет sticky...у меня создано несколько полей такого рода и в зависимости от значений надо выполнять или не выполнять. А насколько мне известно (могу ошибаться) то стики работает с «Закрепить статью сверху» и это поле в 1 экземпляре, поэтому его и не использовал...

Аватар пользователя drupby drupby 15 сентября 2014 в 19:05

"Jluzya" wrote:
они оба ссылаются на одинаковый термин словаря и благодаря этому типа в связке...

если у них одно и то же поле field_tags, то нужно делать джоин с таблицей этого поля по entity_id и потом еще один джоин с taxonomy_index, а потом та же группировка как и в моем первом комментарии и тот же addExpression

Аватар пользователя drupby drupby 15 сентября 2014 в 20:25
$typecas='article';
$select=db_select('node', 'n');
$select->join('field_data_field_top_article', 'tc', 'n.nid = tc.entity_id');
$select->join('field_data_field_referer', 'fr', 'n.nid = fr.entity_id');//джоин с полем термина
$select->fields('n', array('nid'));
$select->fields('tc', array('entity_id'));
$select->fields('fr', array('field_referer_tid'));
$select->condition('n.status', '1');
$select->condition('tc.field_top_article_value', '1');
$select->condition('n.type', $typecas);
$select->range(0,3);
$res = $select->execute();
 
foreach ($res as $rowres) {
  $query = db_select('taxonomy_index', 'ti');
  $query->fields('ti', array('tid'));
  $query->condition('ti.tid', $rowres->field_referer_tid);
  $query->condition('ti.nid', $rowres->nid, '<>');
  $count = $query->execute()->rowCount();//колво подматериалов
  $load_node = node_view(node_load($rowres->nid), 'teaser');
  print drupal_render($load_node);
}
Аватар пользователя drupby drupby 15 сентября 2014 в 21:51

"Jluzya" wrote:
Маленький вопрос еще,если не трудно ответить, если я в выборке допишу global $count, а потом в *tpl выведу как
global $count
echo $count

если переменная нужна для шаблона ноды, то ее лучше добавлять в preprocess_node

function ИМЯТЕМЫ_preprocess_node(&$variables) {
  $node = $variables['node'];
  if ($node->field_top_article['und'][0]['value'] == 1 && $node->type == 'article') {
    $query = db_select('taxonomy_index', 'ti');
    $query->fields('ti', array('tid'));
    $query->condition('ti.tid', $node->field_referer['und'][0]['tid']);
    $query->condition('ti.nid', $node->nid, '<>');
    $variables['count'] = $query->execute()->rowCount();//колво подматериалов
  }
}

и потом в шаблоне ноды выводить в нужном месте переменную $count

Аватар пользователя Jluzya Jluzya 15 сентября 2014 в 22:20

блин, ну вообще слов нету...предоставили всё, что можно...аж стыдно стало) ОГРОМНОЕ СПАСИБО ЗА ПРЕДОСТАВЛЕННУЮ ПОМОЩЬ

Аватар пользователя Jluzya Jluzya 16 сентября 2014 в 2:27

чуть изменил скрипт

<?php
function ИМЯТЕМЫ_preprocess_node(&$variables) {
  
$node $variables['node'];
  if (
$node->field_top_article['und'][0]['value'] == && $node->type == 'article') {
    
$query db_select('taxonomy_index''ti');
    
$query->fields('ti', array('tid'));
    
$query->condition('ti.tid'$node->field_referer['und'][0]['tid']);
    
$query->condition('ti.nid'$node->nid'<>');
    
$variables['count'] = $query->execute()->rowCount();//колво подматериалов
  
}
}
?>

на

<?php
function moyatema_preprocess_node(&$variables) {
  
$node $variables['node'];
  
$instance field_info_instance('node''field_top_article''article');
  if ((
$instance) && $node->type == 'article') {
    
$query db_select('taxonomy_index''ti');
    
$query->fields('ti', array('tid'));
    
$query->condition('ti.tid'$node->field_referer['und'][0]['tid']);
    
$query->condition('ti.nid'$node->nid'<>');
    
$variables['count'] = $query->execute()->rowCount();
  }
}
?>

А то в вашем варианте система ругалась почему-то на свойство поля field_top_article
Notice: Undefined property: stdClass::$field_top_article в функции moyatema_preprocess_node()
Хотя смотрел через print_r, вроде обращение было задано правильно...

Аватар пользователя drupby drupby 16 сентября 2014 в 3:08

"Jluzya" wrote:
чуть изменил скрипт

"Jluzya" wrote:
 $instance = field_info_instance('node', 'field_top_article', 'article');
  if (($instance)

field_info_instance возвращает массив с данными экземпляра поля, в данном случае условие if ($instance) возвращает всегда TRUE
я делал условие по значению поля (т.е. только ноды отмеченные чекбоксом), свойство нужно просто правильно прописать