Joomla表单字段类型sql="....WHERE条件"是什么意思?

3
在Joomla 2.5中,我如何使用SQL查询的“WHERE”条件来进行表单字段类型为“SQL”的操作?
例如:
<field name="catid" type="sql" query="SELECT id, title FROM #__table WHERE {condition}" />

在Joomla文档中没有关于这个的任何内容。我找到了这个链接,但它没有提到在SQL查询中使用WHERE条件(http://docs.joomla.org/SQL_form_field_type)。

请问在Joomla中是否可以做到这一点?

我有一个产品表和一个与品牌相关联的商店表。如果我编辑一个商店,我想显示一个下拉框,其中包含该商店品牌的所有产品。这可能吗?SELECT * FROM #__products WHERE brand = {我选择编辑的商店关联的品牌ID} 这可能吗?

我能够通过自定义表单字段来实现这一点=)

http://docs.joomla.org/Creating_a_custom_form_field_type

谢谢RHR的答案!

6个回答

3

以下是我的解决方案:

您可以通过以下步骤完全替换查询:

1)定义您的查询:

$query = 'SELECT * from table_name WHERE table_id = '.$your_value;

2) 更新你的表单字段属性:

$this->form->setFieldAttribute('field_name', 'query', $query);

1
一些关于@WooDzu解决方案的更新:
class JFormFieldICategory extends JFormFieldSQL
{

    public $type = 'ICategory';

    /**
     * Overrides parent's method
     */
    protected function getOptions()
    {
        // Get the ID
        $cat_id = $this->form->getField((string) $this->element['cat_id']);

        // Override query
        $this->query = str_replace('{cat_id}', (string) $cat_id->value, (string) $this->element['query']);
        echo $this->query.' test '; //exit();

        return parent::getOptions();
    }

}

类型应该是public,查询应分配给$this->query。 非常好!


1

是的,这是可能的。

我使用的代码:

<fields name="request">
 <fieldset name="request" >
<field name="id" type="sql" query="SELECT id , title FROM #__table name where published=1" multiple="single" key_field="id" value_field="title" class="inputbox" label="fieldlabel" description="fielddesc" required="true" />
</fieldset> 
</fields>

您可以另一种方式来完成这个操作,如 自定义字段


1
谢谢您的回答。但我的问题是我能做这样的事情吗? 我有一个产品表和一个与品牌相关联的商店表。 如果我编辑一个商店,我想显示一个下拉框,其中包含该商店品牌的所有产品。这可能吗?SELECT * FROM #__products WHERE brand = {我选择编辑的商店关联的品牌ID}这可行吗?谢谢! - Snitram200

1

我刚遇到了相同的问题。经过一番探索,我发现其实是有解决办法的。

1. 步骤 - 你需要一个自定义表单字段(我将其命名为vssql.php):

JFormHelper::loadFieldClass('sql');

class JFormFieldVSSQL extends JFormFieldSQL
{
    /**
     * The form field type.
     */
    public $type = 'VSSQL';

    /**
     * Overrides parent's method
     */
    protected function getOptions()
    {
        // Get the ID
        $query_id = $this->form->getField((string) $this->element['query_id']);

        // Override query
        $this->element['query'] = str_replace('{query_id}', (string) $query_id->value, (string) $this->element['query']);

        return parent::getOptions();
    }
}

步骤2 - 您需要知道如何使用它:

在您的JForm xml中添加:

  <field
    name="field_name"
    type="vssql"
    query_id="user_id"
    query="SELECT id AS value, CONCAT(street,' ',city) AS addresses FROM #__addresses WHERE user_id = {query_id}"
    label="用户地址列表"
    required="required" />

在您的SQL查询中,占位符{query_id}将被替换为query_id参数的实际值,这种情况下为*user_id*。这将返回分配给给定用户的某个表中的地址列表。


0

我遇到了同样的问题。你不能基于变量来设置where条件,只能使用常量:(

但是你可以通过改变表单字段并使用form->setField函数重新加载视图中的字段。借助这个方法,你可以在字段sql中设置任何条件。

$NewFieldDefinition=new SimpleXMLElement('<field name="catid" type="sql" query="SELECT id, title FROM #__table WHERE title='.$condition.'" />');
$this->form->setField($NewFieldDefinition, null, true);

0

这对我有用(我用它从 #__extensions 表中选择用户插件)在 Joomla 2.5+ 和 3.x+ 中作为 WHERE 条件:

<field name="plugin" type="sql" query="SELECT extension_id as value, name as title FROM #__extensions WHERE type = 'plugin' AND folder = 'user'" />

我认为这一切都与如何在where子句中使用变量有关。 - Barto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接