Browse Source

ZF-11805: Improve error messages in Zend_Navigation

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@24854 44c647ce-9c0f-0410-b52a-842ac1e357ba
adamlundrigan 13 years ago
parent
commit
d5c575565b

+ 375 - 3
documentation/manual/en/module_specs/Zend_Navigation-Containers.xml

@@ -210,8 +210,258 @@ $container = new Zend_Navigation(array(
         <example id="zend.navigation.containers.creating.example.config">
             <title>Creating a container using a config object</title>
 
+            <para>
+                Example for INI:
+            </para>
+
+            <programlisting language="ini"><![CDATA[
+[nav]
+zend.label = "Zend"
+zend.uri = "http://www.zend-project.com/"
+zend.order = "100"
+
+page1.label = "Page 1"
+page1.uri = "page1"
+page1.pages.page1_1.label = "Page 1.1"
+page1.pages.page1_1.uri = "page1/page1_1"
+
+page2.label = "Page 2"
+page2.uri = "page2"
+page2.pages.page2_1.label = "Page 2.1"
+page2.pages.page2_1.uri = "page2/page2_1"
+page2.pages.page2_2.label = "Page 2.2"
+page2.pages.page2_2.uri = "page2/page2_2"
+page2.pages.page2_2.pages.page2_2_1.label = "Page 2.2.1"
+page2.pages.page2_2.pages.page2_2_1.uri = "page2/page2_2/page2_2_1"
+page2.pages.page2_2.pages.page2_2_2.label = "Page 2.2.2"
+page2.pages.page2_2.pages.page2_2_2.uri = "page2/page2_2/page2_2_2"
+page2.pages.page2_2.pages.page2_2_2.active = "1"
+page2.pages.page2_3.label = "Page 2.3"
+page2.pages.page2_3.uri = "page2/page2_3"
+page2.pages.page2_3.pages.page2_3_1.label = "Page 2.3.1"
+page2.pages.page2_3.pages.page2_3_1.uri = "page2/page2_3/page2_3_1"
+page2.pages.page2_3.pages.page2_3_2.label = "Page 2.3.2"
+page2.pages.page2_3.pages.page2_3_2.uri = "page2/page2_3/page2_3_2"
+page2.pages.page2_3.pages.page2_3_2.visible = "0"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.label = "Page 2.3.2.1"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.uri = "page2/page2_3/page2_3_2/1"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.active = "1"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.label = "Page 2.3.2.2"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.uri = "page2/page2_3/page2_3_2/2"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.active = "1"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.label = "Ignore"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.uri = "#"
+page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.active = "1"
+page2.pages.page2_3.pages.page2_3_3.label = "Page 2.3.3"
+page2.pages.page2_3.pages.page2_3_3.uri = "page2/page2_3/page2_3_3"
+page2.pages.page2_3.pages.page2_3_3.resource = "admin"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.label = "Page 2.3.3.1"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.uri = "page2/page2_3/page2_3_3/1"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.active = "1"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.label = "Page 2.3.3.2"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.uri = "page2/page2_3/page2_3_3/2"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.resource = "guest"
+page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.active = "1"
+
+page3.label = "Page 3"
+page3.uri = "page3"
+page3.pages.page3_1.label = "Page 3.1"
+page3.pages.page3_1.uri = "page3/page3_1"
+page3.pages.page3_1.resource = "guest"
+page3.pages.page3_2.label = "Page 3.2"
+page3.pages.page3_2.uri = "page3/page3_2"
+page3.pages.page3_2.resource = "member"
+page3.pages.page3_2.pages.page3_2_1.label = "Page 3.2.1"
+page3.pages.page3_2.pages.page3_2_1.uri = "page3/page3_2/page3_2_1"
+page3.pages.page3_2.pages.page3_2_2.label = "Page 3.2.2"
+page3.pages.page3_2.pages.page3_2_2.uri = "page3/page3_2/page3_2_2"
+page3.pages.page3_2.pages.page3_2_2.resource = "admin"
+page3.pages.page3_3.label = "Page 3.3"
+page3.pages.page3_3.uri = "page3/page3_3"
+page3.pages.page3_3.resource = "special"
+page3.pages.page3_3.pages.page3_3_1.label = "Page 3.3.1"
+page3.pages.page3_3.pages.page3_3_1.uri = "page3/page3_3/page3_3_1"
+page3.pages.page3_3.pages.page3_3_1.visible = "0"
+page3.pages.page3_3.pages.page3_3_2.label = "Page 3.3.2"
+page3.pages.page3_3.pages.page3_3_2.uri = "page3/page3_3/page3_3_2"
+page3.pages.page3_3.pages.page3_3_2.resource = "admin"
+
+home.label = "Home"
+home.order = "-100"
+home.module = "default"
+home.controller = "index"
+home.action = "index"
+]]></programlisting>
+
             <programlisting language="php"><![CDATA[
-/* CONTENTS OF /path/to/navigation.xml:
+$config    = new Zend_Config_Ini('/path/to/navigation.ini', 'nav');
+$container = new Zend_Navigation($config);
+]]></programlisting>
+
+            <para>
+                Example for JSON:
+            </para>
+
+            <programlisting language="json"><![CDATA[
+{
+  "nav": {
+    "zend": {
+      "label": "Zend",
+      "uri": "http:\/\/www.zend-project.com\/",
+      "order": "100"
+    },
+    "page1": {
+      "label": "Page 1",
+      "uri": "page1",
+      "pages": {
+        "page1_1": {
+          "label": "Page 1.1",
+          "uri": "page1\/page1_1"
+        }
+      }
+    },
+    "page2": {
+      "label": "Page 2",
+      "uri": "page2",
+      "pages": {
+        "page2_1": {
+          "label": "Page 2.1",
+          "uri": "page2\/page2_1"
+        },
+        "page2_2": {
+          "label": "Page 2.2",
+          "uri": "page2\/page2_2",
+          "pages": {
+            "page2_2_1": {
+              "label": "Page 2.2.1",
+              "uri": "page2\/page2_2\/page2_2_1"
+            },
+            "page2_2_2": {
+              "label": "Page 2.2.2",
+              "uri": "page2\/page2_2\/page2_2_2",
+              "active": "1"
+            }
+          }
+        },
+        "page2_3": {
+          "label": "Page 2.3",
+          "uri": "page2\/page2_3",
+          "pages": {
+            "page2_3_1": {
+              "label": "Page 2.3.1",
+              "uri": "page2\/page2_3\/page2_3_1"
+            },
+            "page2_3_2": {
+              "label": "Page 2.3.2",
+              "uri": "page2\/page2_3\/page2_3_2",
+              "visible": "0",
+              "pages": {
+                "page2_3_2_1": {
+                  "label": "Page 2.3.2.1",
+                  "uri": "page2\/page2_3\/page2_3_2\/1",
+                  "active": "1"
+                },
+                "page2_3_2_2": {
+                  "label": "Page 2.3.2.2",
+                  "uri": "page2\/page2_3\/page2_3_2\/2",
+                  "active": "1",
+                  "pages": {
+                    "page_2_3_2_2_1": {
+                      "label": "Ignore",
+                      "uri": "#",
+                      "active": "1"
+                    }
+                  }
+                }
+              }
+            },
+            "page2_3_3": {
+              "label": "Page 2.3.3",
+              "uri": "page2\/page2_3\/page2_3_3",
+              "resource": "admin",
+              "pages": {
+                "page2_3_3_1": {
+                  "label": "Page 2.3.3.1",
+                  "uri": "page2\/page2_3\/page2_3_3\/1",
+                  "active": "1"
+                },
+                "page2_3_3_2": {
+                  "label": "Page 2.3.3.2",
+                  "uri": "page2\/page2_3\/page2_3_3\/2",
+                  "resource": "guest",
+                  "active": "1"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "page3": {
+      "label": "Page 3",
+      "uri": "page3",
+      "pages": {
+        "page3_1": {
+          "label": "Page 3.1",
+          "uri": "page3\/page3_1",
+          "resource": "guest"
+        },
+        "page3_2": {
+          "label": "Page 3.2",
+          "uri": "page3\/page3_2",
+          "resource": "member",
+          "pages": {
+            "page3_2_1": {
+              "label": "Page 3.2.1",
+              "uri": "page3\/page3_2\/page3_2_1"
+            },
+            "page3_2_2": {
+              "label": "Page 3.2.2",
+              "uri": "page3\/page3_2\/page3_2_2",
+              "resource": "admin"
+            }
+          }
+        },
+        "page3_3": {
+          "label": "Page 3.3",
+          "uri": "page3\/page3_3",
+          "resource": "special",
+          "pages": {
+            "page3_3_1": {
+              "label": "Page 3.3.1",
+              "uri": "page3\/page3_3\/page3_3_1",
+              "visible": "0"
+            },
+            "page3_3_2": {
+              "label": "Page 3.3.2",
+              "uri": "page3\/page3_3\/page3_3_2",
+              "resource": "admin"
+            }
+          }
+        }
+      }
+    },
+    "home": {
+      "label": "Home",
+      "order": "-100",
+      "module": "default",
+      "controller": "index",
+      "action": "index"
+    }
+  }
+}
+]]></programlisting>
+
+            <programlisting language="php"><![CDATA[
+$config    = new Zend_Config_Json('/path/to/navigation.json', 'nav');
+$container = new Zend_Navigation($config);
+]]></programlisting>
+
+            <para>
+                Example for XML:
+            </para>
+
+            <programlisting language="xml"><![CDATA[
 <?xml version="1.0" encoding="UTF-8"?>
 <config>
     <nav>
@@ -396,11 +646,133 @@ $container = new Zend_Navigation(array(
 
     </nav>
 </config>
- */
+]]></programlisting>
 
-$config = new Zend_Config_Xml('/path/to/navigation.xml', 'nav');
+            <programlisting language="php"><![CDATA[
+$config    = new Zend_Config_Xml('/path/to/navigation.xml', 'nav');
 $container = new Zend_Navigation($config);
 ]]></programlisting>
+
+            <para>
+                Example for YAML:
+            </para>
+
+            <programlisting language="yaml"><![CDATA[
+nav: 
+  zend: 
+    label: Zend
+    uri: http://www.zend-project.com/
+    order: 100
+  page1: 
+    label: Page 1
+    uri: page1
+    pages: 
+      page1_1: 
+        label: Page 1.1
+        uri: page1/page1_1
+  page2: 
+    label: Page 2
+    uri: page2
+    pages: 
+      page2_1: 
+        label: Page 2.1
+        uri: page2/page2_1
+      page2_2: 
+        label: Page 2.2
+        uri: page2/page2_2
+        pages: 
+          page2_2_1: 
+            label: Page 2.2.1
+            uri: page2/page2_2/page2_2_1
+          page2_2_2: 
+            label: Page 2.2.2
+            uri: page2/page2_2/page2_2_2
+            active: 1
+      page2_3: 
+        label: Page 2.3
+        uri: page2/page2_3
+        pages: 
+          page2_3_1: 
+            label: Page 2.3.1
+            uri: page2/page2_3/page2_3_1
+          page2_3_2: 
+            label: Page 2.3.2
+            uri: page2/page2_3/page2_3_2
+            visible: 0
+            pages: 
+              page2_3_2_1: 
+                label: Page 2.3.2.1
+                uri: page2/page2_3/page2_3_2/1
+                active: 1
+              page2_3_2_2: 
+                label: Page 2.3.2.2
+                uri: page2/page2_3/page2_3_2/2
+                active: 1
+                pages: 
+                  page_2_3_2_2_1: 
+                    label: Ignore
+                    uri: #
+                    active: 1
+          page2_3_3: 
+            label: Page 2.3.3
+            uri: page2/page2_3/page2_3_3
+            resource: admin
+            pages: 
+              page2_3_3_1: 
+                label: Page 2.3.3.1
+                uri: page2/page2_3/page2_3_3/1
+                active: 1
+              page2_3_3_2: 
+                label: Page 2.3.3.2
+                uri: page2/page2_3/page2_3_3/2
+                resource: guest
+                active: 1
+  page3: 
+    label: Page 3
+    uri: page3
+    pages: 
+      page3_1: 
+        label: Page 3.1
+        uri: page3/page3_1
+        resource: guest
+      page3_2: 
+        label: Page 3.2
+        uri: page3/page3_2
+        resource: member
+        pages: 
+          page3_2_1: 
+            label: Page 3.2.1
+            uri: page3/page3_2/page3_2_1
+          page3_2_2: 
+            label: Page 3.2.2
+            uri: page3/page3_2/page3_2_2
+            resource: admin
+      page3_3: 
+        label: Page 3.3
+        uri: page3/page3_3
+        resource: special
+        pages: 
+          page3_3_1: 
+            label: Page 3.3.1
+            uri: page3/page3_3/page3_3_1
+            visible: 0
+          page3_3_2: 
+            label: Page 3.3.2
+            uri: page3/page3_3/page3_3_2
+            resource: admin
+  home: 
+    label: Home
+    order: -100
+    module: default
+    controller: index
+    action: index
+]]></programlisting>
+
+            <programlisting language="php"><![CDATA[
+$config    = new Zend_Config_Yaml'/path/to/navigation.yaml', 'nav');
+$container = new Zend_Navigation($config);
+]]></programlisting>
+
         </example>
     </sect2>
 

+ 7 - 2
library/Zend/Navigation/Page.php

@@ -258,9 +258,14 @@ abstract class Zend_Navigation_Page extends Zend_Navigation_Container
             return new Zend_Navigation_Page_Uri($options);
         } else {
             require_once 'Zend/Navigation/Exception.php';
-            throw new Zend_Navigation_Exception(
-                'Invalid argument: Unable to determine class to instantiate');
+            
+            $message = 'Invalid argument: Unable to determine class to instantiate';
+            if (isset($options['label'])) {
+                $message .= ' (Page label: ' . $options['label'] . ')';
         }
+            
+            throw new Zend_Navigation_Exception($message);
+    }
     }
 
     /**

+ 33 - 0
tests/Zend/Navigation/PageTest.php

@@ -1232,4 +1232,37 @@ class Zend_Navigation_PageTest extends PHPUnit_Framework_TestCase
         $subPageTwoDiff = array_diff_assoc($toArray['pages'][1], $options);
         $this->assertEquals(array(), $subPageTwoDiff);
     }
+    
+    /**
+     * @group ZF-11805
+     */
+    public function testFactoryExceptionWhenNoPageTypeDetected()
+    {
+        // Without label
+        try {
+            $page = Zend_Navigation_Page::factory(array());
+            $this->fail('An invalid value was set, but a ' .
+                        'Zend_Navigation_Exception was not thrown');
+        } catch (Zend_Navigation_Exception $e) {
+            $this->assertSame(
+                'Invalid argument: Unable to determine class to instantiate', 
+                $e->getMessage()
+            );
+}
+        
+        // With label
+        try {
+            $page = Zend_Navigation_Page::factory(array(
+                'label' => 'Foo',
+            ));
+            $this->fail('An invalid value was set, but a ' .
+                        'Zend_Navigation_Exception was not thrown');
+        } catch (Zend_Navigation_Exception $e) {
+            $this->assertSame(
+                'Invalid argument: Unable to determine class to instantiate'
+                . ' (Page label: Foo)', 
+                $e->getMessage()
+            );
+        }
+    }
 }