# Section-based page layout / Flexible Content

In this guide, we'll create a section-based template which provides the end user with multiple section types that they can mix and match to their desire to build a unique page layout.

For people coming from the ACF world: this guide shows the alternative of Flexible Content (opens new window) field.

# Add the following to your theme's functions.php
add_action( 'carbon_fields_register_fields', 'crb_attach_post_options' );
function crb_attach_post_options() {
    Container::make( 'post_meta', __( 'Section Options' ) )
        ->where( 'post_type', '=', 'page' )
        ->where( 'post_template', '=', 'template-section-based.php' )
        ->add_fields( array(
            Field::make( 'complex', 'crb_sections', 'Sections' )
                // Our first group will be a simple rich text field
                ->add_fields( 'text', 'Text', array(
                    Field::make( 'rich_text', 'text', 'Text' ),
                ) )

                // Second group will be a list of files for users to download
                ->add_fields( 'file_list', 'File List', array(
                    Field::make( 'complex', 'files', 'Files' )
                        ->add_fields( array(
                            Field::make( 'file', 'file', 'File' ),
                        ) ),
                ) )

                // Third group will be a list of manually selected posts
                // used as a simple curated "Related posts" listing
                ->add_fields( 'related_posts', 'Related Posts', array(
                    Field::make( 'association', 'posts', 'Posts' )
                        ->set_types( array(
                            array(
                                'type' => 'post',
                                'post_type' => 'post',
                            ),
                        ) ),
                ) ),
        ) );
}
# Add the following to a new file and name it template-section-based.php
<?php
/*
Template Name: Section-based
*/
?>
<?php get_header(); ?>

<?php while ( have_posts() ) : the_post(); ?>
    <?php
    $sections = carbon_get_the_post_meta( 'crb_sections' );
    foreach ( $sections as $section ) {
        switch ( $section['_type'] ) {
            case 'text':
                ?>
                <div class="section-text">
                    <?php echo wpautop( $section['text'] ); ?>
                </div>
                <?php
                break;
            case 'file_list':
                ?>
                <div class="section-file-list">
                    <h2>Resources:</h2>
                    <ul>
                        <?php foreach ( $section['files'] as $file_item ) : ?>
                            <li>
                                <a href="<?php echo wp_get_attachment_url( $file_item['file'] ); ?>" target="_blank"><?php echo get_the_title( $file_item['file'] ); ?></a>
                            </li>
                        <?php endforeach; ?>
                    </ul>
                </div>
                <?php
                break;
            case 'related_posts':
                ?>
                <div class="section-related-posts">
                    <h2>Related posts:</h2>
                    <ul>
                        <?php foreach ( $section['posts'] as $post_item ) : ?>
                            <li>
                                <a href="<?php echo get_the_permalink( $post_item['id'] ); ?>"><?php echo get_the_title( $post_item['id'] ); ?></a>
                            </li>
                        <?php endforeach; ?>
                    </ul>
                </div>
                <?php
                break;
        }
    }
    ?>
<?php endwhile; ?>

<?php get_footer(); ?>

Note: This template is the simplest way to implement this functionality and can certainly be improved upon.

With these 2 snippets you now have a section-based page template that you can assign to any page.