EC-CUBEで新しく追加したカラムのセレクトボックスに関数から値を表示したい
- 評価
- クリップ 0
- VIEW 287
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点が不明です。
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
0
このコントローラを見る限り、EC-CUBEはSymfonyで動いているようですね。ならば、そのエラーメッセージをSymfonyに絞って検索してみたら、手がかりになるものがありました。
Troubleshooting “[Syntax Error] Expected PlainValue, got ')'”
$が使えないなら、これが$と認識される書き方されているということです。ということはシングルクォートなどで$が通常の文字列として認識されるような記述がどこかにされている可能性があります。そこをダブルクォートで囲むか、あるいは変数ならば{$hoge}あるいは${hoge}として変数と認識させる必要がありそうです。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
変数を代入したい場合はそのまま出力してください
$this -> getA();
ダブルクォートやシングルクォートで囲むと文字列と認識されてしまいますので、今回の場合何もクォートを使わないのが正解かもしれません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2020/12/14 17:24
変数展開をして読み込ませてみたのですが、ダブルクォーテーションで囲むとその関数名がそのまま出力されてしまいます。
こちらはどのようにすれば値が入りますでしょうか?
"${this->getA()}" : "${this->getA()}"
このような形で書いております。
結果↓
https://gyazo.com/6834b2019fcd5cbb7a5cc2d9aea359bc
2020/12/14 17:38 編集
```
$this -> getA();
```
2020/12/14 17:48
phpdocの中で関数はどのようにすれば使えるのでしょうか。
コメントなのに読み込まれている点もあまり腑に落ちておりません。
2020/12/14 18:00 編集
よく見るとインデックスの方にも文字列にせずに、変数出力していますね。
"choices":{
$this -> getA(): … //キー指定が変数になっている
}
ここを変数以外にしたら問題ないのではないかと思います。
"choices":{
"value_of_getA": $this -> getA()
}
2020/12/14 19:50
おっしゃられたようにキーを文字列にしてみましたが最初と同様のエラーでした。
また、今回はキーがセレクトボックスの値として表示されています。例えば"hoge": "fuga"とやると表示はhogeが出ます。そのため、動的にキーを書き換えることでセレクトボックスの表示を変えたいです。(キーに配列を回し入れてセレクトボックスのオプションを増やしたい)
2020/12/15 08:58 編集
getA = "<?php echo json_encode($this -> getA() ); ?>";
"choices":{
getA: getA
}
jsonで動的にキーを生成する方法はまだちょっとわかりませんが、一旦は値の方を解決できないか確認してみてください。
2020/12/15 17:13 編集
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.
こちらのエラーが出てしまいました。
2020/12/15 17:20
2020/12/15 17: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が出るので削除しています。)