Zend_Paginator, размывающий строки MVC

Адрес Bluetooth - лучший способ различать устройства. Это упоминается в спецификации Bluetooth следующим образом [1]:

Устройства идентифицируются с использованием адреса устройства. Адреса устройств могут быть либо адресом общедоступного устройства, либо адресом произвольного устройства. Адрес общедоступного устройства и адрес произвольного устройства имеют длину 48 битов

Как упоминал Майк, существует несколько типов MAC-адресов, и изменяемый не тот, который вам нужен смотреть на. Спецификация Bluetooth определяет следующие адреса: -

  • Публичный адрес : Это уникальный адрес, созданный в соответствии со стандартом IEEE 802-2014. Для вас это адрес, соответствующий вашему ответу.
  • Случайный статический адрес : Это случайно сгенерированный адрес, который не изменяется, если устройство не выключено и не выключено. Поэтому, если ваше устройство не выключено, вы можете использовать этот адрес для его идентификации.
  • Частный разрешаемый адрес : это изменяющийся MAC-адрес (с частотой изменения в зависимости от приложения), который можно разрешить и связать с уникальным адресом устройства, если известен IRK (т.е. если устройства сопряжены).
  • Частный неразрешимый адрес : это изменяющийся MAC-адрес (с частотой изменения в зависимости от приложения), который нельзя разрешить или связать с уникальным адресом устройства. Этот тип адреса обычно используется в целях безопасности, когда устройство только рекламирует.

Для получения дополнительной информации см. Ссылку ниже.

Надеюсь, это поможет.

[1] Базовая версия Bluetooth версии 5.0, том 6, часть B, раздел 1.3 АДРЕС УСТРОЙСТВА.

6
задан Ken 5 December 2008 в 18:17
поделиться

6 ответов

Можно обеспечить интерфейс на моделях, который принимает $current_page и $per_page параметры и возвраты набор данных текущей страницы, а также объект paginator.

Таким образом, весь Ваш код разбиения на страницы содержится в рамках модели, и Вы свободны использовать адаптеры дб, не чувствуя повреждению понятия.

Плюс, контроллер действительно не должен настраивать пейджер так или иначе, так как Вы корректны в нем связываемый с данными (и модели для данных, не просто соединений с базой данных).

class Model
{
    //...
    /**
     * @return array Array in the form: array( 'paginator' => obj, 'resultset' => obj )
     */
    public function getAll( $where = array(), $current_page = null, $per_page = null );
    //...
}
2
ответ дан 17 December 2019 в 04:53
поделиться

Ну, я не могу дать Вам ответ на Ваши проблемы с использованием DbSelect, но я действительно сталкивался с этим битом кода (в комментариях блога ibuildings) касающийся проблемы сокращения количества строк, которые вытягивают. Могло бы быть полезно для некоторых читателей.

$select = $db->from('users')->order('name');    
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbSelect($select));
$paginator->setCurrentPageNumber($this->_getParam('page', 1));
$paginator->setItemCountPerPage(25);
$this->view->paginator = $paginator;
0
ответ дан 17 December 2019 в 04:53
поделиться

Важный фактор для принятия во внимание, когда работа с MVC состоит в том, что модель для всей доменной логики, тогда как контроллер для бизнес-логики. Общее эмпирическое правило - то, что модель (модели) должна не знать об интерфейсе (контроллеры или представления), но они не должны быть простыми средствами доступа DB. Чтобы быть максимально портативными, они не должны знать ничего из форматирования или свойств дисплея ни один (если это не часть доменной логики).

На самом деле вся логика, которая управляет доменной логикой, должна быть в модели а не в контроллерах. Контроллер должен передать информацию от интерфейса, преобразовав его по мере необходимости, к модели и выбору, которые просматривают для отображения/обновления. Если это не имеет никакого отношения к интерфейсу, это могло бы лучше быть представлено в модели, чем в контроллере, поскольку это будет допускать больше повторного использования кода, если Вы решите выгрузить соединения контроллера/представления позже.

