web-dev-qa-db-ja.com

getUserState()は配列を返し、getItem()はJObjectを返します

セッションまたはテーブルからデータをプルするかどうかのチェックがあるloadFormData関数の問題に直面しています。

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

セッションからデータをプルしている間は配列形式でプルし、データベースからデータをプルしている間はJObjectとしてプルします。これがオブジェクトであるか配列であるかをチェックすることにより、私たちの生活をより困難にします。両方を配列のJObjectにすることでこれを管理する簡単な方法はありますか?

1
Malaiselvan

配列をオブジェクトにマップできます。

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

あなたのコードは

$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

GetItem関数で返すデータは何ですか?セッションで設定するデータ、またはgetItem関数で返すデータを単純に照合できます。

あなたの代わりにあなたのgetItem関数で

$data = $db->loadObject();

を使用してデータをロードする

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

LoadFormDataで検証する代わりに、(モデル内の)JModelAdminクラスのgetItem()メソッドをオーバーライドして、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