Autor Zpráva
Tirus
Profil
V tuto chvíli mám presenter s metodou List v této podobě
public function renderList($id = null) {
    if (!$this->user->isAllowed('AdminUsers')) {
      $this->error($this->translator->translate('messages.error.sufficientPermissions'), \Nette\Http\IResponse::S403_FORBIDDEN);
    }
    $sessionData = $this->getSession(self::SEARCH_USER_BOX_NAME);
    $users = $this->adminUserManagerModel->getUserList($sessionData->where);
    if (!$users) {
      $this->template->userList = array();
    } else {
      $vp = new \VisualPaginator\VisualPaginator($this, 'usersPaginator');
      $paginator = $vp->getPaginator();
      $paginator->itemsPerPage = $this->systemInformation->number_posts_admin_view;
      $paginator->itemCount = count($users);
      $this->template->userList = $users->fetchAll($paginator->offset, $paginator->itemsPerPage);
    }
  }
a následně getUserList obsahuje toto

public function getUserList($where = array()) {
    $result = array();
    $sql = array();
    $sql[] = 'SELECT 
              ' . self::COLUMN_ID . ',
              ' . self::COLUMN_ROLE . ',
              ' . self::COLUMN_EMAIL . ',
              ' . self::COLUMN_USERNAME . ',
              ' . self::COLUMN_SURNAME . ',
              ' . self::COLUMN_FIRST_NAME . ',
              ' . self::COLUMN_ACTIVATED . ',
              ' . self::COLUMN_REGISTERED_AT . ',
              ' . self::COLUMN_LOGGED_AT . ',
              ' . self::COLUMN_EMAIL_ENABLE . ',
              ' . self::COLUMN_MIDDLE_NAME . ',
              ' . self::COLUMN_PHONE . ',
              ' . self::COLUMN_WEB . ',
              ' . self::COLUMN_YOUTUBE . ',
              ' . self::COLUMN_GOOGLE . ',
              ' . self::COLUMN_FACEBOOK . ',
              ' . self::COLUMN_SKYPE . ',
              ' . self::COLUMN_IRC . ',
              ' . self::COLUMN_AVATAR . '
             FROM security_users WHERE 1=1';
    if (count($where) > 0) {
      if (isset($where['role'])) {
        $sql[] = ' AND (';
        $tmp = array();
        $i = 1;
        foreach ($where['role'] as $role) {
          $sql[] = ($i > 1 ? ' OR ' : null) . 'role = %s ';
          $sql[] = $role;
          ++$i;
        }
        $sql[] = ')';
      }
      foreach ($where as $key => $value) {
        if ($key == self::COLUMN_EMAIL || $key == self::COLUMN_USERNAME) {
          $sql[] = ' AND ' . $key . ' LIKE %~like~';
          $sql[] = $value;
        }
      }
    }
    return $this->database->query($sql);
  }

Ovšem toto mi nepříjde jako nejlepší návrh. Jak řešit toto filtrování? (využívám nové nette a dibi)

Děkuji za jakoukoliv radu(nakopnutí) ke správnému návrhu
Tirus
Profil
Už jsem dostal profackováno, že bych to měl přepsat do tříd a rozhraní.. ale tu jsem nějak zkončil (vím, že ty kody spolu moc nesouvisí obsahově, ale pochopím aspoň jak na to)

Zkusil jsem něco takového, ale u tohoto jsem fakt nějak v pr.. :(

<?php

interface IArticle {
    public function find($id);
    
    public function create($data);
    
    public function delete($id);
    
    public function edit($id,$data);
    
    public function findAll();
}

class Story implements IArticle {

    public function find($id){
        return $this->database->query('SELECT * FROM story WHERE id = %i',$id)->fetch();
    }
    
    public function create($data){
        
    }
    
    public function delete($id){
        return $this->database->delete('story')->where(array('id=%i'=>$id));
    }
    
    public function edit($id,$data){
    
    }
    
    public function findAll(){
        return $this->database->query('SELECT * FROM story');
    }
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: