/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
- <div class="highlight"><pre><span class="cp"><?php</span>
- <span class="k">class</span> <span class="nc">AnimalsBaobab</span> <span class="k">extends</span> <span class="nx">Baobab</span> <span class="p">{</span>
-
- <span class="c1">// override build function to create the table the way we want it</span>
- <span class="k">public</span> <span class="k">function</span> <span class="nf">build</span><span class="p">()</span> <span class="p">{</span>
- <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't existing and has been built</span>
-
- <span class="nv">$result</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="na">db</span><span class="o">-></span><span class="na">query</span><span class="p">(</span><span class="s2">"</span>
- <span class="s2"> ALTER TABLE </span><span class="si">{</span><span class="nv">$this</span><span class="o">-></span><span class="na">forest_name</span><span class="si">}</span><span class="s2"></span>
- <span class="s2"> ADD COLUMN name VARCHAR(50) NOT NULL</span>
- <span class="s2"> "</span>
- <span class="p">);</span>
- <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">-></span><span class="na">db</span><span class="p">);</span>
- <span class="p">}</span>
- <span class="p">}</span>
- <span class="p">}</span>
- <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>
- <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>
- <span class="nv">$tree</span><span class="o">-></span><span class="na">destroy</span><span class="p">(</span><span class="k">TRUE</span><span class="p">);</span>
- <span class="nv">$tree</span><span class="o">-></span><span class="na">build</span><span class="p">();</span>
- <span class="p">}</span>
- <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>
-
- <span class="nv">$forestName</span><span class="o">=</span><span class="s2">"animals"</span><span class="p">;</span>
- <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>
-
- <span class="c1">// Create a tree in the forest. It will get automatically his id</span>
- <span class="c1">// (you could read it via the public member "tree_id" ) and we will leave</span>
- <span class="c1">// it alone. A table called $forestName will be created if not yet exists</span>
- <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>
-
- <span class="cm">/*</span>
- <span class="cm"> </span>
- <span class="cm"> We could import some well constructed data structure, but we're doing</span>
- <span class="cm"> it the long and clumsy way to show some functions.</span>
- <span class="cm"> </span>
- <span class="cm"> Say we want to map this tree ...</span>
- <span class="cm"> </span>
- <span class="cm"> Animals</span>
- <span class="cm"> ┣━━ Vertebrates</span>
- <span class="cm"> ┃ ┣━━━ Mollusks</span>
- <span class="cm"> ┃ ┗━━━ Insects</span>
- <span class="cm"> ┃ ┗━━━ Mantis</span>
- <span class="cm"> ┗━━ Invertebrates</span>
- <span class="cm"> ┗━━━ Mammals</span>
- <span class="cm"> ┣━━━ Tiger</span>
- <span class="cm"> ┗━━━ Horse</span>
- <span class="cm"> </span>
- <span class="cm"> */</span>
-
- <span class="c1">// utility function to have something more readable later</span>
-
- <span class="c1">// Append the tree children, each node asks the parent id first, </span>
- <span class="c1">// and the values later</span>
- <span class="nv">$root_id</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s1">'Animals'</span><span class="p">));</span>
-
- <span class="nv">$vertebrates_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Vertebrates"</span><span class="p">));</span>
- <span class="nv">$invertebrates_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Invertebrates"</span><span class="p">));</span>
-
- <span class="c1">// add vertebrates first ...</span>
- <span class="nv">$mollusks_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Mollusks"</span><span class="p">));</span>
- <span class="nv">$insects_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Insects"</span><span class="p">));</span>
-
- <span class="nv">$mantis_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Mantis"</span><span class="p">));</span>
-
- <span class="c1">// and invertebrates next ...</span>
- <span class="nv">$mammals_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Mammals"</span><span class="p">));</span>
-
- <span class="c1">// (we skip intentionally 'tiger')</span>
- <span class="nv">$horse_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Horse"</span><span class="p">));</span>
-
- <span class="c1">// Add tiger before 'horse'. We could have done it earlier with an</span>
- <span class="c1">// appendChild but you're learning here. Indexes start from 0.</span>
- <span class="nv">$tiger_id</span> <span class="o">=</span> <span class="nv">$tree</span><span class="o">-></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">"name"</span><span class="o">=></span><span class="s2">"Tiger"</span><span class="p">));</span>
-
- <span class="cm">/*</span>
- <span class="cm"> Now the content of the 'animals' table is</span>
- <span class="cm"> </span>
- <span class="cm"> ======= == === === =============</span>
- <span class="cm"> tree_id id lft rgt name </span>
- <span class="cm"> ======= == === === =============</span>
- <span class="cm"> 1 1 1 18 Animals</span>
- <span class="cm"> 1 2 2 9 Vertebrates</span>
- <span class="cm"> 1 3 10 11 Invertebrates </span>
- <span class="cm"> 1 4 3 4 Mollusks</span>
- <span class="cm"> 1 5 5 8 Insects </span>
- <span class="cm"> 1 6 6 7 Mantis </span>
- <span class="cm"> 1 7 12 17 Mammals </span>
- <span class="cm"> 1 8 15 16 Horse</span>
- <span class="cm"> 1 9 13 14 Tiger</span>
- <span class="cm"> ======= == === === =============</span>
- <span class="cm"> </span>
- <span class="cm"> */</span>
-
- <span class="c1">// To obtain all the elements beetween root and a node ...</span>
- <span class="nv">$parts</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-></span><span class="na">getPath</span><span class="p">(</span><span class="nv">$insects_id</span><span class="p">);</span>
- <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>
- <span class="c1">// output: [{"id":"1"},{"id":"2"},{"id":"5"}]</span>
- <span class="k">echo</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
-
- <span class="c1">// To obtain all the elements beetween root and a node filtering by a field...</span>
- <span class="nv">$filtered_parts</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-></span><span class="na">getPath</span><span class="p">(</span><span class="nv">$insects_id</span><span class="p">,</span><span class="s1">'name'</span><span class="p">,</span><span class="k">TRUE</span><span class="p">);</span>
- <span class="nb">print_r</span><span class="p">(</span><span class="nb">join</span><span class="p">(</span><span class="s2">" » "</span><span class="p">,</span><span class="nv">$filtered_parts</span><span class="p">));</span>
- <span class="c1">// output: Animals » Vertebrates » Insects</span>
- <span class="k">echo</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
-
- <span class="c1">// Get the crystalized state of the tree, either as a class instance ...</span>
- <span class="nv">$rootTreeState</span><span class="o">=</span><span class="nv">$tree</span><span class="o">-></span><span class="na">getTree</span><span class="p">();</span>
- <span class="nb">print_r</span><span class="p">(</span><span class="nv">$rootTreeState</span><span class="o">-></span><span class="na">children</span><span class="p">);</span>
- <span class="k">echo</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
-
- <span class="c1">// ... or as a JSON string</span>
- <span class="nb">print_r</span><span class="p">(</span><span class="nv">$tree</span><span class="o">-></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>
- <span class="k">echo</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
-
- <span class="c1">// Next time you want to access this tree, if you're using a table to store</span>
- <span class="c1">// a single tree then pass -1 as tree id</span>
- <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>
- <span class="c1">// (otherwise you would need to know his tree id [check the documentation])</span>
- <span class="p">}</span>
- </pre></div>