🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

Q&A

2回答

3420閲覧

EC-CUBEで新しく追加したカラムのセレクトボックスに関数から値を表示したい

hello_space

総合スコア24

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

EC-CUBE

EC-CUBEは、主に日本国内で開発されているECコンテンツ管理システムです。ロックオン社のECKitを元にしてオープンソース化され、商品管理・受注管理・顧客管理・売上集計などECに特化した様々な機能を備えています。

0グッド

0クリップ

投稿2020/12/14 05:55

編集2020/12/21 10:34

EC-CUBEで新しく追加したカラムのセレクトボックスに関数から値を表示したい

EC-CUBEを使い開発を行っています。
EC-CUBE4系
php 7.3.25

https://sorovider.com/2019/03/20/ec-cube4%E3%81%A7%E5%95%86%E5%93%81%E9%A0%85%E7%9B%AE%E7%AD%89%E3%81%AE%E8%BF%BD%E5%8A%A0/

こちらのサイトを参考にし、商品にメーカー名カラムを追加しました。
その後、このカラムに関数の戻り値から値を取得しセレクトボックスで表示しようとする際にエラーが起こってしまいます。

app/Customize/Emtity/ProductTrait.php

<?php namespace Customize\Entity; use Doctrine\ORM\Mapping as ORM; use Eccube\Annotation\EntityExtension; /** * @EntityExtension("Eccube\Entity\Product") */ trait ProductTrait { /** * @ORM\Column(type="string", length=255, nullable=true) * @Eccube\Annotation\FormAppend( * auto_render=false, * type="\Symfony\Component\Form\Extension\Core\Type\ChoiceType", * options = { * "required": false, * "label": "メーカー名", * "choices": { * $this->getA(): $this->getA() * } * }) */ public $maker_name; public function getA() { return 'hoge'; } }

こうすると
"choices": { 'hoge' : 'hoge' }となりhogeが出力されるのかと考えたのですが、エラーが発生してしまいます。
エラー

[Syntax Error] Expected PlainValue, got '$' at position 335 in property Eccube\Entity\Product::$maker_name.

phpdocの中で$を使えないのでエラーになっているのかと思っています。
こちらphpdoc内で関数や変数を使うにはどのように記述すればよろしいでしょうか?
ちなみにベタ書きで'hoge' : 'hoge'とすれば問題なく出力はできています。
また、phpdocの基本的な質問になってしまい申し訳ありませんが、コメントアウトされている箇所が反映されるのは何故なのでしょうか?
よろしくお願いいたします。

追記
EC-CUBEの開発サイトの方から返信をいただきSymfonyのFormExtensionを使うと実装できるようなのですが、Symfony自体の知識がなくどのように反映させれば良いかわかりません。
https://doc4.ec-cube.net/customize_formtype
こちらを参考にとのことでしたが、いまだ実装できていません。
①traitで変更する部分はどこか
②新しく作ったExtensionをどのように読み込めば良いのか
以上の2点が不明です。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

変数を代入したい場合はそのまま出力してください

$this -> getA();

ダブルクォートやシングルクォートで囲むと文字列と認識されてしまいますので、今回の場合何もクォートを使わないのが正解かもしれません。

投稿2020/12/14 08:38

FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

このコントローラを見る限り、EC-CUBEはSymfonyで動いているようですね。ならば、そのエラーメッセージをSymfonyに絞って検索してみたら、手がかりになるものがありました。

Troubleshooting “[Syntax Error] Expected PlainValue, got ')'”

$が使えないなら、これが$と認識される書き方されているということです。ということはシングルクォートなどで$が通常の文字列として認識されるような記述がどこかにされている可能性があります。そこをダブルクォートで囲むか、あるいは変数ならば{$hoge}あるいは${hoge}として変数と認識させる必要がありそうです。

投稿2020/12/14 06:38

FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hello_space

2020/12/14 08:24

ご回答いただきありがとうございます。 変数展開をして読み込ませてみたのですが、ダブルクォーテーションで囲むとその関数名がそのまま出力されてしまいます。 こちらはどのようにすれば値が入りますでしょうか? "${this->getA()}" : "${this->getA()}" このような形で書いております。 結果↓ https://gyazo.com/6834b2019fcd5cbb7a5cc2d9aea359bc
FKM

2020/12/14 08:40 編集

変数を代入したい場合はそのまま出力してください。うっかり投稿してしまったもう一つの記事を参考に… ``` $this -> getA(); ```
hello_space

2020/12/14 08:48

申し訳ありません。こちらは最初に質問した形となり同じエラーになってしまいます。 phpdocの中で関数はどのようにすれば使えるのでしょうか。 コメントなのに読み込まれている点もあまり腑に落ちておりません。
FKM

2020/12/14 09:02 編集

コメントとして読み込まれているのはクラスフォーマットであって、コメントとは厳密に異なるものです。 よく見るとインデックスの方にも文字列にせずに、変数出力していますね。 "choices":{ $this -> getA(): … //キー指定が変数になっている } ここを変数以外にしたら問題ないのではないかと思います。 "choices":{ "value_of_getA": $this -> getA() }
hello_space

2020/12/14 10:50

なるほど、コメントとは厳密には違うものなのですね。 おっしゃられたようにキーを文字列にしてみましたが最初と同様のエラーでした。 また、今回はキーがセレクトボックスの値として表示されています。例えば"hoge": "fuga"とやると表示はhogeが出ます。そのため、動的にキーを書き換えることでセレクトボックスの表示を変えたいです。(キーに配列を回し入れてセレクトボックスのオプションを増やしたい)
FKM

2020/12/15 00:29 編集

あと、これはよく見たらjson形式ですね。だとするとこのままではPHPの変数は入りませんので、一度スクリプトに代入しておく必要があります。 getA = "<?php echo json_encode($this -> getA() ); ?>"; "choices":{ getA: getA } jsonで動的にキーを生成する方法はまだちょっとわかりませんが、一旦は値の方を解決できないか確認してみてください。
hello_space

2020/12/15 08:14 編集

<?php namespace Customize\Entity; use Doctrine\ORM\Mapping as ORM; use Eccube\Annotation\EntityExtension; /** * @EntityExtension("Eccube\Entity\Product") */ trait ProductTrait { /** * @ORM\Column(type="string", length=255, nullable=true) * @Eccube\Annotation\FormAppend( * auto_render=false, * type="\Symfony\Component\Form\Extension\Core\Type\ChoiceType", * options = { * "required": false, * "label": "メーカー名", * getA = "<?php echo json_encode($this -> getA() ); ?>";, * "choices": { * getA: getA * } * }) */ public $maker_name; public function getA() { return "hoge"; } } こちらで試してみましたが [Semantical Error] Couldn't find constant getA, property Eccube\Entity\Product::$maker_name. こちらのエラーが出てしまいました。
FKM

2020/12/15 08:20

getA の行をオブジェクトの外側に置いてください。
hello_space

2020/12/15 08:53

/** * @ORM\Column(type="string", length=255, nullable=true) * @Eccube\Annotation\FormAppend( * auto_render=false, * type="\Symfony\Component\Form\Extension\Core\Type\ChoiceType", * getA="<?php echo json_encode($this->getA()); ?>", * options = { * "required": false, * "label": "メーカー名", * "choices": { * getA: getA * } * }) */ これでも同様のエラー(Semantical Error)になってしまいます。(末尾の;はsyntax errorが出るので削除しています。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問