Zend_Navigation-Containers.xml 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.navigation.containers">
  4. <title>Containers</title>
  5. <para>
  6. Containers have methods for adding, retrieving, deleting and
  7. iterating pages. Containers implement the
  8. <ulink url="http://php.net/spl">SPL</ulink> interfaces
  9. <classname>RecursiveIterator</classname> and
  10. <classname>Countable</classname>, meaning that a container can
  11. be iterated using the SPL
  12. <classname>RecursiveIteratorIterator</classname> class.
  13. </para>
  14. <sect2 id="zend.navigation.containers.creating">
  15. <title>Creating containers</title>
  16. <para>
  17. <classname>Zend_Navigation_Container</classname> is
  18. abstract, and can not be instantiated directly. Use
  19. <classname>Zend_Navigation</classname> if you want to
  20. instantiate a container.
  21. </para>
  22. <para>
  23. <classname>Zend_Navigation</classname> can be constructed
  24. entirely empty, or take an array or a
  25. <classname>Zend_Config</classname> object with pages to put in the
  26. container. Each page in the given array/config will eventually be
  27. passed to the <methodname>addPage()</methodname> method of the container class,
  28. which means that each element in the array/config can be an array or
  29. a config object, or a <classname>Zend_Navigation_Page</classname>
  30. instance.
  31. </para>
  32. <example id="zend.navigation.containers.creating.example.array">
  33. <title>Creating a container using an array</title>
  34. <programlisting language="php"><![CDATA[
  35. /*
  36. * Create a container from an array
  37. *
  38. * Each element in the array will be passed to
  39. * Zend_Navigation_Page::factory() when constructing.
  40. */
  41. $container = new Zend_Navigation(array(
  42. array(
  43. 'label' => 'Page 1',
  44. 'id' => 'home-link',
  45. 'uri' => '/'
  46. ),
  47. array(
  48. 'label' => 'Zend',
  49. 'uri' => 'http://www.zend-project.com/',
  50. 'order' => 100
  51. ),
  52. array(
  53. 'label' => 'Page 2',
  54. 'controller' => 'page2',
  55. 'pages' => array(
  56. array(
  57. 'label' => 'Page 2.1',
  58. 'action' => 'page2_1',
  59. 'controller' => 'page2',
  60. 'class' => 'special-one',
  61. 'title' => 'This element has a special class',
  62. 'active' => true
  63. ),
  64. array(
  65. 'label' => 'Page 2.2',
  66. 'action' => 'page2_2',
  67. 'controller' => 'page2',
  68. 'class' => 'special-two',
  69. 'title' => 'This element has a special class too'
  70. )
  71. )
  72. ),
  73. array(
  74. 'label' => 'Page 2 with params',
  75. 'action' => 'index',
  76. 'controller' => 'page2',
  77. // specify a param or two
  78. 'params' => array(
  79. 'format' => 'json',
  80. 'foo' => 'bar'
  81. )
  82. ),
  83. array(
  84. 'label' => 'Page 2 with params and a route',
  85. 'action' => 'index',
  86. 'controller' => 'page2',
  87. // specify a route name and a param for the route
  88. 'route' => 'nav-route-example',
  89. 'params' => array(
  90. 'format' => 'json'
  91. )
  92. ),
  93. array(
  94. 'label' => 'Page 3',
  95. 'action' => 'index',
  96. 'controller' => 'index',
  97. 'module' => 'mymodule',
  98. 'reset_params' => false
  99. ),
  100. array(
  101. 'label' => 'Page 4',
  102. 'uri' => '#',
  103. 'pages' => array(
  104. array(
  105. 'label' => 'Page 4.1',
  106. 'uri' => '/page4',
  107. 'title' => 'Page 4 using uri',
  108. 'pages' => array(
  109. array(
  110. 'label' => 'Page 4.1.1',
  111. 'title' => 'Page 4 using mvc params',
  112. 'action' => 'index',
  113. 'controller' => 'page4',
  114. // let's say this page is active
  115. 'active' => '1'
  116. )
  117. )
  118. )
  119. )
  120. ),
  121. array(
  122. 'label' => 'Page 0?',
  123. 'uri' => '/setting/the/order/option',
  124. // setting order to -1 should make it appear first
  125. 'order' => -1
  126. ),
  127. array(
  128. 'label' => 'Page 5',
  129. 'uri' => '/',
  130. // this page should not be visible
  131. 'visible' => false,
  132. 'pages' => array(
  133. array(
  134. 'label' => 'Page 5.1',
  135. 'uri' => '#',
  136. 'pages' => array(
  137. array(
  138. 'label' => 'Page 5.1.1',
  139. 'uri' => '#',
  140. 'pages' => array(
  141. array(
  142. 'label' => 'Page 5.1.2',
  143. 'uri' => '#',
  144. // let's say this page is active
  145. 'active' => true
  146. )
  147. )
  148. )
  149. )
  150. )
  151. )
  152. ),
  153. array(
  154. 'label' => 'ACL page 1 (guest)',
  155. 'uri' => '#acl-guest',
  156. 'resource' => 'nav-guest',
  157. 'pages' => array(
  158. array(
  159. 'label' => 'ACL page 1.1 (foo)',
  160. 'uri' => '#acl-foo',
  161. 'resource' => 'nav-foo'
  162. ),
  163. array(
  164. 'label' => 'ACL page 1.2 (bar)',
  165. 'uri' => '#acl-bar',
  166. 'resource' => 'nav-bar'
  167. ),
  168. array(
  169. 'label' => 'ACL page 1.3 (baz)',
  170. 'uri' => '#acl-baz',
  171. 'resource' => 'nav-baz'
  172. ),
  173. array(
  174. 'label' => 'ACL page 1.4 (bat)',
  175. 'uri' => '#acl-bat',
  176. 'resource' => 'nav-bat'
  177. )
  178. )
  179. ),
  180. array(
  181. 'label' => 'ACL page 2 (member)',
  182. 'uri' => '#acl-member',
  183. 'resource' => 'nav-member'
  184. ),
  185. array(
  186. 'label' => 'ACL page 3 (admin',
  187. 'uri' => '#acl-admin',
  188. 'resource' => 'nav-admin',
  189. 'pages' => array(
  190. array(
  191. 'label' => 'ACL page 3.1 (nothing)',
  192. 'uri' => '#acl-nada'
  193. )
  194. )
  195. ),
  196. array(
  197. 'label' => 'Zend Framework',
  198. 'route' => 'zf-route'
  199. )
  200. ));
  201. ]]></programlisting>
  202. </example>
  203. <example id="zend.navigation.containers.creating.example.config">
  204. <title>Creating a container using a config object</title>
  205. <para>
  206. Example for INI:
  207. </para>
  208. <programlisting language="ini"><![CDATA[
  209. [nav]
  210. zend.label = "Zend"
  211. zend.uri = "http://www.zend-project.com/"
  212. zend.order = "100"
  213. page1.label = "Page 1"
  214. page1.uri = "page1"
  215. page1.pages.page1_1.label = "Page 1.1"
  216. page1.pages.page1_1.uri = "page1/page1_1"
  217. page2.label = "Page 2"
  218. page2.uri = "page2"
  219. page2.pages.page2_1.label = "Page 2.1"
  220. page2.pages.page2_1.uri = "page2/page2_1"
  221. page2.pages.page2_2.label = "Page 2.2"
  222. page2.pages.page2_2.uri = "page2/page2_2"
  223. page2.pages.page2_2.pages.page2_2_1.label = "Page 2.2.1"
  224. page2.pages.page2_2.pages.page2_2_1.uri = "page2/page2_2/page2_2_1"
  225. page2.pages.page2_2.pages.page2_2_2.label = "Page 2.2.2"
  226. page2.pages.page2_2.pages.page2_2_2.uri = "page2/page2_2/page2_2_2"
  227. page2.pages.page2_2.pages.page2_2_2.active = "1"
  228. page2.pages.page2_3.label = "Page 2.3"
  229. page2.pages.page2_3.uri = "page2/page2_3"
  230. page2.pages.page2_3.pages.page2_3_1.label = "Page 2.3.1"
  231. page2.pages.page2_3.pages.page2_3_1.uri = "page2/page2_3/page2_3_1"
  232. page2.pages.page2_3.pages.page2_3_2.label = "Page 2.3.2"
  233. page2.pages.page2_3.pages.page2_3_2.uri = "page2/page2_3/page2_3_2"
  234. page2.pages.page2_3.pages.page2_3_2.visible = "0"
  235. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.label = "Page 2.3.2.1"
  236. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.uri = "page2/page2_3/page2_3_2/1"
  237. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_1.active = "1"
  238. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.label = "Page 2.3.2.2"
  239. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.uri = "page2/page2_3/page2_3_2/2"
  240. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.active = "1"
  241. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.label = "Ignore"
  242. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.uri = "#"
  243. page2.pages.page2_3.pages.page2_3_2.pages.page2_3_2_2.pages.page_2_3_2_2_1.active = "1"
  244. page2.pages.page2_3.pages.page2_3_3.label = "Page 2.3.3"
  245. page2.pages.page2_3.pages.page2_3_3.uri = "page2/page2_3/page2_3_3"
  246. page2.pages.page2_3.pages.page2_3_3.resource = "admin"
  247. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.label = "Page 2.3.3.1"
  248. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.uri = "page2/page2_3/page2_3_3/1"
  249. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_1.active = "1"
  250. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.label = "Page 2.3.3.2"
  251. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.uri = "page2/page2_3/page2_3_3/2"
  252. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.resource = "guest"
  253. page2.pages.page2_3.pages.page2_3_3.pages.page2_3_3_2.active = "1"
  254. page3.label = "Page 3"
  255. page3.uri = "page3"
  256. page3.pages.page3_1.label = "Page 3.1"
  257. page3.pages.page3_1.uri = "page3/page3_1"
  258. page3.pages.page3_1.resource = "guest"
  259. page3.pages.page3_2.label = "Page 3.2"
  260. page3.pages.page3_2.uri = "page3/page3_2"
  261. page3.pages.page3_2.resource = "member"
  262. page3.pages.page3_2.pages.page3_2_1.label = "Page 3.2.1"
  263. page3.pages.page3_2.pages.page3_2_1.uri = "page3/page3_2/page3_2_1"
  264. page3.pages.page3_2.pages.page3_2_2.label = "Page 3.2.2"
  265. page3.pages.page3_2.pages.page3_2_2.uri = "page3/page3_2/page3_2_2"
  266. page3.pages.page3_2.pages.page3_2_2.resource = "admin"
  267. page3.pages.page3_3.label = "Page 3.3"
  268. page3.pages.page3_3.uri = "page3/page3_3"
  269. page3.pages.page3_3.resource = "special"
  270. page3.pages.page3_3.pages.page3_3_1.label = "Page 3.3.1"
  271. page3.pages.page3_3.pages.page3_3_1.uri = "page3/page3_3/page3_3_1"
  272. page3.pages.page3_3.pages.page3_3_1.visible = "0"
  273. page3.pages.page3_3.pages.page3_3_2.label = "Page 3.3.2"
  274. page3.pages.page3_3.pages.page3_3_2.uri = "page3/page3_3/page3_3_2"
  275. page3.pages.page3_3.pages.page3_3_2.resource = "admin"
  276. home.label = "Home"
  277. home.order = "-100"
  278. home.module = "default"
  279. home.controller = "index"
  280. home.action = "index"
  281. ]]></programlisting>
  282. <programlisting language="php"><![CDATA[
  283. $config = new Zend_Config_Ini('/path/to/navigation.ini', 'nav');
  284. $container = new Zend_Navigation($config);
  285. ]]></programlisting>
  286. <para>
  287. Example for JSON:
  288. </para>
  289. <programlisting language="json"><![CDATA[
  290. {
  291. "nav": {
  292. "zend": {
  293. "label": "Zend",
  294. "uri": "http:\/\/www.zend-project.com\/",
  295. "order": "100"
  296. },
  297. "page1": {
  298. "label": "Page 1",
  299. "uri": "page1",
  300. "pages": {
  301. "page1_1": {
  302. "label": "Page 1.1",
  303. "uri": "page1\/page1_1"
  304. }
  305. }
  306. },
  307. "page2": {
  308. "label": "Page 2",
  309. "uri": "page2",
  310. "pages": {
  311. "page2_1": {
  312. "label": "Page 2.1",
  313. "uri": "page2\/page2_1"
  314. },
  315. "page2_2": {
  316. "label": "Page 2.2",
  317. "uri": "page2\/page2_2",
  318. "pages": {
  319. "page2_2_1": {
  320. "label": "Page 2.2.1",
  321. "uri": "page2\/page2_2\/page2_2_1"
  322. },
  323. "page2_2_2": {
  324. "label": "Page 2.2.2",
  325. "uri": "page2\/page2_2\/page2_2_2",
  326. "active": "1"
  327. }
  328. }
  329. },
  330. "page2_3": {
  331. "label": "Page 2.3",
  332. "uri": "page2\/page2_3",
  333. "pages": {
  334. "page2_3_1": {
  335. "label": "Page 2.3.1",
  336. "uri": "page2\/page2_3\/page2_3_1"
  337. },
  338. "page2_3_2": {
  339. "label": "Page 2.3.2",
  340. "uri": "page2\/page2_3\/page2_3_2",
  341. "visible": "0",
  342. "pages": {
  343. "page2_3_2_1": {
  344. "label": "Page 2.3.2.1",
  345. "uri": "page2\/page2_3\/page2_3_2\/1",
  346. "active": "1"
  347. },
  348. "page2_3_2_2": {
  349. "label": "Page 2.3.2.2",
  350. "uri": "page2\/page2_3\/page2_3_2\/2",
  351. "active": "1",
  352. "pages": {
  353. "page_2_3_2_2_1": {
  354. "label": "Ignore",
  355. "uri": "#",
  356. "active": "1"
  357. }
  358. }
  359. }
  360. }
  361. },
  362. "page2_3_3": {
  363. "label": "Page 2.3.3",
  364. "uri": "page2\/page2_3\/page2_3_3",
  365. "resource": "admin",
  366. "pages": {
  367. "page2_3_3_1": {
  368. "label": "Page 2.3.3.1",
  369. "uri": "page2\/page2_3\/page2_3_3\/1",
  370. "active": "1"
  371. },
  372. "page2_3_3_2": {
  373. "label": "Page 2.3.3.2",
  374. "uri": "page2\/page2_3\/page2_3_3\/2",
  375. "resource": "guest",
  376. "active": "1"
  377. }
  378. }
  379. }
  380. }
  381. }
  382. }
  383. },
  384. "page3": {
  385. "label": "Page 3",
  386. "uri": "page3",
  387. "pages": {
  388. "page3_1": {
  389. "label": "Page 3.1",
  390. "uri": "page3\/page3_1",
  391. "resource": "guest"
  392. },
  393. "page3_2": {
  394. "label": "Page 3.2",
  395. "uri": "page3\/page3_2",
  396. "resource": "member",
  397. "pages": {
  398. "page3_2_1": {
  399. "label": "Page 3.2.1",
  400. "uri": "page3\/page3_2\/page3_2_1"
  401. },
  402. "page3_2_2": {
  403. "label": "Page 3.2.2",
  404. "uri": "page3\/page3_2\/page3_2_2",
  405. "resource": "admin"
  406. }
  407. }
  408. },
  409. "page3_3": {
  410. "label": "Page 3.3",
  411. "uri": "page3\/page3_3",
  412. "resource": "special",
  413. "pages": {
  414. "page3_3_1": {
  415. "label": "Page 3.3.1",
  416. "uri": "page3\/page3_3\/page3_3_1",
  417. "visible": "0"
  418. },
  419. "page3_3_2": {
  420. "label": "Page 3.3.2",
  421. "uri": "page3\/page3_3\/page3_3_2",
  422. "resource": "admin"
  423. }
  424. }
  425. }
  426. }
  427. },
  428. "home": {
  429. "label": "Home",
  430. "order": "-100",
  431. "module": "default",
  432. "controller": "index",
  433. "action": "index"
  434. }
  435. }
  436. }
  437. ]]></programlisting>
  438. <programlisting language="php"><![CDATA[
  439. $config = new Zend_Config_Json('/path/to/navigation.json', 'nav');
  440. $container = new Zend_Navigation($config);
  441. ]]></programlisting>
  442. <para>
  443. Example for XML:
  444. </para>
  445. <programlisting language="xml"><![CDATA[
  446. <?xml version="1.0" encoding="UTF-8"?>
  447. <config>
  448. <nav>
  449. <zend>
  450. <label>Zend</label>
  451. <uri>http://www.zend-project.com/</uri>
  452. <order>100</order>
  453. </zend>
  454. <page1>
  455. <label>Page 1</label>
  456. <uri>page1</uri>
  457. <pages>
  458. <page1_1>
  459. <label>Page 1.1</label>
  460. <uri>page1/page1_1</uri>
  461. </page1_1>
  462. </pages>
  463. </page1>
  464. <page2>
  465. <label>Page 2</label>
  466. <uri>page2</uri>
  467. <pages>
  468. <page2_1>
  469. <label>Page 2.1</label>
  470. <uri>page2/page2_1</uri>
  471. </page2_1>
  472. <page2_2>
  473. <label>Page 2.2</label>
  474. <uri>page2/page2_2</uri>
  475. <pages>
  476. <page2_2_1>
  477. <label>Page 2.2.1</label>
  478. <uri>page2/page2_2/page2_2_1</uri>
  479. </page2_2_1>
  480. <page2_2_2>
  481. <label>Page 2.2.2</label>
  482. <uri>page2/page2_2/page2_2_2</uri>
  483. <active>1</active>
  484. </page2_2_2>
  485. </pages>
  486. </page2_2>
  487. <page2_3>
  488. <label>Page 2.3</label>
  489. <uri>page2/page2_3</uri>
  490. <pages>
  491. <page2_3_1>
  492. <label>Page 2.3.1</label>
  493. <uri>page2/page2_3/page2_3_1</uri>
  494. </page2_3_1>
  495. <page2_3_2>
  496. <label>Page 2.3.2</label>
  497. <uri>page2/page2_3/page2_3_2</uri>
  498. <visible>0</visible>
  499. <pages>
  500. <page2_3_2_1>
  501. <label>Page 2.3.2.1</label>
  502. <uri>page2/page2_3/page2_3_2/1</uri>
  503. <active>1</active>
  504. </page2_3_2_1>
  505. <page2_3_2_2>
  506. <label>Page 2.3.2.2</label>
  507. <uri>page2/page2_3/page2_3_2/2</uri>
  508. <active>1</active>
  509. <pages>
  510. <page_2_3_2_2_1>
  511. <label>Ignore</label>
  512. <uri>#</uri>
  513. <active>1</active>
  514. </page_2_3_2_2_1>
  515. </pages>
  516. </page2_3_2_2>
  517. </pages>
  518. </page2_3_2>
  519. <page2_3_3>
  520. <label>Page 2.3.3</label>
  521. <uri>page2/page2_3/page2_3_3</uri>
  522. <resource>admin</resource>
  523. <pages>
  524. <page2_3_3_1>
  525. <label>Page 2.3.3.1</label>
  526. <uri>page2/page2_3/page2_3_3/1</uri>
  527. <active>1</active>
  528. </page2_3_3_1>
  529. <page2_3_3_2>
  530. <label>Page 2.3.3.2</label>
  531. <uri>page2/page2_3/page2_3_3/2</uri>
  532. <resource>guest</resource>
  533. <active>1</active>
  534. </page2_3_3_2>
  535. </pages>
  536. </page2_3_3>
  537. </pages>
  538. </page2_3>
  539. </pages>
  540. </page2>
  541. <page3>
  542. <label>Page 3</label>
  543. <uri>page3</uri>
  544. <pages>
  545. <page3_1>
  546. <label>Page 3.1</label>
  547. <uri>page3/page3_1</uri>
  548. <resource>guest</resource>
  549. </page3_1>
  550. <page3_2>
  551. <label>Page 3.2</label>
  552. <uri>page3/page3_2</uri>
  553. <resource>member</resource>
  554. <pages>
  555. <page3_2_1>
  556. <label>Page 3.2.1</label>
  557. <uri>page3/page3_2/page3_2_1</uri>
  558. </page3_2_1>
  559. <page3_2_2>
  560. <label>Page 3.2.2</label>
  561. <uri>page3/page3_2/page3_2_2</uri>
  562. <resource>admin</resource>
  563. </page3_2_2>
  564. </pages>
  565. </page3_2>
  566. <page3_3>
  567. <label>Page 3.3</label>
  568. <uri>page3/page3_3</uri>
  569. <resource>special</resource>
  570. <pages>
  571. <page3_3_1>
  572. <label>Page 3.3.1</label>
  573. <uri>page3/page3_3/page3_3_1</uri>
  574. <visible>0</visible>
  575. </page3_3_1>
  576. <page3_3_2>
  577. <label>Page 3.3.2</label>
  578. <uri>page3/page3_3/page3_3_2</uri>
  579. <resource>admin</resource>
  580. </page3_3_2>
  581. </pages>
  582. </page3_3>
  583. </pages>
  584. </page3>
  585. <home>
  586. <label>Home</label>
  587. <order>-100</order>
  588. <module>default</module>
  589. <controller>index</controller>
  590. <action>index</action>
  591. </home>
  592. </nav>
  593. </config>
  594. ]]></programlisting>
  595. <programlisting language="php"><![CDATA[
  596. $config = new Zend_Config_Xml('/path/to/navigation.xml', 'nav');
  597. $container = new Zend_Navigation($config);
  598. ]]></programlisting>
  599. <para>
  600. Example for YAML:
  601. </para>
  602. <programlisting language="yaml"><![CDATA[
  603. nav:
  604. zend:
  605. label: Zend
  606. uri: http://www.zend-project.com/
  607. order: 100
  608. page1:
  609. label: Page 1
  610. uri: page1
  611. pages:
  612. page1_1:
  613. label: Page 1.1
  614. uri: page1/page1_1
  615. page2:
  616. label: Page 2
  617. uri: page2
  618. pages:
  619. page2_1:
  620. label: Page 2.1
  621. uri: page2/page2_1
  622. page2_2:
  623. label: Page 2.2
  624. uri: page2/page2_2
  625. pages:
  626. page2_2_1:
  627. label: Page 2.2.1
  628. uri: page2/page2_2/page2_2_1
  629. page2_2_2:
  630. label: Page 2.2.2
  631. uri: page2/page2_2/page2_2_2
  632. active: 1
  633. page2_3:
  634. label: Page 2.3
  635. uri: page2/page2_3
  636. pages:
  637. page2_3_1:
  638. label: Page 2.3.1
  639. uri: page2/page2_3/page2_3_1
  640. page2_3_2:
  641. label: Page 2.3.2
  642. uri: page2/page2_3/page2_3_2
  643. visible: 0
  644. pages:
  645. page2_3_2_1:
  646. label: Page 2.3.2.1
  647. uri: page2/page2_3/page2_3_2/1
  648. active: 1
  649. page2_3_2_2:
  650. label: Page 2.3.2.2
  651. uri: page2/page2_3/page2_3_2/2
  652. active: 1
  653. pages:
  654. page_2_3_2_2_1:
  655. label: Ignore
  656. uri: #
  657. active: 1
  658. page2_3_3:
  659. label: Page 2.3.3
  660. uri: page2/page2_3/page2_3_3
  661. resource: admin
  662. pages:
  663. page2_3_3_1:
  664. label: Page 2.3.3.1
  665. uri: page2/page2_3/page2_3_3/1
  666. active: 1
  667. page2_3_3_2:
  668. label: Page 2.3.3.2
  669. uri: page2/page2_3/page2_3_3/2
  670. resource: guest
  671. active: 1
  672. page3:
  673. label: Page 3
  674. uri: page3
  675. pages:
  676. page3_1:
  677. label: Page 3.1
  678. uri: page3/page3_1
  679. resource: guest
  680. page3_2:
  681. label: Page 3.2
  682. uri: page3/page3_2
  683. resource: member
  684. pages:
  685. page3_2_1:
  686. label: Page 3.2.1
  687. uri: page3/page3_2/page3_2_1
  688. page3_2_2:
  689. label: Page 3.2.2
  690. uri: page3/page3_2/page3_2_2
  691. resource: admin
  692. page3_3:
  693. label: Page 3.3
  694. uri: page3/page3_3
  695. resource: special
  696. pages:
  697. page3_3_1:
  698. label: Page 3.3.1
  699. uri: page3/page3_3/page3_3_1
  700. visible: 0
  701. page3_3_2:
  702. label: Page 3.3.2
  703. uri: page3/page3_3/page3_3_2
  704. resource: admin
  705. home:
  706. label: Home
  707. order: -100
  708. module: default
  709. controller: index
  710. action: index
  711. ]]></programlisting>
  712. <programlisting language="php"><![CDATA[
  713. $config = new Zend_Config_Yaml'/path/to/navigation.yaml', 'nav');
  714. $container = new Zend_Navigation($config);
  715. ]]></programlisting>
  716. </example>
  717. </sect2>
  718. <sect2 id="zend.navigation.containers.adding">
  719. <title>Adding pages</title>
  720. <para>
  721. Adding pages to a container can be done with the methods
  722. <methodname>addPage()</methodname>, <methodname>addPages()</methodname>, or
  723. <methodname>setPages()</methodname>. See examples below for explanation.
  724. </para>
  725. <example id="zend.navigation.containers.adding.example">
  726. <title>Adding pages to a container</title>
  727. <programlisting language="php"><![CDATA[
  728. // create container
  729. $container = new Zend_Navigation();
  730. // add page by giving a page instance
  731. $container->addPage(Zend_Navigation_Page::factory(array(
  732. 'uri' => 'http://www.example.com/'
  733. )))
  734. // add page by giving an array
  735. $container->addPage(array(
  736. 'uri' => 'http://www.example.com/'
  737. )))
  738. // add page by giving a config object
  739. $container->addPage(new Zend_Config(array(
  740. 'uri' => 'http://www.example.com/'
  741. )))
  742. $pages = array(
  743. array(
  744. 'label' => 'Save'
  745. 'action' => 'save',
  746. ),
  747. array(
  748. 'label' => 'Delete',
  749. 'action' => 'delete'
  750. )
  751. );
  752. // add two pages
  753. $container->addPages($pages);
  754. // remove existing pages and add the given pages
  755. $container->setPages($pages);
  756. ]]></programlisting>
  757. </example>
  758. </sect2>
  759. <sect2 id="zend.navigation.containers.removing">
  760. <title>Removing pages</title>
  761. <para>
  762. Removing pages can be done with <methodname>removePage()</methodname> or
  763. <methodname>removePages()</methodname>. The first method accepts a an instance
  764. of a page, or an integer. The integer corresponds to the
  765. <property>order</property> a page has. The latter method will remove all
  766. pages in the container.
  767. </para>
  768. <example id="zend.navigation.containers.removing.example">
  769. <title>Removing pages from a container</title>
  770. <programlisting language="php"><![CDATA[
  771. $container = new Zend_Navigation(array(
  772. array(
  773. 'label' => 'Page 1',
  774. 'action' => 'page1'
  775. ),
  776. array(
  777. 'label' => 'Page 2',
  778. 'action' => 'page2',
  779. 'order' => 200
  780. ),
  781. array(
  782. 'label' => 'Page 3',
  783. 'action' => 'page3'
  784. )
  785. ));
  786. // remove page by implicit page order
  787. $container->removePage(0); // removes Page 1
  788. // remove page by instance
  789. $page3 = $container->findOneByAction('page3');
  790. $container->removePage($page3); // removes Page 3
  791. // remove page by explicit page order
  792. $container->removePage(200); // removes Page 2
  793. // remove all pages
  794. $container->removePages(); // removes all pages
  795. ]]></programlisting>
  796. </example>
  797. </sect2>
  798. <sect2 id="zend.navigation.containers.finding">
  799. <title>Finding pages</title>
  800. <para>
  801. Containers have finder methods for retrieving pages.
  802. They are <methodname>findOneBy($property, $value)</methodname>,
  803. <methodname>findAllBy($property, $value)</methodname>, and
  804. <methodname>findBy($property, $value, $all = false)</methodname>.
  805. Those methods will recursively search the container for
  806. pages matching the given <command>$page->$property == $value</command>.
  807. The first method, <methodname>findOneBy()</methodname>, will return a
  808. single page matching the property with the given value, or
  809. <constant>NULL</constant> if it cannot be found. The second method will return
  810. all pages with a property matching the given value. The third
  811. method will call one of the two former methods depending on the
  812. <varname>$all</varname> flag.
  813. </para>
  814. <para>
  815. The finder methods can also be used magically by appending the
  816. property name to <property>findBy</property>, <property>findOneBy</property>, or
  817. <property>findAllBy</property>, e.g. <methodname>findOneByLabel('Home')</methodname> to
  818. return the first matching page with label 'Home'.
  819. Other combinations are <methodname>findByLabel(...)</methodname>,
  820. <methodname>findOnyByTitle(...)</methodname>,
  821. <methodname>findAllByController(...)</methodname>, etc. Finder
  822. methods also work on custom properties, such as
  823. <methodname>findByFoo('bar')</methodname>.
  824. </para>
  825. <example id="zend.navigation.containers.finding.example">
  826. <title>Finding pages in a container</title>
  827. <programlisting language="php"><![CDATA[
  828. $container = new Zend_Navigation(array(
  829. array(
  830. 'label' => 'Page 1',
  831. 'uri' => 'page-1',
  832. 'foo' => 'bar',
  833. 'pages' => array(
  834. array(
  835. 'label' => 'Page 1.1',
  836. 'uri' => 'page-1.1',
  837. 'foo' => 'bar',
  838. ),
  839. array(
  840. 'label' => 'Page 1.2',
  841. 'uri' => 'page-1.2',
  842. 'class' => 'my-class',
  843. ),
  844. array(
  845. 'type' => 'uri',
  846. 'label' => 'Page 1.3',
  847. 'uri' => 'page-1.3',
  848. 'action' => 'about'
  849. )
  850. )
  851. ),
  852. array(
  853. 'label' => 'Page 2',
  854. 'id' => 'page_2_and_3',
  855. 'class' => 'my-class',
  856. 'module' => 'page2',
  857. 'controller' => 'index',
  858. 'action' => 'page1'
  859. ),
  860. array(
  861. 'label' => 'Page 3',
  862. 'id' => 'page_2_and_3',
  863. 'module' => 'page3',
  864. 'controller' => 'index'
  865. )
  866. ));
  867. // The 'id' is not required to be unique, but be aware that
  868. // having two pages with the same id will render the same id attribute
  869. // in menus and breadcrumbs.
  870. $found = $container->findBy('id',
  871. 'page_2_and_3'); // returns Page 2
  872. $found = $container->findOneBy('id',
  873. 'page_2_and_3'); // returns Page 2
  874. $found = $container->findBy('id',
  875. 'page_2_and_3',
  876. true); // returns Page 2 and Page 3
  877. $found = $container->findById('page_2_and_3'); // returns Page 2
  878. $found = $container->findOneById('page_2_and_3'); // returns Page 2
  879. $found = $container->findAllById('page_2_and_3'); // returns Page 2 and Page 3
  880. // Find all matching CSS class my-class
  881. $found = $container->findAllBy('class',
  882. 'my-class'); // returns Page 1.2 and Page 2
  883. $found = $container->findAllByClass('my-class'); // returns Page 1.2 and Page 2
  884. // Find first matching CSS class my-class
  885. $found = $container->findOneByClass('my-class'); // returns Page 1.2
  886. // Find all matching CSS class non-existant
  887. $found = $container->findAllByClass('non-existant'); // returns array()
  888. // Find first matching CSS class non-existant
  889. $found = $container->findOneByClass('non-existant'); // returns null
  890. // Find all pages with custom property 'foo' = 'bar'
  891. $found = $container->findAllBy('foo', 'bar'); // returns Page 1 and Page 1.1
  892. // To achieve the same magically, 'foo' must be in lowercase.
  893. // This is because 'foo' is a custom property, and thus the
  894. // property name is not normalized to 'Foo'
  895. $found = $container->findAllByfoo('bar');
  896. // Find all with controller = 'index'
  897. $found = $container->findAllByController('index'); // returns Page 2 and Page 3
  898. ]]></programlisting>
  899. </example>
  900. </sect2>
  901. <sect2 id="zend.navigation.containers.iterating">
  902. <title>Iterating containers</title>
  903. <para>
  904. <classname>Zend_Navigation_Container</classname> implements
  905. <classname>RecursiveIteratorIterator</classname>, and can be
  906. iterated using any <classname>Iterator</classname> class. To iterate
  907. a container recursively, use the
  908. <classname>RecursiveIteratorIterator</classname> class.
  909. </para>
  910. <example id="zend.navigation.containers.iterating.example">
  911. <title>Iterating a container</title>
  912. <programlisting language="php"><![CDATA[
  913. /*
  914. * Create a container from an array
  915. */
  916. $container = new Zend_Navigation(array(
  917. array(
  918. 'label' => 'Page 1',
  919. 'uri' => '#'
  920. ),
  921. array(
  922. 'label' => 'Page 2',
  923. 'uri' => '#',
  924. 'pages' => array(
  925. array(
  926. 'label' => 'Page 2.1',
  927. 'uri' => '#'
  928. ),
  929. array(
  930. 'label' => 'Page 2.2',
  931. 'uri' => '#'
  932. )
  933. )
  934. ),
  935. array(
  936. 'label' => 'Page 3',
  937. 'uri' => '#'
  938. )
  939. ));
  940. // Iterate flat using regular foreach:
  941. // Output: Page 1, Page 2, Page 3
  942. foreach ($container as $page) {
  943. echo $page->label;
  944. }
  945. // Iterate recursively using RecursiveIteratorIterator
  946. $it = new RecursiveIteratorIterator(
  947. $container, RecursiveIteratorIterator::SELF_FIRST);
  948. // Output: Page 1, Page 2, Page 2.1, Page 2.2, Page 3
  949. foreach ($it as $page) {
  950. echo $page->label;
  951. }
  952. ]]></programlisting>
  953. </example>
  954. </sect2>
  955. <sect2 id="zend.navigation.containers.other">
  956. <title>Other operations</title>
  957. <para>
  958. The method <methodname>hasPage(Zend_Navigation_Page $page)</methodname> checks
  959. if the container has the given page. The method <methodname>hasPages()</methodname>
  960. checks if there are any pages in the container, and is equivalent
  961. to <command>count($container) > 1</command>.
  962. </para>
  963. <para>
  964. The <methodname>toArray()</methodname> method converts the container and the
  965. pages in it to an array. This can be useful for serializing and
  966. debugging.
  967. </para>
  968. <example id="zend.navigation.containers.other.example.toarray">
  969. <title>Converting a container to an array</title>
  970. <programlisting language="php"><![CDATA[
  971. $container = new Zend_Navigation(array(
  972. array(
  973. 'label' => 'Page 1',
  974. 'uri' => '#'
  975. ),
  976. array(
  977. 'label' => 'Page 2',
  978. 'uri' => '#',
  979. 'pages' => array(
  980. array(
  981. 'label' => 'Page 2.1',
  982. 'uri' => '#'
  983. ),
  984. array(
  985. 'label' => 'Page 2.2',
  986. 'uri' => '#'
  987. )
  988. )
  989. )
  990. ));
  991. var_dump($container->toArray());
  992. /* Output:
  993. array(2) {
  994. [0]=> array(15) {
  995. ["label"]=> string(6) "Page 1"
  996. ["id"]=> NULL
  997. ["class"]=> NULL
  998. ["title"]=> NULL
  999. ["target"]=> NULL
  1000. ["rel"]=> array(0) {
  1001. }
  1002. ["rev"]=> array(0) {
  1003. }
  1004. ["order"]=> NULL
  1005. ["resource"]=> NULL
  1006. ["privilege"]=> NULL
  1007. ["active"]=> bool(false)
  1008. ["visible"]=> bool(true)
  1009. ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  1010. ["pages"]=> array(0) {
  1011. }
  1012. ["uri"]=> string(1) "#"
  1013. }
  1014. [1]=> array(15) {
  1015. ["label"]=> string(6) "Page 2"
  1016. ["id"]=> NULL
  1017. ["class"]=> NULL
  1018. ["title"]=> NULL
  1019. ["target"]=> NULL
  1020. ["rel"]=> array(0) {
  1021. }
  1022. ["rev"]=> array(0) {
  1023. }
  1024. ["order"]=> NULL
  1025. ["resource"]=> NULL
  1026. ["privilege"]=> NULL
  1027. ["active"]=> bool(false)
  1028. ["visible"]=> bool(true)
  1029. ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  1030. ["pages"]=> array(2) {
  1031. [0]=> array(15) {
  1032. ["label"]=> string(8) "Page 2.1"
  1033. ["id"]=> NULL
  1034. ["class"]=> NULL
  1035. ["title"]=> NULL
  1036. ["target"]=> NULL
  1037. ["rel"]=> array(0) {
  1038. }
  1039. ["rev"]=> array(0) {
  1040. }
  1041. ["order"]=> NULL
  1042. ["resource"]=> NULL
  1043. ["privilege"]=> NULL
  1044. ["active"]=> bool(false)
  1045. ["visible"]=> bool(true)
  1046. ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  1047. ["pages"]=> array(0) {
  1048. }
  1049. ["uri"]=> string(1) "#"
  1050. }
  1051. [1]=>
  1052. array(15) {
  1053. ["label"]=> string(8) "Page 2.2"
  1054. ["id"]=> NULL
  1055. ["class"]=> NULL
  1056. ["title"]=> NULL
  1057. ["target"]=> NULL
  1058. ["rel"]=> array(0) {
  1059. }
  1060. ["rev"]=> array(0) {
  1061. }
  1062. ["order"]=> NULL
  1063. ["resource"]=> NULL
  1064. ["privilege"]=> NULL
  1065. ["active"]=> bool(false)
  1066. ["visible"]=> bool(true)
  1067. ["type"]=> string(23) "Zend_Navigation_Page_Uri"
  1068. ["pages"]=> array(0) {
  1069. }
  1070. ["uri"]=> string(1) "#"
  1071. }
  1072. }
  1073. ["uri"]=> string(1) "#"
  1074. }
  1075. }
  1076. */
  1077. ]]></programlisting>
  1078. </example>
  1079. </sect2>
  1080. </sect1>