Retrieving view data in a view composer - php

If I do the following in this view composer:
View::composer('product.edit', function($view)
{
$viewdata = $view->getData();
dd($viewdata);
});
I can see in the output that exists 'language_id', however I don't know how to retrieve it, since $viewdata['language_id'] will throw an exception.
How should I go about this?
Update:
The accepted answer led me to discover that when a presenter is involved in this operation, the model will be available in the offset, here is the final code:
View::composer('product.edit', function($view)
{
$data = $view->offsetGet('product')->toArray();
echo $data['language_id'];
exit;
});

You may try this:
$language_id = $view->offsetGet('language_id');
Following public methods are available in the $view object (An instance of Illuminate\View\View)
0 => string '__construct' (length=11)
1 => string 'render' (length=6)
2 => string 'renderSections' (length=14)
3 => string 'with' (length=4)
4 => string 'nest' (length=4)
5 => string 'withErrors' (length=10)
6 => string 'getEnvironment' (length=14)
7 => string 'getEngine' (length=9)
8 => string 'getName' (length=7)
9 => string 'getData' (length=7)
10 => string 'getPath' (length=7)
11 => string 'setPath' (length=7)
12 => string 'offsetExists' (length=12)
13 => string 'offsetGet' (length=9)
14 => string 'offsetSet' (length=9)
15 => string 'offsetUnset' (length=11)
16 => string '__get' (length=5)
17 => string '__set' (length=5)
18 => string '__isset' (length=7)
19 => string '__unset' (length=7)
20 => string '__call' (length=6)
21 => string '__toString' (length=10)
You may also try something like this:
if($view->offsetExists('language_id')) {
$language_id = $view->offsetGet('language_id');
}

Worth noting you can also access view data using the attribute syntax (at least starting Laravel 8):
$languageId = $view->product->language_id ?? null;

Related

Why is the array index is undefined undefined?

I'm having trouble finding out why is the following code not working.
I've a JSON answer from a remote server, containting the following data:
...., "UserId":{"50423":"Free Kkludkjta","54379":"Sjkllyu\u00e9lkj Nolla","67103":"Tswt\u00f3 BLLA","64469":"Uz\u00e1h G","46699":"RT\u00e1sdt UTSF","46873":"Tam\u00e1s XXXX"}, ...
(names are swapped, but since there are some special chars in the aswer I've kept those)
And I have the following code sniplet, which gives 'array index undefined for idx 64469':
$proj_schema = json_decode($proj_schema);
var_dump($proj_schema->UserId);
$avail_users = (array)$proj_schema->UserId;
var_dump($avail_users);
var_dump($avail_users[64469]);
The output is the following:
C:\wamp\www\j34\administrator\components\com_mycomponent\views\myview\view.html.php:113:
object(stdClass)[309]
public '50423' => string 'Name1' (length=14)
public '54379' => string 'Name2' (length=18)
public '67103' => string 'Name3' (length=12)
public '64469' => string 'Name4' (length=15)
public '46699' => string 'Name5' (length=11)
public '46873' => string 'Name6' (length=12)
C:\wamp\www\j34\administrator\components\com_mycomponent\views\myview\view.html.php:115:
array (size=6)
'50423' => string 'Name1' (length=14)
'54379' => string 'Name2' (length=18)
'67103' => string 'Name3' (length=12)
'64469' => string 'Name4' (length=15)
'46699' => string 'Name5' (length=11)
'46873' => string 'Name6' (length=12)
Notice: Undefined offset: 64469 in C:\wamp\www\j34\administrator\components\com_mycomponent\views\myview\view.html.php on line 116
If I walk through the array with foreach and write out the element based on 'if ($key == 64469)' it echos the name, but I cannot access the name by array key.
Results are same with PHP 5.6.32 (I know) and PHP 7.1.0. Result is the same if I put the id in "" or '';
What am I missing with the casting?
You are using the JSON as an object and not as an array. Therefore, the key does not exist, because it is a property.
Decode with true as 2nd argument to get an array instead of an object.
$proj_schema = json_decode($proj_schema, true);

mongo PHP app error: Fatal error: Uncaught exception 'MongoException' with message ''.' not allowed in key

I have the following PHP array:
array (size=9)
'script_desc' => string 'Test Script' (length=21)
'script_date' => string 'May 11 2016 15:40:48' (length=20)
'log_date' => string 'May 12 2016 09:17:58' (length=20)
'name' => string 'test name' (length=2)
'type' => string 'location_status' (length=15)
'status' => boolean false
'test.server.1' =>
array (size=1)
'packages' =>
array (size=2)
'package1' =>
array (size=4)
'package_name' => string 'package1' (length=10)
'current_version' => string 'package1-1.4.26-r1' (length=20)
'latest_version' => string '1.4.26-r1' (length=9)
'package_status' => string '=' (length=1)
'package2' =>
array (size=4)
'package_name' => string 'package2' (length=14)
'current_version' => string 'package2-0.31.1-r1' (length=24)
'latest_version' => string '0.31.1-r2' (length=9)
'package_status' => string '<' (length=1)
'test.server.2' =>
array (size=1)
'packages' =>
array (size=2)
'package1' =>
array (size=4)
'package_name' => string 'package1' (length=16)
'current_version' => string 'package1-0.35.1-r0' (length=26)
'latest_version' => string '0.35.1-r0' (length=9)
'package_status' => string '=' (length=1)
'package3' =>
array (size=4)
'package_name' => string 'package3' (length=3)
'current_version' => string 'package3-5.3.2-r0' (length=33)
'latest_version' => string '5.3.2-r0' (length=8)
'package_status' => string '=' (length=1)
'_id' => float 5
Here's the code that I use to try to insert this array into my mongo database:
68 function add_history_record($location)
69 {
70 $m = new MongoClient("mongodb://10.1.1.1:27017");
71 $db = $m->mymongodb;
72 $collection = $db->mycollection;
73 $location['_id'] = getNextSequence("locationid");
74 $cursor = $collection->insert($location);
75 var_dump($cursor);
76 }
The error message I'm getting is this:
Fatal error: Uncaught exception 'MongoException' with message ''.' not
allowed in key: test.server.1' in
/var/www/html/mongotestapp/inventory.php on
line 74
What I've tried So Far:
To prove to myself that I can have keys with "." in it, I used robomongo to add the following document:
{
"_id" : ObjectId("573483ae3747106e60a087f9"),
"test.server.1.1" : 123
}
It saved the document in my collection no problems.
I'm not sure what I'm missing in my PHP code...
Any suggestions?
EDIT 1:
I've changed my code to include the following:
68 function add_playbook_history_record($location)
69 {
70 $m = new MongoClient("mongodb://10.1.1.1:27017");
71 $db = $m->phonesys;
72 $collection = $db->inventory;
73 $location['_id'] = getNextSequence("locationid");
74 printf($location['_id']);
75 echo "<pre>".json_encode($location)."</pre>";
76 $cursor = $collection->insert($location, array("w"=>1));
77
78 // $cursor = $collection->insert($location, array("w" => 0,"j"=>true));
79 }
I can see that the system is generating a legit location id.
I also took the json formatted output and tested in jsonlint to make sure it's properly formatted etc.
Lastly, I started playing with the write options. When I enable line 78, the system doesn't return any error messages, but the records are not added to the database. But when I set w=1, it fails with the same error message about the key.
I've been playing around with the different options and reading this: http://php.net/manual/en/mongo.writeconcerns.php
but if you have any tips I'm all ears.
I don't have any shards or other servers. Just one main mongodb server running right now.
Thanks.
You can not have a . in your key names as the error message tells you.
MongoDB accepts this directly, but you would not be able to query against these field names as in queries, the dot has a special meaning:
// document
{foo:{bar:"baz"}}}
// query
db.col.find( { 'foo.bar' : 'baz' } );
All official drivers guard against putting a . (and other chars) in key names, and hence the PHP driver correctly rejects this.

