it-swarm.com.de

getUserState () gibt ein Array zurück, wobei getItem () JObject zurückgibt

Ich habe ein Problem mit der Funktion loadFormData, bei der überprüft wird, ob Daten aus der Sitzung oder aus der Tabelle abgerufen werden sollen.

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;
}

Beim Abrufen der Daten aus der Sitzung werden Daten im Array-Format und beim Abrufen der Daten aus der Datenbank als JObject abgerufen. Dies erschwert unser Leben, indem überprüft wird, ob es sich um ein Objekt oder ein Array handelt. Gibt es eine einfachere Möglichkeit, dies zu verwalten, indem Sie beide als JObject of Array verwenden?

1
Malaiselvan

Sie können dem Objekt ein Array zuordnen.

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

Ihr Code würde werden

$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

Welche Daten geben Sie in der Funktion getItem zurück? Sie können einfach die Daten abgleichen, die Sie in der Sitzung festlegen, oder Sie kehren in Ihrer Funktion getItem zurück.

In Ihrer Funktion getItem anstelle von

$data = $db->loadObject();

daten laden mit

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

Anstatt in loadFormData zu überprüfen, können Sie die getItem () -Methode der JModelAdmin-Klasse (in Ihrem Modell) überschreiben, damit sie ein assoziatives Array anstelle von JObject zurückgibt.

// 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