intval($v[self::$ID]), 'name' => trim((string)$v[self::$NAME]), 'category_id' => intval($v[self::$CATEGORY]), 'pos' => intval($v[self::$POS]), 'target' => [ 'original'=>$v[self::$TARGET], 'period'=>[ 'day' => floor($per_day), 'week' => floor($per_day*7), 'month' => floor($per_day*$days_in_month), 'year' => floor($per_day*$days_in_year), ] ], 'target_period' => intval($v[self::$TARGET_PERIOD]), 'state' => intval($v[self::$STATE]), 'pause' => intval($v[self::$PAUSE]), 'pause_start' => intval($v[self::$PAUSE_START]), 'begin' => intval($v[self::$BEGIN]), 'favorite' => boolval($v[self::$FAVORITE]), 'archive' => boolval($v[self::$ARCHIVE]), 'is_before_comment' => boolval($v[self::$IS_BEFORE_COMMENT]), 'is_after_comment' => boolval($v[self::$IS_AFTER_COMMENT]), ]; } static function toggleFavorite($id){ $id = intval($id); $C = self::getByID($id); self::updateById($id,[ self::$FAVORITE => boolval($C[self::$FAVORITE]) ? 0 : 1, ]); } static function pause($id) { $id = intval($id); $C = self::getByID($id); switch ($C[Action::$STATE]) { case eActionState::PLAY: Action::updateById($id,[ Action::$STATE => eActionState::PAUSE, Action::$PAUSE_START => time(), ]); break; } } static function start($id) { $id = intval($id); $C = self::getByID($id); switch ($C[Action::$STATE]){ case eActionState::PAUSE: Action::updateById($id,[ Action::$STATE => eActionState::PLAY, Action::$PAUSE => $C[Action::$PAUSE] + (time() - $C[Action::$PAUSE_START]), ]); break; case eActionState::STOP: Action::updateById($id,[ Action::$STATE => eActionState::PLAY, Action::$BEGIN => time(), ]); break; } } static function stop($id){ $res = null; $id = intval($id); $C = self::getByID($id); Action::updateById($id,[ Action::$STATE => eActionState::STOP, Action::$BEGIN => 0, Action::$PAUSE => 0, Action::$PAUSE_START => 0, ]); $end = time(); $duration = 0; $pause_duration = 0; switch ($C[Action::$STATE]) { case eActionState::PLAY: $duration = $end - $C[Action::$BEGIN]; $pause_duration = $C[Action::$PAUSE]; break; case eActionState::PAUSE: $pause_duration = $C[Action::$PAUSE] + ($end - $C[Action::$PAUSE_START]); $duration = $end - $C[Action::$BEGIN] - $pause_duration; break; } switch ($C[Action::$STATE]) { case eActionState::PLAY: case eActionState::PAUSE: $history = [ History::$ACTION => $C[Action::$ID], History::$BEGIN => $C[Action::$BEGIN], History::$END => $end, History::$DATE_BEGIN => date('Y-m-d', $C[Action::$BEGIN]), History::$DATE_END => date('Y-m-d', $end), History::$DURATION => $duration, History::$PAUSE => $pause_duration, ]; $res = History::insert($history); break; } return $res; } static function getByProfile($pid,$isAssoc = true){ $pid = intval($pid); return self::select([ \Query::WHERE => new \Where( \Where::_operator(self::$PROFILE,'=',$pid) ) ],$isAssoc); } static function getMyActive($isAssoc = true){ return self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$PROFILE,'=',PID), \Where::_in(self::$STATE,[eActionState::PLAY,eActionState::PAUSE]), \Where::_operator(self::$ARCHIVE,'=',0), ])) ],$isAssoc); } static function getMyFavorite($isAssoc = true){ return self::select([ \Query::WHERE => new \Where(\Where::_and([ \Where::_operator(self::$PROFILE,'=',PID), \Where::_operator(self::$FAVORITE,'=',1), \Where::_operator(self::$ARCHIVE,'=',0), ])) ],$isAssoc); } static function pauseMyAll(){ $a = self::getMyActive(); foreach ($a as $v){ self::pause($v[self::$ID]); } } static function stopMyAll(){ $a = self::getMyActive(); foreach ($a as $v){ self::stop($v[self::$ID]); } } static function startMyAll(){ $a = self::getMyActive(); foreach ($a as $v){ self::start($v[self::$ID]); } } static function startMyAllFavorite(){ $a = self::getMyFavorite(); foreach ($a as $v){ self::start($v[self::$ID]); } } static function archiveByID($id){ $id = intval($id); self::stop($id); self::updateById($id,[ self::$ARCHIVE => 1, ]); } static function unzipByID($id){ $id = intval($id); self::updateById($id,[ self::$ARCHIVE => 0, ]); } static function removeByID($id) { $id = intval($id); self::stop($id); self::deleteByID($id); History::delete(new \Where(\Where::_operator(History::$ACTION,'=',$id))); } static function getMy(){ return self::getByProfile(PID); } static function getMyFormatted(){ $res = []; $a = self::getMy(); foreach ($a as $v){ $res[] = self::format($v); } return $res; } static function getByCategory($category_id,$isAssoc=true){ $category_id = intval($category_id); return self::select([ \Query::WHERE => new \Where( \Where::_operator(self::$CATEGORY,'=',$category_id) ) ],$isAssoc); } static function getByCategoryFormatted($category_id){ $res = []; $a = self::getByCategory($category_id); foreach ($a as $v){ $res[] = self::format($v); } return $res; } public static function getFormInputs(\ModuleBZ\Form &$form, array $data, $C, bool $isEdit) { $form ->addRow((new Row()) ->addColumn((new Text()) ->setClassAll('c-50') ->setPlaceholder("Введите название таймера") ->setLabel("Название таймера") ->setValue((string)$C[self::$NAME]) ->setName(self::$NAME) ) ->addColumn((new Select()) ->setClassAll('c-50') ->setOptions(Category::getMyFormatted()) ->setLabel('Категория таймера') ->setPlaceholder('Выберите категорию таймера') ->setValue($C ? $C[self::$CATEGORY] : intval($data['category_id'])) ->setName(self::$CATEGORY) ) ) ->addRow((new Row()) ->addColumn((new TimePicker()) ->setClassAll('c-1-4') ->setLabel("Цель") ->setValue($C ? (string)$C[self::$TARGET] : '01:00:00') ->setName(self::$TARGET) ) ->addColumn((new Select()) ->setClassAll('c-1-3') ->setLabel("Период цели") ->setValue($C ? intval($C[self::$TARGET_PERIOD]) : eTargetPeriod::WEEK) ->setOptions(eTargetPeriod::getNameList()) ->setName(self::$TARGET_PERIOD) ) ) /* ->addRow((new Row()) ->addColumn((new Switcher()) ->setClassAll('c-100') ->setPlaceholder("Запрашивать комменатрий при запуске таймера") ->setValue(boolval($C[self::$IS_BEFORE_COMMENT])) ->setName(self::$IS_BEFORE_COMMENT) ) ) ->addRow((new Row()) ->addColumn((new Switcher()) ->setClassAll('c-100') ->setPlaceholder("Запрашивать комменатрий при завершении таймера") ->setValue(boolval($C[self::$IS_AFTER_COMMENT])) ->setName(self::$IS_AFTER_COMMENT) ) ) /**/ ; } static function columnInfo() : array { return [ new C([ C::VAR_NAME =>&self::$ID, C::TYPE =>eColumnType::INT, C::AUTO_INCREMENT =>true, C::PRIMARY =>true, C::DEFAULT =>0, C::HIDDEN =>true, C::TH =>V::get(Vars::$ID), ]), new C([ C::VAR_NAME => &self::$NAME, C::TYPE => eColumnType::VARCHAR, C::LENGTH => 1023, C::TH => V::get(Vars::$NAME), ]), new C([ C::VAR_NAME => &self::$CATEGORY, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$TARGET, C::TYPE => eColumnType::TIME, ]), new C([ C::VAR_NAME => &self::$TARGET_PERIOD, C::TYPE => eColumnType::TINYINT, C::DEFAULT => eTargetPeriod::DAY, ]), new C([ C::VAR_NAME => &self::$PROFILE, C::TYPE => eColumnType::INT, C::DEFAULT => intval(PID), ]), new C([ C::VAR_NAME => &self::$POS, C::TYPE => eColumnType::INT, C::DEFAULT => time(), ]), new C([ C::VAR_NAME => &self::$STATE, C::TYPE => eColumnType::INT, C::DEFAULT => eActionState::STOP, ]), new C([ C::VAR_NAME => &self::$BEGIN, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$PAUSE, C::TYPE => eColumnType::INT, ]), new C([ C::VAR_NAME => &self::$PAUSE_START, C::TYPE => eColumnType::INT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$IS_BEFORE_COMMENT, C::TYPE => eColumnType::TINYINT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$IS_AFTER_COMMENT, C::TYPE => eColumnType::INT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$PORTAL, C::TYPE => eColumnType::INT, C::DEFAULT => intval(\Site::$portal_id), ]), new C([ C::VAR_NAME => &self::$ACCOUNT, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$ACCOUNT), C::DEFAULT => intval(\Site::$owner_id), c::HIDDEN=>true, ]), new C([ C::VAR_NAME => &self::$FAVORITE, C::TYPE => eColumnType::TINYINT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$ARCHIVE, C::TYPE => eColumnType::TINYINT, C::DEFAULT => 0, ]), new C([ C::VAR_NAME => &self::$CREATED, C::TYPE => eColumnType::INT, C::LENGTH => 11, C::TH => V::get(Vars::$CREATED), C::DEFAULT => time(), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$CREATED]);}, c::HIDDEN=>true, ]), new C([ C::VAR_NAME => &self::$UPDATED, C::TYPE => eColumnType::INT, C::DEFAULT => time(), C::TH => V::get(Vars::$UPDATED), c::FUNC_VALUE => function($v){return self::formatDate($v[self::$UPDATED]);}, c::HIDDEN=>true, ]), ]; } } new Action();