Содержание


Страницы


Pages, Navigation, ЗФ2, Zend Framework 2, ZF2, ру, ru




Zend\Navigation поставляется с двумя типами страниц:

- Страницы MVC – используется класс Zend\Navigation\Page\Mvc

- Страницы URI - используется класс Zend\Navigation\Page\Uri

 

Страницы MVC это ссылки на страницы веб -  сайта и определяются с помощью параметров MVC (action, controller, route, params). URI страницы создаются как отдельные URI, в силу чего Вы можете использовать сгенерированую ссылку вне пределов сайта или еще каким – либо необходимым способом. Сгенерированный URI  выглядит так: <a href="#">foo<a>.

 



Общие особенности страниц

 

Все классы страниц должны расширять Zend\Navigation\Page\AbstractPage, что обеспечивает общий набор функций и свойств.  Доступные настройки будут приведены в таблице ниже.

 

Ключи настройки используются для вызовов «set» методов. Тоесть, ключ настройки «order» вызовет метод «setOrder()», а ключ «reset_params» метод «setResetParams()». Если же сет-метода не будет найдено, то настройка будет установлена как свойство страницы.

 

Важно: Пользовательские свойства.

Все страницы поддерживают добавление (setting) и извлечение (getting) пользовательских свойств через магические методы __set($name, $value), __get($name), __isset($name) and __unset($name).

Пользовательские свойства могут иметь любые значения и добавлюятся в массив, который возвращается от $page->toArray(), который выступает проверкой на возможность сериализации / десериализации  страниц, даже если в страницах присутствуют свойства, не поддерживаемые классом страницы.

Как пользовательские так и родные свойства могут быть назначены с помощью метода «$page->set($name, $value)», а получены с помощью метода «$page->get($name)», или используя магические методы.

 

Как использовать пользовательские свойства страницы:

$page = new Zend\Navigation\PageMvc();
$page->foo     = 'bar';
$page->meaning = 42;
 
echo $page->foo;
 
if ($page->meaning != 42) {
    // action should be taken
}


Zend\Navigation\Page\Mvc

 

Страницы Mvc создаются на параметрах Mvc, которые находятся в компоненте Zend\Mvc.  Страницы Mvc используют метод «getHref()» интерфейса Zend\Mvc\Router\RouteStackInterface для создания «hrefs» (адреса URL), а так же метод «isActive()», который сравнивает параметры Zend\Mvc\Router\RouteMatch с параметрами страницы для определения активной страницы.

 

Параметры Mvc страниц

 

Ключ

Тип

Значение

По умолчанию

Описание

action

String

NULL

Имя действия при создании href страницы

controller

String

NULL

Имя контроллера при создании href страницы

params

Array

array()

Пользовательские параметры, используемые при создании href страницы

route

String

NULL

Имя маршрута при создании href страницы

routeMatch

Zend\Mvc\Router\RouteMatch

NULL

Параметры маршрутизации и их валидность

router

Zend\Mvc\Router\RouteStackInterface

NULL

Имя маршрутизатора для сборки URL

 

Важно: URI создается относительно «baseUrl», находящегося в Zend\Mvc\Router\Http\TreeRouteStack. Для простоты, в след примере baseUrl будет « / ».

 

Генерация URIстраницы  с помощью getHref()

 

Этот пример демонстрирует, как страницы MVC используют Zend\Mvc\Router\RouteStackInterface для генерации URI, вызывая метод «$page->getHref()».

// Create route
$route = Zend\Mvc\Router\Http\Segment::factory(array(
   'route'       => '/[:controller[/:action][/:id]]',
   'constraints' => array(
      'controller' => '[a-zA-Z][a-zA-Z0-9_-]+',
      'action'     => '[a-zA-Z][a-zA-Z0-9_-]+',
      'id'         => '[0-9]+',
   ),
   array(
      'controller' => 'AlbumControllerAlbum',
      'action'     => 'index',
   )
));
$router = new Zend\Mvc\Router\Http\TreeRouteStack();
$router->addRoute('default', $route);
 
// getHref() returns /album/add
$page = new Zend\Navigation\Page\Mvc(array(
    'action'     => 'add',
    'controller' => 'album',
));
 
// getHref() returns /album/edit/id/1337
$page = new Zend\Navigation\Page\Mvc(array(
    'action'     => 'edit',
    'controller' => 'album',
    'params'     => array('id' => 1337),
));

Определение активной страницы с помощью isActive()

/**
 * Dispatched request:
 * - controller: album
 * - action:     index
 */
$page1 = new Zend\Navigation\Page\Mvc(array(
    'action'     => 'index',
    'controller' => 'album',
));
 
$page2 = new Zend\Navigation\Page\Mvc(array(
    'action'     => 'edit',
    'controller' => 'album',
));
 
$page1->isActive(); // returns true
$page2->isActive(); // returns false
 
/**
 * Dispatched request:
 * - controller: album
 * - action:     edit
 * - id:         1337
 */
$page = new Zend\Navigation\Page\Mvc(array(
    'action'     => 'edit',
    'controller' => 'album',
    'params'     => array('id' => 1337),
));
 
// returns true, because request has the same controller and action
$page->isActive();
 
/**
 * Dispatched request:
 * - controller: album
 * - action:     edit
 */
$page = new Zend\Navigation\Page\Mvc(array(
    'action'     => 'edit',
    'controller' => 'album',
    'params'     => array('id' => null),
));
 
// returns false, because page requires the id param to be set in the request
$page->isActive(); // returns false

