Expressのデータ削除の際にエラー、さらにそれに関連したエントリーの編集不可

2017年8月28日 at 6:17

エクスプレスのデータオブジェクトからオブジェクトを削除しようとした際にエラーが発生し、正しく削除できず、
オブジェクト一覧に残ったままになってしまいました。(バグ??)

その後、アソシエーションで関連づけた別のエントリーを編集しようとしたところ、
以下のエラーが表示され編集が不可に、、、

Call to a member function getId() on null

関連したアソシエーションを削除をしているので、
そのIDが無いために生じていることかと思うのですが、
データベースを触れる状況でも無いため、
MySQLを直接、、と言うことも難しく、困っています。

エントリーの編集ができるようにだけでもなりませんでしょうか?

# concrete5 Version
Core Version - 8.2.1
Version Installed - 8.2.1
Database Version - 20170802000000

# concrete5 Packages
Honest Websites Back To Top (1.0.1), Manual Nav (2.2.0), Open Graph Tags Lite (2.1.3)

# concrete5 Cache Settings
Block Cache - Off
Overrides Cache - Off
Full Page Caching - Off
Full Page Cache Lifetime - Only when manually removed or the cache is cleared.

# Server Software
Apache

# Server API
cgi-fcgi

# PHP Version
5.6.31

# PHP Extensions
bcmath, cgi-fcgi, Core, ctype, curl, date, dom, ereg, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, intl, json, libxml, mbstring, mcrypt, mysql, mysqli, openssl, pcre, PDO, pdo_mysql, pdo_pgsql, pdo_sqlite, pgsql, Phar, posix, Reflection, session, SimpleXML, soap, sockets, SPL, sqlite3, standard, tokenizer, xml, xmlreader, xmlrpc, xmlwriter, xsl, Zend OPcache, zip, zlib

# PHP Settings
max_execution_time - 300
log_errors_max_len - 1024
max_file_uploads - 20
max_input_nesting_level - 64
max_input_time - 600
max_input_vars - 1000
memory_limit - 500M
post_max_size - 1000M
sql.safe_mode - Off
upload_max_filesize - 1000M
mysql.max_links - Unlimited
mysql.max_persistent - Unlimited
mysqli.max_links - Unlimited
mysqli.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 - 2000
opcache.max_file_size - 0
opcache.max_wasted_percentage - 5

==== 追記 ======

一部自己解決しました。

エクスプレスで登録する際に表示されない問題に関しては、
設定にて、
削除したものも含めたアソシエーションをエントリー一覧に表示するようにしていたのですが、
それが有効のままだったために、エラーを起こしていたようです。

以下の手順で解決しました。

concrete/src/Express/Search/Column/AssociationColumn.php :

21行目を

return 'association_' . $this->association->getId();

return 'association_' . '1111111';

26行目を

return S$this->association->getTargetEntity()->getName();

return '1111111';

に一旦修正して、更新。

これで、
Expressオブジェクトのエントリー一覧が表示されるようになります。

この状態で、
「システム設定」→「データオブジェクト」→ 対象のオブジェクト

オブジェクト詳細が表示されます。

「検索/一覧をカスタマイズ」を表示させると、
「アソシエーション」の部分が、[1111111]など、先ほど書き換えた表示になっていますが、
気にせず、その横にあるチェックを全て外し保存。

これで、
エキスプレスのエントリー一覧から、
アソシエーション部分の名前が消えます。

その後、
先ほど修正した箇所を戻して保存。

これで治りました。


ですが、データオブジェクトの問題は残ったままです。
ローカルでも試しましたが、残ったままです。

使わないので、問題はないのですが、
気持ち悪いので、何とかしたいのですが、方法はありますでしょうか?

タグ:

Re: Expressのデータ削除の際にエラー、さらにそれに関連したエントリーの編集不可

2017年8月28日 at 13:46
エクスプレス自体新しい機能なので、なかなか回答がつくのも難しそうな気はします。取り急ぎ、管理画面のログから、過去のエラーログを遡り、関係ありそうなものは見つからないでしょうか?
 

Re: Expressのデータ削除の際にエラー、さらにそれに関連したエントリーの編集不可

2017年8月31日 at 0:32
返事遅くなってすいません。

エラーログを調べたところ、
関係があるかどうかはわかりませんが、本エラーが最初に表示されたあたりのログは見つけました。

"Exception Occurred: /****/concrete/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:53 An exception occurred while executing 'SELECT count(distinct e.exEntryID) FROM ExpressEntityEntries e LEFT JOIN TypeOfEventExpressSearchIndexAttributes ea ON e.exEntryID = ea.exEntryID WHERE e.exEntryEntityID = ? LIMIT 1' with params [""bf8fec22-8b55-11e7-9974-00164711fcee""]: SQLSTATE[42S02]: Base table or view not found: 1146 Table '[[[[ DB_name ]]]].TypeOfEventExpressSearchIndexAttributes' doesn't exist (0)
"



"Exception Occurred: /****/concrete/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/AbstractMySQLDriver.php:60 An exception occurred while executing 'DELETE FROM ExpressEntities WHERE id = ?' with params [""bf8fec22-8b55-11e7-9974-00164711fcee""]: SQLSTATE[23000]: Integrity constraint violation: 1451 Cannot delete or update a parent row: a foreign key constraint fails (`[[[[ DB_name ]]]]`.`ExpressEntityEntries`, CONSTRAINT `FK_B8AE3531AFC87D03` FOREIGN KEY (`exEntryEntityID`) REFERENCES `ExpressEntities` (`id`)) (0)"


サイトのアドレスにあたる部分と、
DB名([[[[DB_name]]]])は伏せていますが、おそらくこの2行がキモかなと。

また、
削除したはずオブジェクト(以降:幽霊オブジェクト)は、
別のオブジェクトのエントリー一覧とかに表示させていたりしたので、
それも影響しているかと思います。

幽霊オブジェクトは、
設定のデータオブジェクトから選択も可能で、
「詳細」「エンティティ編集」「属性」「アソシエーション」「フォーム」は選択可能。
ただし、「属性」では、
登録していた属性は消えていますが、
改めて消す前に登録していた属性のハンドルは残っているみたいで、
「すでに登録されている」というエラーが表示されます。
別の名称でハンドルを登録しようとすると、以下のエラーが出て登録できません。

An exception occurred while executing 'ALTER TABLE TypeOfEventExpressSearchIndexAttributes ADD ak_test_ex_hundles LONGTEXT DEFAULT NULL': SQLSTATE[42S02]: Base table or view not found: 1146 Table '[[[[DB_name]]]].TypeOfEventExpressSearchIndexAttributes' doesn't exist


上記を含め、
どれを設定したところで、反映されないようなので意味はありません。

構造を把握しているわけではないんで、
なんとも言えないですけど、
オブジェクトのテーブルだけがない?
オブジェクトの名前だけがどっかに残って削除できてない???
ということでしょうか?

ちなみに、
MySQLのバージョンは5.6です。