Skip to content

Commit

Permalink
Merge pull request #4 from RhubarbPHP/feature/MultipleMenus
Browse files Browse the repository at this point in the history
Refactoring to suit Leaf 1.0 and Adding support for Multiple Menus
  • Loading branch information
NiallSmyth authored Oct 24, 2016
2 parents 9d3b651 + 87e4627 commit 4751ebe
Show file tree
Hide file tree
Showing 9 changed files with 279 additions and 114 deletions.
33 changes: 33 additions & 0 deletions src/Menu.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

namespace Rhubarb\Scaffolds\NavigationMenu;

use Rhubarb\Stem\Models\Model;
use Rhubarb\Stem\Schema\Columns\AutoIncrementColumn;
use Rhubarb\Stem\Schema\Columns\StringColumn;
use Rhubarb\Stem\Schema\ModelSchema;

/**
*
*
* @property int $MenuID Repository field
* @property string $Name Repository field
* @property-read \TinyTours\BookingApp\Models\TinyToursNavigationMenuItem[]|\Rhubarb\Stem\Collections\RepositoryCollection $MenuItems Relationship
*/
class Menu extends Model
{
/**
* @return ModelSchema
*/
protected function createSchema()
{
$model = new ModelSchema('tblMenu');

$model->addColumn(
new AutoIncrementColumn('MenuID'),
new StringColumn('Name', 255)
);

return $model;
}
}
80 changes: 64 additions & 16 deletions src/MenuItem.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,14 @@
namespace Rhubarb\Scaffolds\NavigationMenu;

use Rhubarb\Stem\Collections\Collection;
use Rhubarb\Stem\Collections\RepositoryCollection;
use Rhubarb\Stem\Filters\AndGroup;
use Rhubarb\Stem\Filters\Equals;
use Rhubarb\Stem\Models\Model;
use Rhubarb\Stem\Schema\Columns\AutoIncrement;
use Rhubarb\Stem\Schema\Columns\ForeignKey;
use Rhubarb\Stem\Schema\Columns\Integer;
use Rhubarb\Stem\Schema\Columns\String;
use Rhubarb\Stem\Schema\Columns\AutoIncrementColumn;
use Rhubarb\Stem\Schema\Columns\ForeignKeyColumn;
use Rhubarb\Stem\Schema\Columns\IntegerColumn;
use Rhubarb\Stem\Schema\Columns\StringColumn;
use Rhubarb\Stem\Schema\ModelSchema;

/**
Expand All @@ -38,9 +40,12 @@
* @property string $ParentMenuItemIDs
* @property string $CssClassName
* @property int $Position
*
* @property MenuItem[] $Children
* @property Collection|MenuItem[] $Children
* @property MenuItem $Parent
* @property int $MenuID Repository field
* @property-read Menu $Menu Relationship
* @property-read \TinyTours\BookingApp\Models\TinyToursNavigationMenuItem[]|RepositoryCollection $ChildMenuItems Relationship
* @property-read mixed $ParentMenuItemIDArray {@link getParentMenuItemIDArray()}
*/
class MenuItem extends Model
{
Expand All @@ -54,23 +59,52 @@ protected function createSchema()
$schema = new ModelSchema("tblMenuItem");

$schema->addColumn(
new AutoIncrement("MenuItemID"),
new ForeignKey("ParentMenuItemID", 0),
new String("MenuName", 50),
new String("Url", 200),
new String("SecurityOption", 200),
new String("ParentMenuItemIDs", 200),
new String("CssClassName", 40),
new Integer("Position", 0)
new AutoIncrementColumn("MenuItemID"),
new ForeignKeyColumn("ParentMenuItemID", 0),
new ForeignKeyColumn('MenuID', 0),
new StringColumn("MenuName", 50),
new StringColumn("Url", 200),
new StringColumn("SecurityOption", 200),
new StringColumn("ParentMenuItemIDs", 200),
new StringColumn("CssClassName", 40),
new IntegerColumn("Position", 0)
);

return $schema;
}

