在phalcon框架中,我想填充相关的下拉类别列表。但是我在代码中遇到了一些问题:

#1在选择类别列表->子类别列表上显示:未定义(未使用值填充选项)

#2。如果数据库没有数据console.log显示:未定义的变量:我控制器中的resData
 #3。如果选择值为“ 0”的类别,则不会再次禁用子类别列表
我在代码中做错了什么?
php - 依赖于Phalcon的下拉列表填充-LMLPHP

[Module.php]

use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Volt;

$di->setShared('view', function () use ($config){
    $view = new View();
    $view->setViewsDir(APP_PATH . $config->appB->viewsDir);
# Register Volt Template
    $view->registerEngines(array(
    ".volt" => function($view, $di) use ($config) {
        $volt = new Volt($view, $di);
        $volt->setOptions(
            array(
                'compiledPath'      => APP_PATH . $config->appB->cacheDir,
                'compiledExtension' => '.php',
                'compiledSeparator' => '_',
                'compileAlways'     => true,
                'autoescape'        => false,
                'stat'              => true
            )
        );
    $compiler = $volt->getCompiler();
    $compiler->addFunction('strtotime','strtotime');

    return $volt;
    }
    ));
    return $view;
});


[CONTROLLER]

public function entryAction()
{
        $formAction = 'backend/index/insert';
        $this->view->setVar('action',$formAction);
        $this->view->product_title = '';
        $this->view->product_price = '';
        $this->view->product_keyword = '';
        $this->view->product_image = '';
        $this->view->product_desc = '';
        $category = Categories::find();
        $this->view->setVar('categories',$category);
        $this->view->pick("index/entry");
}

public function getSubcategoryAction()
{
    $id = $this->request->getPost('id');
    $data = Subcat::findBycategory_id($id);
    $resData = array();
    foreach($data as $result)
    {
        $resData[] = array('id' => $result->id, 'category_id' => $result->category_id, 'subcategory' => $result->subcategory_name);
    }
    echo(json_encode($resData));
    //$this->view->setVar('subcategory',$resData);
}


[输入电压]

Category:<select name="category" id="category">
    <option value="0">Choose Category ...</option>
{% for category in categories %}
    <option value="{{category.id}}">{{category.categoryname}}</option>
{% endfor %}
</select><br/>
sub-Category:<select name="subcategory" id="subcategory" disabled="disabled"><option value="0">Choose Sub-Category ...</option></select>
<br/>
    Products:<select name="products" id="products" disabled="disabled"><option value="0">Choose a Product ...</option></select>
<br/>


[JQUERY]

$("select[name='category']").on("change", function(e){
    e.preventDefault();
    var value = $(this).val();
    $("select[name='subcategory']").attr("disabled", false);
    $.ajax({
        type: "POST",
        url: "http://localhost/shopping/backend/index/getSubcategory",
        data:'id='+value,
    }).done(function(response){
        $("#subcategory").not(":first").remove();
        response = JSON.parse(response);
        response.forEach(function(value){
            $('#subcategory').append('<option value="'+value.id+'">'+value.subcategory+'</option>');
        });

    }).fail(function(){
            console.log('error: Please reload page and try again!');
    }).always(function(){
            console.log('Complete:');
    });
});

最佳答案

请注意,在控制器的第一行中,您将禁用视图,因此不会处理Volt。在您现在工作时,jQuery仅接收JSON结果,因此您要附加JSON而不是Volt。
您必须选择一个路径:要么使用Volt,在这种情况下,您必须在两个操作中都删除第1行并使用参数处理视图,或者继续向jQuery发送JSON数据,并正确设置以处理JSON响应(检查此answer

在您的情况下,getSubcategoryAction()看起来像:

public function getSubcategoryAction()
{
    //$this->view->disable();  //Replaced by:
    $this->view->setRenderLevel(
        View::LEVEL_ACTION_VIEW
     );
    $id = $this->request->getPost('id');
    $data = Subcat::findBycategory_id($id);
    foreach($data as $result)
    {
        $resData[] = array('id' => $result->id, 'category_id' => $result->category_id, 'subcategory' => $result->subcategory_name);
    }

    $this->view->setVar('categories', $resData);

}


假设您已在DI中将Volt设置为渲染引擎,并且Volt模板对应于../app/views/index/getSubcategory.phtml,即:

<?php

use Phalcon\Mvc\View;
use Phalcon\Mvc\View\Engine\Volt;

// Register Volt as a service
$di->set(
    'voltService',
    function ($view, $di) {
        $volt = new Volt($view, $di);

        $volt->setOptions(
          [
            'compiledPath'      => '../app/compiled-templates/',
            'compiledExtension' => '.compiled',
          ]
        );

       return $volt;
    }
);

// Register Volt as template engine
$di->set(
    'view',
    function () {
        $view = new View();

        $view->setViewsDir('../app/views/');

        $view->registerEngines(
          [
            '.volt' => 'voltService',
          ]
        );

        return $view;
    }
);


伏特注册代码从以下位置复制:https://docs.phalconphp.com/en/3.4/volt根据您的App结构修改目录。

关于php - 依赖于Phalcon的下拉列表填充,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52963830/

10-10 04:57