Zend Dojo FilteringSelect从连接的表中选择



在我的Zend Framework应用程序中,我有许多FilteringSelect元素工作得很好,但它们是基于简单的查询。

我现在需要创建一个FilteringSelect,这将允许我选择一个表的id,同时在一个相关的表中显示字段的文本,即我有两个表groomservices和groomprocedures是相关的(即groomprocedures)。groomprocedures(有许多groomservices.procedure)。我要创建的表单是一个约会表,其中有许多新郎服务。groomServicesID值。我希望用户能够看到程序的名称,同时保存新郎服务的价值。使用FilteringSelect.

到目前为止,我还没有能够做到这一点,在我的FilteringSelect显示什么,我相信这可以做到,只是错误是与我的经验不足Zend,学说和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');

提前感谢,

格雷厄姆

注:忘了提我在mysql中尝试了以下查询,我给了我我正在寻找的东西,我相信Doctine查询的评估结果是相同的。

select groomservices.groomservicesID,groomprocedures.groomprocedure from groomprocedures left join groomservices on groomprocedures.groomproceduresID =groomservices.groomProcedure

但是我不确定我在Doctrine中的查询格式是否正确。

编辑与评论相关的内容

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

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_Controller。管理上下文和视图会更容易。你可以这样做:

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参数更简单,但它会用?format=json污染url。这是关于AjaxContext的Zend文档。

如果你不想传递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。然后在里面放

Zend_Json::encode($this->model)

使用Firebug查看从服务返回的内容

最新更新