Tworzy wersję roboczą kategorii z wszystkimki zależnościami,
obejmując wszystko transakcją na bazie danych
@return \Cms\Orm\CmsCategoryRecord
977022
public function createAndGetDraftForUser($userId, $force = false)
    {
        //wyszukiwanie najnowszego draftu (chyba że wymuszony nowy)
        if (!$force && null !== $lastDraft = (new \Cms\Orm\CmsCategoryQuery)
            ->whereCmsCategoryOriginalId()->equals($this->_category->id)
            ->andFieldStatus()->equals(\Cms\Orm\CmsCategoryRecord::STATUS_DRAFT)
            ->andFieldDateAdd()->greater(date('Y-m-d H:i:s', strtotime(self::DRAFT_MAX_LIFETIME)))
            ->andFieldCmsAuthId()->equals($userId)
            ->orderDescId()
            ->findFirst()) {
            //czyszczenie starych draftów
            $this->_gc($userId, $lastDraft->id);
            //zwrot ostatniego draftu
            return $lastDraft;
        }
        //próba kopiowania
        if (!parent::copyWithTransaction()) {
            return;
        }
        //pobranie drafta
        $draft = $this->getCopyRecord();
        //przypinanie użytkownika do draftu
        $draft->cmsAuthId = $userId;
        $draft->dateAdd = date('Y-m-d H:i:s');
        $draft->save();
        //czyszczenie starych draftów
        $this->_gc($userId, $draft->id);
        //zwrot drafta
        return $draft;
    }
171482
protected function _prepareForwardRequest(\Cms\Orm\CmsCategoryRecord $category)
    {
        //tworzenie nowego requestu na podstawie obecnego
        $request = clone $this->getRequest();
        $request->setModuleName('cms')
            ->setControllerName('category')
            ->setActionName('article');
        //przekierowanie MVC
        if ($category->mvcParams) {
            //tablica z tpl
            $mvcParams = [];
            //parsowanie parametrów mvc
            parse_str($category->mvcParams, $mvcParams);
            return $request->setParams($mvcParams);
        }
        //pobranie typu (szablonu) i jego parametrów mvc
        if (!$category->getJoined('cms_category_type')->mvcParams) {
            return $request;
        }
        //tablica z tpl
        $mvcParams = [];
        //parsowanie parametrów mvc
        parse_str($category->getJoined('cms_category_type')->mvcParams, $mvcParams);
        return $request->setParams($mvcParams);
    }
