プログラムからExpressのエントリーを取得できない

2018年7月27日 at 16:59

みなさま

↓ページを参考に、Expressに登録したHandle名「event」のエントリーを取得しようとしています。
http://documentation.concrete5.org/developers/express/creating-reading-searching-updating-and-deleting-express-entries

[ソース]
$entity = Express::getObjectByHandle('event');
$list = new \Concrete\Core\Express\EntryList($entity);
$events = $list->getResults();

結果、$eventsに何も格納されず、空のArrayになってしまいます。
試しに、getResults()をgetTotalResults()にしてみると、
エントリーの個数が返ってきます。

どうすればうまく動作しますでしょうか?
どうぞよろしくお願いします。

# concrete5 Version
Core Version - 8.4.1
Version Installed - 8.4.1
Database Version - 20180710203437

# concrete5 Packages
Event Calendar (3.4.1), Quick Tabs (1.0), Stucco (2.1.6), Stylish Ordered Lists (1.0)

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

# Server Software
Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/5.6.36

# Server API
apache2handler

# PHP Version
5.6.36

# PHP Extensions
apache2handler, bz2, calendar, Core, ctype, curl, date, dom, ereg, exif, fileinfo, filter, ftp, gd, gettext, hash, iconv, json, libxml, mbstring, mhash, mysql, mysqli, mysqlnd, openssl, pcre, PDO, pdo_mysql, pdo_sqlite, Phar, posix, Reflection, session, shmop, SimpleXML, sockets, SPL, sqlite3, standard, sysvmsg, sysvsem, sysvshm, tokenizer, wddx, xml, xmlreader, xmlwriter, xsl, zip, zlib

# PHP Settings
max_execution_time - 600
log_errors_max_len - 1024
max_file_uploads - 20
max_input_nesting_level - 64
max_input_time - 60
max_input_vars - 1000
memory_limit - 512M
post_max_size - 512M
sql.safe_mode - Off
upload_max_filesize - 512M
mysql.max_links - Unlimited
mysql.max_persistent - Unlimited
mysqli.max_links - Unlimited
mysqli.max_persistent - Unlimited
pcre.backtrack_limit - 1000000
pcre.recursion_limit - 100000
session.cache_limiter - no value
session.gc_maxlifetime - 7200

タグ:

Re: プログラムからExpressのエントリーを取得できない

2018年7月27日 at 18:27
$events は array() で格納されますので、foreach 等で個別の entry を取得する必要があります。

foreach ($events as $event) {
echo $event->getXXXXXX();
// 続く
}

これで試してみてください。
 

Re: プログラムからExpressのエントリーを取得できない

2018年7月27日 at 18:34
Katzさん

ありがとうございます!

試してみたのですが、何も出力されませんでした。
$events自体が空っぽのようです。

DBのクエリーログを見ていると、getResults()実行時に
問い合わせはあるようですが、結果が格納されていないようです。
 

Re: プログラムからExpressのエントリーを取得できない

2018年7月27日 at 19:26
getTotalResults() で数字が返ってきているのであれば、
きちんと $events にExpress のエントリー一覧が格納されていると思います。

もしかすると、その先のデータを出力する部分が間違っているかもしれません。
そのコードを教えて頂ける範囲で教えていただけますか?
 

Re: プログラムからExpressのエントリーを取得できない

2018年7月27日 at 19:29
参考までに、Express のサンプルデータを公開しています。
http://github.com/katzueno/c5-express-boiler-plate

ここの
http://github.com/katzueno/c5-express-boiler-plate/blob/master/application/blocks/express_entry_list/templates/curry_store_list.php
が一覧表示のサンプルです。

サンプルの $results が、$events と同じです。
 

Re: プログラムからExpressのエントリーを取得できない

2018年7月28日 at 0:21
Katzさん

ありがとうございます。

教えていただいたソースを参考にしてみましたが、ダメでした…
まだテスト段階で、出力も下のようにvar_dumpで確認しているだけなんです。

$entity = Express::getObjectByHandle('event');
$list = \Concrete\Core\Express\EntryList($entity);
$events = $list->getResults();
$total = $list->getTotalResults();
var_dump($events); // array(0) {}   が出力される
var_dump($total); // string(2) "16" が出力される

このExpressからの値取得をジョブとして作成しています。
ジョブとして作成することは、特に関係ないですよね?
 

Re: プログラムからExpressのエントリーを取得できない

2018年7月30日 at 13:58
Katzさん

教えていただいた方法通りに、「Expressのカスタムテンプレート」ですと、
うまく動作し、エントリーを取得できました!

問題は、「自作ジョブからExpressエントリーを取得できない」
ということになりますね。
 

Re: プログラムからExpressのエントリーを取得できない

2018年7月31日 at 12:58
いろいろ試してみました。

どうも、EntryListクラスのgetResultメソッド内、下の箇所が原因で
結果が返ってきていないようです。

if (is_object($entry)) {
if ($this->checkPermissions($entry)) {
return $entry;
}
}

エントリーにアクセスするためのパーミッション設定が必要なのでしょうか?
 

Re: プログラムからExpressのエントリーを取得できない

2018年8月1日 at 12:00
パーミッションの件解決し、うまくいきました!

原因は「CLIでジョブを実行していたこと」でした。
管理画面からジョブ実行したところうまく動作しました。

いろいろとお騒がせしました。
ありがとうございました。
 

Re: プログラムからExpressのエントリーを取得できない

2018年8月1日 at 15:26
返信遅れてました。
CLI でジョブを実行していたら実行できなかったというのは、ちょっと気になりますね・・・。
コードの問題ではなく、CLI側の問題かも・・・。

とにかく Express のコード自体は問題がないとのことで安心しました。