Question

So I'm wanting to make a way to display the 2nd newest row from my database. So my example (To help better explain it) If i have 10 rows. I want to display only the second newest one. Not the newest one but the one right after it. Or the maybe even the third one. I have my working code below and i see the for each loop. But I'm not sure how to only display the one I'm wanting it to display. I also don't think how i have it set up is the most efficient way of acomplishing this.

I am using concrete5 for this site and the main idea is for composer so i can post a new post and the pull a recent news feed but showing the second post.

Here is my current code: (This shows the first post)

    <?php 
    defined('C5_EXECUTE') or die("Access Denied.");
    ?>
    <div id="blog-index">
        <?php  
        $isFirst = true; //So first item in list can have a different css class (e.g. no top border)
        $excerptBlocks = ($controller->truncateSummaries ? 1 : null); //1 is the number of blocks to include in the excerpt
        $truncateChars = ($controller->truncateSummaries ? $controller->truncateChars : 255);
        $imgHelper = Loader::Helper('image');
        foreach ($cArray as $cobj):
            $title = $cobj->getCollectionName();
            $date = $cobj->getCollectionDatePublic(DATE_APP_GENERIC_MDY_FULL);
            $author = $cobj->getVersionObject()->getVersionAuthorUserName();
            $link = $nh->getLinkToCollection($cobj);
            $firstClass = $isFirst ? 'first-entry' : '';

            $entryController = Loader::controller($cobj);
            if(method_exists($entryController,'getCommentCountString')) {
                $comments = $entryController->getCommentCountString('%s '.t('Comment'), '%s '.t('Comments'));
            }
            $isFirst = false;
        ?>
        <div class="entry">
            <div class="title">
                <h3>
                    <a href="<?php  echo $link; ?>" class="text-error"><?php  echo $title; ?></a>
                </h3>
                <h6 class="post-date">
                    <?php  
                    echo t('Posted by %s on %s',$author,$date);
                    ?>
                </h6>
            </div>
            <div class="excerpt">
                <?php
                    $a = new Area('Main');
                    $a->disableControls();
                    if($truncateChars) {
                      $th = Loader::helper('text');
                      ob_start();
                        $a->display($cobj);
                      $excerpt = ob_get_clean();
                      echo $th->entities($th->shorten($excerpt,$truncateChars));
                    } else {
                      $a->display($cobj);
                    }
                  ?>
            </div>
            <div class="ccm-spacer"></div>
            <br />
            <div class="meta">
                <?php  echo $comments; ?> <a href="<?php  echo $link; ?>" class="btn btn-danger"><?php  echo t('Read the full post'); ?> <i class="icon-chevron-right"></i></a>
            </div>
        </div>
        <hr class="blog-entry-divider"/>
        <?php  endforeach; ?>
    </div>
Was it helpful?

Solution

To build upon what the others have written as comments:

What you've pasted is a concrete5 view. You'll notice there's no db querying or PageList building in there. For that, you need to look in the controller. (This looks like a page list block view, so the controller will be in / concrete / core / controllers / blocks / page_list.php (on c5.6+).

The concrete5 api code to do what the others have suggested (let mysql handle the skipping) is done within the ->get() call. So, on about line 135:

$pl->get(1, 1);

Remember not to modify the files directly, but to override them the c5 way. There are plenty of tutorials on this on the c5 website.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top