我的Zend Framework应用程序中有许多FilteringSelect元素,它们运行正常,但它们基于简单的查询。
我现在需要创建一个FilteringSelect,它允许我在相关表格中显示字段文本时选择一个表的id,即我有两个相关的表gingerservices和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();
}
我的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
但我不确定我是否在Doctrine中正确格式化了查询。
关于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();
}
}
我确定错误在于我。
答案 0 :(得分:1)
看起来您在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。这是Zend documentation on AjaxContext。
如果您不想传递格式参数,可以使用以下插件。
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期望的视图变量,而不是回显数据。有关格式,请参阅此document。
$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();
}
创建一个视图,查看/ scripts / appointment / gservice.json.phtml并在其中放置
Zend_Json::encode($this->model)
使用Firebug查看从您的服务返回的内容。