Как сохранить выбранные данные в комбо select после запроса? - PullRequest
0 голосов
/ 18 марта 2019

У меня есть эта функция, которая позволяет мне выбрать категорию (из выбранной комбинации), чтобы связать ее с продуктом во время его создания.Это работает хорошо, но когда я изменяю продукт, мне бы хотелось, чтобы категория, назначенная во время создания, оставалась выделенной и видимой в начале комбо.

Я полагаю, что мне нужно что-то изменить в функции, когда яобновить продукт.Любое предложение?

Спасибо

Функция:

function CategoryTree(&$output=null, $cat_parent_id=0, $indent=null){

    global $con;

    try {

    // prepare select query
    $query = "SELECT * FROM category WHERE cat_parent_id=:parentid AND cat_lang = '{$_SESSION['lang']}'";
    $stmt = $con->prepare($query);

    // this is the first question mark
    $stmt->bindParam(2, $id);

    // execute our query
    $stmt->execute(array( 'parentid' => $cat_parent_id));

    while($c = $stmt->fetch(PDO::FETCH_ASSOC)){
       $disable= "";
        if($cat_parent_id==0 ){
          $disable= 'disabled="disabled" style="color:black;font-weight:bold;font-style:oblique"';
    }
    $output .= '<option  '. $disable.'  value=' . $c['cat_id'] . '>' . $indent . $c['cat_name'] . "</option>\n";
    if($c['cat_id'] != $cat_parent_id){

        CategoryTree($output, $c['cat_id'], $indent . "&nbsp;&nbsp;");
    }
}
    // return the list of categories
    return $output;
}
// show error
catch(PDOException $exception){
    die('ERROR: ' . $exception->getMessage());
}
}

HTML:

<select name="category" class="form-control" id="category" required />
   <option value="">Select a category</option>

<?php

    echo CategoryTree();
?>   
    </select>

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Хорошо, я перепишу свой вопрос здесь, так как я не могу объяснить себя. Я должен переписать этот код из старого mysql_ в PDO. Возможно, при написании кода это лучше понять.

Основная функция:

/*
    Generate combo box options containing the categories we have.
    if $catId is set then that category is selected
*/
function buildCategoryOptions($catId = 0)
{
    $sql = "SELECT cat_id, cat_parent_id, cat_name
            FROM tbl_category  WHERE cat_lang = '{$_SESSION['lang']}'
            ORDER BY cat_id";
    $result = dbQuery($sql);

    $categories = array();
    while($row = dbFetchArray($result)) {
        list($id, $parentId, $name) = $row;

        if ($parentId == 0) {
            // we create a new array for each top level categories
            $categories[$id] = array('name' => $name, 'children' => array());
        } else {
            // the child categories are put int the parent category's array
            $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name); 
        }
    }   

    // build combo box options
    $list = '';
    foreach ($categories as $key => $value) {
        $name     = $value['name'];
        $children = $value['children'];

        $list .= "<optgroup label=\"$name\">"; 

        foreach ($children as $child) {
            $list .= "<option value=\"{$child['id']}\"";
            if ($child['id'] == $catId) {
                $list.= " selected";
            }

            $list .= ">{$child['name']}</option>\r\n";
        }

        $list .= "</optgroup>";
    }

    return $list;
}

create.php:

$catId = (isset($_GET['catId']) && $_GET['catId'] > 0) ? $_GET['catId'] : 0;
$categoryList = buildCategoryOptions($catId);

, а затем

<select name="cboCategory" id="cboCategory" class="width-50">
     <option value="" selected>-- Choose Category --</option>
<?php
echo $categoryList;
?>   
  </select>

update.php

// get category list
$sql = "SELECT cat_id, cat_parent_id, cat_name
        FROM tbl_category 
          ORDER BY cat_id";
$result = dbQuery($sql) or die('Cannot get Product. ' . mysql_error());

$categories = array();
while($row = dbFetchArray($result)) {
    list($id, $parentId, $name) = $row;

    if ($parentId == 0) {
        $categories[$id] = array('name' => $name, 'children' => array());
    } else {
        $categories[$parentId]['children'][] = array('id' => $id, 'name' => $name); 
    }
}   
// build combo box options
$list = '';
foreach ($categories as $key => $value) {
    $name     = $value['name'];
    $children = $value['children'];

    $list .= "<optgroup label=\"$name\">"; 

    foreach ($children as $child) {
        $list .= "<option value=\"{$child['id']}\"";

        if ($child['id'] == $cat_id) {
            $list .= " selected";
        }
        $list .= ">{$child['name']}</option>";
    }

    $list .= "</optgroup>";
}
?> 

, а затем

<select name="cboCategory" id="cboCategory" class="box">
     <option value="" selected>-- Choose Category --</option>
<?php
    echo $list;
?>   
    </select>

Функции:

 dbQuery() =    global $dbConn;

  $result = mysqli_query($dbConn, $sql) or die(mysqli_error($dbConn));

    return $result;

dbFetchArray = function dbFetchArray($result, $resultType = MYSQL_NUM) {
    return mysqli_fetch_array($result, $resultType);
}
0 голосов
/ 18 марта 2019

Я думаю, что вам нужно (если я правильно понял вашу проблему), чтобы использовать атрибут 'selected' опции, вы можете сказать, какая опция помечена как выбранная при загрузке страницы, сказав

'<option  '. $disable.'  value=' . $c['cat_id'] . ' selected>'

(https://www.w3schools.com/tags/att_option_selected.asp)

Затем можно использовать значение в $_POST['category'] при отправке формы и сравнить его со значением категории ($c['cat_id']) в цикле, чтобы решить, какой элемент

Когда форма отправлена ​​и страница перезагружена, последнее выбранное значение останется выбранным.

Простите, если я не правильно понял ваш вопрос, но я ДУМАЮ, что это то, чтоты имеешь в виду

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...