自作外部フォームの動作不良
初めて投稿させていただきます。
バージョン: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: 自作外部フォームの動作不良
教えて頂いた通りにやってみたのですが、どうもうまくいきませんでした。
キャッシュの影響を気にしながら、いろいろ試してみたところ、
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: 自作外部フォームの動作不良
次のバージョンで修正されますので、いまから直接修正して使ってもらってもかまいません
http://github.com/concrete5/concrete5-5.7.0/commit/f861bc87408d854d80d5a6b70d88fa5c2166c6ad
takuro hishikawa
Re: 自作外部フォームの動作不良
ですので、フォームのコントローラーの格納位置はこのようになり
application/blocks/external_form/controllers/my_form.php
名前空間、及びクラス名はこのようになります
<?php
namespace Application\Block\ExternalForm\Controllers;
use Concrete\Core\Controller\AbstractController;
class MyForm extends AbstractController
{
}