Prev / Next节点导航,在完整节点中包含缩略图

时间:2012-01-17 20:22:46

标签: drupal-7 drupal-theming

我一直试图解决这个问题,并让它发挥作用,但由于我不是程序员,只是一个编码知识有限的设计师,我一直在这个问题上遇到问题。

我正在创建自己的照片库,我希望将两个上一个或下一个图像显示为链接缩略图。我发现这个脚本可以工作并显示文本链接,但不知道如何根据我的需要调整它。

的template.php

<?php
function dad_prev_next($current_node = NULL, $op = 'p') {
    if ($op == 'p') {
        $sql_op = '<';
        $order = 'DESC';
    } elseif ($op == 'n') {
        $sql_op = '>';
        $order = 'ASC';
    } else {
        return NULL;
    }

    $output = NULL;

    $sql = "SELECT n.nid, n.title
             FROM {node} n
             WHERE n.nid $sql_op :nid
             AND type IN ('photos')
             AND status = 1
             ORDER BY nid $order
             LIMIT 1";
    $result = db_query($sql, array(':nid' => $current_node -> nid));
    foreach ($result as $data) {
    }
    if (isset($data)) {            


        if ($op == 'n')            
            return l("Next", "node/$data->nid", array('html' => TRUE));
        else if ($op == 'p')
            return l("Previous", "node/$data->nid", array('html' => TRUE));
    }
}
?>

node.tpl.php

<?php print dad_prev_next($node,'p') . " / " . dad_prev_next($node,'n'); ?>

工作示例

这张图片显示了两个上一张/下一张图片

的template.php

function dad_prev_next($nid = NULL, $op = 'p', $start = 0) {
    if ($op == 'p') {
        $sql_op = '>';
        $order = 'ASC';
    }
    elseif ($op == 'n') {
        $sql_op = '<';
        $order = 'DESC';
    }
    else {
        return NULL;
    }

    $output = '';

    // your node must have an image type field
    // let's say it's name is IMAGEFIELD
    // select from node table
    $query = db_select('node', 'n');
    // join node table with image field table
    $query->leftJoin('field_data_field_photo', 'i', 'i.entity_id = n.nid');
    // join file managed table where all data about managed files stored
    $query->leftJoin('file_managed', 'f', 'f.fid = i.field_photo_fid');
    $query
        // select nid and title from node
        ->fields('n', array('nid', 'title'))
        // select uri from file_managed (image path)
        ->fields('f', array('uri'))
        // select image alt and title
        ->fields('i', array('field_photo_alt', 'field_photo_title'))
        // where nid "greater than"/"lower than" our current node nid
        ->condition('n.nid', $nid, $sql_op)
        // where node type in array('your content types')
        ->condition('n.type', array('photos'), 'IN')
        // where node is published
        ->condition('n.status', 1)
        // where requested node has image to display (if you want thumbnail)
        ->condition('f.uri', '', '!=')
        // order by nid
        ->orderBy('n.nid', $order)
        // limit result to 1
        ->range($start, 1);     

    // make query
    $result = $query->execute()->fetchAll();

    foreach ($result as $node) {
        // theme your thumbnail image
        $variables = array(
            // default image style name `thumbnail`
            // you can use your own by following
            // admin/config/media/image-styles on your site
            'style_name' => 'square_small',
            'path' => $node->uri,
            'alt' => $node->field_photo_alt,
            'title' => $node->field_photo_title
        );
        $image = theme('image_style', $variables);

        $options = array(
            'html' => TRUE,
            'attributes' => array(
                'title' => $node->title
            )
        );
        $output = l($image, "node/{$node->nid}", $options);
    }

    return $output;
}

node.tpl.php

<?php print dad_prev_next($node->nid, 'p', 1); ?>
<?php print dad_prev_next($node->nid, 'p', 0); ?>
<?php print dad_prev_next($node->nid, 'n', 0); ?>
<?php print dad_prev_next($node->nid, 'n', 1); ?>

1 个答案:

答案 0 :(得分:1)

<强>的template.php

function dad_prev_next($nid = NULL, $op = 'p', $qty = 1) {
    if ($op == 'p') {
        $sql_op = '<';
        $order = 'DESC';
    }
    elseif ($op == 'n') {
        $sql_op = '>';
        $order = 'ASC';
    }
    else {
        return NULL;
    }

    $output = '';

    // your node must have an image type field
    // let's say it's name is IMAGEFIELD
    // select from node table
    $query = db_select('node', 'n');
    // join node table with image field table
    $query->leftJoin('field_data_field_IMAGEFIELD', 'i', 'i.entity_id = n.nid');
    // join file managed table where all data about managed files stored
    $query->leftJoin('file_managed', 'f', 'f.fid = i.field_IMAGEFIELD_fid');
    $query
        // select nid and title from node
        ->fields('n', array('nid', 'title'))
        // select uri from file_managed (image path)
        ->fields('f', array('uri'))
        // select image alt and title
        ->fields('i', array('field_IMAGEFIELD_alt', 'field_IMAGEFIELD_title'))
        // where nid "greater than"/"lower than" our current node nid
        ->condition('n.nid', $nid, $sql_op)
        // where node type in array('your content types')
        ->condition('n.type', array('photos'), 'IN')
        // where node is published
        ->condition('n.status', 1)
        // where requested node has image to display (if you want thumbnail)
        ->condition('f.uri', '', '!=')
        // order by nid
        ->orderBy('n.nid', $order)
        // limit result to $qty
        ->range(0, $qty);

    // make query
    $result = $query->execute()->fetchAll();

    foreach ($result as $node) {
        // theme your thumbnail image
        $variables = array(
            // default image style name `thumbnail`
            // you can use your own by following
            // admin/config/media/image-styles on your site
            'style_name' => 'thumbnail',
            'path' => $node->uri,
            'alt' => $node->field_IMAGEFIELD_alt,
            'title' => $node->field_IMAGEFIELD_title
        );
        $image = theme('image_style', $variables);

        $options = array(
            'html' => TRUE,
            'attributes' => array(
                'title' => $node->title
            )
        );
        $output = l($image, "node/{$node->nid}", $options);
    }

    return $output;
}

<强> node.tpl.php

<?php print dad_prev_next($node->nid, 'p', 2); ?>
<?php print dad_prev_next($node->nid, 'n', 2); ?>