2
0
Просмотр исходного кода

ZF-7266, ZF-7360: Correct issue with populating FilteringSelect

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@19057 44c647ce-9c0f-0410-b52a-842ac1e357ba
matthew 16 лет назад
Родитель
Сommit
8465ef5f12

+ 4 - 11
library/Zend/Dojo/View/Helper/ComboBox.php

@@ -72,9 +72,6 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit
             // using dojo.data datastore
             if (false !== ($store = $this->_renderStore($params['store'], $id))) {
                 $params['store'] = $params['store']['store'];
-                if ($this->_useProgrammatic()) {
-                    unset($params['store']);
-                }
                 if (is_string($store)) {
                     $html .= $store;
                 }
@@ -99,9 +96,6 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit
                     }
                 }
             }
-            if ($this->_useProgrammatic()) {
-                unset($params['store']);
-            }
             $html .= $this->_createFormElement($id, $value, $params, $attribs);
             return $html;
         }
@@ -141,14 +135,13 @@ class Zend_Dojo_View_Helper_ComboBox extends Zend_Dojo_View_Helper_Dijit
         if ($this->_useProgrammatic()) {
             if (!$this->_useProgrammaticNoScript()) {
                 require_once 'Zend/Json.php';
-                $js = 'var ' . $storeParams['jsId'] . ' = '
+                $this->dojo->addJavascript('var ' . $storeParams['jsId'] . ";\n");
+                $js = $storeParams['jsId'] . ' = '
                     . 'new ' . $storeParams['dojoType'] . '('
                     .     Zend_Json::encode($extraParams)
-                    . ");\n"
-                    . 'dijit.byId("' . $this->_normalizeId($id) . '").attr("store", '
-                    . $storeParams['jsId'] . ');';
+                    . ");\n";
                 $js = "function() {\n$js\n}";
-                $this->dojo->prependOnLoad($js);
+                $this->dojo->_addZendLoad($js);
             }
             return true;
         }

+ 43 - 1
library/Zend/Dojo/View/Helper/Dojo/Container.php

@@ -160,6 +160,12 @@ class Zend_Dojo_View_Helper_Dojo_Container
     protected $_stylesheets = array();
 
     /**
+     * Array of onLoad events specific to Zend_Dojo integration operations
+     * @var array
+     */
+    protected $_zendLoadActions = array();
+
+    /**
      * Set view object
      *
      * @param  Zend_Dojo_View_Interface $view
@@ -856,7 +862,7 @@ function() {
 }
 EOJ;
             $this->requireModule('dojo.parser');
-            $this->prependOnLoad($js);
+            $this->_addZendLoad($js);
             $this->addJavascript('var zendDijits = ' . $this->dijitsToJson() . ';');
             $this->_dijitLoaderRegistered = true;
         }
@@ -1117,6 +1123,13 @@ EOJ;
         }
 
         $onLoadActions = array();
+        // Get Zend specific onLoad actions; these will always be first to 
+        // ensure that dijits are created in the correct order
+        foreach ($this->_getZendLoadActions() as $callback) {
+            $onLoadActions[] = 'dojo.addOnLoad(' . $callback . ');';
+        }
+
+        // Get all other onLoad actions
         foreach ($this->getOnLoadActions() as $callback) {
             $onLoadActions[] = 'dojo.addOnLoad(' . $callback . ');';
         }
@@ -1147,4 +1160,33 @@ EOJ;
               . PHP_EOL . '</script>';
         return $html;
     }
+
+    /**
+     * Add an onLoad action related to ZF dijit creation
+     *
+     * This method is public, but prefixed with an underscore to indicate that 
+     * it should not normally be called by userland code. It is pertinent to
+     * ensuring that the correct order of operations occurs during dijit 
+     * creation.
+     * 
+     * @param  string $callback 
+     * @return Zend_Dojo_View_Helper_Dojo_Container
+     */
+    public function _addZendLoad($callback)
+    {
+        if (!in_array($callback, $this->_zendLoadActions, true)) {
+            $this->_zendLoadActions[] = $callback;
+        }
+        return $this;
+    }
+
+    /**
+     * Retrieve all ZF dijit callbacks
+     * 
+     * @return array
+     */
+    public function _getZendLoadActions()
+    {
+        return $this->_zendLoadActions;
+    }
 }