Идеально, Ваша модель должна обеспечить интерфейс для доступа к информации, в которой Вы нуждаетесь. То, как это реализовано позади того интерфейса, не является беспокойством MVC, пока модель остается не знать о части VC MVC. Если это означает раздавать объект paginator, который не является прямым нарушением принципов MVC, хотя, если paginator имеет какое-либо отношение к рендерингу себя (извините, я не знаю Пехлеви), могло бы быть лучше передать интерфейс его в (который пропускает методы рендеринга), имейте модель, управляют/заполняют им в, то пасуют назад его. Тем путем у Вас нет кода рендеринга, сгенерированного из модели, и Вы могли заменить paginator реализацию, если бы Вы решили подать свою заявку консольное приложение позже (или добавить какой-то API-интерфейс).

0
ответ дан 17 December 2019 в 04:53
поделиться

При использовании адаптера DbSelect, можно просто передать в наборе результатов, и это имеет большое значение в поддержании некоторого разделения. Таким образом в Вашем контроллере:

$items = new Items();//setup model as usual in controller
$this->view->paginator = Zend_Paginator::factory($items->getAll()); //initialize the pagination in the view NB getAll is just a custom function to encapsulate my query in the model that returns a Zend_Db_Table_Rowset
$this->view->paginator->setCurrentPageNumber($page); //$page is just the page number that could be passed in as a param in the request
$this->view->paginator->setView($this->view);

В представлении можно получить доступ к данным через paginator

<?php foreach($this->paginator as $item):?>
 <?=$item->someProperty?>
<?php endforeach;?>

Это - упрощенный пример (я также устанавливаю стиль прокрутки значения по умолчанию и представление по умолчанию, неравнодушное в начальной загрузке), но я thnk, установка его в контроллере не плоха, потому что полученные данные из модели помещаются в представление Контроллером так или иначе и эту реализацию, использую набор результатов НЕ модель.

0
ответ дан 17 December 2019 в 04:53
поделиться

Теперь существует метод setFilter для Zend_Paginator, который позволяет загружать данные из объекта строки в любой объект модели, который вы хотите:

class Model_UserDataMapper {
    public function getUsers($select, $page) {
        $pager = Zend_Paginator::factory($select);
        $pager->setItemCountPerPage(10)
                    >setCurrentPageNumber($page)
                    ->setFilter(new Zend_Filter_Callback(array($this,'getUserObjects')));
    }

    public function getUserObjects($rows) {
        $users = array();

        foreach($rows as $row) {
            $user  = new Model_User($row->toArray());

            $users[] = $user;
        }

        return $users;
    }
}
2
ответ дан 17 December 2019 в 04:53
поделиться

Вы также можете напрямую реализовать Zend_Paginator_Adapter_Interface или расширить Zend_Paginator_Adapter_DbSelect в любой модели, которая должна поддерживать разбиение на страницы.

Таким образом, модель ничего не знает напрямую о View, Controller или даже Zend_Paginator, но может напрямую использоваться с Zend_Paginator везде, где это имеет наибольший смысл.

class ModelSet extends Zend_Paginator_Adapter_DbSelect
{
    public function __construct( ... )
    {
        // Create a new Zend_Db_Select ($select) representing the desired
        // data set using incoming criteria
        parent::__construct($select);
    }
    ...
}

С помощью чего-то вроде этого вы можете напрямую создать экземпляр пейджера, используя экземпляр этого класса, где это наиболее целесообразно:

$modelSet = new ModelSet( ... );
...
$pager = new Zend_Paginator( $modelSet );
$pager->setItemCountPerPage( ... );
$pager->setCurrentPageNumber( ... );
...
// The first time the record set is actually retrieved will be at the beginning
// of the first traversal
foreach ($pager as $record)
{
    // ... do stuff with the record ...
}

Теперь вы можете использовать этот класс в качестве базового класса для любой «Модели», которая является набором .

0
ответ дан 17 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: