Jump to content

Issue updating multiple pages


onjegolders
 Share

Recommended Posts

Hi guys, have been struggling all day with a problem creating a front-end form.

The idea is that "students" are linked with "feedback" and on both templates there is a page field which links the two together.

The superuser has an update feedback form on the frontend where they can make changes, set to hidden/visible as well as assigning the feedback to a student.

For some reason I can get the feedback page itself to be updated, I can remove any old attachments from student pages to this feedback page but trying to update the new student to be attached is causing errors. 

I've had an error telling me to set OutputFormatting to false (it already is) and now I seem to be getting server errors that it's running out of time.

I've included the current commented code below, can anyone see anything I'm missing?

Thanks :)

<?php 

// If form is submitted

if ($input->post->submit_update_testimonial) {

	// Assign empty variables

	$out = "";
	$error = 0;

	// Check if required fields empty

	if (empty($input->post->title) || empty($input->post->testimonial)) {

		$error = 1;
		$out = "<h3>Please include a title and testimonial</h3>";

	}

	if ($error == 0) {

		// Set sanitized variables

		$title = $sanitizer->text($input->post->title);
		$testimonial = $sanitizer->textarea($input->post->testimonial);
		$date = $sanitizer->text($input->post->date);
		$student = $sanitizer->text($input->post->student);

		// Get current student who is attached to feedback (if any) and remove the attachment

		$current_s = $pages->get("template=student, student_feedback=$page");
		
		if ($current_s->id) {

		$current_s->of(false);
		$current_s->student_feedback = "";
		$current_s->save();

		}
		
		// See if newly-selected student exists and if so attach it to this feedback (CAUSING ERRORS)

		$new_s = $pages->get("template=student, id=$student");

		if ($new_s->id) {

		$new_s->of(false);
		$new_s->set("student_feedback", $student);
		$new_s->save();

		}

		// Update the actual feedbcak contents from the form

		$page->of(false);
		$page->title = $title;
		$page->body = $testimonial;
		$page->testimonial_date = $date;

		// Update whether the feedback should be visible or hidden

		if ($input->post->publish == "") {
			$page->addStatus(Page::statusHidden);
		} else {
			$page->removeStatus(Page::statusHidden);
		}

		// If set to a student then assign it on the feedback page

		if ($student == "unassigned") {
			$page->set("feedback_which_student", "");
		} else {
			$page->feedback_which_student = $student;
		}

		$page->save();

	} // end if no errors

} // end if form submitted

?>

<?php 
if(!$user->isGuest() && $user->name === $page->name OR $user->isSuperuser() OR $user->hasRole("editor")) { 

	include("./header.inc"); ?>

	<div id="feedback_item_admin" class="content">

	<div class="row">

		<div class="large-12 columns">
			<div class="content_area">

				<div class="row">
					<div class="large-9 columns">
						<h3>Edit Testimonial</h3>
					</div> <!-- /.large-9 columns -->

					<div class="large-3 columns">
						<a href="<?php echo $page->parent->url; ?>" class="tar flr">← Return to Testimonials</a>
					</div> <!-- /.large-3 columns -->
				</div> <!-- /.row -->

				<hr>

				<form action="./" method="post">

				<div class="row">
					<div class="large-8 columns">
						<input type="text" name="title" value="<?php echo $page->title; ?>">
					</div> <!-- /.large-8 columns -->

					<div class="large-4 columns">
						<input type="date" name="date" value="<?php echo date('Y-m-d', strtotime($page->testimonial_date)); ?>">
					</div> <!-- /.large-4 columns -->
				</div> <!-- /.row -->

				<textarea name="testimonial" cols="30" rows="10"><?php echo strip_tags($page->body); ?></textarea>

				<div class="row">
					<div class="large-6 columns">
						<label for="publish">Publish?</label>
						<input type="checkbox" name="publish"<?php if (!$page->is(Page::statusHidden)) { echo " checked"; } ?>>
					</div> <!-- /.large-6 columns -->
					
					<div class="large-6 columns">
						
						<label for="student">Relates to student?</label>
						<select name="student">
							<?php if ($page->feedback_which_student->id != "") { ?>
							<option value="<?php echo $page->feedback_which_student->id; ?>"><?php echo $page->feedback_which_student->title; ?></option>
							<?php } ?>
							<?php foreach ($pages->find("template=student")->remove($page->feedback_which_student) as $student) { ?>
								<option value="<?php echo $student->id; ?>"><?php echo $student->title; ?></option>
							<?php } ?>
							<option value="unassigned"<?php if ($page->feedback_which_student->id == "") { echo " selected"; } ?>>Unassigned</option>
							
						</select>
					</div> <!-- /.large-6 columns -->
				</div> <!-- /.row -->

				<input class="button secondary small drop_down" type="submit" name="submit_update_testimonial" value="Update">

				</form>

			</div>
		</div>

	</div>

<?php include("./footer.inc"); ?>

<?php } else { 
	throw new Wire404Exception();
}

 
Link to comment
Share on other sites

Thanks again Martijn, I haven't managed to get it working this morning though that may be more to do with my head being overly full of rubbish. 

