Jump to content
anderson

php basics? about Repeater print out

Recommended Posts

Hi,

For the purpose of learning, as shown in this photo, I created a repeater field "we", then a template, then a page.

But in /templates/testrepeater.php, I has some problem, the "foreach" part does not work as expected.

<html>
<body>
	<?php echo "<h1>$page->title</h1><br>"; ?>

	<? foreach($page->we as $member); ?>
		<img  src="<?php echo $member->images->url; ?>" alt="">	
		<?php echo $member->wemember; ?><br>
	<? endforeach;?>
</body>
</html>

Could anybody please help point out my error?

Thanks in advance.

repeatertest.jpg

Share this post


Link to post
Share on other sites

From a quick look, I see a typo here:

<? foreach($page->we as $member); ?>

It should be:

<? foreach($page->we as $member): ?>

Notice ":" instead of ";"

  • Like 1

Share this post


Link to post
Share on other sites

You may also need to grab the ->first() image from the images field, or add another nested foreach to loop through all images, eg:

    <?php echo "<h1>$page->title</h1><br>"; ?>

    <? foreach($page->we as $member): ?>
        <? foreach($member->images as $image):
            <img src="<?php echo $images->url; ?>" alt="">    
        <? endforeach;?>    
        <?php echo $member->wemember; ?><br>
    <? endforeach;?>

 

Share this post


Link to post
Share on other sites

I'd recommend using adrians great tracy debugger module. Then you can easily (and instantly) see the content of your variables. It has lots of helpful information so you'll learn a lot quicker and it has the console, where you can try out things quickly and easily. See what you get by a simple dump - using the short syntax d()

Zfv1HnA.png 

  • Like 2

Share this post


Link to post
Share on other sites
<html>
<body>
	<?php echo "<h1>$page->title</h1><br>"; ?>

	<? foreach($page->we as $member): ?>
		<img  src="<?php echo $member->Images->url; ?>" alt="">	
		<?php echo $member->wemember; ?><br>
	<? endforeach;?>
</body>
</html>

 

Share this post


Link to post
Share on other sites

Hi,

1. PHP notice is not error. Your code still valid.

2. Try change the line if displaying image to the following:

<?php echo $member->images->first()->url; ?>

Gideon

Share this post


Link to post
Share on other sites
9 hours ago, Gideon So said:

Hi,

1. PHP notice is not error. Your code still valid.

2. Try change the line if displaying image to the following:

<?php echo $member->images->first()->url; ?>

Gideon

Thanks for your help. 

first() is recognized as unknow function?

To make it clear, with @adrian's code, I removed everything else that's working, only kept:

    <? foreach($page->we as $member): ?>
        <? foreach($member->images as $image):
            <img src="<?php echo $images->url; ?>" alt="">    
        <? endforeach;?>    
    <? endforeach;?>

 and the result output is:

we as $member): ?> images as $image):  

that's always the same problem.

Really don't know what is going on.  

Share this post


Link to post
Share on other sites

another format:

    <? foreach($page->we as $member): ?>
        <? foreach($member->images as $image):
            echo '<img src="' . $images->url . '"  alt="">'    
        <? endforeach;?>    
    <? endforeach;?>

still similar result.

Share this post


Link to post
Share on other sites

Can you show the code from the entire page? 

Is it maybe a PHP short tags issue, or a character encoding issue?

Do you have PW debug mode on?

Does that code work in the Tracy Debugger console panel? Just trying to isolate it.

 

Share this post


Link to post
Share on other sites

Thanks for fast response.

17 minutes ago, adrian said:

code from the entire page? 

my last post IS the entire page of \site\templates\testrepeater.php

I'm new to all this, I didn't create any shortcut of PHP, Wordpress or anything.

 

21 minutes ago, adrian said:

character encoding issue?

Just tried ANSI, Unicode, UTF-8. All the same.

And yes, PW debug is ON. 

Not in the Tracy Debugger console panel.

Share this post


Link to post
Share on other sites

This does not help because tracy and the file editor panel do not work on this host. Also, you should never make any admin login data public, please remove it from your post, even if it is a temporary host.

Did you do (and I mean DO, not READ) the hello world tutorial? https://processwire.com/docs/tutorials/hello-worlds/

PS: I got several 502 bad gateway errors on your install, so you might have server issues that cause several problems...

Share this post


Link to post
Share on other sites

i think it's a problem with php 😉 

 

Check it with this code:

<html>
<body>
	<?php echo "<h1>$page->title</h1><br>"; ?>

	<?php foreach($page->we as $member): ?>
		<img  src="<?php echo $member->Images->url; ?>" alt="">	
		<?php echo $member->wemember; ?><br>
	<?php endforeach;?>