PHP and JSON from Openstreetmap search

I am trying to use Openstreetmap and PHP to point to a place on a map.
As you can see below, I retrieve a JSON array, but PHP returns a NULL value.
Note that my $url is a valid JSON (you can check it here).
<?
$url = 'http://nominatim.openstreetmap.org/search/Piazza%20Duomo%20Trento?format=json&addressdetails=1&limit=1&polygon_svg=1';
$html = file_get_contents($url);
$jsonout = json_decode($html);
echo $jsonout[0];
?>
What am I doing wrong?
What am I doing wrong?
First of all, your openning tag is not correct :
<? ----> <?php
Then, you cannot echo an array like that. Use var_dump on your array to see the structure.
When I try your code with the corrections, I got this :
array (size=1)
0 =>
object(stdClass)[1]
public 'place_id' => string '8577656' (length=7)
public 'licence' => string 'Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright' (length=84)
public 'osm_type' => string 'node' (length=4)
public 'osm_id' => string '924463183' (length=9)
public 'boundingbox' =>
array (size=4)
0 => string '46.0675164' (length=10)
1 => string '46.0676164' (length=10)
2 => string '11.1217498' (length=10)
3 => string '11.1218498' (length=10)
public 'lat' => string '46.0675664' (length=10)
public 'lon' => string '11.1217998' (length=10)
public 'display_name' => string 'Piazza Duomo, Piazza del Duomo, centro storico Trento, Trento, TN, TAA, 38122, Italia' (length=85)
public 'class' => string 'highway' (length=7)
public 'type' => string 'bus_stop' (length=8)
public 'importance' => float 0.311
public 'icon' => string 'http://nominatim.openstreetmap.org/images/mapicons/transport_bus_stop2.p.20.png' (length=79)
public 'address' =>
object(stdClass)[2]
public 'bus_stop' => string 'Piazza Duomo' (length=12)
public 'pedestrian' => string 'Piazza del Duomo' (length=16)
public 'suburb' => string 'centro storico Trento' (length=21)
public 'city' => string 'Trento' (length=6)
public 'county' => string 'TN' (length=2)
public 'state' => string 'TAA' (length=3)
public 'postcode' => string '38122' (length=5)
public 'country' => string 'Italia' (length=6)
public 'country_code' => string 'it' (length=2)
public 'svg' => string 'cx="11.1217998" cy="-46.067566399999997"' (length=40)
In answer to your question, except for trying to output an array with the following statement
echo $jsonout[0];
Which will throw a Catchable fatal error: Object of class stdClass could not be converted to string
Everything is ok.
If this is about accessing the members of the json_decode return, see below
$jsonout is an array with one element,
that one element is an object, you can access its members like this
print $jsonout[0]->licence;
Which will output
Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright
If you'd like an associative array, you can pass the second argument for json_decode, like this
$jsonout = json_decode($html,true);
print $jsonout[0]['display_name'];
Which will decode the json into an associative array and will display in a similar way
Piazza Duomo, Piazza del Duomo, centro storico Trento, Trento, TN, TAA, 38122, Italia
please use print_r() in place of echo
$url = "http://nominatim.openstreetmap.org/search/Piazza%20Duomo%20Trento?format=json&addressdetails=1&limit=1&polygon_svg=1";
$html = file_get_contents($url);
$jsonout = json_decode($html);
print_r($jsonout[0]);
and you will get your result.
or you can print $jsonout[0]["license"]