1075658
public static function send()
    {
        //rezultat wysyłania
        $result = ['error' => 0, 'success' => 0];
        //pobieranie maili
        $emails = (new Orm\CmsMailQuery)
            ->join('cms_mail_definition')->on('cms_mail_definition_id')
            ->join('cms_mail_server', 'cms_mail_definition')->on('cms_mail_server_id')
            ->whereActive()->equals(0)
            ->andFieldDateSendAfter()->lessOrEquals(date('Y-m-d H:i:s'))
            ->orderAscDateSendAfter()
            ->limit(500)
            ->find();
        //brak maili do wysyłki
        if (count($emails) == 0) {
            return $result;
        }
        //tymczasowy stan (w wysyłce)
        foreach ($emails as $email) {
            $email->active = 2;
            $email->save();
        }
        //wysyłka pojedynczego maila
        foreach ($emails as $email) {
            //instancja PHPMailer'a
            $mail = new \PHPMailer(true);
            try {
                $mail->CharSet = 'utf-8';
                //ustawiam SMTP
                $mail->isSMTP();
                //ustawianie hosta
                $mail->Host = $email->getJoined('cms_mail_server')->address;
                //ustawianie portu
                $mail->Port = $email->getJoined('cms_mail_server')->port;
                //jezeli podana nazwa uzytkownika i haslo to wlaczamy uwierzytelnienie
                if ($email->getJoined('cms_mail_server')->username && $email->getJoined('cms_mail_server')->password) {
                    //uwierzytelnianie serwera
                    $mail->SMTPAuth = true;
                    //typ uwierzytelniania
                    $mail->AuthType = 'LOGIN';
                    //uzytkownik SMTP
                    $mail->Username = $email->getJoined('cms_mail_server')->username;
                    //haslo SMTP
                    $mail->Password = $email->getJoined('cms_mail_server')->password;
                }
                if ($email->getJoined('cms_mail_server')->ssl != 'plain') {
                    //szyfrowanie polaczenia
                    $mail->SMTPSecure = $email->getJoined('cms_mail_server')->ssl;
                }
                //ustawianie treści wiadomości
                $mail->Body = strip_tags($email->message);
                //jezeli HTML to ustawiam typ wiadomości na HTML
                if ($email->getJoined('cms_mail_definition')->html) {
                    $mail->isHTML(true);
                    $mail->Body = $email->message;
                }
                //ustawianie "from"
                $mail->setFrom($email->getJoined('cms_mail_server')->from, $email->fromName);
                //ustawianie "do"
                $recipients = explode(';', $email->to);
                foreach ($recipients as $recipient) {
                    $mail->addAddress(trim($recipient));
                }
                //ustawianie reply
                if ($email->replyTo) {
                    $mail->addReplyTo($email->replyTo);
                }
                //ustawianie tematu
                $mail->Subject = $email->subject;
                //dołączanie załączników
                $attachments = unserialize($email->attachements);
                if (!empty($attachments)) {
                    foreach ($attachments as $fileName => $filePath) {
                        if (!file_exists($filePath)) {
                            continue;
                        }
                        $file = [
                            'content' => base64_encode(file_get_contents($filePath)),
                            'type' => \Mmi\FileSystem::mimeType($filePath)
                        ];
                        $mail->addStringAttachment(base64_decode($file['content']), $fileName, 'base64', $file['type'], 'attachment');
                    }
                }
                //wysyłka maila
                $mail->send();
                //logowanie wysyłki
                \Mmi\App\FrontController::getInstance()->getLogger()->info('Sent: ' . $email->to . ' ' . $email->subject);
                //czyszczenie załączników
                $email->attachements = null;
                //ustawienie pol po wysłaniu
                $email->active = 1;
                $email->dateSent = date('Y-m-d H:i:s');
                $email->save();
                //podwyzszenie licznika udanych
                $result['success'] ++;
            } catch (\Exception $e) {
                //bład wysyłki
                \Mmi\App\FrontController::getInstance()->getLogger()->warning($e->getMessage());
                //podwyzszenie licznika nieudanych
                $result['error'] ++;
            }
        }
        return $result;
    }
1140261
protected function _setupDatabase()
    {
        //brak konfiguracji bazy
        if (!\App\Registry::$config->db || !\App\Registry::$config->db->driver) {
            return $this;
        }
        //obliczanie nazwy drivera
        $driver = '\\Mmi\\Db\\Adapter\\Pdo' . ucfirst(\App\Registry::$config->db->driver);
        //próba powołania drivera
        \App\Registry::$db = new $driver(\App\Registry::$config->db);
        //jeśli aplikacja w trybie debug
        if (\App\Registry::$config->debug) {
            //wstrzyknięcie profilera do adaptera bazodanowego
            \App\Registry::$db->setProfiler(new \Mmi\Db\DbProfiler);
        }
        //wstrzyknięcie do ORM
        \Mmi\Orm\DbConnector::setAdapter(\App\Registry::$db);
        return $this;
    }
800362
protected function _prepareData()
	{
        //próba pobrania struktury uprawnień z cache
        if (null !== $this->_acl = \App\Registry::$cache->load($cacheKey = 'categories-roles')) {
			return;
        }
		$this->_acl = [];
		//zapytanie o całą strukturę powiązań: kategorie - role
		foreach ((new \Cms\Orm\CmsCategoryRoleQuery())
					->join('cms_role')->on('cms_role_id')
					->orderAscCmsCategoryId()
					->find() as $record) {
			if (!array_key_exists($record->cmsCategoryId, $this->_acl)) {
				$this->_acl[$record->cmsCategoryId] = [];
			}
			$this->_acl[$record->cmsCategoryId][] = $record->getJoined('cms_role')->name;
		}
        //zapis struktury uprawnień do cache
        \App\Registry::$cache->save($this->_acl, $cacheKey, 0);
	}