</body>
</html>

 

you are using <? ... but with newer PHP Versions, this isn't working with the standard configuration, so you should always use <?php instead of <?

Share this post


Link to post
Share on other sites
20 minutes ago, zoeck said:

i think it's a problem with php 😉 

Check it with this code:

......

you are using <? ... but with newer PHP Versions, this isn't working with the standard configuration, so you should always use <?php instead of <?

You saved my life !!!!!!

This works:

<html>
<body>
	<?php echo "<h1>$page->title</h1><br>"; ?>

	<?php foreach($page->we as $member): ?>
			<?php foreach($member->images as $image): ?>
	            	<img  src="<?php echo $image->url; ?>" alt="">   
	        <?php endforeach;?> 		
		<?php echo $member->wemember; ?><br>
	<?php endforeach;?>
</body>
</html>

New PHP version is more tight?

And I appreciate help of everybody here, so nice! 

Share this post


Link to post
Share on other sites
37 minutes ago, bernhard said:

This does not help because tracy and the file editor panel do not work on this host. Also, you should never make any admin login data public, please remove it from your post, even if it is a temporary host.

OK, I'll remember that, and any Admin here please delete that info for me, guess I cann't do that on my own. And I find it hard to amend my post, only get a short window of one minute or so.

And, yes, I DID the hello world tuts.  Also I'm watching some youtube tuts by Ryan. Hope I could learn fast. 

Thanks.

  • Like 1

Share this post


Link to post
Share on other sites

You can also just change your login credentials or take the site offline 😉

Share this post


Link to post
Share on other sites
Just now, bernhard said:

You can also just change your login credentials or take the site offline 😉

