Всем привет. Народ, помогите разобраться плз. Есть такая вот выборка...
<?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 тизера основынх материалов (буду их так называть) с нужными данными (но только те материалы у которых в админке стоит галочка), у этих материалов есть свои подматериалы, и мне нужно подсчитать кол-во этих подматериалов, и отобразить в результатах вывода в тизере основного материала (как-то так). Не могу сообразить как это сделать, может кто-то подскажет какую-то лог. цепочку или что-то ещё? Был бы очень признателен
Комментарии
если reference поле то добавить связь по нему, группировку по n.nid и $query->addExpression('COUNT(*)', 'count');
в зависимости от того ссылаются материалы на подматериалы или наоборот, связь с этим полем по entity_id или по target_id
а почему не использовать для этого $node->sticky ?
как такового поля reference нету.
Осн. материал и подматериал не ссылаются друг на друга, они оба ссылаются на одинаковый термин словаря и благодаря этому типа в связке...
при создании основного материала или подматериала, в каждом из них есть поле, в нём выбираешь термин из словаря таксономии. Значение поля Основного материала = значению поля подматериала, например если у основного материала выбрано Новости, то у подматериала тоже будет выбрано Новости. Может сделать так: на основе этого выводить нужный мне материал, загонять результат в масив и делать подсчет беря данные из этого масива...как-то так может? а может и как-то по-другому...какая-то сложная конструкция получается, возможно есть путь легче?
а насчет sticky...у меня создано несколько полей такого рода и в зависимости от значений надо выполнять или не выполнять. А насколько мне известно (могу ошибаться) то стики работает с «Закрепить статью сверху» и это поле в 1 экземпляре, поэтому его и не использовал...
если у них одно и то же поле field_tags, то нужно делать джоин с таблицей этого поля по entity_id и потом еще один джоин с taxonomy_index, а потом та же группировка как и в моем первом комментарии и тот же addExpression
сенкс, пошел покапаюсь
$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);
}
сенкс огромное за предоставленный вариант, как оказалось я был на верном пути...радует).
если переменная нужна для шаблона ноды, то ее лучше добавлять в preprocess_node
$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
блин, ну вообще слов нету...предоставили всё, что можно...аж стыдно стало) ОГРОМНОЕ СПАСИБО ЗА ПРЕДОСТАВЛЕННУЮ ПОМОЩЬ
чуть изменил скрипт
<?php
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();//колво подматериалов
}
}
?>
на
<?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, вроде обращение было задано правильно...
field_info_instance возвращает массив с данными экземпляра поля, в данном случае условие if ($instance) возвращает всегда TRUE
я делал условие по значению поля (т.е. только ноды отмеченные чекбоксом), свойство нужно просто правильно прописать
спс, переписал, всё ок