837815
public function detailsAction()
    {
        if (!$this->getPost()->cmsFileId) {
            return $this->_jsonError(185);
        }
        //szukamy rekordu pliku
        if (null == $record = (new CmsFileQuery)->findPk($this->getPost()->cmsFileId)) {
            return $this->_jsonError(185);
        }
        //wycinamy rozszerzenie z nazwy oryginalnego pliku do edycji
        //pozycja ostatniej kropki w nazwie
        $pointPosition = strrpos($record->original, '.');
        if ($pointPosition !== false) {
            $record->original = substr($record->original, 0, $pointPosition);
        }
        $data = [];
        if ($record->data instanceof \Mmi\DataObject) {
            //parametry
            $data = $record->data->toArray();
        }
        $data['urlFile'] = ((\App\Registry::$config->cdn) ? : $record->getUrl());
        if ($record->data->posterFileName) {
            $data['poster'] = $record->getPosterUrl();
        }    
        return json_encode(['result' => 'OK', 'record' => $record, 'data' => $data]);
    }
60610
public function getTotalRecords()
    {
        $qb = clone $this->queryBuilder;
        $this->_addSearch($qb);
        $qb->resetDQLPart('orderBy');

        $gb = $qb->getDQLPart('groupBy');
        if (empty($gb) || !in_array($this->fields['_identifier_'], $gb))
        {
            $qb->select(" count({$this->fields['_identifier_']}) ");
            return $qb->getQuery()->getSingleScalarResult();
        }
        else
        {
            $qb->resetDQLPart('groupBy');
            $qb->select(" count(distinct {$this->fields['_identifier_']}) ");
            return $qb->getQuery()->getSingleScalarResult();
        }
    }
506136
public function getTotalRecordCount()
    {

        if (!isset($this->rs)) {
            $this->doRs();
        }

        if (empty($this->recordCount)) {
            $this->countCriteria = clone $this->criteria;
            $this->countCriteria->setLimit(0);
            $this->countCriteria->setOffset(0);

            $this->recordCount = call_user_func(array($this->getPeerClass(), $this->getPeerCountMethod()), $this->countCriteria);
        }

        return $this->recordCount;
    }
117252
public function navigation()
    {
        //brak wygenerowanych breadcrumbów
        if (null === $this->_breadcrumbs) {
            return $this->_buildBreadcrumbs();
        }
        //ustawienia domyślne
        return $this->setMaxDepth()
                ->setMinDepth()
                ->setActiveBranchOnly(false)
                ->setAllowedOnly(true);
    }
757616
public function describeAction()
    {
        //sprawdzamy, czy jest id pliku i form
        if (!$this->getPost()->cmsFileId || !is_array($this->getPost()->form)) {
            return $this->_jsonError(186);
        }
        //szukamy rekordu pliku
        if (null === $record = (new CmsFileQuery)->findPk($this->getPost()->cmsFileId)) {
            return $this->_jsonError(186);
        }
        //pobranie danych
        $form = array_merge(['active' => 0, 'sticky' => null], $this->getPost()->form);
        foreach ($form as $field) {
            $form[$field['name']] = $field['value'];
            if ($field['name'] == 'active' || $field['name'] == 'sticky') {
                continue;
            }
            if ($field['name'] == 'original') {
                //dodajemy rozszerzenie
                //pozycja ostatniej kropki w nazwie - rozszerzenie pliku
                $pointPosition = strrpos($record->name, '.');
                if ($pointPosition !== false) {
                    $form['original'] .= substr($record->name, $pointPosition);
                }
                $record->data->original = $form['original'];
                continue;
            }
            $record->data->{$field['name']} = $field['value'];
        }
        //próba zapisu postera
        if (isset($form['poster']) && $form['poster']) {
            $form['posterFileName'] = $this->_savePoster($form['poster'], $record);
        }
        unset($form['poster']);
        if ($record->data instanceof \Mmi\DataObject) {
            //czyszczenie nieprzesłanych checkboxów
            foreach (array_keys($record->data->toArray()) as $name) {
                //nie czyścimy postera jeśli był wgrany
                if ($name == 'posterFileName') {
                    continue;
                }
                if (!isset($form[$name])) {
                    $record->data->{$name} = null;
                }
            }
        }
        $record->active = isset($form['active']) ? $form['active'] : $record->active;
        $record->sticky = isset($form['sticky']) ? $form['sticky'] : $record->sticky;
        $record->original = isset($form['original']) ? $form['original'] : $record->original;
        if ($record->sticky) {
            $result = $record->setSticky();
        } else {
            $result = $record->save();
        }
        if ($result) {
            //jeśli wykonać operację po edycji
            if ($this->getPost()->afterEdit) {
                $this->_operationAfter($this->getPost()->afterEdit, $record);
            }
            return json_encode(['result' => 'OK']);
        }
        return $this->_jsonError(186);
    }
