外部フォームからExpressエントリを登録したい

2020年7月20日 at 13:55

いつもこのフォーラムで助けていただいております。
先日来、Expressエンティティへの接続について質問を
させていただいておりますが、私の理解が不十分で、皆さま
に大変ご迷惑をおかけしております。
今回、外部フォームブロックから、Expressエントリを新規
追加したいと思い、挑戦しておりますが、質問内容が以前とは
異なりますので、新たにスレッドを立てさせていただきます。
どうぞよろしくお願い致します。

【作っているもの】
外部フォーム:ファイル名 express_data.php
コントローラ:ファイル名 express_data.php(controllerフォルダに格納)
仕様:フォームには5つの部品を設置しています。
  1.テキスト ユーザID入力欄 (userid)
  2.テキスト ユーザ名入力欄 (name)
  3.テキスト メールアドレス入力欄 (email)
  4.プルダウンメニュー 居住都道府県選択欄 (pref)
  5.テキストエリア その他詳細入力欄 (shousai)
  6.submitボタン

Express側に、’user’ エンティティを作成、上の入力用フォームでsubmit
が押下されたタイミングで userエンティティにデータを新規登録したい
と思っております。

【コード部分】
・コントローラに置いたexpress_data.phpにおいて
 冒頭use を用いて
 use Express;を宣言
 
 View側フォームのaction で指定した action_express_entry において、
    public function action_express_entry(){
$userid = trim($this->post('p_userid'));
$username = trim($this->post('p_username'));
$email = trim($this->post('p_email'));
$pref = trim($this->post('p_pref'));
$shousai = $this->post('p_shousai');
//エラーがないとき、入力データをExpressへ登録する
//Expressを使う
$entry = Express::buildEntry('user');
$entry->setUseruserid($userid);
$entry->setUsername($username);
$entry->setUseremail($email);
$entry->setUserpref($pref);
$entry->setUsershousai($shousai);
$entry->save();
$this->set('response', true);
return true;
}
としております。

その後、ファイルをサーバにアップロードし、
http://demo.survey-support.jp/test/index.php
にアクセスしましたところ、


Whoops\Exception\ErrorException
/virtual/htdocs/default/test/application/blocks/external_form/form/controller/express_data.php89 というエラーが表示されてしまいました。
これはどういうことを意味しているのか、理解ができておりません。
何が原因が、ご教示頂ければ幸いです。
どうぞよろしくお願い致します。

【サーバ環境情報】
# concrete5 Version
Core Version - 8.5.4
Version Installed - 8.5.4
Database Version - 20200609145307

# Database Information
Version: 5.1.73
SQL Mode:

# concrete5 Packages
None

# concrete5 Overrides
blocks/external_form/form/controller, blocks/external_form/form/express_data.php, blocks/external_form/form, blocks/external_form

# concrete5 Cache Settings
Block Cache - On
Overrides Cache - On
Full Page Caching - Off
Full Page Cache Lifetime - Every 6 hours (default setting).

# Server Software
Apache

# Server API
apache2handler

# PHP Version
7.1.33

# PHP Extensions
apache2handler, bcmath, bz2, calendar, Core, ctype, curl, date, dba, dom, enchant, exif, fileinfo, filter, ftp, gd, gettext, gmp, hash, iconv, imap, intl, json, ldap, libxml, mbstring, mcrypt, mysqli, mysqlnd, odbc, openssl, pcre, PDO, pdo_mysql, PDO_ODBC, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, pspell, recode, Reflection, session, shmop, SimpleXML, snmp, soap, sockets, SPL, sqlite3, standard, sysvmsg, sysvsem, sysvshm, tidy, tokenizer, wddx, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zip, zlib

# PHP Settings
max_execution_time - 3600
log_errors_max_len - 4096
max_file_uploads - 100
max_input_nesting_level - 64
max_input_time - 60
max_input_vars - 1000
memory_limit - 64M
post_max_size - 384M
sql.safe_mode - Off
upload_max_filesize - 256M
ldap.max_links - Unlimited
mysqli.max_links - Unlimited
mysqli.max_persistent - Unlimited
odbc.max_links - Unlimited
odbc.max_persistent - Unlimited
pcre.backtrack_limit - 1000000
pcre.recursion_limit - 100000
pgsql.max_links - Unlimited
pgsql.max_persistent - Unlimited
session.cache_limiter - no value
session.gc_maxlifetime - 7200
soap.wsdl_cache_limit - 5
opcache.max_accelerated_files - 4000
opcache.max_file_size - 0
opcache.max_wasted_percentage - 5

タグ:

Re: 外部フォームからExpressエントリを登録したい

2020年7月20日 at 14:17
express_data.php の 89行目で例外が発生しているよというエラーメッセージです。
 

Re: Re: 外部フォームからExpressエントリを登録したい

2020年7月20日 at 14:25
菱川さま

ご返信ありがとうございます。
ご回答を受けまして、express_data.phpの89行目を確認いたしました
ところ、class EntryForm extends AbstractController{
}の、}の個所になっておりました。
恐れ入ります。この個所が例外を起こすのは何が起因していると
いうことになりますでしょうか?
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月20日 at 14:28
先ほどの例外メッセージの後に、

