Jump to content
mowerol

Foreach loop commented out in HTML page

Recommended Posts

Hi everyone,

I'm new to processwire and have just started playing around with it for the past week. At the moment, I'm trying to use repeater fields and am having difficulty getting them to output to my page. Instead, what bizarrely seems to be happening is that half of the foreach loop declaration seems to be appearing as plain text on my page and is commented out when I check inspect element.

 

I'm not sure if my syntax is wrong or this is an entirely different problem. Any help would be hugely appreciated!

Here's my code:

<?php $portfolio=$pages->get("name=portfolio");?>

<? foreach ($portfolio->portfoliopreviews as $portfoliopreview): ?>
<a href="#">
	<div class="port">
		<img class="pic" src="<?=$portfoliopreview->portimg->url;?>"/>
		<div class="portbgrdtext">
			<h5><?=$portfoliopreview->portgenre;?></h5>
			<p><?=$portfoliopreview->porttext;?></p>
			<button class="portbtn">Read More</button>
		</div>
	</div>
</a>
<? endforeach; ?>

And in the attached images you can see what's happening on the page and within inspect element.

You can see that the div is being created, albeit without any fields populating inside of it. You can also see that loop is being commented out within inspect element.

Cheers!

 

screenshot-127.0.0.1 2016-07-05 12-02-41.png

inspect.png

Share this post


Link to post
Share on other sites

The php server environment where you use this code, has short php syntax disabled.

To be save and transportable with your code, you never should use this. Always use <?php to enter into php mode. Better don't use <?

Share this post


Link to post
Share on other sites

Thanks, but I've used short syntax throughout my file and have had no problems except with this one.

When I make it <?php for some reason I now get this error:

Quote

Parse Error: syntax error, unexpected end of file (line 89 of C:\xampp\apps\processwire\htdocs\site\templates\home.php) 

There isn't any code on line 89 so it's referring to the end of  my doc. Would this mean something else is wrong?

 

//Edit - Cheers again horst. I just changed the endforeach to use <?php too and that's resolved the problem!

Edited by mowerol
Update

Share this post


Link to post
Share on other sites

This sounds like you're missing a <?php or a ?> somewhere in that file either or some other syntax error, which puzzles the parser. Essentially the parser is mixing up php and html content different to what you intended.

  • Like 1

Share this post


Link to post
Share on other sites

I think that you:

a) have only used short syntax for echo(ing) strings: <?= what is not the same as the short php opener. Please check and confirm. :)

b) now, it is parsed and tells you that you have a parse error. A parse error at the last line of a file occures when you somewhere have an unclosed level of, e.g. foreach, if statement or something else.

You have to go through your code and check if you have closed each opened one.

In tis regard, I want to say that the code you use is not the best solution. I personally find it really hard to read, and it also is hard to maintain.

There are many ways to keep the logic aways from the markup. Big and small solutions. But everything seems to be better than that. For example, you can do the php logic in the top of the file, and than merge it together with the markup.

<?php // open the file in PHP mode, 
/** add comments to the file if needed. 
  * This is a good place here. :)
  **/

// define a markup template with placeholders
$myMarkupTemplate = "
<a href='#'>
    <div class='port'>
        <img class='pic' src='[_URL_]'/>
        <div class='portbgrdtext'>
            <h5>[__GENRE__]</h5>
            <p>[__TEXT__]</p>
            <button class='portbtn'>Read More</button>
        </div>
    </div>
</a>
";

// now get your page and loop through your selections
$portfolio = $pages->get("name=portfolio");
foreach($portfolio->portfoliopreviews as $portfoliopreview) {
    $search = array('[_URL_]', '[__GENRE__]', '[__TEXT__]'); 
    $replace = array($portfoliopreview->portimg->url, $portfoliopreview->portgenre, $portfoliopreview->porttext);
    echo str_replace($search, $replace, $myMarkupTemplate);
}

Another approach could be

<?php
// get your page and loop through your selections
$portfolio = $pages->get("name=portfolio");
foreach($portfolio->portfoliopreviews as $portfoliopreview) {
    $url = $portfoliopreview->portimg->url;
    $genre = $portfoliopreview->portgenre;
    $text = $portfoliopreview->porttext;
    echo "
      <a href='#'>
          <div class='port'>
              <img class='pic' src='{$url}'/>
              <div class='portbgrdtext'>
                  <h5>{$genre}</h5>
                  <p>{$text}</p>
                  <button class='portbtn'>Read More</button>
              </div>
          </div>
      </a>\n";
}

