web-dev-qa-db-ja.com

フロントエンドのサブフォームの値をどのように表示しますか?

データベースにデータを保存するサブフォームを持つ単純なコンポーネントを作成しました。次に、このデータをフロントページに表示する必要があります。データはそのまま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;
    }
}
1
Nik

これに対する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としてデータベースにデータを保存することは、データベース設計が最適ではないことを示す場合があります...あなたのデータとその意図された使用法についてはあまりにも多くが不明です.

0
mickmackusa

できます。ソリューション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; ?>
0
Nik