687741
public function getCMSFields()
    {
        $fields = parent::getCMSFields();

        $field = SortableUploadField::create('Images', _t('CarouselPage.db_Images'));
        $field->setFolderName($this->getClassFolder());
        $field->setFileEditFields('getCarouselEditFields');

        $root = $fields->fieldByName('Root');
        $tab = $root->fieldByName('Images');
        if (! $tab) {
            $tab = Tab::create('Images');
            $tab->setTitle(_t('CarouselPage.db_Images'));
            $root->insertAfter($tab, 'Main');
        }
        $tab->push($field);

        return $fields;
    }
360362
public function setAutoTagValue()
    {
        //brak rekordu
        if (!$this->_form->hasRecord()) {
            return $this;
        }
        //ustawianie wartości
        $this->setValue((new TagRelationModel($this->getOption('object') ? $this->getOption('object') : $this->_form->getFileObjectName(), $this->_form->getRecord()->getPk()))
                ->getTagRelations());
        //zwrot obiektu
        return $this;
    }
853553
public function map()
    {
        $column = array();
        foreach ($this as $record) {
            $key = reset($record);
            $val = next($record);
            $column[$key] = $val;
        }
        return $column;
    }
1083917
public static function getStructure()
    {
        $components = [
            'module' => [],
            'template' => [],
            'translate' => [],
            'filter' => [],
            'helper' => [],
        ];
        //vendors na koniec
        foreach (array_reverse(\Mmi\Mvc\StructureParser::getModules()) as $module) {
            $components = array_merge_recursive(self::_parseModule($module), $components);
        }
        return $components;
    }
311636
public function lock()
    {
        //wyszukiwanie blokady dla kategorii
        if (null === $lockRecord = (new CacheQuery)->findPk($lockKey = self::CACHE_PREFIX . $this->_categoryId)) {
            $lockRecord = new CacheRecord;
            $lockRecord->id = $lockKey;
            $lockRecord->data = true;
        }
        //brak możliwości założenia blokady
        if ($lockRecord->ttl > time()) {
            return false;
        }
        //zakładanie blokady
        $lockRecord->ttl = time() + self::LOCK_TIMEOUT;
        return $lockRecord->save();
    }
1272788
public function uploadAction()
    {
        $files = $this->getFiles()->toArray();
        //brak plików lub klasy
        $error = null;
        if (empty($files) || !isset($files['file']) || empty($files['file']) || !$this->class) {
            $error = 'Błąd: nie przesłano pliku';
        }
        //nieprawidłowy hash zabezpieczający
        if ($this->hash != md5($this->t . '+' . \Mmi\Session\Session::getId() . '+' . $this->class)) {
            $error = 'Błąd: nieprawidłowy hash';
        }
        //jeśli nie było błędu
        if ($error === null) {
            //dołączanie plików
            if (!\Cms\Model\File::appendFiles($this->object, $this->objectId, $files, $this->types ? $this->types : [])) {
                $error = 'Nieprawidłowy typ pliku';
            }
        }
        //rendering widgeta uploadera
        return $this->view->widget('cms', 'file', 'uploader', [
                'object' => $this->object,
                'objectId' => $this->objectId,
                'types' => $this->types,
                'error' => $error
        ]);
    }
943274
public function toArray()
    {
        //tworzy array z opcji
        $array = $this->_options;
        //dołącza joinowane tabele
        foreach ($this->_joined as $name => $value) {
            if ($value instanceof \Mmi\Orm\RecordRo) {
                $value = $value->toArray();
            }
            $array[$name] = $value;
        }
        //dołącza pola obiektu
        foreach ($this as $name => $value) {
            //tylko publiczne zmienne
            if (substr($name, 0, 1) == '_') {
                continue;
            }
            $array[$name] = $value;
        }
        return $array;
    }