【问题标题】:How to set form data for a Joomla subform?如何为 Joomla 子表单设置表单数据?
【发布时间】:2018-02-25 12:58:20
【问题描述】:

我正在尝试创建一个 Joomla (3.x) 组件并努力使用子表单。除了例如,似乎没有太多关于使用子表单的文档。 https://docs.joomla.org/Subform_form_field_type

对于我的组件,我有一个父表和来自子表的一些关联数据库行。

这个想法是使用 Joomla 的 XML 表单语法为该父表显示一个编辑表单,并且在该编辑表单中还显示一个包含多个项目的子表单(来自子表的关联行)。

我希望能够修改父表字段,但也可以一次性修改关联的子表行(当然可以单独编辑与父表关联的每一行,但我猜这会很糟糕用户体验)。还是我以错误的方式处理这件事?

现在,我知道如何实现/显示子表单,也知道如何显示父表字段并使用正确的数据填充这些字段。但是如何使用父表单填充或引用子表单?

我的组件模型中有这个函数(继承自JModelAdmin)。

protected function loadFormData()
{
  $data = JFactory::getApplication()->getUserState('com_mycomp.edit.parent.data', array());

  if (empty($data))
  {
    $data = $this->getItem();
    // how to refer to subform fields inside $data?
  }

  return $data;
}

我知道一个字段是否被称为nametitle 我可以在$this->getItem() 之后更改$data 对象,例如$this->set('name', 'John Doe').

假设subform 类型的字段具有name 属性books,我想插入一行或多行,我该如何引用它?我尝试过各种形式的点语法,例如:$data->set('books.1.childfield')$data->set('books.pages1.childfield')。但它似乎没有引用正确的形式。

在同一个模型文件中当然有getForm 函数,但是我不认为应该独立于包含父表单来加载子表单?

public function getForm($data = array(), $loadData = true)
{
  $app = JFactory::getApplication();

  $form = $this->loadForm('com_mycomp.parent', 'parent', array('control' => 'jform', 'load_data' => $loadData));
  if (empty($form))
  {
    return false;
  }

  return $form;
}

编辑: 已经回答了我自己的问题。

【问题讨论】:

    标签: joomla joomla3.0 subform


    【解决方案1】:

    没关系。休息了一段时间后我想通了,然后再试一次(再次检查表单输入并深呼吸)。

    这是使用的格式:

    $data->set('nameofsubformfield',
    [
      'nameofsubformfield0' => [
        'fieldwithinsubform' => 'value-of-field-within-subform'
      ]
    ]);
    

    这似乎有效!我现在在getItem 函数中使用它。只需循环并将循环计数器放在nameofsubformfield 之后的零位置。有关某些上下文,请参见下面的代码(函数位于父模型中)。

    public function getItem($pk = null)
      {
        $data = parent::getItem((int)$pk);
        if (empty($data))
        {
           return false;
        }
        $childModel = JModelLegacy::getInstance('child', 'MycompModel');
        $rowChildren = $childModel->getChildrenByParentID((int)$data->get('id'));
        $childArray = [];
        for ($i = 0; $i < count($rowChildren); $i++)
        {
            $childArray['children'. $i] = [
                'name' => $rowChildren[$i]['name']
            ];
        }
        $data->set('children', $childArray);
        return $data;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2022-01-02
      • 2017-07-01
      相关资源
      最近更新 更多