/**
* @return RepositoryCollection
* @throws \Rhubarb\Stem\Exceptions\FilterNotSupportedException
*/
public static function getTopLevelMenus()
{
$menus = new Collection("MenuItem");
$menus->filter(new Equals("ParentMenuItemID", 0));
$menus = MenuItem::find();
$menus->filter(
new AndGroup(
new Equals("ParentMenuItemID", 0),
new Equals('MenuID', 0)
)
);
$menus->replaceSort(
[
"Position" => false,
"MenuName" => true
]
);

return $menus;
}

/**
* @param Menu $menu
* @return Collection|MenuItem[]
* @throws \Rhubarb\Stem\Exceptions\FilterNotSupportedException
*/
public static function getTopLevelMenuItemsForMenu(Menu $menu)
{
$menus = $menu->MenuItems->filter(new Equals('ParentMenuItemID', 0));

$menus->replaceSort(
[
"Position" => false,
Expand All @@ -92,6 +126,9 @@ public function isPermitted()
return true;
}

/**
* @return Collection
*/
protected function getChildren()
{
$this->clearPropertyCache();
Expand All @@ -107,11 +144,19 @@ protected function getChildren()
return $children;
}

/**
* @param $url
* @return Model|static
* @throws \Rhubarb\Stem\Exceptions\RecordNotFoundException
*/
public static function findByUrl($url)
{
return self::findFirst(new Equals("Url", $url));
}

/**
* @return array
*/
private function getAllParents()
{
$parents = [];
Expand All @@ -138,6 +183,9 @@ protected function beforeSave()
$this->ParentMenuItemIDs = implode(",", $parentIds);
}

/**
* @return mixed
*/
public function getParentMenuItemIDArray()
{
return explode(",", $this->ParentMenuItemIDs);
Expand Down
16 changes: 14 additions & 2 deletions src/NavigationMenuSchema.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,34 @@

use Rhubarb\Stem\Schema\SolutionSchema;

/**
* Class NavigationMenuSchema
* @package Rhubarb\Scaffolds\NavigationMenu
*/
class NavigationMenuSchema extends SolutionSchema
{
/**
* NavigationMenuSchema constructor.
* @param float $version
*/
public function __construct($version = 0.1)
{
parent::__construct($version);

$this->addModel("MenuItem", __NAMESPACE__ . "\MenuItem");
$this->addModel('Menu', Menu::class, 1);
$this->addModel("MenuItem", MenuItem::class, 2);
}

protected function defineRelationships()
{
$this->declareOneToManyRelationships(
[
'Menu' => [
'MenuItems' => 'MenuItem.MenuID',
],
"MenuItem" => [
"ChildMenuItems" => "MenuItem.ParentMenuItemID:Parent"
]
],
]
);
}
Expand Down
39 changes: 36 additions & 3 deletions src/Presenters/TwoLevelMenu.php
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,29 @@ protected function createModel()
{
$model = new TwoLevelMenuModel();

$model->secondaryContainerClasses = $model->primaryContainerClasses = [
'Nav',
'primary',
];

return $model;
}

protected function onModelCreated()
{
parent::onModelCreated();

$this->setPrimaryContainerValues(MenuItem::getTopLevelMenus());
}

/**
* @param Collection $collection
*/
public function setPrimaryContainerValues(Collection $collection)
{
$currentUrl = Request::current()->urlPath;

$this->model->primaryMenuItems = MenuItem::getTopLevelMenus();
$this->model->secondaryMenuItems = [];
$this->model->primaryMenuItems = $collection;

$foundActivePrimary = false;

Expand Down Expand Up @@ -133,7 +152,21 @@ protected function createModel()
}

$this->model->secondaryMenuItems = array_diff_key($this->model->secondaryMenuItems, $itemsToRemove);
}

return $model;
/**
* @param $classes
*/
public function setPrimaryContainerClasses($classes)
{
$this->model->primaryContainerClasses = $classes;
}

/**
* @param $classes
*/
public function setSecondaryContainerClasses($classes)
{
$this->model->secondaryContainerClasses = $classes;
}
}
3 changes: 3 additions & 0 deletions src/Presenters/TwoLevelMenuModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,9 @@ class TwoLevelMenuModel extends LeafModel
{
public $primaryMenuItems = [];
public $secondaryMenuItems = [];

public $primaryContainerClasses = [];
public $secondaryContainerClasses = [];

public $activePrimaryMenuItemId;
public $activeSecondaryMenuItemId;
Expand Down
4 changes: 2 additions & 2 deletions src/Presenters/TwoLevelMenuView.php
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class TwoLevelMenuView extends View
protected function printViewContent()
{
?>
<ul class='Nav primary'>
<ul class='<?= implode(' ', $this->model->primaryContainerClasses)?>'>
<?php

foreach ($this->model->primaryMenuItems as $menuItem) {
Expand All @@ -51,7 +51,7 @@ protected function printViewContent()

?>
</ul>
<ul class='Nav secondary'>
<ul class='<?= implode(' ', $this->model->secondaryContainerClasses)?>'>
<?php

foreach ($this->model->secondaryMenuItems as $menuItem) {
Expand Down
72 changes: 72 additions & 0 deletions tests/Leaves/TwoLevelMenuPresenterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<?php

namespace Rhubarb\Scaffolds\NavigationMenu\Tests\Presenters;

use Rhubarb\Crown\Request\Request;
use Rhubarb\Scaffolds\NavigationMenu\Presenters\TwoLevelMenu;
use Rhubarb\Scaffolds\NavigationMenu\Presenters\TwoLevelMenuModel;
use Rhubarb\Scaffolds\NavigationMenu\Tests\MenuItemTest;

/**
* Class TwoLevelMenuPresenterTest
* @package Rhubarb\Scaffolds\NavigationMenu\Tests\Presenters
*/
class TwoLevelMenuPresenterTest extends MenuItemTest
{
public function testMenuViewGetsCorrectMenus()
{
$request = Request::current();
$request->urlPath = "/";

$menu = new TwoLevelMenu();

/** @var TwoLevelMenuModel $menuModel */
$menuModel = $menu->getModelForTesting();

$this->assertCount(5, $menuModel->primaryMenuItems);
$this->assertCount(0, $menuModel->secondaryMenuItems);

$this->assertEquals("/companies/", $menuModel->primaryMenuItems[1]->Url);
$this->assertEquals("/setup/", $menuModel->primaryMenuItems[2]->Url);

$request->urlPath = "/companies/";

$menu = new TwoLevelMenu();

/** @var TwoLevelMenuModel $menuModel */
$menuModel = $menu->getModelForTesting();

$this->assertCount(5, $menuModel->primaryMenuItems);
$this->assertEquals("History", $menuModel->secondaryMenuItems[1]->MenuName);

$request->urlPath = "/companies/history/";

$menu = new TwoLevelMenu();

/** @var TwoLevelMenuModel $menuModel */
$menuModel = $menu->getModelForTesting();

$this->assertCount(5, $menuModel->primaryMenuItems);
$this->assertEquals("History", $menuModel->secondaryMenuItems[1]->MenuName);

$request->urlPath = "/companies/history/ancient/";

$menu = new TwoLevelMenu();

/** @var TwoLevelMenuModel $menuModel */
$menuModel = $menu->getModelForTesting();

$this->assertEquals("Ancient History", $menuModel->secondaryMenuItems[0]->MenuName);
$this->assertEquals(5, $menuModel->activePrimaryMenuItemId);
$this->assertEquals(8, $menuModel->activeSecondaryMenuItemId);

$request->urlPath = "/setup/help/closing/";

$menu = new TwoLevelMenu();

/** @var TwoLevelMenuModel $menuModel */
$menuModel = $menu->getModelForTesting();

$this->assertEquals(6, $menuModel->activeSecondaryMenuItemId);
}
}
Loading

0 comments on commit 4751ebe

Please sign in to comment.