SamC Posted November 4, 2017 Share Posted November 4, 2017 I'm making a function which just returns an image based on the current page. I set global image options in '_init.php' and wanted to use this variable in '_func.php' but it throws an undefined error. '_init.php' is appended on every page. Below is how it works now, but I've had to redefine the image options twice: // _init.php // Global image options $options = array("quality" => 80, "cropping" => "center"); // Include shared functions (if any) include_once("./_func.php"); // _func.php function getMetaImage() { $page = wire("page"); $pages = wire("pages"); // max height of uploaded landscape image = 1200px $imgHeight = 1200; $imgWidth = 1200; $options = array("quality" => 80, "cropping" => "center"); // <<<< want rid of this // if /tutorials/blog-entry/ if ($page->postThumbnail && $page->parent->id === 1017) { $metaImage = $page->postThumbnail->size($imgHeight, $imgWidth, $options)->httpUrl; } // if /tutorials/blog-entry/blog-entry/ elseif ($page->parent->postThumbnail) { $metaImage = $page->parent->postThumbnail->size($imgHeight, $imgWidth, $options)->httpUrl; } // default image on /site-settings/ else { $metaImage = $pages->get(1319)->postThumbnail->size($imgHeight, $imgWidth, $options)->httpUrl; } return $metaImage; } // /includes/header.php <meta property='og:image' content='<?= getMetaImage(); ?>'> Is there a way to define the global options just once and use them in my functions file? Thanks for any advice. 1 Link to comment Share on other sites More sharing options...
BitPoet Posted November 4, 2017 Share Posted November 4, 2017 Add them to $config in site/config.php and you can access them like every other configuration option. Just make sure to use a naming scheme that's unlikely to clash with future standard options. I tend to prefix mine with "cust". 1 1 Link to comment Share on other sites More sharing options...
SamC Posted November 4, 2017 Author Share Posted November 4, 2017 I did this now: /** * * Global image sizing options * */ $config->imageSizerOptions = array("upscaling" => true, 'cropping' => "center", "quality" => 90); Did you mean adding the whole line to config.php? // Global image options $options = array("upscaling" => true, 'cropping' => "center", "quality" => 90); I'd rather have them as a variable like this, then I can override when required inside my templates (say I want a 'nw' crop in one place). I don't mind passing the extra $options to each image resize. = EDIT= Sorry, maybe you mean, use the line in the first code block, then access like this: $thumb = $entry->postThumbnail->size(800, 450, $config->imageSizerOptions); Link to comment Share on other sites More sharing options...
fbg13 Posted November 4, 2017 Share Posted November 4, 2017 You can add your own properties to $config $config->customProperty = "whatever"; $config->prefixName = [1, 2, 3]; 1 1 Link to comment Share on other sites More sharing options...
SamC Posted November 4, 2017 Author Share Posted November 4, 2017 1 minute ago, fbg13 said: You can add your own properties to $config $config->customProperty = "whatever"; $config->prefixName = [1, 2, 3]; Aha, I see, thanks. Link to comment Share on other sites More sharing options...
horst Posted November 4, 2017 Share Posted November 4, 2017 No, I believe @BitPoet means you should add it as your custom/personal property to $config. Please don't overwrite the imageSizerOptions! // Global image options, different from default imageSizerOptions (!) $config->mySpecialImageOptions = array("upscaling" => true, 'cropping' => "center", "quality" => 90); If you overwrite the ImageSizerOptions with an array that does not include all key->value pairs, somewhere a kitten will die!! Or you do it with array_merge: $config->imageSizerOptions = array_merge($config->imageSizerOptions, array("upscaling" => true, 'cropping' => "center", "quality" => 90)); Then you always increment every key->value you don't want specifically change, (even future unknown ones, thinking on PW-Version-Upgrades!!) 1 Link to comment Share on other sites More sharing options...
SamC Posted November 4, 2017 Author Share Posted November 4, 2017 23 minutes ago, horst said: If you overwrite the ImageSizerOptions with an array that does not include all key->value pairs, somewhere a kitten will die!! Lol, now I'd hate that to be on my conscience. I'll create a custom option then. This is linked to my other post: Trying to juggle between the two here. 1 Link to comment Share on other sites More sharing options...
Robin S Posted November 4, 2017 Share Posted November 4, 2017 10 hours ago, SamC said: I set global image options in '_init.php' and wanted to use this variable in '_func.php' but it throws an undefined error. This is because of variable scope in PHP. Every function has its own internal scope. So this doesn't work: $vegetable = "Beetroot"; function vegetableOpinion() { // $vegetable is undefined in this function's scope return "$vegetable is delicious!"; } echo vegetableOpinion(); But you can pass in $vegetable as an argument to the function so it is available within the function's scope: function vegetableOpinion($vegetable) { return "$vegetable is delicious!"; } // Could be defined in _init.php if you like $vegetable = "Beetroot"; // Pass in $vegetable as an argument to the function echo vegetableOpinion($vegetable); 1 1 Link to comment Share on other sites More sharing options...
SamC Posted November 4, 2017 Author Share Posted November 4, 2017 33 minutes ago, Robin S said: This is because of variable scope in PHP. Every function has its own internal scope. Hi @Robin S yeah I thought I was aware of scope. However, my code now looks like this: // config.php /** * * Global image sizing options * */ $config->custImages = array("upscaling" => true, "cropping" => "center", "quality" => 90); // _init.php $imgOptions = $config->custImages; // Include shared functions (if any) include_once("./_func.php"); // _func.php function getMetaImage() { $page = wire("page"); $pages = wire("pages"); // max height of uploaded landscape image = 1200px $imgHeight = 1200; $imgWidth = 1200; // if /tutorials/blog-entry/ if ($page->postThumbnail && $page->parent->id === 1017) { $metaImage = $page->postThumbnail->size($imgHeight, $imgWidth, $imgOptions); } // if /tutorials/blog-entry/blog-entry/ elseif ($page->parent->postThumbnail) { $metaImage = $page->parent->postThumbnail->size($imgHeight, $imgWidth, $imgOptions); } // default image on /site-settings/ else { $metaImage = $pages->get(1319)->postThumbnail->size($imgHeight, $imgWidth, $imgOptions); } return $metaImage; } ...then I call it in a template: // /includes/header.php <meta name='twitter:image' content='<?= getMetaImage()->httpUrl; ?>'> ...and no error. The 1200px x 1200px image is created just fine (and it's def using imagemagick too, these images are being created way faster than before). I can't get my head around why this working yet my original example right at the top threw an error. Any ideas? Link to comment Share on other sites More sharing options...
fbg13 Posted November 4, 2017 Share Posted November 4, 2017 @SamC your $imgOptions is null since it's not in the function's scope. The code works because $options is ignored if null. https://github.com/processwire/processwire/blob/57b297fd1d828961b20ef29782012f75957d6886/wire/core/Pageimage.php#L377 You can check function test() { return $imgOptions; } var_dump(test()); just replace $imgOptions with wire("config")->custImages in your function 2 1 Link to comment Share on other sites More sharing options...
SamC Posted November 4, 2017 Author Share Posted November 4, 2017 I just checked, it is NULL indeed. Thanks for pointing that out. So using info from the previous two replies, I can either: // _func.php function getMetaImage() { $imgOptions = wire("config")->custImages; //... $metaImage = $page->parent->postThumbnail->size($imgHeight, $imgWidth, $imgOptions); //... } // /includes/header.php <meta name='twitter:image' content='<?= getMetaImage()->httpUrl; ?>'> OR pass it into the function. // _func.php function getMetaImage($imgOptions) { //... $metaImage = $page->parent->postThumbnail->size($imgHeight, $imgWidth, $imgOptions); //... } // $imgOptions is available from prepended _init.php <meta name='twitter:image' content='<?= getMetaImage($imgOptions)->httpUrl; ?>'> If I use the second option here, I don't need it anything on config no? I could just use a regular variable and leave config alone: // _init.php $imgOptions = array("upscaling" => true, "cropping" => "center", "quality" => 90); Would there be a preference over one way or the other? Link to comment Share on other sites More sharing options...
Robin S Posted November 4, 2017 Share Posted November 4, 2017 Personally, I wouldn't bother with the function. /includes/header.php <?php $metaImage = $page->closest("postThumbnail.count>0")->postThumbnail; if(!$metaImage) $metaImage = $pages(1319)->postThumbnail; ?> <meta name="twitter:image" content="<?= $metaImage->size(1200, 1200, ['upscaling' => true, 'cropping' => 'center', 'quality' => 90])->httpUrl ?>"> 1 Link to comment Share on other sites More sharing options...
SamC Posted November 5, 2017 Author Share Posted November 5, 2017 13 hours ago, Robin S said: $metaImage = $page->closest("postThumbnail.count>0")->postThumbnail; Oooooo, I like this! Maybe I should have mentioned that I use the function a few times. The full section looks like this. <meta property="og:type" content="article"> <meta property="og:title" content="<?= $page->get('altTitle|title'); ?>"> <meta property="og:url" content="<?= $page->httpUrl; ?>"> <meta property="og:image" content="<?= getMetaImage()->httpUrl; ?>"> <meta property="article:author" content="@pwtuts"> <meta name="twitter:card" content="summary"> <meta name="twitter:site" content="@pwtuts"> <meta name="twitter:title" content="<?= $page->get('altTitle|title'); ?>"> <meta name="twitter:description" content="<?= $page->get('metaDescription|summary|title'); ?>"> <meta name="twitter:image" content="<?= getMetaImage()->httpUrl; ?>"> <meta name="twitter:image:alt" content="<?= getMetaImage()->description; ?>"> Thanks for the help Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now