Oh, good to know. 👍

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: – soon –
    • By Peter Knight
      I have 2 repeater types working with the Repeater Matrix.
      To keep things simple, I have
      image gallery a downloads gallery. I can't quite figure out how to echo the contents from within a product_gallery. 
      I can get the code below to display the text 'An image gallery' but not the bunch of images within this.
      I'm not sure though if it's my variable trail or my nested echo statement.
       
      <?php foreach($page->components as $item) { if($item->type == 'product_gallery') { echo " An image gallery..."; foreach($product_gallery->images as $photo) { echo " An image <image src='{$photo->url}'> "; } } else if($item->type == 'downloads') { echo " A download gallery... "; } } ?> Thanks
      P
    • By Harmen
      Hi All,
      I've made a previous regarding an issue which I solved but I stumbled across a new issue :). Below again the explanation needed.
      You need a short introduction for this. The company I am working for has approx. 80 products on their website and they all have their own features. The features are imported from an older system which isn't used anymore. Back then, when they changed from the old system to PW, we imported the features into the product pages as a JSON-array so the pages could load a bit faster as exploding a JSON array is a bit faster than loading in a lot of items from a table or a repeater field.
      How the JSON array looks like: 
      {     "2": {  // The ID of the group that contains the actual features         "name": "Model and function", // The name of the group         "features": {             "43": { // Attribute ID                 "name": "Resolution (DPI)", // Attribute name                 "values": {                     "896": "500-1500-2000-3500" // Value ID and value name                 }             }         }     } } Now we are adding a few more products to the catalog with new features and some that are already in use by other products but I am really struggling to assign the right ID's with the correct values in 7 different languages without messing up filters etc. So I decided to develop a module that lets you easily add feature groups, attributes and values as pages and connect these to the product using a repeater. This started by exporting all the current groups, attributes and values and import them as pages in the following structure:
      - Features - Feature Groups - Group 1 - Group 2 - ... - Feature Attributes - Attribute 1 - Attribute 2 - ... - Feature Values - Value 1 - Value 2 - ... Secondly, I created a repeater field that I assigned to the 'Features'-page that can handle the JSON structure explained above by seeing each item of the repeater field as a group. Inside each item you can select the group page and you will find another repeater which contains 2 page selectors to select an attribute and a value. A single repeater field looks like this:

      Next step was to create a module that gets this field as an Inputfield from the Features page. Once the user has finished adding groups, attributes and values he can click on save and I export all the values in the same JSON array structure as earlier but now the ID's of the groups, attributes and values are just the page ID's. This works great to add new features to new products. 
      BUT, sometimes the features of a product change or need to be changed and you don't want to change the JSON array manually.
      So my idea was to do the same thing as adding the features, but now you grab the values from the product first and populate the items of the repeater field.
      $featuresPage = wire("pages")->get("template=features"); $featureGroups = json_decode($product->features, true); foreach ($featureGroups as $featureGroupID => $featureGroup){ $row = $featuresPage->features_repeater->getNewItem(); $groupPage = wire("pages")->get($featureGroupID); $row->feature_group_selector = $groupPage; $row->save(); foreach ($featureGroup["features"] as $featureID => $feature){ $featuresRow = $row->feature_repeater->getNewItem(); $attributePage = wire("pages")->get($featureID); $valuePage = wire("pages")->get(key($feature['values'])); $featuresRow->feature_attribute_selector = $attributePage; $featuresRow->feature_value_selector = $valuePage; $featuresRow->save(); } $row->save(); } $featuresPage->save(); $f = wire('fields')->get('features_repeater'); $inputfield = $f->getInputfield($featuresPage); $form->add($inputfield); $f = $this->modules->get("InputfieldSubmit"); $f->name = 'updateFeatures'; $f->label = 'Update Features'; $f->icon = 'plus'; $f->value = 'Update Features'; $form->add($f); Then the user can change / add features, click save and done!
      It is possible to update the feature attributes and values, but when I change the feature group value, it seems like PW creates a new field behind the scenes and keeps the old value as well. So let's say I have the following feature structure:
      - Feature Group 1 - Feature attribute 1 - Feature value 1 Now I want to update Feature Group 1 to Feature Group 2, below is the desired result and the actual result:
      // === Desired result - Feature Group 2 - Feature attribute 1 - Feature value 1 // === Actual result - Feature Group 2 - Feature attribute 1 - Feature value 1 - Feature Group 1 - Feature attribute 1 - Feature value 1  
      I am using the following function to update the features:
      private function processForm5_UpdateFeatures(InputfieldForm $form){ $form->processInput($this->input->post); if (count($form->getErrors())) return false; $pageID = $this->session->selectedProduct; $product = wire('pages')->get($pageID); $product->of(false); $repeater = $form->get("features_repeater")->value; $languages = wire("languages"); foreach ($languages as $language) { $return_array = []; $i = 0; foreach ($repeater as $repeaterItem) { //$this->message($repeaterItem); $group = $repeaterItem->feature_group_selector; if ($group["id"] == 0) { continue; } else { $group = wire("pages")->get($group["id"]); $feature_group_name = &$return_array[$group->id]['name']; if (!isset($feature_group_name)) $feature_group_name = $group->title->getLanguageValue($language); $features = $repeaterItem->feature_repeater; foreach ($features as $feature) { $this->message($feature); $attribute = $feature->feature_attribute_selector; $value = $feature->feature_value_selector; if ($attribute["id"] == 0 || $value["id"] == 0) { continue; } else { $attribute = wire("pages")->get($attribute["id"]); $value = wire("pages")->get($value["id"]); $return_array[$group->id]['features'][$attribute->id]['name'] = $attribute->title->getLanguageValue($language); $return_array[$group->id]['features'][$attribute->id]['values'][$value->id] = $value->title->getLanguageValue($language); } } } } $product->features->setLanguageValue($language->name, json_encode($return_array, JSON_UNESCAPED_UNICODE)); } $product->save(); $featuresPage = wire("pages")->get("template=features"); $featuresPage->features_repeater->removeAll(); $featuresPage->save(); /* $this->messages("clear all"); $this->errors("clear all");*/ $this->message("Updated all features for {$product->title}"); $this->session->redirect("../"); } Is there a way to avoid the current result and get the desired result? Why is there even a new repeater page created for the new value? Anything that can help me is greatly appreciated!
       
      ~Harmen
    • By gregory
      Hi guys, I need help.
      how do I translate Next Page?
      <?php if($page->next->id) {echo "<div class='float-right'><a class='button' href='{$page->next->url}'> Next Page </a></div>";} ?> I usually use this:
      <?php $lang = $user->language->name; if($lang == 'default') {echo "Next Page";} else {echo "Pagina successiva";} ?> or
      <?php echo __("Next Page"); ?> Thanks
    • By nuel
      Hi there
      Basically I want to call code within a ProcessWire page that isn't used as a template. Example: www.mypwpage.com/myphpfile.php
      I have a working PW Website with a couple of pages like /artists, /releases, /videos etc. Now I need a page /download without any editable fields in the backend, just calling some PHP code (that was coded by another guy) containing a form that checks unique download-codes in a second database and starts the download of the desired file. The script is working fine right now as part of a static website, but since I built PW behind the site, this independent «Download Section» of the page doesn't work anymore.
      Right now I have the main file download.php as a page template on a newly created empty page called /download, so until now the form is working (wow). After sending the form containing the download-code, the file check_code.php in a subfolder /site/templates/download is called and that's where I get an error.
      Any help?
×
×
  • Create New...