Zend framework Zend Dojo FilteringSelect from join tables如何使用条令实现这一点

Zend framework Zend Dojo FilteringSelect from join tables如何使用条令实现这一点,zend-framework,dojo,doctrine,Zend Framework,Dojo,Doctrine,我的Zend Framework应用程序中有许多FilteringSelect元素工作正常,但它们基于简单的查询 我现在需要创建一个FilteringSelect,它允许我在相关表中显示字段文本时选择一个表的id,即我有两个相关的表groomservices和groomprocedures(即groomprocedures.groomProceduresID有许多groomservices.procedure)。 我试图创建的表单是为一个约会表创建的,该表有许多groomservices.gro

我的Zend Framework应用程序中有许多FilteringSelect元素工作正常,但它们基于简单的查询

我现在需要创建一个FilteringSelect,它允许我在相关表中显示字段文本时选择一个表的id,即我有两个相关的表groomservices和groomprocedures(即groomprocedures.groomProceduresID有许多groomservices.procedure)。 我试图创建的表单是为一个约会表创建的,该表有许多groomservices.groomServicesID值。我希望用户能够在使用FilteringSelect保存groomservices.groomServicesID的值时看到过程的名称

到目前为止,我还不能做到这一点,因为我的FilteringSelect没有显示任何内容,我确信这是可以做到的,只是因为我对Zend、Doctrine和Dojo缺乏经验

我不确定我的问题是自动完成操作(包括查询)还是FilteringSelect元素

谁能在下面的代码部分指出我哪里出错了,我需要让它工作

我的控制器内的自动完成操作

public function gserviceAction()
{
// disable layout and view rendering
$this->_helper->layout->disableLayout();
$this->getHelper('viewRenderer')->setNoRender(true);

    // get a list of all grooming services IDs and related procedures
 $qry= Doctrine_Query::create()
    ->select('g.groomServicesID,p.groomProcedure')
    ->from('PetManager_Model_Groomservices g')
    ->leftJoin('g.PetManager_Model_Groomprocedures p');
    $result=$qry->fetchArray();

   //generate and return JSON string 
   $data = new Zend_Dojo_Data('g.groomServicesID',$result);
   echo $data->toJson();
}
My FilteringSelect元素代码

  // Create a autocomplete select input for the service
    $gservice = new Zend_Dojo_Form_Element_FilteringSelect('gapmtService');
    $gservice->setLabel('Proceedure');
        $gservice->setOptions(array(
          'autocomplete' => true,
          'storeID'   => 'gserviceStore',
          'storeType' => 'dojo.data.ItemFileReadStore',
         'storeParams' => array('url' => "/groomappointments/appointment/gservice"),
         'dijitParams' => array('searchAttr' => 'groomProcedure')))
          ->setRequired(true)
          ->addValidator('NotEmpty', true)
          ->addFilter('HTMLEntities')            
          ->addFilter('StringToLower')        
          ->addFilter('StringTrim');
多谢各位

格雷厄姆

p.S.orgot提到,我在mysql中尝试了以下查询,我给出了我要查找的内容,我相信Doctine查询的结果也是一样的

select groomservices.groomservicesID,groomprocedures.groomprocedure from groomprocedures left join groomservices on groomprocedures.groomproceduresID =groomservices.groomProcedure
但我不确定我是否在理论中正确格式化了查询

根据flammon的评论进行编辑

好的,我已经将代码设置为以下内容,但仍然没有显示任何内容

public function gserviceAction()
{
$ajaxContext = $this->_helper->getHelper('AjaxContext');
    $ajaxContext->addActionContexts(array(
    'gservice' => 'json' 
));

// get a list of all grooming services IDs and related procedures
 $qry= Doctrine_Query::create()
   ->select('g.groomServicesID AS id,p.groomprocedure AS name')
    ->from('PetManager_Model_Groomservices g')
    ->leftJoin('g.PetManager_Model_Groomprocedures p');

    $this->view->model = (object) array();
    $this->view->model->identifier = 'id';
    $this->view->model->label = 'name';
    $this->view->model->items = array();

    $tableRows = $this->dbTable->fetchAll($qry);

    foreach ($tableRows as $row) {
            $this->view->model->items[] = $row->toArray();
            }

  }