+ 2 - 1
tests/Zend/Dojo/Form/Element/ComboBoxTest.php

@@ -172,6 +172,7 @@ class Zend_Dojo_Form_Element_ComboBoxTest extends PHPUnit_Framework_TestCase
 
     /**
      * @group ZF-7134
+     * @group ZF-7266
      */
     public function testComboBoxInSubFormShouldCreateJsonStoreBasedOnQualifiedId()
     {
@@ -187,7 +188,7 @@ class Zend_Dojo_Form_Element_ComboBoxTest extends PHPUnit_Framework_TestCase
         $subform->addElement($this->element);
         $html = $this->element->render();
         $dojo = $this->view->dojo()->__toString();
-        $this->assertContains('dijit.byId("bar-foo")', $dojo, $dojo);
+        $this->assertContains('"store":"foo"', $dojo, $dojo);
     }
 }
 

+ 12 - 5
tests/Zend/Dojo/View/Helper/ComboBoxTest.php

@@ -166,9 +166,11 @@ class Zend_Dojo_View_Helper_ComboBoxTest extends PHPUnit_Framework_TestCase
         $this->assertNotNull($this->view->dojo()->getDijit('elementId'));
 
         $found = false;
-        $scripts = $this->view->dojo()->getOnLoadActions();
+        $this->assertContains('var stateStore;', $this->view->dojo()->getJavascript());
+
+        $scripts = $this->view->dojo()->_getZendLoadActions();
         foreach ($scripts as $js) {
-            if (strstr($js, 'var stateStore = new ')) {
+            if (strstr($js, 'stateStore = new ')) {
                 $found = true;
                 break;
             }
@@ -200,15 +202,20 @@ class Zend_Dojo_View_Helper_ComboBoxTest extends PHPUnit_Framework_TestCase
 
     /**
      * @group ZF-5987
+     * @group ZF-7266
      */
     public function testStoreCreationWhenUsingProgrammaticCreationShouldRegisterAsDojoJavascript()
     {
         Zend_Dojo_View_Helper_Dojo::setUseProgrammatic(true);
         $html = $this->getElementAsRemoter();
-        $js   = $this->view->dojo()->getOnLoadActions();
+
+        $js   = $this->view->dojo()->getJavascript();
+        $this->assertContains('var stateStore;', $js);
+
+        $onLoad = $this->view->dojo()->_getZendLoadActions();
         $storeDeclarationFound = false;
-        foreach ($js as $statement) {
-            if (strstr($statement, 'var stateStore = new ')) {
+        foreach ($onLoad as $statement) {
+            if (strstr($statement, 'stateStore = new ')) {
                 $storeDeclarationFound = true;
                 break;
             }

+ 1 - 1
tests/Zend/Dojo/View/Helper/DojoTest.php

@@ -642,7 +642,7 @@ function() {
         $this->assertContains($json, $html, $html);
 
         $found = false;
-        foreach ($this->helper->getOnLoadActions() as $action) {
+        foreach ($this->helper->_getZendLoadActions() as $action) {
             if (strstr($action, 'dojo.mixin')) {
                 $found = true;
                 break;

+ 4 - 2
tests/Zend/Dojo/View/Helper/FilteringSelectTest.php

@@ -165,10 +165,12 @@ class Zend_Dojo_View_Helper_FilteringSelectTest extends PHPUnit_Framework_TestCa
         $this->assertRegexp('/<input[^>]*(type="text")/', $html);
         $this->assertNotNull($this->view->dojo()->getDijit('elementId'));
 
+        $this->assertContains('var stateStore;', $this->view->dojo()->getJavascript());
+
         $found = false;
-        $scripts = $this->view->dojo()->getOnLoadActions();
+        $scripts = $this->view->dojo()->_getZendLoadActions();
         foreach ($scripts as $js) {
-            if (strstr($js, 'var stateStore')) {
+            if (strstr($js, 'stateStore = new ')) {
                 $found = true;
                 break;
             }