データベースにデータを保存するサブフォームを持つ単純なコンポーネントを作成しました。次に、このデータをフロントページに表示する必要があります。データはそのままdbから表示されます
{"comment0":{"comment":"one"},"comment1":{"comment":"two"}}
修正して値を取得するにはどうすればよいですかone, two
フロントエンドに?少しずつ教えてください。
私が持っているもの:
views/myview/tmpl/default.php
<?php defined('_JEXEC') or die; ?>
<?php foreach ($this->items as $item) : ?>
<?php echo $item->comment; ?>
<?php endforeach; ?>
views/myview/view.html.php
<?php defined('_JEXEC') or die;
class MycomponentViewMyView extends JViewLegacy {
protected $items;
public function display($tpl = null)
{
$this->items = $this->get('Items');
$app = JFactory::getApplication();
$params = $app->getParams();
$this->assignRef( 'params', $params );
if (count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode("\n", $errors));
return false;
}
parent::display($tpl);
}
}
標準モデルも
<?php defined('_JEXEC') or die;
class MyComponentModelMyModel extends JModelList {
public function __construct($config = array())
{
if (empty($config['filter_fields']))
{
$config['filter_fields'] = array(
'id', 'a.id'
);
}
parent::__construct($config);
}
protected function populateState($ordering = null, $direction = null)
{
$id = JRequest::getInt('id');
$this->setState('id', $id);
}
protected function getListQuery()
{
$db = $this->getDbo();
$query = $db->getQuery(true);
$query->select(
$this->getState(
'list.select',
'a.id, a.comment,'
)
);
$query->from($db->quoteName('#__mycomponent').' AS a');
$query->where('(a.state IN (0, 1))');
if ($id = $this->getState('id'))
{
$query->where('a.id = '.(int) $id);
}
return $query;
}
}
これに対するJoomla固有の修正があるかどうかはわかりませんが、単にjson文字列をデコードする必要があるようです。実際のデータがどのように変化するか、または条件付き処理を含めたいかどうかはわかりませんが、生成された多次元データをループするだけで済みます。
ループ内のecho $item->comment;
が{"comment0":{"comment":"one"},"comment1":{"comment":"two"}}
を表示しているとすると、次のことができます
$comment_json = '{"comment0":{"comment":"one"},"comment1":{"comment":"two"}}';
↑↑↑↑↑↑↑↑↑↑↑↑↑
------------------------------------- this is effectively your $item->comment
↓↓↓↓↓↓↓↓↓↓↓↓↓
$comments = json_decode($comment_json);
foreach ($comments as $key => $set) {
echo "$key contains:\n";
foreach ($set as $label => $value) {
echo "\t$label : $value\n";
}
echo "---\n";
}
出力:
comment0 contains:
comment : one
---
comment1 contains:
comment : two
---
*読みやすくするために\n
と\t
を追加しました。
デコードされたデータを処理する方法はいくつかありますが、おそらくこれが最も読みやすく管理しやすい方法です。
一般的に、json文字列canとしてデータベースにデータを保存することは、データベース設計が最適ではないことを示す場合があります...あなたのデータとその意図された使用法についてはあまりにも多くが不明です.
できます。ソリューションmickmackusaをありがとう。
例
views/myview/tmpl/default.php
<?php defined('_JEXEC') or die; ?>
<?php foreach ($this->items as $item) : ?>
<?php
$ comment_json = $ item-> comment; $ comments = json_decode($ comment_json); foreach($ comments as $ key => $ set){ echo "$ key contains:\ n"; foreach($ set as $ label => $ value){ echo nl2br( "\ t $ label:$ value\n"); } echo "---\n"; } ?>
<?php endforeach; ?>