I'm now just wondering how you would all go about a similar scenario? I'm just finding it's getting more and more complicated and maybe I should try reverting to the backend (I posted in another thread about a two-way page field) or maybe just start this particular template again with a fresh mind?

Maybe I don't even need the two way reference, I can just use different selectors for when I need to get the information the other way around (though it feels solid having an actual field value in both directions)

Would be interested in getting some people's thoughts...

Link to comment
Share on other sites

I seem to have started again (perhaps the best thing to do in these scenarios) and written it afresh. Now seems to work. I think perhaps this is still the way to go. I know reverse references can be made in selectors but I keep thinking I will need an actual field value at some point later in the project. It just feels more solid having an automatic reference between the two.

The following code seems to be working OK now:

<?php 

// If form is submitted

if ($input->post->submit_update_testimonial) {

	// Assign empty variables

	$out = "";
	$error = 0;

	// Check if required fields empty

	if (empty($input->post->title) || empty($input->post->testimonial)) {

		$error = 1;
		$out = "<h3>Please include a title and testimonial</h3>";

	}

	if ($error == 0) {

		// Set sanitized variables

		$title = $sanitizer->text($input->post->title);
		$testimonial = $sanitizer->textarea($input->post->testimonial);
		$date = $sanitizer->text($input->post->date);
		$student = $sanitizer->text($input->post->student);
		// $student_page = $pages->get((int) $student);
		$student_page = $pages->get("template=student, id=$student");
		// $student_page->setOutputFormatting(false);

		// Find current feedback owner (if any) and remove it

		$current = $pages->get("template=student, student_feedback=$page");

		if ($current->id) {
			$current->of(false);
			$current->student_feedback = "";
			$current->save();
		}

		// Update any page edits

		$page->of(false);
		$page->title = $title;
		$page->body = strip_tags($testimonial);
		$page->testimonial_date = $date;

		// Show/hide page

		if ($input->post->publish == "") {
			$page->addStatus(Page::statusHidden);
		} else {
			$page->removeStatus(Page::statusHidden);
		}

		// If assigned student exists assign it, else set it to empty

		if ($student_page->id) {
			$page->feedback_which_student = $student_page;
		} else {
			$page->feedback_which_student = "";
		}

		$page->save();

		if ($student_page->id) {
			
			$student_page->of(false);
			$student_page->student_feedback = $page;
			$student_page->save();

		} 
		
	} // end if no errors

} // end if form submitted

?>

<?php 
if(!$user->isGuest() && $user->name === $page->name OR $user->isSuperuser() OR $user->hasRole("editor")) { 

	include("./header.inc"); ?>

	<div id="feedback_item_admin" class="content">

	<div class="row">

		<div class="large-12 columns">
			<div class="content_area">

				<div class="row">
					<div class="large-9 columns">
						<h3>Edit Testimonial</h3>
					</div> <!-- /.large-9 columns -->

					<div class="large-3 columns">
						<a href="<?php echo $page->parent->url; ?>" class="tar flr">← Return to Testimonials</a>
					</div> <!-- /.large-3 columns -->
				</div> <!-- /.row -->

				<hr>

				<form action="./" method="post">

				<div class="row">
					<div class="large-8 columns">
						<input type="text" name="title" value="<?php echo $page->title; ?>">
					</div> <!-- /.large-8 columns -->

					<div class="large-4 columns">
						<input type="date" name="date" placeholder="YYYY-MM-DD" value="<?php echo date('Y-m-d', strtotime($page->testimonial_date)); ?>">
					</div> <!-- /.large-4 columns -->
				</div> <!-- /.row -->

				<textarea name="testimonial" cols="30" rows="10"><?php echo strip_tags($page->body); ?></textarea>

				<div class="row">
					<div class="large-6 columns">
						<label for="publish">Publish?</label>
						<input type="checkbox" name="publish"<?php if (!$page->is(Page::statusHidden)) { echo " checked"; } ?>>
					</div> <!-- /.large-6 columns -->
					
					<div class="large-6 columns">
						
						<label for="student">Relates to student?</label>
						<select name="student">
							<?php if ($page->feedback_which_student->id != "") { ?>
							<option value="<?php echo $page->feedback_which_student->id; ?>"><?php echo $page->feedback_which_student->title; ?></option>
							<?php } ?>
							<?php foreach ($pages->find("template=student")->remove($page->feedback_which_student) as $student) { ?>
								<option value="<?php echo $student->id; ?>"><?php echo $student->title; ?></option>
							<?php } ?>
							<option value="unassigned"<?php if ($page->feedback_which_student->id == "") { echo " selected"; } ?>>Unassigned</option>
							
						</select>
					</div> <!-- /.large-6 columns -->
				</div> <!-- /.row -->

				<input class="button secondary small drop_down" type="submit" name="submit_update_testimonial" value="Update">

				</form>

			</div>
		</div>

	</div>

<?php include("./footer.inc"); ?>

<?php } else { 
	throw new Wire404Exception();
}

 

Thanks to Martijn for his help.

  • Like 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...