• Как управлять фоновыми rake task'ами из админки?

    viktorvsk
    @viktorvsk
    Решение в лоб - сделать новую сущность, типа RakeTaskManager
    Запускаются и обрубать таски из админки. При запуске в базу пишется активный статус. при выключении - неактивный.
    Можно писать в базу айди процесса, а там уже пусть менеджер процессов какой-нибудь разбирается
    Возможно, есть решения лучше, но тогда условия надо конкретней

    P.S.
    Вообще посмотрите в сторону God, Monit. Возможно, вам что-то подойдет. Возможно, есть готовые решения с веб-интерфейсом.
    Ответ написан
    Комментировать
  • Как правильно организовать обработку ошибок на PHP?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    В дополнение к предыдущим ответам, познайте замечательный Monolog
    Ответ написан
    1 комментарий
  • Как правильно организовать обработку ошибок на PHP?

    miraage
    @miraage
    Старый прогер
    Например.

    <?php
    
    // Any expression you want
    define('IN_DEV', $_SERVER['REMOTE_ADDR'] === '127.0.0.1');
    
    error_reporting(-1);
    ini_set('display_errors', IN_DEV);
    
    /**
     * Error handler
     *
     * @param int $severity Errno
     * @param string $msg Errstr
     * @param string $file Errfile
     * @param int $line Errline
     * @throws ErrorException
     */
    function errhandler($severity, $msg, $file, $line)
    {
        if (error_reporting() & $severity) {
            throw new ErrorException($msg, 0, $severity, $file, $line);
        }
    }
    
    /**
     * Exception handler
     *
     * @param Exception $e
     */
    function exceptionHandler($e)
    {
        if (IN_DEV) {
            // show error for developer
            echo $e->getMessage(), '<pre>', $e->getTraceAsString(), '</pre>';
        } else {
            // log error
            // file, database, whatever
        }
    }
    
    set_error_handler('errhandler', error_reporting());
    set_exception_handler('exceptionHandler');
    Ответ написан
    1 комментарий
  • В файле .tpl не работает код php

    Переименовать файлы *.tpl в *.tpl.php (более надежно, будет работать везде, где есть PHP) и/или файл .htaccess в корневом каталоге:

    AddHandler application/x-httpd-php .php .tpl
    Ответ написан
    1 комментарий
  • Как реализовать передачу двух параметров ($id) на другую страницу?

    WooDFox
    @WooDFox
    <input type='checkbox' name='prod[]' value='$id' >
    <input type='checkbox' name='prod[]' value='$id' >


    // Получаем массив элементов
    $prod = $_POST['prod'];
    // $prod - это массив со всеми отмеченными элементами
    // Его можно обработать, например, так:
    foreach ($prod as $item) {
         echo $item;
    }


    Если вам обязательно надо получить два поля, надо изменять обработку в JS

    UPDATE: Source
    <?php
    			if (!empty($_POST['prod'])) {
    				// Получаем массив элементов
    				$prod = $_POST['prod'];
    				// $prod - это массив со всеми отмеченными элементами
    				// Его можно обработать, например, так:
    				echo 'Recieved: '.implode(', ', $prod).'<br />';
    				
    				exit();
    			}
    ?>
    
    <!DOCTYPE html>
    <html>
    	<head>
    		<meta http-equiv="content-type" content="text/html; charset=utf-8" />
    	</head>
    	<body>
    		<form method="post" action="" onsubmit="send(this); return false;">
    			<input type='checkbox' name='prod[]' value='value1' /><br />
    			<input type='checkbox' name='prod[]' value='value2' /><br />
    			<input type='checkbox' name='prod[]' value='value3' /><br />
    			<input type='checkbox' name='prod[]' value='value4' /><br />
    			<br />
    			<input type="submit" value="Отправить" />
    		</form>
    		
    		<script src="http://code.jquery.com/jquery-1.11.1.min.js" type="text/javascript"></script>
    		<script>
    			function send (form) {
    				var count = $(form).find(':checked').length;
    				if (count == 2) {
    					var prods = $(form).serialize();
    					$.ajax({
    						type: "POST",
    						url: "toster.php",
    						data: prods,
    						success: function (html) { $("body").append(html); }
    					}); 
    				} else if (count > 2) {
    					alert('Много выделено');
    				} else {
    					alert('Мало выделено');
    				}
    			}
    		</script>
    	</body>
    </html>
    Ответ написан
    9 комментариев
  • Как красиво решить это с помощью ООП?

    akubintsev
    @akubintsev
    Опытный backend разработчик
    interface StorableMaterial
    {
        public function save();
    }
    
    class Material implements StorableMaterial
    {
        public function save()
        {
            // ...
        }
    }
    
    class SuperMaterial implements StorableMaterial
    {
        public function save()
        {
            // ...
        }
    }

    А затем в нужно смотреть тот класс, откуда дергается метод save() и работать там с абстракцией в виде интерфейса SavableMaterial, а не конкретным классом
    Ответ написан
    3 комментария
  • Как красиво решить это с помощью ООП?

    @andfadeev
    www.startupfellows.ru - поиск людей в стартапы
    Код на джаве, но суть ООП одна и та же. Материал это интерфейс, конкретный материал - его реализация. В методы первого класса подаем интерфейс, дальше работает полиморфизм.

    class A {
    	void save(Material m) {
    		m.save();
    	}
    	void delete(Material m) {
    		m.delete();
    	}
    }
    
    
    interface Material {
    	void save();
    	void delete();
    }
    
    class MaterialNumberOne  implements Material  {
    	void save() {
    		//делаем что нужно для первого материала
    	}
    	void delete() {
    		//делаем что нужно для первого материала
    	}
    }
    
    class MaterialNumberTwo  implements Material  {
    	void save() {
    		//делаем что нужно для второго материала
    	}
    	void delete() {
    		//делаем что нужно для второго материала
    	}
    }
    
    
    // юзаем так
    public static void main(String[] args) {
    	Material m1 = new MaterialNumberOne();
    	Material m2 = new MaterialNumberTwo();
    
    	A a = new A();
    	a.save(m1);
    	a.delete(m1);
    	a.save(m2);
    	a.delete(m2);
    }
    Ответ написан
    1 комментарий
  • Как красиво решить это с помощью ООП?

    pavel_salauyou
    @pavel_salauyou
    Symfony2 & Angular разработчик
    наверно в вашем случае нужен паттерн проектирования Фабричный метод.

    class MaterialFactory 
    {
        public static function build($type)
        {
            // тут генерим путь до класса на основе его типа
            return new $className();
        }
    }
    
    class Material
    {
        public function save()
        {
            // тут свои действия
        }
    }
    
    class SuperMaterial
    {
        public function save()
        {
            // тут другие действия
        }
    }


    потом в вашем методе

    public function save($one,$type){
         $obj = MaterialFactory::build($type);
         $obj->save();
    }


    но схему можно ещё улучшить, всё зависит от текущего вашего кода
    Ответ написан
    2 комментария
  • Количество просмотров "поста"

    1. Заведите в модели Поста целочисленное поле :visitors.
    2. В контроллере постов сделайте как-то так:

    def show
    ...
    @post.increment(:visitors)
    @post.save
    ...
    end
    Ответ написан
    1 комментарий