Your IP : 216.73.217.117


Current Path : /var/www/v3.cesa.co.za/src/SessionsBundle/Services/
Upload File :
Current File : /var/www/v3.cesa.co.za/src/SessionsBundle/Services/SessionValuesManager.php

<?php

namespace App\SessionsBundle\Services;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Monolog\Logger;
use App\SessionsBundle\Entity\SessionValues;
use App\CoreBundle\Services\Utils;
use App\ContentBundle\Entity\Languages;

/**
 * Session values manager
 *
 * @author Otto Saayman <otto@igotafrica.com>
 * @package SessionsBundle
 * @subpackage LanguagePhrases
 * @version 0.0.1
 */
final class SessionValuesManager
{

    /**
     * Service Container
     * @var object
     */
    private $container = null;

    /**
     * Entity manager
     * @var object
     */
    private $em;

    /**
     * Current language
     * @var object
     */
    private $language;

    /**
     * Current language for admin site items create
     * @var object
     */
    private $languageForAdmin;

    /**
     * Settings
     * @var array
     */
    private $settings;

    /**
     * Symfony session
     * @var Object
     */
    private $sf_session;

    /**
     * Symfony session
     * @var Object
     */
    private $session;

    /**
     * Class construct
     *
     * @param  ContainerInterface $container
     * @param  Logger             $logger
     * @return void
     */
    public function __construct(
        ContainerInterface $container
    ) {
        $this->setContainer($container);
        $this->setEm($container->get('doctrine')->getManager('default'));

        return;
    }

    /**
     * Get Container
     *
     * @return ContainerInterface $container
     */
    public function getContainer()
    {
        return $this->container;
    }

    /**
     * Set Container
     *
     * @param  ContainerInterface $container
     * @return void
     */
    public function setContainer($container)
    {
        $this->container = $container;
    }

    /**
     * Get Entity Manager
     *
     * @return string
     */
    public function getEm()
    {
        return $this->em;
    }

    /**
     * Set Container
     *
     * @param  string $em
     * @return void
     */
    public function setEm($em)
    {
        $this->em = $em;
    }

    /**
     * Set Session
     *
     * @param  Session $session
     * @return void
     */
    public function setSession($session)
    {
        $this->session = $session;
    }

    /**
     * Save session values object
     *
     * @param SessionsBundle:SessionValues $sessionValues
     * @return void
     */
    public function save($sessionValues)
    {

        if ($this->getEm()->isOpen()) {
            $this->getEm()->persist($sessionValues);
            $this->getEm()->flush();
        }

        return;
    }

    /**
     * Get Language
     *
     * @return string
     */
    public function getLanguage($cultureString = 'en_US')
    {

        if (is_object($this->language)) {
            return $this->language;
        }

        if (!is_object($this->session)) {
            $this->session = $this->getContainer()->get('sessions.manager')->getSession();
        }

        if (strlen($cultureString) > 0) {
            $this->language = $this->em->getRepository(Languages::class)->findOneBy(array('culture_string' => $cultureString));
        } else {
            $languageId = $this->getValue(array('session' => $this->session, 'value_name' => 'language_id'));

            if (strlen($languageId) > 0) {
                $this->language = $this->em->getRepository(Languages::class)->find($languageId);
            } else {

                $systemSettingManager = $this->getContainer()->get('system_setting.manager');
                $languageId = $systemSettingManager->getSetting('default_language');

                $this->language = $this->em->getRepository(Languages::class)->find($languageId);
            }
        }

        if (!is_object($this->language)) {
            //If not language found, find the en_US one
            $this->language = $this->em->getRepository(Languages::class)->findOneBy(array('culture_string' => 'en_US'));
        }

        if (is_object($this->language) && is_object($this->session)) {
            //&& php_sapi_name() != 'cli'
            $this->setValue(array('value_name' => 'language_id', 'value' => $this->language->getId(), 'session' => $this->session));
        }

        return $this->language;
    }

