Zend Dojo FilteringВыбрать из объединенных таблиц Как это можно сделать с помощью Doctrine - PullRequest
0 голосов
/ 23 апреля 2011

У меня есть несколько элементов FilteringSelect в моем приложении Zend Framework, которые работают нормально, но они основаны на простых запросах.

Теперь мне нужно создать FilteringSelect, который позволит мне выбрать идентификатор одногово время отображения текста поля в связанной таблице, то есть у меня есть две таблицы, связанные с groomservices и groomsercedures (т.е. groomprocedures.groomProceduresID имеет много groomservices.procedure).Форма, которую я пытаюсь создать, предназначена для таблицы встреч, которая имеет много значений groomservices.groomServicesID.Я хочу, чтобы пользователь мог видеть имя процедуры при сохранении значения groomservices.groomServicesID с помощью FilteringSelect.

Пока я не смог этого сделать, поскольку мой 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');

Заранее большое спасибо,

Грэхем

PS Не забудьте упомянуть, что я пробовал следующий запрос в 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();
            }

  }

Я уверен, что вина лежит на мне.

1 Ответ

1 голос
/ 24 апреля 2011

Похоже, что есть проблема с данными, которые вы помещаете в 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 проще, но он загрязняет URL с помощью? Format = json.Вот документация Zend для 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.См. Этот документ для формата.

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

Поместите данные вашей строки в массив модели-> items []:

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

Создайте представление, просмотр / сценарии / встречу/gservice.json.phtml и поместите в него

Zend_Json::encode($this->model)

Используйте Firebug, чтобы увидеть, что возвращается от вашего сервиса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...