2

I want to see if a certain field exists in a block of a matrix. Here is my code.

{% for block in entry.someStepContainer %}
  <div class="each-step">

    {% if block.type == "someStep" %}
      <div class="step-number"><span>{{loop.index}}</span></div>
      <h3 class="step-title">{{block.stepTitle}}</h3>
      <div class="step-description">{{block.stepDescription}}</div>

      <! -- this is part I'm trying to fix -->

      {% if block.stepAccordionContent %}
        <div class="accordion-section">
          {% for row in block.stepAccordionContent %}
            <h3 class="accordion-control">{{row.accordionTitle}}</h3>
            <p class="accordion-content" style="display: none;">{{row.accordionContent}}</p>
          {% endfor %}
        </div>
      {% endif %}


      <!-- end part -->

    {% endif %}

  </div>
{% endfor %} 

I've tried using:

{% if block.stepAccordionContent | length %}

But this still yields an empty

<div class="accordion-section">

stepAccordionContent is a table.

13
  • You say your checking if a Matrix block exists, but it looks like you're checking if a field inside of a block has any data. Can you clarify what stepAccordionContent is?
    – Brad Bell
    Jan 6, 2015 at 0:50
  • @DouglasMcDonald printing {{block.stepAccordionContent|length}} gives me 0.
    – Nick
    Jan 6, 2015 at 16:12
  • @BradBell you're right. I have a matrix that is someStepsContainer with one block someStep and three fields, one of them being stepAccordionContent which is a table.
    – Nick
    Jan 6, 2015 at 16:14
  • @BradBell stepAccordionContent is a table
    – Nick
    Jan 6, 2015 at 16:21
  • @DouglasMcDonald I was expecting if {%if block.stepAccordionContent|length%} returns 0, nothing inside the conditional would show. Instead, all content is showing (empty h3 and p)
    – Nick
    Jan 6, 2015 at 17:16

1 Answer 1

1

You can use {% if block.stepAccordionContent|length %}...{% endif %} to test if any rows are defined in your table field.

Note: When you create a table field it will have an empty row defined under 'Default Values', which should be removed; otherwise all new instances of the table will have an empty row defined by default causing block.stepAccordionContent|length to return 1, instead of 0 as expected.

6
  • I'd also make sure you're looking at the correct fellowshipStep block since there could be multiple ones on the entry.
    – Brad Bell
    Jan 6, 2015 at 22:19
  • My Test1: showed '1' for each, every 'foo' showed up, and in my entry with stepAccordionContent, Test1 showed '5' and the accordion-selection div, along with foo's
    – Nick
    Jan 6, 2015 at 23:47
  • I think I may have figured out your problem. In the table field settings in your matrix field, there is something called 'Default Values'. I would guess that you have one empty row defined, such that when you create a new matrix block, by default it has one empty row in it; thus when you run your test you get 1 for length, even though it looks empty. If you actually delete the empty row I would guess that it returns zero as expected. Go into your settings and delete that extra row from the 'Default Values', and the problem should go away. Jan 7, 2015 at 0:21
  • @DouglasMcDonald I did have an empty row as a default value! Once I deleted this from the field settings, then went and deleted it for each entry already created, it worked!!!!! Bravo bravo!!!!
    – Nick
    Jan 7, 2015 at 0:26
  • You should add this as an answer!
    – Nick
    Jan 7, 2015 at 0:26

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.