/doc/source/_templates/sphinxdoc/examples/animals.html

https://github.com/riquito/Baobab · HTML · 124 lines · 102 code · 22 blank · 0 comment · 0 complexity · 9e58846c8f9e9ec75d225f4e7feee8b5 MD5 · raw file

  1. <div class="highlight"><pre><span class="cp">&lt;?php</span>
  2. <span class="k">class</span> <span class="nc">AnimalsBaobab</span> <span class="k">extends</span> <span class="nx">Baobab</span> <span class="p">{</span>
  3. <span class="c1">// override build function to create the table the way we want it</span>
  4. <span class="k">public</span> <span class="k">function</span> <span class="nf">build</span><span class="p">()</span> <span class="p">{</span>
  5. <span class="k">if</span> <span class="p">(</span><span class="k">parent</span><span class="o">::</span><span class="na">build</span><span class="p">())</span> <span class="p">{</span> <span class="c1">// the table wasn&#39;t existing and has been built</span>
  6. <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">db</span><span class="o">-&gt;</span><span class="na">query</span><span class="p">(</span><span class="s2">&quot;</span>
  7. <span class="s2"> ALTER TABLE </span><span class="si">{</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">forest_name</span><span class="si">}</span><span class="s2"></span>
  8. <span class="s2"> ADD COLUMN name VARCHAR(50) NOT NULL</span>
  9. <span class="s2"> &quot;</span>
  10. <span class="p">);</span>
  11. <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nv">$result</span><span class="p">)</span> <span class="k">throw</span> <span class="k">new</span> <span class="nx">sp_MySQL_Error</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">db</span><span class="p">);</span>
  12. <span class="p">}</span>
  13. <span class="p">}</span>
  14. <span class="p">}</span>
  15. <span class="k">function</span> <span class="nf">start_over</span><span class="p">(</span><span class="nv">$conn</span><span class="p">,</span><span class="nv">$forestName</span><span class="p">){</span>
  16. <span class="nv">$tree</span><span class="o">=</span><span class="k">new</span> <span class="nx">AnimalsBaobab</span><span class="p">(</span><span class="nv">$conn</span><span class="p">,</span><span class="nv">$forestName</span><span class="p">);</span>
  17. <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">destroy</span><span class="p">(</span><span class="k">TRUE</span><span class="p">);</span>
  18. <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">build</span><span class="p">();</span>
  19. <span class="p">}</span>
  20. <span class="k">function</span> <span class="nf">main</span><span class="p">(</span><span class="nv">$conn</span><span class="p">){</span> <span class="c1">// $conn is a mysqli connection object</span>
  21. <span class="nv">$forestName</span><span class="o">=</span><span class="s2">&quot;animals&quot;</span><span class="p">;</span>
  22. <span class="nx">start_over</span><span class="p">(</span><span class="nv">$conn</span><span class="p">,</span><span class="nv">$forestName</span><span class="p">);</span>
  23. <span class="c1">// Create a tree in the forest. It will get automatically his id</span>
  24. <span class="c1">// (you could read it via the public member &quot;tree_id&quot; ) and we will leave</span>
  25. <span class="c1">// it alone. A table called $forestName will be created if not yet exists</span>
  26. <span class="nv">$tree</span><span class="o">=</span><span class="k">new</span> <span class="nx">AnimalsBaobab</span><span class="p">(</span><span class="nv">$conn</span><span class="p">,</span><span class="nv">$forestName</span><span class="p">);</span>
  27. <span class="cm">/*</span>
  28. <span class="cm"> </span>
  29. <span class="cm"> We could import some well constructed data structure, but we&#39;re doing</span>
  30. <span class="cm"> it the long and clumsy way to show some functions.</span>
  31. <span class="cm"> </span>
  32. <span class="cm"> Say we want to map this tree ...</span>
  33. <span class="cm"> </span>
  34. <span class="cm"> Animals</span>
  35. <span class="cm"> ┣━━ Vertebrates</span>
  36. <span class="cm"> ┃ ┣━━━ Mollusks</span>
  37. <span class="cm"> ┃ ┗━━━ Insects</span>
  38. <span class="cm"> ┃ ┗━━━ Mantis</span>
  39. <span class="cm"> ┗━━ Invertebrates</span>
  40. <span class="cm"> ┗━━━ Mammals</span>
  41. <span class="cm"> ┣━━━ Tiger</span>
  42. <span class="cm"> ┗━━━ Horse</span>
  43. <span class="cm"> </span>
  44. <span class="cm"> */</span>
  45. <span class="c1">// utility function to have something more readable later</span>
  46. <span class="c1">// Append the tree children, each node asks the parent id first, </span>
  47. <span class="c1">// and the values later</span>
  48. <span class="nv">$root_id</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="k">NULL</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s1">&#39;Animals&#39;</span><span class="p">));</span>
  49. <span class="nv">$vertebrates_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$root_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Vertebrates&quot;</span><span class="p">));</span>
  50. <span class="nv">$invertebrates_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$root_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Invertebrates&quot;</span><span class="p">));</span>
  51. <span class="c1">// add vertebrates first ...</span>
  52. <span class="nv">$mollusks_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$vertebrates_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Mollusks&quot;</span><span class="p">));</span>
  53. <span class="nv">$insects_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$vertebrates_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Insects&quot;</span><span class="p">));</span>
  54. <span class="nv">$mantis_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$insects_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Mantis&quot;</span><span class="p">));</span>
  55. <span class="c1">// and invertebrates next ...</span>
  56. <span class="nv">$mammals_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$root_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Mammals&quot;</span><span class="p">));</span>
  57. <span class="c1">// (we skip intentionally &#39;tiger&#39;)</span>
  58. <span class="nv">$horse_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">appendChild</span><span class="p">(</span><span class="nv">$mammals_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Horse&quot;</span><span class="p">));</span>
  59. <span class="c1">// Add tiger before &#39;horse&#39;. We could have done it earlier with an</span>
  60. <span class="c1">// appendChild but you&#39;re learning here. Indexes start from 0.</span>
  61. <span class="nv">$tiger_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">insertBefore</span><span class="p">(</span><span class="nv">$horse_id</span><span class="p">,</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;name&quot;</span><span class="o">=&gt;</span><span class="s2">&quot;Tiger&quot;</span><span class="p">));</span>
  62. <span class="cm">/*</span>
  63. <span class="cm"> Now the content of the &#39;animals&#39; table is</span>
  64. <span class="cm"> </span>
  65. <span class="cm"> ======= == === === =============</span>
  66. <span class="cm"> tree_id id lft rgt name </span>
  67. <span class="cm"> ======= == === === =============</span>
  68. <span class="cm"> 1 1 1 18 Animals</span>
  69. <span class="cm"> 1 2 2 9 Vertebrates</span>
  70. <span class="cm"> 1 3 10 11 Invertebrates </span>
  71. <span class="cm"> 1 4 3 4 Mollusks</span>
  72. <span class="cm"> 1 5 5 8 Insects </span>
  73. <span class="cm"> 1 6 6 7 Mantis </span>
  74. <span class="cm"> 1 7 12 17 Mammals </span>
  75. <span class="cm"> 1 8 15 16 Horse</span>
  76. <span class="cm"> 1 9 13 14 Tiger</span>
  77. <span class="cm"> ======= == === === =============</span>
  78. <span class="cm"> </span>
  79. <span class="cm"> */</span>
  80. <span class="c1">// To obtain all the elements beetween root and a node ...</span>
  81. <span class="nv">$parts</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">getPath</span><span class="p">(</span><span class="nv">$insects_id</span><span class="p">);</span>
  82. <span class="nb">print_r</span><span class="p">(</span><span class="nb">json_encode</span><span class="p">(</span><span class="nv">$parts</span><span class="p">));</span>
  83. <span class="c1">// output: [{&quot;id&quot;:&quot;1&quot;},{&quot;id&quot;:&quot;2&quot;},{&quot;id&quot;:&quot;5&quot;}]</span>
  84. <span class="k">echo</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
  85. <span class="c1">// To obtain all the elements beetween root and a node filtering by a field...</span>
  86. <span class="nv">$filtered_parts</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">getPath</span><span class="p">(</span><span class="nv">$insects_id</span><span class="p">,</span><span class="s1">&#39;name&#39;</span><span class="p">,</span><span class="k">TRUE</span><span class="p">);</span>
  87. <span class="nb">print_r</span><span class="p">(</span><span class="nb">join</span><span class="p">(</span><span class="s2">&quot; » &quot;</span><span class="p">,</span><span class="nv">$filtered_parts</span><span class="p">));</span>
  88. <span class="c1">// output: Animals » Vertebrates » Insects</span>
  89. <span class="k">echo</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
  90. <span class="c1">// Get the crystalized state of the tree, either as a class instance ...</span>
  91. <span class="nv">$rootTreeState</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">getTree</span><span class="p">();</span>
  92. <span class="nb">print_r</span><span class="p">(</span><span class="nv">$rootTreeState</span><span class="o">-&gt;</span><span class="na">children</span><span class="p">);</span>
  93. <span class="k">echo</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
  94. <span class="c1">// ... or as a JSON string</span>
  95. <span class="nb">print_r</span><span class="p">(</span><span class="nv">$tree</span><span class="o">-&gt;</span><span class="na">export</span><span class="p">(</span><span class="nv">$conn</span><span class="p">,</span><span class="nv">$forestName</span><span class="p">));</span>
  96. <span class="k">echo</span> <span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">;</span>
  97. <span class="c1">// Next time you want to access this tree, if you&#39;re using a table to store</span>
  98. <span class="c1">// a single tree then pass -1 as tree id</span>
  99. <span class="nv">$treeLoadedAgain</span><span class="o">=</span><span class="k">new</span> <span class="nx">AnimalsBaobab</span><span class="p">(</span><span class="nv">$conn</span><span class="p">,</span><span class="nv">$forestName</span><span class="p">,</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
  100. <span class="c1">// (otherwise you would need to know his tree id [check the documentation])</span>
  101. <span class="p">}</span>
  102. </pre></div>