Whoops\Run handleError
…/vendor/filp/whoops/src/Whoops/Run.php433
0
Whoops\Run handleShutdown
[internal]0

という文言も表示されておりました。
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月20日 at 14:50
再度例外内容について確認いたしました。
Whoops\Exception\ErrorException: Cannot declare class Application\Block\ExternalForm\form\Controller\ExpressEntry, because the name is already in use in file /virtual/htdocs/default/test/application/blocks/external_form/form/controller/express_data.php on line 89
Stack trace:
1. Whoops\Exception\ErrorException->() /virtual/htdocs/default/test/application/blocks/external_form/form/controller/express_data.php:89
2. Whoops\Run->handleError() /virtual/htdocs/default/test/concrete/vendor/filp/whoops/src/Whoops/Run.php:433
3. Whoops\Run->handleShutdown() [internal]:0

という内容になっておりましたので、コントローラ側のexpress_data.phpファイルの
namespaceを確認いたしましたが、階層の定義に間違いはございませんでした。
試しに、クラス名を変更しても、the name is already in use in file と表示されます。
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月20日 at 15:25
express_data.php ファイルの作り方が根本的に間違っている気がします
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月20日 at 15:45
菱川さま
ご回答ありがとうございます。
再度 express_data.php を一から見直してみます。
ありがとうございます。
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月21日 at 16:20
いつもありがとうございます。
昨日より、phpの構成等を一から見直しました。
まずは、当フォーラムの過去記事を参照して、Expressエンティティ(エンティティ名:user)
からデータを取得できるか、Viewに設置したphpファイル(ファイル名:GetExpressData.php)に
<?php
$entry = Express::getObjectByHandle('user');
$list = new Concrete\Core\Express\EntryList($entry);
$results = $list->getResults();
if (count($results) > 0){
foreach($results as $exEntry){
$userid = $exEntry->getUserid();
$username = $exEntry->getName();
$email = $exEntry->getEmail();
$pref = $exEntry->getUserpref();
$shousai = $exEntry->getShousai();
?>
<div class="col-sm-4">
<?=$userid;?>
</div>
<br>
<div class="col-sm-4">
<?=$username;?>
</div>
<br>
<div class="col-sm-4">
<?=$email;?>
</div>
<br>
<div class="col-sm-4">
<?=$pref;?>
</div>
<br>
<?php
}
}
?>
としましたところ、外部ブロックがロードされた際にエンティティuserからデータを
取得して表示することができました。
昨日は、データをExpressが取得する上のコードをコントローラ側に記述して、
"Page Not Found"と表示されておりました。

今度は、コントローラ側のファイル(ファイル名:GetExpressData.php)に、テスト
用の外部フォームを参考にして、外部フォームのブロックIDを取得した際に、
レスポンスを返すコートを記述して、サーバに設置しました。

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

class exGet extends AbstractController{

public function action_express_get($bID = false)
{
if ($this->bID == $bID){
$this->set('response', t('Thanks!'));
return true;
}
}

public function view(){
$this->set('message', t('This is test!'));
}
}
?>

テスト用外部フォームでは、view側でアクションが行われていない時(つまりロード
されたとき)は、$message の内容がフォームに表示されておりますが、どういうわけ
か、何も表示されておりません。
次に、レスポンスがあれば、view側のフォームに

if (isset($response)){
var_dump($response);
?>
<div id="ok">
<h3>応答あり</h3>
</div>
と記述いたしましたが、コントローラ側を呼び出そうとすると、"error404 Page not found"
と表示されてしまいます。
過去のフォーラム記事で、namespace に起因している記事がありましたので、名前空間を
見直してみましたが、問題ないようです。
なんとか、コントローラ側のファイルから応答を取りたいのですが、404エラーが発生
する原因が分かりかねております。
どなた様か、この対処方法についてご教示頂けませんでしょうか?
どうぞよろしくお願い致します。

http://demo.survey-support.jp/test/index.php

で、実際にExpressから取得したデータも表示されております。
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月22日 at 13:50
いつもありがとうございます。
すみません、自己解決しました。

http://www.cherrypieweb.com/1110

を再度読み返し、私の間違いに気づきました。
結果、ファイル名とクラス名を変更しました。

【修正前】
ファイル名:GetExpressData.php
クラス名:exGet

【修正後】
ファイル名:get_express_data
クラス名:GetExpressData

concrete5 におけるファイルやクラス名命名規則の最も基本的な
ところでございました。
大変失礼いたしました。
お陰様で、コントローラからレスポンスを受信することができました。
これから、Expressへのデータ登録へ進んでまいります。
ありがとうございました。
 

Re: 外部フォームからExpressエントリを登録したい

2020年7月22日 at 15:32
いつもありがとうございます。
フォーラムの皆さま、ありがとうございました。

お陰様で、外部フォームからExpressエンティティ(user)へ無事データ登録
することができました。
拙い質問内容にいつも真摯にご回答賜り、本当にありがとうございます。
今回賜った回答で、concrete5 のシステムについてより勉強させていただけ
ました。
ありがとうございます。
今後ともどうぞよろしくお願い致します。
この質問スレッドは、これで終了とさせていただきます。