How do I check an objects property types?

Sorry for the title, I couldn't find a better way to write it =/
I am receiving a error object called ErrorBase.
If there is only one error it will return me the following:
public 'ErrorBase' =>
public 'CODIGO_ERRO' => string '1' (length=1)
public 'MENSAGEM_ERRO' => string 'Autenticação Inválida' (length=24)
public 'TIPO_ERRO' => string 'Usuario' (length=7)
But if there is more than one error, it will return me a array of objects like this:
public 'ErrorBase' =>
array
0 =>
object(stdClass)[30]
public 'CODIGO_ERRO' => string '1' (length=1)
public 'MENSAGEM_ERRO' => string 'Autenticação Inválida' (length=24)
public 'TIPO_ERRO' => string 'Usuario' (length=7)
1 =>
object(stdClass)[31]
public 'CODIGO_ERRO' => string '002' (length=3)
public 'MENSAGEM_ERRO' => string 'teste 002' (length=9)
public 'TIPO_ERRO' => string 'tipo 002' (length=8)
2 =>
object(stdClass)[32]
public 'CODIGO_ERRO' => string '003' (length=3)
public 'MENSAGEM_ERRO' => string 'teste 003' (length=9)
public 'TIPO_ERRO' => string 'tipo 003' (length=8)
3 =>
object(stdClass)[33]
public 'CODIGO_ERRO' => string '004' (length=3)
public 'MENSAGEM_ERRO' => string 'teste 004' (length=9)
public 'TIPO_ERRO' => string 'tipo 004' (length=8)
How can I work with these situations?
How do I check if there is a array of objects or only a object?
Thanks in advance for any help.
Try... is_object() and is_array()
is_array($variable) returns true if $variable contains an array, and false otherwise.
Use is_array() :
if (is_array($this->ERROR_BASE))
To test the class of an object :
if ($var instanceof ErrorBase) {
To test if it is an array :
if (is_array($var)) {
use gettype() to returns the vars type.
or use is_array/is_object to test for each

PHP::Reference or copy (case inside)?

Please help me to prove about the case if variable reference or copy.
Case1 - $arr copy or reference?:
class Ex1{
public static $var1=array(10=>'work', 20=>'home');
}
$arr=Ex1::$var1;
Case2 - $arr copy or reference?:
class Ex1{
protected static $var1=array(10=>'work', 20=>'home');
public static function getArr(){
return self::$var1;
}
}
$arr=Ex1::getArr();
Thanks,
Yosef
By my reckoning, it should be a copy.
class Ex1{
public static $var1=array(10=>'work', 20=>'home');
}
$arr=Ex1::$var1;
var_dump($arr);
$arr[15] = 'play';
var_dump($arr);
$arr2=Ex1::$var1;
var_dump($arr2);
Ex1::$var1 = array(10=>'work', 15=>'asylum', 20=>'home');
$arr3=Ex1::$var1;
var_dump($arr3);
var_dump($arr2);
gives
array
10 => string 'work' (length=4)
20 => string 'home' (length=4)
array
10 => string 'work' (length=4)
20 => string 'home' (length=4)
15 => string 'play' (length=4)
array
10 => string 'work' (length=4)
20 => string 'home' (length=4)
array
10 => string 'work' (length=4)
15 => string 'asylum' (length=6)
20 => string 'home' (length=4)
array
10 => string 'work' (length=4)
20 => string 'home' (length=4)
Both copy. Only objects are transmitted by reference by default.
Modify $arr and then var_dump(Ex1::getArr()); and you'll see if it was a copy or a reference.
edit: didn't see Ex1::var1 was protected
It is going to be a copy, test it like:
$arr=Ex1::$var1;
$arr['omg'] = 'lol';
var_dump($arr);
var_dump(Ex1::$var1);

Categories