J'ai créé un composant simple avec un sous-formulaire qui stocke des données dans une base de données. Maintenant, je dois afficher ces données sur la page d'accueil. Les données sont affichées telles quelles à partir de la base de données
{"comment0":{"comment":"one"},"comment1":{"comment":"two"}}
Comment puis-je résoudre ce problème et obtenir des valeurs one, two
sur le front-end? S'il vous plaît dites-moi étape par étape.
Ce que j'ai:
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);
}
}
aussi modèle standard
<?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;
}
}
Je ne sais pas s'il existe un correctif spécifique à Joomla pour cela, mais il semble que vous deviez simplement décoder votre chaîne JSON. Je ne sais pas comment vos données réelles peuvent varier ou si vous souhaitez inclure une manipulation conditionnelle, mais vous pouvez simplement parcourir les données multidimensionnelles générées.
En supposant echo $item->comment;
à l'intérieur de votre boucle affiche {"comment0":{"comment":"one"},"comment1":{"comment":"two"}}
, Ensuite vous pouvez
Voici un démonstration :
$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";
}
Sortie:
comment0 contains:
comment : one
---
comment1 contains:
comment : two
---
*J'ai ajouté \n
et \t
pour une meilleure lisibilité.
Il y aura différentes manières de gérer les données décodées, mais c'est probablement la plus facile à lire et à gérer.
De manière générale, le stockage de données dans une base de données sous forme de chaîne json peut indiquer une conception de base de données sous-optimale dans certains cas ... mais je vais éviter ce débat car trop de choses sont inconnues sur vos données et leur utilisation prévue.
Ça marche. merci pour la solution mickmackusa.
exemple
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); poureach ($ comment en tant que $ key => $ set) { echo "$ key contient:\n"; pour chaque ($ set as $ label => $ valeur) { echo nl2br ("\ t $ label: $ value\n"); } echo "---\n"; } ?>
<?php endforeach; ?>