如何使用ExpressionEngines不明确的通道字段ID保持理智?

时间:2012-06-29 19:45:52

标签: expressionengine

在编写查询或运行结果集时,我经常不得不将字段称为“field_id_X”。我想相信,除了为每个field_id / name对定义CONST之外,还有一种更为理智的方法。

define(NAME_FIELD ,'field_id_3');
define(HEIGHT_FIELD, 'field_id_4');

foreach( $result as $row ){
    $name = $row[NAME_FIELD]; // :(
}

2 个答案:

答案 0 :(得分:2)

获取字段ID和名称的数组......

function getFieldReferences() {
    $sql = "SELECT field_id, field_name
        FROM exp_channel_fields
       WHERE site_id = ".$this->EE->config->item('site_id');
    $result = $this->EE->db->query($sql);

    if ($result->num_rows() > 0) {
        $result = $result->result_array();
        $finalResult = array();
        foreach ($result as $row)
            $finalResult[$row["field_id"]] = $row["field_name"];

        return $finalResult;
    } else {
        return false;
    }
}

特定条目的转换示例$ entry_id ...

$sql = "SELECT exp_channel_data.*, exp_channel_titles.*, exp_channels.channel_name
          FROM exp_channel_data, exp_channel_titles, exp_channels
         WHERE exp_channel_data.entry_id = $entry_id
           AND exp_cart_products.entry_id = $entry_id
           AND exp_channel_titles.entry_id = $entry_id
         LIMIT = 1";
$result = $this->EE->db->query($sql);
if ($result->num_rows() > 0) {
        $result = $result->result_array();
        $result = $result[0];

        //###   Get Field Titles   ###
        $fieldReferences = getFieldReferences();

        //###   Replace Field ID reference with name   ###
        foreach ($result as $key => $value) {
            if (substr($key,0,9) == "field_id_") {
                $result[$fieldReferences[substr($key,9)]] = $value;
                unset($result[$key]);
            }
            if (substr($key,0,9) == "field_ft_")
                unset($result[$key]);
        }//###   End of foreach   ###
}

根据指定成员$ id ...

将成员字段转换为名称
$sql = "SELECT m_field_id, m_field_name
      FROM exp_member_fields";
$result = $this->EE->db->query($sql);
if ($result->num_rows() > 0) {
    $memberFields = $result->result_array();

    $sql = "SELECT exp_member_data.*, exp_members.email
          FROM exp_member_data, exp_members
         WHERE exp_member_data.member_id = $id
           AND exp_members.member_id = $id
         LIMIT 1";

    $result = $this->EE->db->query($sql);
    if ($result->num_rows() > 0) {
    $result = $result->result_array();
    $rawMemberDetails = $result[0];

    //###   Loop through each Member field assigning it the correct name   ###
    foreach($memberFields as $row)
        $memberDetails[ $row['m_field_name'] ] = $rawMemberDetails['m_field_id_'.$row['m_field_id']];
}

答案 1 :(得分:0)

您可以通过 exp_channel_data 中的 field_id 查找 exp_channel_fields.field_name (或field_label)。