【问题标题】:phalcon dependent dropdown list population with jquery使用 jquery 的 phalcon 依赖下拉列表填充
【发布时间】:2018-10-24 08:04:46
【问题描述】:

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

#1。在选择类别列表 -> 子类别列表中显示:未定义(它没有用值填充选项)

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

[模块.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;
});

[控制器]

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:');
    });
});

【问题讨论】:

    标签: php jquery mysql phalcon


    【解决方案1】:

    请注意,在控制器的第一行中,您禁用了视图,因此永远不会处理 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;
        }
    );
    

    Volt注册码复制自:https://docs.phalconphp.com/en/3.4/volt根据你的App结构修改目录。

    【讨论】:

    • 在我的情况下不明白,请举一个与我的代码相关的示例,如何使用 volt 来获得预期的结果!
    • 我按照您的指示更改控制器操作也 jquery!但console.log 没有显示任何内容并且下拉菜单没有填充
    • 我刚刚更新了我的完整代码,请检查它并告诉我我做错了什么以获得预期的结果?
    • 如果您访问http://localhost/shopping/backend/index/getSubcategory,您会收到什么?此外,如果可能,请包括您的 Volt 服务的定义。
    • 好的,当你直接用浏览器访问这个url的时候?
    【解决方案2】:

    按照此操作并更新您的代码...

    [JQuery]

    $("select[name='category']").on("change", function(e){
        e.preventDefault();
        var value = $(this).val();
        if(value === '0'){$("select[name='subcategory']").attr("disabled", true); $("select[name='products']").attr("disabled", true);}else{$("select[name='subcategory']").attr("disabled", false);} 
        $.ajax({
            type: "POST",
            url: "http://localhost/shopping/backend/index/getSubcategory",
            data:'id='+value,       
        }).done(function(response){
            $("#subcategory").find('option').not(":first").remove();    
            $("#products").find('option').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:');
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多