【问题标题】:Zend Dojo FilteringSelect from joined tables How can this be done with DoctrineZend Dojo FilteringSelect from join tables 如何用 Doctrine 完成
【发布时间】:2011-04-23 18:14:06
【问题描述】:

我的 Zend Framework 应用程序中有许多 FilteringSelect 元素运行良好,但它们基于简单查询。

我现在需要创建一个 FilteringSelect,它允许我在显示相关表中的字段文本时选择一个表的 id,即我有两个相关的表groomservices 和groomprocedures(即groomprocedures.groomProceduresID 有很多新郎服务.程序)。 我要创建的表单是用于具有许多新郎服务.groomServicesID 值的约会表。我希望用户能够在使用 FilteringSelect 保存新郎services.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');

非常感谢,

格雷厄姆

附:或者不得不提一下,我在 mysql 中尝试了以下查询,并给了我正在寻找的内容,我相信 Doctine 查询的计算结果相同。

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

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

编辑与火烈鸟的 cmets 相关的内容

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

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();
            }

  }

我确定是我的错。

【问题讨论】:

    标签: zend-framework dojo doctrine


    【解决方案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=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();
    }
    

    创建一个视图,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 AS id,p.groomProcedure AS 名称以使其与示例一起使用。
    • @flammon 我想我做了你所描述的,但我仍然收到错误 Unable to load /groomappointments/appointment/gservice status:500 1234 out of range 505 and 646 out of range 103 in firebug
    • 我怀疑上下文没有切换并导致 500。您可以通过创建与 gservice.json.phtml 具有相同内容的 view/scripts/appointment/gservice.phtml 来测试这一点。我已经更新了答案以包含有关 AjaxContext 帮助器的更多信息。您需要传递 ?format=json 或使用提供的插件。
    • @flammon 我在 Apache 中检查了我的错误日志,它报告了 PHP Notice: Undefined property: Groomappointments_AppointmentController::$dbTable in C:\\..\\..\\application\\modules\ \groomappointments\\controllers\\AppointmentController.php 在第 43 行,引用:petmanager/groomappointments/appointment/create PHP 致命错误:调用 C:\\WebDocs\\petmanager\\application\\ 中非对象上的成员函数 fetchAll() modules\\groomappointments\\controllers\\AppointmentController.php 在第 43 行,引用者:petmanager/groomappointments/appointment/create
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多