web-dev-qa-db-fra.com

getUserState () return array où, comme getItem (), retourne JObject

Je suis confronté à un problème avec la fonction loadFormData où il est vérifié s'il faut extraire des données de la session ou de la table.

protected function loadFormData() {
  // Check the session for previously entered form data.
  $data = JFactory::getApplication()->getUserState('com_mycomp.edit.profile.data', array());
  if (empty($data)) {
    $data = $this->getItem();
  }

  //Do further validation on $data and adjust the required values
  if (is_object($data)){
    $data->custom_field = 'custom value';
  }else if (is_array($data)){
    $data['custom_field'] = 'custom value'
  }

  return $data;
}

Tout en extrayant les données de la session, il extrait le format Array et, en extrayant les données de la base de données, en tant que JObject. Cela rend notre vie plus difficile en vérifiant s'il s'agit d'un objet ou d'un tableau. Existe-t-il un moyen plus simple de gérer cela en ayant les deux comme JObject of Array?

1
Malaiselvan

Vous pouvez mapper un tableau à un objet.

$object = Joomla\Utilities\ArrayHelper::toObject($array, 'JObject');

Votre code deviendrait

$data = (array)JFactory::getApplication()->getUserState('com_mycomp.edit.profile.data', array());
$data = Joomla\Utilities\ArrayHelper::toObject($data, 'JObject');

//Do further validation on $data and adjust the required values
if (is_object($data)){
  $data->custom_field = 'custom value';
}
2
Rene Korss

Quelles données vous retournez dans la fonction getItem? Vous pouvez simplement faire correspondre les données que vous définissez en session ou que vous renvoyez dans votre fonction getItem.

Dans votre fonction getItem, au lieu de

$data = $db->loadObject();

charger des données en utilisant

$data = $db->loadAssoc();
1
Nagarjun

Au lieu de valider dans loadFormData, vous pouvez penser à surcharger la méthode getItem () de la classe JModelAdmin (dans votre modèle) pour lui faire renvoyer un tableau associatif au lieu de JObject.

// Make sure you are making it public if you going to call it in view.html.php

    public function getItem($pk = null)
    {
        $pk    = (!empty($pk)) ? $pk : (int) $this->getState($this->getName() . '.id');
        $table = $this->getTable();

        if ($pk > 0)
        {
            // Attempt to load the row.
            $return = $table->load($pk);

            // If you want you can load more result from another table and merge it here.

            // Check for a table object error.
            if ($return === false)
            {
                return false;
            }
        }

        // Convert to the JObject before adding other data.
        $properties = $table->getProperties(1);
        $item       = \Joomla\Utilities\ArrayHelper::toObject($properties, 'JObject');

        if (property_exists($item, 'params'))
        {
            $registry     = new Registry;
            $registry->loadString($item->params);
            $item->params = $registry->toArray();
        }

        // Here you can add custom data as follows:

        $item->custom_field = 'custom value';

        $data = \Joomla\Utilities\ArrayHelper::fromObject($item);

        return $data;
    }
1
Sahil Purav