首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字段选项中的Value == DisplayText,否则字段为空

字段选项中的Value == DisplayText,否则字段为空
EN

Stack Overflow用户
提问于 2013-06-15 01:27:59
回答 1查看 3.1K关注 0票数 1

我已经在jquery-jtable Github问题部分提出了这个问题:https://github.com/hikalkan/jtable/issues/703。目前似乎没有太多的知识被分享,这个问题严重阻碍了我的项目的进一步发展。

我几乎可以肯定我遗漏了一些相对简单的东西,因为基于这里的文档:http://www.jtable.org/ApiReference#fopt-options,这真的应该很简单,没有问题。

请注意,此简化版本的代码应该演示该问题,并不代表代码是如何实现的。也就是说,我严格地试图解决可重现的问题,而不是如何在我的更大的项目中最好地使用它。以下是该问题的副本粘贴:

让我们创建SQL表:

代码语言:javascript
复制
--Create "employee titles" table
create table employee_titles (employeetitleid int not null IDENTITY, employeetitle varchar(50) not null,
constraint PK_employee_titles_employeetitleid
primary key clustered (employeetitleid))
go

现在让我们创建jtable:

代码语言:javascript
复制
<html>
  <head>

    <link href="/jtabphp/themes/redmond/jquery-ui-1.8.16.custom.css" rel="stylesheet" type="text/css" />
    <link href="/jtabphp/scripts/jtable/themes/lightcolor/blue/jtable.css" rel="stylesheet" type="text/css" />

    <script src="/jtabphp/scripts/jquery-1.6.4.min.js" type="text/javascript"></script>
    <script src="/jtabphp/scripts/jquery-ui-1.8.16.custom.min.js" type="text/javascript"></script>
    <script src="/jtabphp/scripts/jtable/jquery2.3.0.jtable.js" type="text/javascript"></script>

  </head>
  <body>
    <div id="EmployeeTitles" style="width: 600px;"></div>
    <script type="text/javascript">

        $(document).ready(function () {

            //Prepare jTable
            $('#EmployeeTitles').jtable({
                title: 'Employee Titles',
                actions: {
                    listAction: 'PersonActions.php?action=list',
                    },
                fields: {
                    employeetitleid: {
                        key: true,
                        create: false,
                        edit: false,
                        title: 'Title ID',
                        width: '10%'
                    },
                    employeetitle: {
                        title: 'Employee Title',
                        options: 'DropdownSelectors.php?Selector=employeetitle',
                        optionsSorting: 'text',
                        width: '45%'
                    }
                }
            });

            //Load person list from server
            $('#EmployeeTitles').jtable('load');

        });

    </script>

  </body>
</html>

让我们创建运行action==list的personactions.php查询的SQL文件:

代码语言:javascript
复制
<?php

// Connect to SQL Server
include '../../phpconfig/connectstrings.php';

try
{
    $conn = new PDO ( "sqlsrv:server = $serverstring; Database = $databasestring", "$usernamestring", "$passwordstring");
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}

catch ( PDOException $e )
{
    print( "Error connecting to SQL Server." );
    die(print_r($e));
}

catch(Exception $e)
{
    die(var_dump($e));
}

try {
    //Getting records (listAction)
    if($_GET["action"] == "list")
    {

    //Get records from database
    $sql_select = "SELECT employeetitleid, employeetitle FROM employee_titles";
    $stmt = $conn->query($sql_select);

    //Add all records to an array
    $rows = $stmt->fetchall(PDO::FETCH_ASSOC);

    //Return result to jTable
    $jTableResult = array();
    $jTableResult['Result'] = "OK";
    $jTableResult['Records'] = $rows;
    print json_encode($jTableResult);
    }
    //Creating a new record (createAction)
    else if($_GET["action"] == "create")
    {
    //Insert record into database
    $sql_insert = "INSERT INTO employee_titles (employeetitle) VALUES (?)";
    $stmt = $conn->prepare($sql_insert);
    $stmt->bindValue(1, $_POST['employeetitle']);
    $stmt->execute();

    //Get last inserted record (to return to jTable)
    $sql_select = "SELECT employeetitleid, employeetitle FROM employee_titles WHERE employeetitleid = @@IDENTITY";
    $stmt = $conn->prepare($sql_select);
    $stmt->execute();
    $row = $stmt->fetch(PDO::FETCH_ASSOC);

    //Return result to jTable
    $jTableResult = array();
    $jTableResult['Result'] = "OK";
    $jTableResult['Record'] = $row;
    print json_encode($jTableResult);
    }

    //Updating a record (updateAction)
    else if($_GET["action"] == "update")
    {
    //Update record in database
    $sql_update = "UPDATE employee_titles SET employeetitle = ? WHERE employeetitleid = ?;";
    $stmt = $conn->prepare($sql_update);
    $stmt->bindValue(1, $_POST['employeetitle']);
    $stmt->bindValue(2, $_POST['employeetitleid']);
    $stmt->execute();

    //Return result to jTable
    $jTableResult = array();
    $jTableResult['Result'] = "OK";
    print json_encode($jTableResult);
    }
    //Deleting a record (deleteAction)
    else if($_GET["action"] == "delete")
    {
    //Delete from database
    $sql_delete = "DELETE FROM employee_titles WHERE employeetitleid = ?;";
    $stmt = $conn->prepare($sql_delete);
    $stmt->bindValue(1, $_POST['employeetitleid']);
    $stmt->execute();

    //Return result to jTable
    $jTableResult = array();
    $jTableResult['Result'] = "OK";
    print json_encode($jTableResult);
    }

//Close database connection
$conn = null;

}
catch(Exception $ex)
{
//Return error message
$jTableResult = array();
$jTableResult['Result'] = "ERROR";
$jTableResult['Message'] = $ex->getMessage();
print json_encode($jTableResult);
}