Использование маршрутов

 

Если у страницы есть маршрут, то он может быть использован в getHref()  для генерации URL.

// the following route is added to the ZF router
$route = Zend\Mvc\Router\Http\Segment::factory(array(
   'route'       => '/a/:id',
   'constraints' => array(
      'id' => '[0-9]+',
   ),
   array(
      'controller' => 'AlbumControllerAlbum',
      'action'     => 'show',
   )
));
$router = new Zend\Mvc\Router\Http\TreeRouteStack();
$router->addRoute('albumShow', $route);
 
// a page is created with a 'route' option
$page = new Zend\Navigation\Page\Mvc(array(
    'label'      => 'Show album',
    'route'      => 'albumShow',
    'params'     => array('id' => 42)
));
 
// returns: /a/42
$page->getHref();


Zend\Navigation\Page\Uri

 

Страницы типа Zend\Navigation\Page\Uri могут быть использованы для создания ссылок на страницы других доменов или сайтов, или реализации пользовательской логики страниц. В дополнение к общим параметрам страниц в страницах URI есть всего один параметр – «uri». Он возвращается при вызове «$page->getHref()» и может принимать всего два значения: «String» или «NULL».

 

Важно: Zend\Navigation\Page\Uri не вызывает автоматически метод «$page->isActive()» для определения активной страницы. Если необходимо, то вызывайте этот метод врчную или указывает опцию «active» в настройках страницы при создании.

Параметры Uri страниц

 

Ключ

Тип

Значение

По умолчанию

Описание

Uri

String

Uri страницы

Строка или NULL

 

 


Создание пользовательских типов страниц

 

При расширении Zend\Navigation\Page\AbstractPageтак же необходимо переопределить конструктор или методы «setOptions()» или «setConfig()». Конструктор страницы принимает всего один параметр -  массив или объект Zend\Config, который передается в setOptions() или setConfig() соответственно. Эти методы в свою очередь вызывают метод «set()», который будет отобрадать родные или пользовательские свойства. Напрмиер, если передана опция «internal_id», то метод сначала будет искать метод с названием «setInternalId()», а затем если найдет то передаст туда опцию. Если же искомого метода е обнаружится, то опция будет установлена как пользовательское свойство страницы, и будет доступно через «$internalId = $page->internal_id;» или «$internalId = $page->get('internal_id');».

 

 

Простое создание пользовательской страницы

 

Кдасс пользовательской страницы должен реализовать минимум один метод «getHref()»

class MySimplePage extends Zend\Navigation\Page\AbstractPage
{
    public function getHref()
    {
        return 'something-completely-different';
    }
}

Пользовательская страница со свойствами

 

При добавлении свойств к расширенной странице переопределять или изменять методы «setOptions()» и «setConfig()» нет необходимости.

class MyNavigationPage extends ZendNavigationPageAbstractPage
{
    protected $foo;
    protected $fooBar;
 
    public function setFoo($foo)
    {
        $this->foo = $foo;
    }
 
    public function getFoo()
    {
        return $this->oo;
    }
 
    public function setFooBar($fooBar)
    {
        $this->fooBar = $fooBar;
    }
 
    public function getFooBar()
    {
        return $this->fooBar;
    }
 
    public function getHref()
    {
        return $this->foo . '/' . $this->fooBar;
    }
}
 
// can now construct using
$page = new My\Navigation\Page(array(
    'label'   => 'Property names are mapped to setters',
    'foo'     => 'bar',
    'foo_bar' => 'baz'
));
 
// ...or
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'type'    => 'My\Navigation\Page',
    'label'   => 'Property names are mapped to setters',
    'foo'     => 'bar',
    'foo_bar' => 'baz'
));


Создание страниц через фабрики

 

Все страницы (в том числе и пользовательские классы) могут быть созданы через фабрику Zend\Navigation\Page\AbstractPage::factory(). Фабрика принимает массив опций или объект Zend\Config. Каждый ключ в массиве или config соответствует опции страницы, как это описано в секции «Страницы». При наличии опции «uri» и отсутствии опций «MVC» (action, controller, route), URI страницы будет создан. Если же указаны опции MVC  страница так же будет создана.

 

Если же указан тип, фабрика будет использовать его как имя класса, с помощью которого создавать страницы.

 

Создание страниц MVC используя фабрику

$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'label'  => 'My MVC page',
    'action' => 'index',
));
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'label'      => 'Search blog',
    'action'     => 'index',
    'controller' => 'search',
));
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'label' => 'Home',
    'route' => 'home',
));
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'type'   => 'mvc',
    'label'  => 'My MVC page',
));

Создание страниц URI используя фабрику

$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'label' => 'My URI page',
    'uri'   => 'http://www.example.com/',
));
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'label'  => 'Search',
    'uri'    => 'http://www.example.com/search',
    'active' => true,
));
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'label' => 'My URI page',
    'uri'   => '#',
));
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'type'  => 'uri',
    'label' => 'My URI page',
));

Создание пользовательских страниц используя фабрику

class My\Navigation\Page extends Zend\Navigation\Page\AbstractPage
{
    protected $_fooBar = 'ok';
 
    public function setFooBar($fooBar)
    {
        $this->_fooBar = $fooBar;
    }
}
 
$page = Zend\Navigation\Page\AbstractPage::factory(array(
    'type'    => 'MyNavigationPage',
    'label'   => 'My custom page',
    'foo_bar' => 'foo bar',
));

Автор статьи: DuB