0

enter image description hereI have a table that populates data pulled from ACF. It basically adds a PDF of a report if there's one available. I think I got that part figured out, but my code is awfully complicated and I'll like to simplify it with a switch statement or something similar. Also, how do I get the table to display a value of 'x' when there's no PDF file available? It's currently removing the cell and I don't want it to do that. Thanks in advance.

<table class="float-left table">
    <thead>
    <tr>
        <th scope="col">Company</th>
        <th scope="col">Annual Report</th>
        <th scope="col">Interim Statement</th>
        <th scope="col">Prospectus</th>
    </tr>
    </thead>
    <tbody>
    <?php if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); ?>

        <?php if( have_rows( 'recent_documents') ): ?>
            <tr>
                <th>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                </th>


                <?php while( have_rows( 'recent_documents') ): the_row(); ?>

                    <?php if ( have_rows( 'new_document') ): ?>

                        <?php while ( have_rows( 'new_document') ): the_row(); ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Annual") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>annual</a>
                                </td>
                            <?php endif; ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Interim") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>interim</a>
                                </td>
                            <?php endif; ?>

                            <?php if (strpos(get_sub_field( 'report_type'), "Prospectus") !==false): ?>
                                <td><a href="<?php the_sub_field('file'); ?>" target="_blank"><i class="fas fa-file-pdf"></i>Prospectus</a>
                                </td>
                            <?php endif; ?>
                        <?php endwhile; ?>


                    <?php endif; ?>

                <?php endwhile; ?>


            </tr>
        <?php endif; ?>

    <?php endwhile; endif; wp_reset_postdata(); ?>
    </tbody>
</table>
1
  • 1
    If you just fetch the contents of recent_documents, you’ll see that it’s a big multidimensional array with all of your data. I find that much easier to output directly rather than using all the have_rows nonsense.
    – Milo
    Oct 16, 2018 at 14:55

1 Answer 1

0

As I am new here too, I can't comment and ask for clarification or give some suggestions, so I'll do that here.

Why do you have nested repeaters recent_documents and new_document? It appears that recent_documents always has only single row, otherwise there would be a mess. But anyway, working with what you have, you could do something like this:

<table class="float-left table">
    <thead>
    <tr>
        <th scope="col">Company</th>
        <th scope="col">Annual Report</th>
        <th scope="col">Interim Statement</th>
        <th scope="col">Prospectus</th>
    </tr>
    </thead>
    <tbody>
    <?php if( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post(); ?>

        <?php if( have_rows( 'recent_documents') ): ?>
            <tr>
                <th>
                    <a href="<?php the_permalink(); ?>">
                        <?php the_title(); ?>
                    </a>
                </th>

                <?php
                // We get the inner repeater (if it exists)
                $documents = get_field( 'recent_documents' );

                // Create our 'dictionary' array
                $report_types = array( 'Annual', 'Interim', 'Prospectus' );

                // Loop through it. This will always create three cells, even if there are no documents.
                foreach ( $report_types as $key => $report_type ) : ?>
                    <td>
                        <?php
                        $new_document = ! empty( $documents[$key]['new_document'] ) ? $documents[$key]['new_document'][0] : false;

                        if ( ! $new_document 
                             || strpos( $new_document['report_type'], $report_type ) === false 
                             || empty( $new_document['file'] ) ) 
                        {
                            echo 'x';
                            continue;
                        }                        
                        echo '<a href="' . $new_document['file'] . '" target="_blank"><i class="fas fa-file-pdf"></i>' . $report_type . '</a>';
                        ?>
                    </td>
                <?php endforeach; ?>

            </tr>
        <?php endif; ?>

    <?php endwhile; endif; wp_reset_postdata(); ?>
    </tbody>
</table>

Let me know if this doesn't do what you wanted.

Please be aware that new_documents have to go in this particular order: Annual, Interim, Prospectus, otherwise it would skip documents even if they exist.

17
  • Thanks for your reply. I really like how you've simplified it. I tried it in my theme and it's filling 'x' in all the cells. It doesn't seem to be finding any matching PDFs even though they are there.
    – fridayikon
    Oct 16, 2018 at 14:09
  • @user22768 Can you try again? I think I made a mistake calling the recent_documents repeater as a sub_field.
    – djboris
    Oct 16, 2018 at 14:20
  • No luck. Still filling all cells with 'x'
    – fridayikon
    Oct 16, 2018 at 14:30
  • @user22768 Ok, I finally managed to test this locally, and found some other bugs. Sorry about that! It should work now.
    – djboris
    Oct 16, 2018 at 14:31
  • Ok. So it now finds the Annual Report but not the other documents. I have an Interim Report that it should have picked up as well. Any ideas?
    – fridayikon
    Oct 16, 2018 at 14:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.