MyBB Community Forums

Full Version: Language variables with spritf keeps first value and all language vars.
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
I am currently developing a new plugin and found this error into mybb.

In postbit where values are changes into every post or any new pages you can see this error.

Sample 1:

$lang->sample1 = "Sample 1";
---------
other lang vars.
------------
$lang->sample1 = "This is a new value for sample 1";



The right value must be the latest one, but unfortunatelly allways takes the first value.

And the real problem is when i use lang->sprintf

I mean if i woul like to use this:

$lang->sample2 = "User id for this post {1}";

$lang->sample2 = $lang->spritf($lang->sample2,$post['newvalue']);

And if i use this:

$lang->sample2 = "User id for this post ".$post['newvalue'];

Then the right value appears like if i use the sprintf ...

And use it into a hook in postbit template then allways takes the first post uid and the same text

This way i can not do any language vars like sprintf any more and i have to use directly into post vars, or how can we use this ?
Please give us a code sample that we can use to test this issue. Sorry you are having troubles.
https://github.com/WhiteNeo/post_rate

Even i was sent in here but still waiting validation.

I have comented lang part into postbit with the common errors and in new templates i have to add multi instances to retrieve code besides one var or lang var. Maybe i am doing something wrong and no problem mate i know how hard is mantain the code up to date.

Thanks for your time.

I was taken the value from a new serialized data into posts and when i dump the var all values are right, if i use the code in parts it is fine too but if i use sprintf then the same value keeps it as the first one result.

In new templates i have to do the same.

If you can review that to help me on the right way to write all missing parts in this plugin it would be awesome.

Ok i have make a video of what i mean.

In ajax all works fine, even if i write lang vars with the value but do not with sprintf, only some parts works fine even if i put into a post var same happens, the value are there but only if i set without sprintf works fine.



Thanks in advance.
Okay Whiteneo, I spent some time this morning and was able to track down the problem.

In inc/plugins/dnt_post_rate.php on line 860 (and 861 in the commented line), you are overwriting this language variable:

$l['pcl_total'] = '<span style="display:block">This post has been rated {1} times.';

So that on the first iteration it is set to this:

$l['pcl_total'] = '<span style="display:block">This post has been rated 6 times.';

Then the next call to MyLanguage::sprintf cannot replace the {1} because it isn't there any more.

To fix, just assign to a variable instead of assigning back to the language variable.
Ok undestand so the right way is using vars instead lang vars, well i can now continue writting this plugin without several unnecesary lang addittions because i do not like that Smile i prefer to use single as posible and editable as posible for user in the front end but backend i can focus into fix errors, customize the content to be easy to change from user's side.

Thanks for your time.
(2017-12-30, 09:44 PM)Whiteneo Wrote: [ -> ]Ok undestand so the right way is using vars instead lang vars

To be clear, there is nothing wrong with assigning values to new properties of the $lang object, but in cases where MyLanguage::sprintf is used, those variables (with the number placeholders, ie. {1}, {2}) should not be overwritten. Instead create a new (unused) property:

foreach ($things as $id => $thing) {
	$value1 = $thing->['property1'];
	$value2 = $thing->['property2'];

	$lang->new_key = $lang->sprintf($lang->existing_key_with_placeholders, $id, $value1, $value2);

	echo "<a href=\"url.com\">{$lang->new_key}</a>";
}

(2017-12-30, 09:44 PM)Whiteneo Wrote: [ -> ]Thanks for your time.

You're welcome. Smile
yep at the end i will use that for new templates with the row value inside lang name declaration all other code must be the same, i was used a new post var for postbit but for new templates i will use that trick.

I mean i will use the count to set a value, then i will use this:

$lang->new_key[$item_no] = $lang->sprintf($lang->new_key, $id, $value1, $value2);

I think this one whould work either due i will assign new record value for every listed items into my sql rows.

I suppose this should work, but otherwise i will use foreach as you recommend, and thanks seriously for this aclaration, now i wont waste the time trying to make a function works where they are not Smile
You're welcome. Cool