Noel Boss

Image not saved… HELP!

Recommended Posts

Hi, I'm stuck since hours and don't know what to do. Here is my Problem:

I try to generate Previews of PDF using imagick. I have 4 PDF, I generate a preview of the first page of the pdf, save it to a temporary file and want to import it using the api into an image field. It works for the later 3 pdf but not the first. I add it to the image field and save it. Inside the function that saves it, the image is stored in 'data' as well as in 'itemsAdded' but as soon as i leave the function, its nowhere to be found.

Process:

1. create previewimage using imagick and create Pageimage > works

2. add image to filed 'filepreviews', returns Pageimages array with image added > okay

3. save page > returns true

4. Outside renderPreview method, image is not anymore in 'filepreviews'

// mymodule
// …
// foreach($files as $file){

  $preview = wire('page')->filepreviews->get('name*='.$file->basename(false));
  // if there is no preview image…
  if (!$preview instanceof Pageimage) {
	$this->renderPreview($file) // we create one using $this->renderPreview > should return true on successful save
	dump(wire('page')->filepreviews); // my Image is nowhere to be found
  	$preview = wire('page')->filepreviews->get('name*='.$file->basename(false));
  }

// end for each

	// render a preview of an otherwhise not supported file format
	// return true if sucessfull save
	private function renderPreview($file)
	{
		$page = wire('page');
		
		// get path to temporary image
		$tempFile = $path.$file->basename(false).'-preview.jpg';
		// … some imagick code
		// … and save it:
		$imagick->writeImage($tempFile);

		$img = new Pageimage($page->filepreviews, $tempFile);
		$img->description = $file->basename(false);

		// destroy temp image
		unlink($tempFile);

		// this is my Pageimage, all good…
		dump($img);

		// save image, my Pageimage can be found in data and itemsAdded – all good
		dump($page->filepreviews->add($img));
		$page->of(false);
		$success = $page->save();
	
		// sucess = true
		dump($success);

		return $success;
	}

5acf2824c13fa_ScreenShot2018-04-12at11_27_59.thumb.png.ceb8f022b9c411004e767b25abd26a02.png

 

Second question:

Would there a generally better approach? Like using pageFiles somehow. Goal is to be able to use the image api like scale etc – I don't generally need the images to be stored in an image field.

 

Share this post


Link to post
Share on other sites

Have you tried to do $page->of(false) before you add the image?
 

$page->of(false);
$page->filepreviews->add($img);
$success = $page->save();

EDIT: this would explain why the first did not get added but the follwing did. Because of() was only set to false after adding the first image

  • Like 6

Share this post


Link to post
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

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By louisstephens
      I have a repeater with a text field where I would like to use hanna code (to make it easier on the user) so the user can define the action of a image that is in the repeater. For example:
      1. The image should have an external link:
      - the user can just type in the url
      2. The image, when clicked, should be printable (using print.js)
      - the user can just type [[print_image]]
      That works just fine, but I am running into an "issue". The code I need to use to print is:
      onclick="printJS({printable: 'path_to_image', type: 'image'});" I can put that into the hanna code as plain text, but I have no idea how to get the image from the repeater item and pass to "path_to_image". Is this even possible?
    • By louisstephens
      I have a script that is pulling in a json feed (will be attached to a cron job later) which looks like:
      $http = new WireHttp(); // Get the contents of a URL $response = $http->get("feed_url"); if($response !== false) { $decodedFeed = json_decode($response); } Everything there works well and I can pull the id, title, status (updated, new, sold) and other items from the decoded feed in a foreach loop. My whole goal is to create pages from the feed, but if the page has already been created, with all the same exact items from the json feed, I will need to "skip" over it.
      So far, I am running into a roadblock with my checks. I guess I need to compare the json to all my pages and their values and:
      1. If an id already exists, check to see if a fields data has been updated and then update the page,
      2. If an id exists and all fields are unchanged, skip adding that page
       
      $http = new WireHttp(); // Get the contents of a URL $response = $http->get("feed_url"); if($response !== false) { $decodedFeed = json_decode($response); foreach($decodedFeed as $feed) { $u = new Page(); $u->template = $templates->get("basic-page"); $u->parent = $pages->get("/development/"); $u->name = $feed->title = $feed->id; $u->title = $feed->title; $u->status = $feed->status $u->body = $feed->title; $u->save(); $u->setOutputFormatting(false); } } else { echo "HTTP request failed: " . $http->getError(); } I am really just hung up on how to do the current page checks and matching them with the json field data.
    • By louisstephens
      So I was going to build a todo tracking app for myself to test/broaden my knowledge of processwire, and so far it has been taxing 😓.  My Site structure is:
      - Project One - Phase One - Task - Task - Task - Phase Two - Task - Task - Task So far it was pretty easy, I can easily foreach through the Project and get the phases with their tasks. However, it gets a bit muddled when I have more than one project as I was trying to have a dashboard where the content switches out to the selected project as opposed to accessing each project via their own url. How would yall handle this?
      My next hurdle is each task has a select field (for project status) that I want to update via ajax (for the smooth transitioning).
      Scenario: You finish a task, change the option from "new" to "completed", and an onclick changes the status drop down background to green (which I have working), but then posts/saves a field on the backend to the new option.
       
      I have a page called "Actions" set up with url segments using
      if ($config->ajax && $input->urlSegment1 == 'change-status') { //save update field on admin } However, I am a little fuzzy on how to actually pass the current page along with the new selected status to actually update the page (task). I guess I am not very far into my endeavor. Any help would be greatly appreciated.
    • By louisstephens
      So this is more or less just a question regarding best practices, and how to actually achieve this. I have an internal tool I built awhile ago that has just gotten very "trashed". The naming conventions are all out of whack due to trying to get something completed, and pages are just everywhere. The fields got really out of hand as well, but I believe I have found a much cleaner field structure with the Repeater Matrix and a few other ProFields.  I decided recently to rewrite the template structure and the fields from scratch to keep everything nice and neat, but then it hit me that I would need to move all the previous data over and populate the new fields etc.
      The current tree looks something like:
      Group Title - Section A (template "section") - Category One (template "category") - Category Two (template "category") - Section B (template "section") - Category One (template "category") - Category Two (template "category") Etc etc... The structure is pretty good, and I am thinking of keeping it as it serves my purpose. However, I now have about 140 Sections with child pages that I would hopefully like to move to different templates, as well as changing the child templates/mapping data to the new fields. The only fields I need to worry about are a few textareas, text fields, options field,  as well as 1 image filed.
      I guess my real question is, what is the best way to go about this "migration" via the api while keeping the parent/child structure. It would be ok to leave it as is and chip away at it if I were the only one using it, but unfortunately that is not the case. 
      I guess one approach would be to copy over the entire structure and make the move to the new templates/fields. Once we have verified all the data/templates are correct, we could remove the old structure and possibly rename the new to mirror the old. However, this might just be too complicated.
    • By Marcel
      Hey, 
      I am very new to processwire and bootstrap. I have a field (text area) and there I want to be able to insert an image which is responsive. I tryed it with Source but in the end the page doesn't seem to like it when I insert in Source the following code
      <img src="<?php echo $homepage->content_img->url; ?>" class="img-fluid" alt="Responsive image"> What can I do to make it possible to insert reponsive images in a text area?
      Thank you in advance.
      Marcel