    /**
     * Get Language
     *
     * @return string
     */
    public function getLanguageForAdmin()
    {

        if (is_object($this->languageForAdmin)) {
            return $this->languageForAdmin;
        }

        if (!is_object($this->session)) {
            $this->session = $this->getContainer()->get('sessions.manager')->getSession();
        }

        $languageId = $this->getValue(array('session' => $this->session, 'value_name' => 'language_for_admin_id'));

        if (strlen($languageId) > 0) {
            $this->languageForAdmin = $this->em->getRepository(Languages::class)->find($languageId);
        } else {

            $systemSettingManager = $this->getContainer()->get('system_setting.manager');
            $languageId = $systemSettingManager->getSetting('default_language');

            $this->languageForAdmin = $this->em->getRepository(Languages::class)->find($languageId);
        }

        if (is_object($this->languageForAdmin)) {
            $this->setValue(array('value_name' => 'language_for_admin_id', 'value' => $this->languageForAdmin->getId()));
        }

        return $this->languageForAdmin;
    }

    /**
     * Get Language
     *
     * @return string
     */
    public function getValueObject($params)
    {

        if (!is_object($this->session)) {
            $this->session = $this->getContainer()->get('sessions.manager')->getSession();
        }

        if (!isset($params['session'])) {
            $params['session'] = $this->session;
        }

        if (!is_object($params['session'])) {
            return new SessionValues();
        }

        if ((!isset($params['value_name'])) || (strlen($params['value_name']) <= 0)) {
            return new SessionValues();
        }

        $return = $this->em->getRepository(SessionValues::class)->findOneBy(array('sessions' => $params['session'], 'value_name' => $params['value_name']));

        if (!is_object($return)) {
            $return = new SessionValues();
        }

        return $return;
    }

    /**
     * Get Language
     *
     * @return string
     */
    public function getValue($params, $forceDB = false)
    {

        if (is_null($this->sf_session)) {
            $this->sf_session = $this->getContainer()->get('sessions.manager')->getSfSession();
        }

        //        echo 'session in parameters? ' . is_object($params['session']);
        //        exit;

        $sessionId = '-';

        if (isset($params['session']) && is_object($params['session']) && !empty($params['session']->getId())) {
            $this->session = $params['session'];
            $sessionId = $this->session->getId();
        }

        $settingsMCD = unserialize($this->getContainer()->get('system_setting.manager')->getMemCachedValue('session_value_array_' . $sessionId, serialize(array())));
        //        echo count($settingsMCD) . ' ';

        if (is_array($settingsMCD) && count($settingsMCD) > 0) {
            $this->settings = $settingsMCD;
        }

        if (isset($this->settings[$params['value_name']]) && !empty($this->settings[$params['value_name']]) && !$forceDB) {
            return $this->settings[$params['value_name']];
        }

        if (is_object($this->sf_session)) {
            $this->settings[$params['value_name']] = $this->sf_session->get($params['value_name']);
        }

        if (isset($this->settings[$params['value_name']]) && !empty($this->settings[$params['value_name']]) && !$forceDB) {
            return $this->settings[$params['value_name']];
        }

        $sessionValue = $this->getValueObject($params);

        if (!is_object($sessionValue)) {
            $sessionValue = $this->getContainer()->get('session_text_values.manager')->getValueObject($params);
        }

        if (!is_object($sessionValue)) {
            $this->settings[$params['value_name']] = '';

            if (isset($params['default'])) {
                $this->settings[$params['value_name']] = $params['default'];
            }

            return $this->settings[$params['value_name']];
        }

        $this->settings[$params['value_name']] = $sessionValue->getValue();
        $this->getContainer()->get('system_setting.manager')->setMemCachedValue('session_value_array_' . $sessionId, serialize($this->settings));

        return $this->settings[$params['value_name']];
    }

