自作外部フォームの動作不良

2015年1月17日 at 0:39

初めて投稿させていただきます。

バージョン:5.7.3.1

外部フォームですが、自作した外部フォームを
application/blocks/external_form/form/
内に入れても、うまく動きません。

具体的には、フォーム自体は表示されますが、初期処理やコミットができません。
コントロールクラス(~/form/controller/ に入れるクラス)が認識されていないようです。


・再現方法

concrete/blocks/external_form/form/test_form.php
concrete/blocks/external_form/form/controller/test_form.php

を名前を変えてapplication以下にコピー

application/blocks/external_form/form/testa_form.php
application/blocks/external_form/form/controller/testa_form.php

~/controller/testa_form.phpの
namespaceを Application\Block\ExternalForm\Form\Controller に変更
クラス名を TestaForm に変更

元のクラスと区別するため
view()内を
$this->set('message', 'Test A Form.');
に変更

外部フォームを追加したページで、外部フォームを編集し読み込むファイルで Testa Form を選択して保存し、編集を終了

ページを更新
→ $message が表示されるはずの場所に Test A Form. が表示されない

送信ボタンをクリック
→ Page Not Found になる


・その後やったこと

application/blocks/external_form/form/controller/testa_form.php
だけを
concrete/blocks/external_form/form/controller/testa_form.php
にコピーし、namespaceを Concrete\~ に変更

→ 正常に動作


・考えたこと

~/blocks/external_form/form/controller/
がオーバーライドされないようです。

concrete/blocks/external_form/controller.php
を見てみたところ、getController()に、

overrideable_core_class(
'Block\\ExternalForm\\Form\\Controller\\' . $class,
DIRNAME_BLOCKS . '/external_form/controllers/' . $this->filename
)

という部分がありました。
ここの、
'/external_form/controllers/' は
'/external_form/form/controller/' ではないでしょうか?


「本家」の方で何か情報がないかと探してみましたら、
http://www.concrete5.org/developers/bugs/5-7-3-1/external-form/
というのが出て来ました。

「Resolved Bug」となっていて、
http://github.com/concrete5/concrete5-5.7.0/commit/9934e53603a97b4ac9f1786d55415240e3d85e27
にリンクがありましたが、
これってもしかして、修正ミスということはないでしょうか?


PS.
concrete5歴は2ヶ月程度なので、まだまだ分からないことが多いため、何か勘違いがあるかも知れませんが、そのときはご指摘ください。
また、すでに対応済みの場合はご容赦ください。

長文失礼いたしました。

タグ:

Re: 自作外部フォームの動作不良

2015年1月20日 at 3:01
聞いてみましたが、上記の修正はこれで正しい。ということです。

ですので、フォームのコントローラーの格納位置はこのようになり

application/blocks/external_form/controllers/my_form.php

名前空間、及びクラス名はこのようになります

<?php
namespace Application\Block\ExternalForm\Controllers;
use Concrete\Core\Controller\AbstractController;

class MyForm extends AbstractController
{
}
 

Re: 自作外部フォームの動作不良

2015年1月20日 at 23:57
返信ありがとうございます。

教えて頂いた通りにやってみたのですが、どうもうまくいきませんでした。

キャッシュの影響を気にしながら、いろいろ試してみたところ、
application/blocks/external_form/controllers/my_form.php // (1)
application/blocks/external_form/form/controller/my_form.php // (2)
の両方に配置したときに限って、(2)が呼び出されるようです。

このとき(1)の名前空間は、(1)の位置に対応したものでも(2)と同じものでも変わりがないようです。

で、やっぱり気になるのが

concrete/blocks/external_form/controller.php

ですが、この中で最初の投稿でも引用した(77行目からのgetController()内)、

return \Core::make(
overrideable_core_class(
'Block\\ExternalForm\\Form\\Controller\\' . $class,
DIRNAME_BLOCKS . '/external_form/controllers/' . $this->filename
)
);

の部分によると、ファイルの位置の指定は

/external_form/controllers/

ですが、名前空間は、

Block\\ExternalForm\\Form\\Controller\\

になっています。

このままでは、(1)のファイルを検索した後に(2)のクラスを生成してしまうように思えるのですが、どうでしょうか?
 

Re: 自作外部フォームの動作不良

2015年1月21日 at 9:08
ほんまですね。ありがとうございます、それを向こうに説明します
 

Re: 自作外部フォームの動作不良

2015年1月24日 at 10:27
やっぱり '/external_form/form/controller/' だったそうです(^^;

次のバージョンで修正されますので、いまから直接修正して使ってもらってもかまいません

http://github.com/concrete5/concrete5-5.7.0/commit/f861bc87408d854d80d5a6b70d88fa5c2166c6ad