我确信这是我的错。

您放在ItemFileReadStore中的数据似乎有问题

这里有几点建议

考虑为您的服务扩展Zend_Rest_控制器。管理上下文和视图会更容易。您将能够执行以下操作:

public function init()
{
    $ajaxContext = $this->_helper->getHelper('AjaxContext');
    $ajaxContext->addActionContexts(array(
        'gservice' => 'json'
    ));
}
这将消除您在每个服务操作中对以下内容的需求

// disable layout and view rendering
$this->_helper->layout->disableLayout();
$this->getHelper('viewRenderer')->setNoRender(true);
您需要传递format参数或使用以下插件来帮助进行上下文切换。传递format参数更简单,但它会污染url?format=json。这是我的建议

如果不想传递format参数,可以使用以下插件

class Application_Plugin_AcceptHandler extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {

        if (!$request instanceof Zend_Controller_Request_Http) {
            return;
        }

        $header = $request->getHeader('Accept');

        switch (true) {
        case (strstr($header, 'application/json')):
            Zend_Registry::get('logger')->log('Setting format to json', Zend_Log::INFO);
            $request->setParam('format', 'json');
            break;
        case (strstr($header, 'application/xml')
            && (!strstr($header, 'html'))):
            Zend_Registry::get('logger')->log('Setting format to xml', Zend_Log::INFO);
            $request->setParam('format', 'xml');
            break;
        default:
            Zend_Registry::get('logger')->log('Setting format to html', Zend_Log::INFO);
            break;
        }
    }
}
在控制器中,创建dojo期望的视图变量,而不是回显数据。格式见此

$this->view->model = (object) array();
$this->view->model->identifier = 'id';
$this->view->model->label = 'name';
$this->view->model->items = array();
在控制器中,获取表行:

$tableRows = $this->dbTable->fetchAll($select);
或者,如果将模型代码放在函数中,它可能看起来更像:

$tableRows = $this->dbTable->fetchGroomProcedures();
将行数据放入model->items[]数组:

foreach ($tableRows as $row) {
    $this->view->model->items[] = $row->toArray();
}
创建一个视图,view/scripts/appointment/gservice.json.phtml并将其放入

Zend_Json::encode($this->model)

使用Firebug查看您的服务返回了什么。

@flammon感谢您的输入,它非常广泛,但是由于我是Zend和Dojo的新手,我有点困惑。从您的解释来看,当我想要创建约会时,我必须在表单中呈现一个不同的视图来显示FilteringSelect结果,对吗?@Graham是的,对。FilteringSelect的数据从不同的视图加载。当您指定'storeParams'=>array('url'=>“/groomappointments/appointment/gservice)时,gservice操作将准备该视图的数据。还有一件事,您可能希望将查询中的字段别名为id和name。例如,g.groomServicesID作为id,p.groomProcedure作为名称,以使其与示例一起工作。@flammon我想我做了您描述的事情,但仍然出现错误,无法在FireBug中加载/groomAppointment/appointment/gservice状态:500 1234超出范围505和646超出范围103。我怀疑上下文没有切换,导致500。您可以通过使用与gsservice.json.phtml相同的内容创建view/scripts/appointment/gservice.phtml来测试这一点。我已经更新了答案,以包含关于AjaxContext帮助程序的更多信息。您需要传递?format=json或使用提供的插件。@flammon我在Apache中检查了错误日志,它报告了PHP注意事项:未定义属性:Groomappointments\u AppointController::$dbTable,位于C:\\\\\\\\\\\\\\\\\\\application\\modules\\GroomAppoints\\controllers\\AppointController.PHP的第43行,referer:PHP致命错误:在C:\\WebDocs\\petmanager\\application\\modules\\groomappointments\\controllers\\AppointmentController.PHP的第43行,对非对象调用成员函数fetchAll(),referer: