バージョン選択

フォーラム

メニュー

オンライン状況

36 人のユーザが現在オンラインです。 (19 人のユーザが フォーラム を参照しています。)
登録ユーザ: 0
ゲスト: 36
もっと...

サイト内検索

質問 > その他 > 【EC-CUBE4.0.3】twigとtwigMacroについて

その他

新規スレッドを追加する

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
katoasr
投稿日時: 2020/2/6 13:44
対応状況: 解決済
新米
登録日: 2020/1/30
居住地:
投稿: 5
【EC-CUBE4.0.3】twigとtwigMacroについて
▼テンプレート
[EC-CUBE] EC-CUBE4.0.3を新規インストール
[レンタルサーバ]使用していない
[OS] WIN10 pro
[PHP] PHP7.2.26
[データベース] MySQL5.7
[WEBサーバ] httpd-2.4.39
[ブラウザ] Google Chrome
[導入プラグインの有無] 無
[カスタマイズの有無]
EC-CUBE 4.0 でtwigとtwigのマクロを追加してみました

[現象]

SampleController.phpのfunction index()で配列をindex.twigに渡して表示ようとしています。
http://localhost/sample/indexにアクセスするとRuntimeErrorとなり、HTTP 500 Internal Server Error
Impossible to access an attribute ("id") on a integer variable ("1") in __string_template__
dbb243f2e991d8deb318a1724bc15d531391fc06135417c4666be3e5760536f4 at line 3.
とエラーが表示されます。キャッシュ管理からキャッシュ削除を実施してもエラー内容は変わりませんでした。
なにか指摘があれば教えてください。

SampleController.phpは下記になります。

<?php
namespace Customize\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use \Datetime;

class SampleController
{
/**
* @Method("GET")
* @Route("/sample/index", name="sample")
* @Template("Sample/index.twig")
*/
public function index()
{

$Categorise = [
["id" => 1, "name" => "suzuki", "children" => array("id" => 1,"name" => "taro")],
["id" => 2, "name" => "satou", "children" => array()]
];
return ["Categorise" => $Categorise];

}
}

index.twigは以下になります。

{% macro tree(Category) %}
{% from _self import tree %}
<a herf="{{url('product_list')}}?category_id={{ Category.id}}">
{{ Category.name}}
</a>
{% if Category.children|length>0 %}
{{dump(Category.children|length)}}
<ul>
{{dump(Category.children)}}
{% for ChildCategory in Category.children %}

{{dump(ChildCategory)}}
<li>{{tree(ChildCategory)}}</li>
{% endfor %}
</ul>
{% endif %}
{% endmacro%}

{% from _self import tree%}

<div class='ec-CategoryNaviRole'>
<div class='ec-itemNav'>
<ul class="ec-itemNav__nav">
{% for Category in Categorise %}
<li>
{{tree(Category)}}
</li>
{% endfor%}
</ul>
</div>
</div>
tsuji
投稿日時: 2020/2/7 9:39
対応状況: −−−
仙人
登録日: 2013/11/19
居住地:
投稿: 863
Re: 【EC-CUBE4.0.3】twigとtwigMacroについて
katoasr 様

以下のコードを


{% for ChildCategory in Category.children %}
    {{dump(ChildCategory)}}
    <li>{{tree(ChildCategory)}}</li>
{% endfor %}


以下のように変えるか、コメントアウトすると動くように思います。


    {{tree(Category.children)}}


実装して動かしたわけではないですが、
ChildCategory in Category.childrenで
「ChildCategory」に入るものは、idやnameの中身かと思います。
それで、tree内に入るとidの中身(1)に対してidを参照することになるかと思います。


----------------
****************************************
株式会社システムフレンド
辻 拓也(takuya tsuji)
改造専門店・EC-CUBE工房
****************************************

katoasr
投稿日時: 2020/2/7 21:45
対応状況: −−−
新米
登録日: 2020/1/30
居住地:
投稿: 5
Re: 【EC-CUBE4.0.3】twigとtwigMacroについて
tsuji様
回答ありがとうございます。
ご指摘いただいた箇所を修正して試しました。

ご指摘いただいた箇所をコメントアウトすれば動きました。

ご指摘いただいた箇所を{{tree(Category.children)}}に修正すると下記のエラーメッセージがでました。

Key "children" for array with keys "id, name" does not exist in __string_template__078dd8f837f68751123bf23bd9477b2ab0c382ded78f8c99f0f3134ab92dd434 at line 6.

twig上でdumpを試みた結果、

ChildCategoryの中身は下記のように配列が渡されることを想定していましたが、

array:2 [
"id" => 1
"name" => "taro"
]

dumpしてみると配列ではなく配列の中身が個別にChildCategoryに渡されていました。

{{dump(ChildCategory)}}の出力

1
"taro"

このため、idにアクセスできないとエラーが出力されていると思いました。

助言していただきありがとうございます。
katoasr
投稿日時: 2020/2/8 0:30
対応状況: 解決済
新米
登録日: 2020/1/30
居住地:
投稿: 5
Re: 【EC-CUBE4.0.3】twigとtwigMacroについて
tsuji様

ご助言頂いている意味が理解できました。

dumpの結果から tsuji様の考え通りの挙動で、ご指摘の通り {{tree(Category.children)}}することがわかりました。
ご指摘の通り今のままでは「idやnameの中身」がChildCategoryになるからです。

ご助言をようやく理解した上で、修正して実行すると
Key "children" for array with keys "id, name" does not exist in __string_template__078dd8f837f68751123bf23bd9477b2ab0c382ded78f8c99f0f3134ab92dd434 at line 6.
上記のようなエラーがでました。

{{dump(Category.children)}}にすれば
array:2 [▼
"id" => 1
"name" => "taro"
]

が表示されたので上書きで{{tree(Category.children)}}としたのですが前述のエラーになりました。

もし、なにか思い当たることがあればよろしくお願いいたします。

コントローラー側を
class SampleController
{
/**
* @Method("GET")
* @Route("/sample/index", name="sample")
* @Template("Sample/index.twig")
*/
public function index()
{

$Categorise = [
["id" => 1, "name" => "suzuki", "children" =>["id" => 1,"name" => "taro","children"=>[]]],
["id" => 2, "name" => "satou", "children" => []]
];
return ["Categorise" => $Categorise];

}
}

twig側を
{% macro tree(Category) %}
{% from _self import tree %}
<a herf="http://localhost?category_id={{ Category.id}}">
{{ Category.name}}
</a>
{% if Category.children|length>0 %}
<ul>
{{tree(Category.children)}}
</ul>
{% endif %}
{% endmacro%}

{% from _self import tree %}

<div class='ec-CategoryNaviRole'>
<div class='ec-itemNav'>
<ul class="ec-itemNav__nav">
{% for Category in Categorise %}
<li>
{{tree(Category)}}
</li>
{% endfor%}
</ul>
</div>
</div>

とすることで解決しました。

tsuji様 アドバイスありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ


 



ログイン


EC-CUBEペイメント

公式ストアEC-CUBE4系デザインテンプレート続々リリース中

統計情報

総メンバー数は59,208名です
総投稿数は95,090件です

投稿数ランキング

1
seasoft
7332
2
AMUAMU
2712
3
nanasess
2035
4
468
1979
5
yuh
1612
6
umebius
1562
7
red
1391
8
h_tanaka
971
9
fukap
907
10
tsuji
863
11
shutta
835
12 ramrun 789
13
tao_s
783
14 karin 656
15 sumida 641
16
homan
633
17 DELIGHT 571
18
patapata
502
19
flealog
485
20 tonton 437


ネットショップの壺

EC-CUBEインテグレートパートナー

Copyright© EC-CUBE CO.,LTD. All Rights Reserved.