?>

最后,让我们生成要查询下拉内容的DropdownSelectors.php文件。根据我如何构造这个文件,我将得到两个不同的结果,但都不是令人满意的结果。

在第一个示例中,我将使DisplayText ==值。这将在jtable视图中正确显示员工头衔信息,并正确填充用于创建/编辑的下拉列表。但是,dropdown报告的值对于以后的查询没有那么有用,因为它实际上是employeetitleid,而不是重复的employeetitleid。这两个示例中的代码生成了与jtable期望的数组类型完全匹配的数组类型,如下所示:http://www.jtable.org/apireference#fopt-options。这不应该是有争议的,因为创建/编辑下拉菜单在这两个示例中都可以工作。

示例DropdownSelectors.php #1:

代码语言:javascript
复制
<?php
// Connect to SQL Server
include '../../../phpconfig/connectstrings.php';

try
{
$conn = new PDO ( "sqlsrv:server = $serverstring; Database = $databasestring", "$usernamestring", "$passwordstring");
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}

catch ( PDOException $e )
{
print( "Error connecting to SQL Server." );
die(print_r($e));
}
catch(Exception $e)
{
    die(var_dump($e));
}
if ($_GET['Selector'] == "employeetitle") {
    $sql_select = "SELECT employeetitle [DisplayText], employeetitle [Value] FROM employee_titles";
    $stmt = $conn->prepare($sql_select);
    $stmt->execute();

    $rows= $stmt->fetchAll(PDO::FETCH_ASSOC);

    $options[Result] = 'OK';
    $options[Options] = $rows;

    print json_encode($options);
                                            }
?>

在第二个示例中,我将从employee_titles表的不同列中提取DisplayText和Value。这将导致jtable的employee title列为空,但仍然可以正确地填充下拉列表以进行创建/编辑。在这种情况下,dropdown报告的值对于以后的查询非常有用,因为它实际上报告了employeetitleid,而不仅仅是重复报告employeetitleid。这两个示例中的代码生成了与jtable期望的数组类型完全匹配的数组类型,如下所示:http://www.jtable.org/apireference#fopt-options。这不应该是有争议的,因为创建/编辑下拉菜单在这两个示例中都可以工作。然而,显示的jtable列显示为空白是完全不可接受的。

示例DropdownSelectors.php #2:

代码语言:javascript
复制
<?php
// Connect to SQL Server
include '../../../phpconfig/connectstrings.php';

try
{
$conn = new PDO ( "sqlsrv:server = $serverstring; Database = $databasestring", "$usernamestring", "$passwordstring");
$conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}

catch ( PDOException $e )
{
print( "Error connecting to SQL Server." );
die(print_r($e));
}

catch(Exception $e)
{
    die(var_dump($e));
}
if ($_GET['Selector'] == "employeetitle") {
    $sql_select = "SELECT employeetitle [DisplayText], employeetitleid [Value] FROM employee_titles";
    $stmt = $conn->prepare($sql_select);
    $stmt->execute();

    $rows= $stmt->fetchAll(PDO::FETCH_ASSOC);

    $options[Result] = 'OK';
    $options[Options] = $rows;

    print json_encode($options);
                                            }
?>

现在你已经有了所有必要的代码来完全重现这个非常可重现的问题,谁能告诉我如何修复它,以便在列出的字段中显示DisplayText和下拉选项,发出等同于ID #的vlaue?我开始相信jtable本身存在一个显示错误,某个地方的小修复就会导致信息出现在jtable视图中。

请参阅链接的github问题,了解我尝试过的一些解决方法以及它们不起作用的原因。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-18 05:24:04

好吧!我解决了这个问题。天哪,我真的觉得自己很傻。我对值与记录和字段名的关系有一个错误的理解。我假设Value严格是在进行下拉选择时传递的信息。但是,正如我现在所看到的,Value也对应于jtable字段中包含的记录。因此,fieldname必须与数据所属的列名相对应,就像标准的jtable字段一样。值必须与该列对应。因此,为了修复提供的示例,我们执行以下操作:

代码语言:javascript
复制
if ($_GET['Selector'] == "employeetitleid") {
    $sql_select = "SELECT employeetitle [DisplayText], employeetitleid [Value] FROM employee_titles";
    $stmt = $conn->prepare($sql_select);
    $stmt->execute();

    $rows= $stmt->fetchAll(PDO::FETCH_ASSOC);

    $options[Result] = 'OK';
    $options[Options] = $rows;

    print json_encode($options);
                                            }

代码语言:javascript
复制
employeetitleid: {
                    title: 'Employee Title',
                    dependsOn: 'anotherfield',
                    options: function (data) { if (data.source == 'list') { return  'DropdownSelectors.php?Selector=employeetitleid&filter=>0'; }
                    return './../DropdownSelectors.php?Selector=employeetitleid&filter==' + data.dependedValues.anotherfield },
                    optionsSorting: 'text',
                    width: '45%'
                }

上面的例子还包括了操作级联下拉列表的DepndsOn功能的逻辑,这就是我开始遇到这个问题的原因(在此之前,Value==DisplayText工作得很好)。在这个例子中,jtable将显示列名称"Employee title“,字段将显示与title id编号相关的文本字符串。然而,实际处理的数据是title id编号,这使得所有的查询和字段配置必须更容易、更高效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17114084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档