【问题标题】:Joomla Subform fieldJoomla 子表单字段
【发布时间】:2020-05-18 19:34:54
【问题描述】:

我们继承了一个Joomla项目,需要为产品图片实现一个重复字段。

我们无法理解如何在数据库中实现这一点。是否有一些命名约定来告诉 Joomla 使用什么表/外键?

我们在 xml 文件中有这个:

<?xml version="1.0" encoding="UTF-8"?>
<field
    name="gallery_images"
    type="subform"
    label="Gallery Images"
    description="Images for the gallery"
    multiple="true"
    min="1"
    max="10"
    >
    <form>
        <field
            name="image_url"
            type="media"
            label="Image"
            />
    </form>
</field>

然后我们将其拉入表单edit.php文件中,如下所示:

<div class="control-group">
    <div class="control-label"><?php echo $this->form->getLabel('gallery_images'); ?></div>
    <div class="controls"><?php echo $this->form->getInput('gallery_images'); ?></div>
</div>

这实际上在后端都可以完美运行。但它没有保存任何地方。我们尝试在产品表上创建一个字段,认为它可能会存储为 JSON。我们已经尝试为带有 product_id 的图像创建另一个表,认为 Joomla 可能只是计算出外键?

Joomla 文档似乎没有说明它在数据库中的工作方式。 (https://docs.joomla.org/Subform_form_field_type)

提前致谢。

【问题讨论】:

  • 按照现在的配置方式,Joomla 将尝试将 subfields-json 存储在各自的模型gallery_images 列中。只有关于文件名的命名约定,但由于您的 edit.php 已经呈现了您的 .xml 文件字段,我认为这是正确的。
  • 谢谢,这是我们的预期,但它没有发生。可能我们正在做的其他事情阻止了它?无论哪种方式,我们都编写了一些代码来手动保存该字段并且有效。我们在互联网上发现了其他必须做同样事情的人。我已经添加了答案。
  • 媒体字段可能需要格外小心,因为它是一个 javascript 重字段,并且子表单确实存在需要 javascript 的字段的问题。

标签: php mysql joomla


【解决方案1】:

因此,由于 joomla 保存了 gallery_images 字段,我们编写了一些代码手动执行此操作。

class ModelProduct extends JModelAdmin
{
    public function save($data) {
        if (parent::save($data)) {
            $registry = new Registry;
            $registry->loadArray($data['gallery_image']);
            $data['gallery_image'] = (string) $registry;
            $db = JFactory::getDbo();
            $query = $db->getQuery(true);

            // Fields to update.
            $fields = array(
                $db->quoteName('gallery_image') . ' = ' . $db->quote($data['gallery_image']),
            );

            // Conditions for which records should be updated.
            $conditions = array(
                $db->quoteName('id') . ' = '.$data['id'],
            );

            $query->update($db->quoteName('v4yn2_product'))->set($fields)->where($conditions);
            $db->setQuery($query);
            $result = $db->execute();
            return true;
        }
        return false;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2012-09-20
    • 1970-01-01
    相关资源
    最近更新 更多