    /**
     * Set Value
     *
     * @param  array $params
     * @return void
     */
    public function setValue($params)
    {

        if (isset($params['session']) && is_object($params['session']) && !empty($params['session']->getId())) {
            $this->session = $params['session'];
        }

        if (!is_object($this->session)) {
            $this->session = $this->getContainer()->get('sessions.manager')->getSession();
        }

        if (!isset($params['session']) || !is_object($params['session']) || empty($params['session']->getId())) {
            $params['session'] = $this->session;
        }

        if (!is_object($params['session'])) {
            return;
        }

        if ((!isset($params['value_name'])) || (empty($params['value_name']))) {
            return;
        }

        if ((!isset($params['value'])) || (empty($params['value']))) {
            $params['value'] = '';
        }

        if (strlen($params['value']) > 254) {
            return $this->getContainer()->get('session_text_values.manager')->setValue($params);
        }

        $settingsMCD = unserialize($this->getContainer()->get('system_setting.manager')->getMemCachedValue('session_value_array_' . $params['session']->getId(), serialize(array())));
        //        echo count($settingsMCD) . ' ';

        if (is_array($settingsMCD) && count($settingsMCD) > 0) {
            $this->settings = $settingsMCD;
        }

        $sessionValue = $this->getValueObject($params);
        //        echo ' ' . $params['session']->getSymfonyCookie() . ' ready to save value ';
        //        exit;
        $sessionValue->setSessions($params['session']);
        $sessionValue->setValueName($params['value_name']);
        $sessionValue->setValue($params['value']);

        if ($sessionValue instanceof SessionValues) {
            $this->save($sessionValue);
        } else {
            $this->getContainer()->get('session_text_values.manager')->save($sessionValue);
        }

        //        $this->getEm()->refresh($sessionValue);

        if (is_null($this->sf_session)) {
            $this->sf_session = $this->getContainer()->get('sessions.manager')->getSfSession();
        }

        if (is_object($this->sf_session)) {
            $this->sf_session->set($params['value_name'], $params['value']);
        }

        $this->settings[$params['value_name']] = $sessionValue->getValue();
        $this->getContainer()->get('system_setting.manager')->setMemCachedValue('session_value_array_' . $params['session']->getId(), serialize($this->settings));
    }

    /**
     * Archive session value data
     *
     * @param array $sessionIds
     * @param string $monthName
     * @return void
     */
    public function archiveSessionValues($sessionIds, $monthName)
    {

        if (count($sessionIds) <= 0) {
            return;
        }

        $this->getEm()->getConnection()->getConfiguration()->setSQLLogger(null);

        $sessionValues = $this->em->getRepository(SessionValues::class)->findBySessionIds($sessionIds);
        $this->getContainer()->get('error_log.manager')->info('Rolling up session Values - Number of values: ' . count($sessionValues) . " - Month: " . $monthName);

        if (count($sessionValues) > 0) {

            $fileName = $this->getContainer()->get('kernel')->getRootDir() . '/../web/archives/';

            if (!is_dir($fileName)) {
                mkdir($fileName, 0777);
            }

            $fileName .= 'session-values-' . $monthName . '.csv';

            if (file_exists($fileName)) {
                unlink($fileName);
            }

            $stream = fopen($fileName, 'w');
            fputcsv($stream, array_merge(array_keys($sessionValues[0])));

            foreach ($sessionValues as $sessionValue) {
                fputcsv($stream, Utils::formatArrayCsv($sessionValue));
            } //foreach

            fclose($stream);

            $deleteQuery = "DELETE FROM session_values WHERE session_id IN ('" . implode("', '", $sessionIds) . "')";
            $this->getContainer()->get('error_log.manager')->info('Deleting session values');

            $this->getEm()->getConnection()->exec($deleteQuery);

            //            $statement = $this->getEm()->getConnection()->prepare($deleteQuery);
            //            $statement->execute();
            //            try {
            //                $result = $statement->fetchAll();
            //            } catch (\PDOException $ex) {
            //            }
            //            $statement->closeCursor();

            $this->getEm()->flush();

            echo $fileName . ' - ' . count($sessionValues) . " - " . $monthName . "\n";
        } //count($oldSessions) > 0
    }
}