or you ommit the temporary variables and put out the field values directly:

<?php
// get your page and loop through your selections
$portfolio = $pages->get("name=portfolio");
foreach($portfolio->portfoliopreviews as $portfoliopreview) {
    echo "
      <a href='#'>
          <div class='port'>
              <img class='pic' src='{$portfoliopreview->portimg->url}'/>
              <div class='portbgrdtext'>
                  <h5>{$portfoliopreview->portgenre}</h5>
                  <p>{$portfoliopreview->porttext}</p>
                  <button class='portbtn'>Read More</button>
              </div>
          </div>
      </a>\n";
}

There are many ways one can go. :)

 

  • Like 3

Share this post


Link to post
Share on other sites

Thanks for the really detailed response @horst. I'll definitely try out all of these options as I continue to work with PW and get stronger at it. The first approach you've suggested is a cool solution!

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By David Karich
      ProcessWire InputfieldRepeaterMatrixDuplicate
      Thanks to the great ProModule "RepeaterMatrix" I have the possibility to create complex repeater items. With it I have created a quite powerful page builder. Many different content modules, with many more possible design options. The RepeaterMatrix module supports the cloning of items, but only within the same page. Now I often have the case that very design-intensive pages and items are created. If you want to use a content module on a different page (e.g. in the same design), you have to rebuild each item manually every time.
      This module extends the commercial ProModule "RepeaterMatrix" by the function to duplicate repeater items from one page to another page. The condition is that the target field is the same matrix field from which the item is duplicated. This module is currently understood as proof of concept. There are a few limitations that need to be considered. The intention of the module is that this functionality is integrated into the core of RepeaterMatrix and does not require an extra module.
      Check out the screencast
      What the module can do
      Duplicate a repeater item from one page to another No matter how complex the item is Full support for file and image fields Multilingual support Support of Min and Max settings Live synchronization of clipboard between multiple browser tabs. Copy an item and simply switch the browser tab to the target page and you will immediately see the past button Support of multiple RepeaterMatrix fields on one page Configurable which roles and fields are excluded Duplicated items are automatically pasted to the end of the target field and set to hidden status so that changes are not directly published Automatic clipboard update when other items are picked Automatically removes old clipboard data if it is not pasted within 6 hours Delete clipboard itself by clicking the selected item again Benefit: unbelievably fast workflow and content replication What the module can't do
      Before an item can be duplicated in its current version, the source page must be saved. This means that if you make changes to an item and copy this, the old saved state will be duplicated Dynamic loading is currently not possible. Means no AJAX. When pasting, the target page is saved completely No support for nested repeater items. Currently only first level items can be duplicated. Means a repeater field in a repeater field cannot be duplicated. Workaround: simply duplicate the parent item Dynamic reloading and adding of repeater items cannot be registered. Several interfaces and events from the core are missing. The initialization occurs only once after the page load event Changelog
      1.0.4
      Bug fix: Various bug fixes and improvements in live synchronization Bug fix: Items are no longer inserted when the normal save button is clicked. Only when the past button is explicitly clicked Feature: Support of multiple repeater fields in one page Feature: Support of repeater Min/Max settings Feature: Configurable roles and fields Enhancement: Improved clipboard management Enhancement: Documentation improvement Enhancement: Corrected few typos #1 1.0.3
      Feature: Live synchronization Enhancement: Load the module only in the backend Enhancement: Documentation improvement 1.0.2
      Bug fix: Various bug fixes and improvements in JS functions Enhancement: Documentation improvement Enhancement: Corrected few typos 1.0.1
      Bug fix: Various bug fixes and improvements in the duplication process 1.0.0
      Initial release Support this module
      If this module is useful for you, I am very thankful for your small donation: Donate 5,- Euro (via PayPal – or an amount of your choice. Thank you!)
      Download this module
      > Github: https://github.com/FlipZoomMedia/InputfieldRepeaterMatrixDuplicate
      > PW module directory: https://modules.processwire.com/modules/inputfield-repeater-matrix-duplicate/
    • By gerritvanaaken
      Wouldn’t it be cool to have whole repeater items (or even repeater matrix items) language-specific. Some of my clients do have pages that are 90% identical in German and English, but there are some sections that should not appear in one or another language. I attached a concept screenshot.
      Would something like this be possible with some simple backend hooks and "hidden checkbox fields"? Or is it way more complicated?
       

    • By brdje
      Greetings,
       
      I've ran into an issue with adding a repeater field to a template.
      The page editor in the backend shows the fields and the data attached to the fields, including the repeater.
       
       
      However, when viewing the template in the front-end, there is no sign of a repeater field in the data set.
      ["data"]=> array(3) { ["name1189"]=> string(11) "partenaires" ["status1189"]=> string(1) "1" ["title"]=> string(8) "Partners" } } Do u have any idea what could be causing this issue?
      I've tried recreating the field and there is no caching active, but still can't get the repeater in the data set.
    • By Robin S
      Repeater Images
      Adds options to modify Repeater fields to make them convenient for "page-per-image" usage. Using a page-per-image approach allows for additional fields to be associated with each image, to record things such as photographer, date, license, links, etc.
      When Repeater Images is enabled for a Repeater field the module changes the appearance of the Repeater inputfield to be similar (but not identical) to an Images field. The collapsed view shows a thumbnail for each Repeater item, and items can be expanded for field editing.
      Screencast

      Installation
      Install the Repeater Images module.
      Setup
      Create an image field to use in the Repeater field. Recommended settings for the image field are "Maximum files allowed" set to 1 and "Formatted value" set to "Single item (null if empty)". Create a Repeater field. Add the image field to the Repeater. If you want additional fields in the Repeater create and add these also. Repeater Images configuration
      Tick the "Activate Repeater Images for this Repeater field" checkbox. In the "Image field within Repeater" dropdown select the single image field. You must save the Repeater field settings to see any newly added Image fields in the dropdown. Adjust the image thumbnail height if you want (unlike the core Images field there is no slider to change thumbnail height within Page Edit). Note: the depth option for Repeater fields is not compatible with the Repeater Images module.
      Image uploads feature
      There is a checkbox to activate image uploads. This feature allows users to quickly and easily add images to the Repeater Images field by uploading them to an adjacent "upload" field.
      To use this feature you must add the image field selected in the Repeater Images config to the template of the page containing the Repeater Images field - immediately above or below the Repeater Images field would be a good position.
      It's recommended to set the label for this field in template context to "Upload images" or similar, and set the visibility of the field to "Closed" so that it takes up less room when it's not being used. Note that when you drag images to a closed Images field it will automatically open. You don't need to worry about the "Maximum files allowed" setting because the Repeater Images module overrides this for the upload field.
      New Repeater items will be created from the images uploaded to the upload field when the page is saved. The user can add descriptions and tags to the images while they are still in the upload field and these will be retained in the Repeater items. Images are automatically deleted from the upload field when the page is saved.
      Tips
      The "Use accordion mode?" option in the Repeater field settings is useful for keeping the inputfield compact, with only one image item open for editing at a time. The "Repeater item labels" setting determines what is shown in the thumbnail overlay on hover. Example for an image field named "image": {image.basename} ({image.width}x{image.height})  
      https://github.com/Toutouwai/RepeaterImages
      https://modules.processwire.com/modules/repeater-images/
    • By Orkun
      Hi Guys
      I have a problem with a repeater field. Some weeks ago I had exported a repeater field from a dev installation and then imported it to a live installation. All just had worked fine as I remember (the field was created etc...). But today I got an email from the developer of our customer that he has a problem with two repeater fields. When he had changed the fields of another repeater it has also changed it in the other repeater field (which I had imported some weeks ago). I investigated this further and found out that exporting/importing of repeater fields doesn't work for my version of processwire (we are using 2.7.3) (see https://github.com/processwire/processwire-issues/issues/416). 
      So I decided to remove the repeater field and create it again manually on the live enviroment. I could remove the repeater field from the template but I can't delete the repeater field because it is referring to a false repeater template. How can I fix this issue so that I can delete the repeater field?
       
      The "event_dates" repeater field is referring to the "repeater_speciality_adresses" template which is wrong.

      When I try to delete the field I get this error:

       
      Do I need to manually remove the field from the db? What do I exactly need to do?
      Kind Regards
      Orkun
×
×
  • Create New...