Задать вопрос
  • Как организовать процесс разработки сайтов на Wordpress?

    Не занимаюсь сейчас подобной разроботкой (клиенты, ftp, итп). Ведем большой проект, работаем в команде, юзаем git. Локальный репозиторий у каждого на компьютере + git + сервер (live,dev) + gitosis (похоже на habrahabr.ru/post/75990/, если не идентично, т.к. по ней впервые настраивал).

    Разумеется, супер удобно для разработки, но не очень - для хотфиксов. Тут, пожалуй, нет одного конца у палки... Если набирается более или менее большое кол-во фиксов (что повлечет много измененных файлов) - целесообрано юзать git. Если это 1-2-5 мелких правок проще на ftp, а потом просто слить себе всю тему/плагин на локаль и продолжать разработку.

    Стоит отметить, что для организации git-репозитория на сервере, Вам понадобится root (иначе не представляю возможным поставить сам git + точно не уверен, как удастся настроить доступ к репозиторию именно для Вас), а не каждый заказчик, на мой взгляд, готов взять хотя бы vps, только для того, чтобы Вам было удобнее файлики сохранять.

    Безусловно, если Вы все делаете на своем сервере - будет лучше юзать гит...

    Но опять-таки, если найдете конец у палки :)

    С удовольствием поделюсь своим опытом детальнее, если это нужно.

    P.S. Недавно надо было жене сайт по-быстрому развернуть (визиточка, для работы) - гит не юзал, правил через SFTP в Sublime, хоть и разместил его на своем сервере (где есть и гит и гитосис).
    Ответ написан
    2 комментария
  • Существует ли какой-то готовый поисковый движок по MS SQL Server базе?

    Могу порекомендовать sphinx. Отличная документация, есть поддержка mssql, есть стеммеры, есть мануал от Аксенова, как учитывать опечатки, делать подсказки итп. Убежден, что можно многое допилить.

    UPD: Но, это не внутреннее решение под mssql, а все же сторонний поисковый движок.
    Ответ написан
    Комментировать
  • Как исправить ошибку "На этой странице обнаружена циклическая переадресация"?

    Действительно, трудно понять, где подвох.

    Рекомендую вместо header() заюзать exit(), таким образом увидете, какой редирект срабатывает и можно будет уже разбираться в конкретном месте.

    На первый взгляд, похоже, что лажает
    if($forum_type['alliance'] != $session->alliance){
            header("Location: ".$_SERVER['PHP_SELF']);
    }

    т.к. не вижу, где устанавливает $session->alliance, но это может быть не так. Дебажьте :)
    Ответ написан
    Комментировать
  • Как использовать объект как поле класса в php?

    Сделать родиельский класс, в котором будут грузиться классы для БД, сессии итп в его свойства.

    Затем, при создании новых классов екстендить родительский, например:
    class MainLogic {
    	protected $db;
    
    	function __construct() {
    		$this->db = new DB('login', 'pass', 'database'); // получаем инстанс, короче
    	}
    
            function testDb() {
                 $this->db->query('...'); // will work! 
           }
    
    }
    
    class User extends MainLogic {
    	
    	public function addUser() {
    		$this->db->query(''); // also will work, тут уже это св-во есть, тк мы его пронаследовали от MainLogic
    	}
    
    }


    P.S. Если класс с логикой только один (что, в большинстве случае, также не может быть правильно) - то просто в __constuct присваивайте $this->db ссылку на класс базы и из методов MainLogic обращайтесь через $this->db.
    P.P.S. Не знаю, какой класс для работы с БД юзаете Вы, но для этих дел уже есть ActiveRecord, например.
    Ответ написан
  • Как создать личный счет пользователя в wordpress или как организовать продажи между юзерами?

    Немного погуглил, есть вариант woocommerce + wp user frontend pro, но мне кажется, что все равно прийдется много допиливать.

    На мой взгляд, лучше выбрать другую cms или же писать с нуля.
    Ответ написан
    1 комментарий
  • Как определить php_value upload_max_filesize функциями PHP?

    По идее, если нет прав переопределить это с помощью htaccess, то и с ini_set толку не будет.
    Ответ написан
    Комментировать
  • Как добавить новый объект в jquery-массив после ajax-вставки?

    Поддерживаю вариант @itspers.

    Не знаю, как обстоят дела с on, но раньше использование live считалось не самой лучшей практикой. Альтернатива - обновлять $coversSet onSuccess ajax-а. Т.е. как-то так:
    var $coversSet = $('#building_views').find("input[id$='is_cover']");
    
    $.ajax({
        // url, data, type, etc
        success : function(result) {
             $coversSet = $('#building_views').find("input[id$='is_cover']");
        }
    });


    Если же это какой-то виджет и явного $.ajax() нет, надо подобрать соотв. хук.
    Ответ написан
    Комментировать
  • Как в MYSQL реализовать объединение колонок и строк?

    Не имею возможности потестить. На мой взгляд, должно выйти что-то типа такого:

    SELECT o.orderid, o.customer_data, o.time, o.sum, GROUP_CONCAT(CONCAT_WS(':', oi.name, oi.price, oi.count) SEPARATOR '|') as items 
    FROM orders o
    JOIN orders_items oi ON oi.orderid=o.orderid
    GROUP BY o.orderid

    Фокус в том, что мы делаем GROUP_CONCAT строки, которую возвращает CONCAT_WS. Ну и "+" для корерктной работы GROUP_CONCAT необходимо по какому-то полю делать GROUP BY.
    Ответ написан
    1 комментарий
  • Где найти плагин для Wordpress для постинга в общий блог?

    Несколько лет назад стояла похожая задача, многое надо было допиливать, реализация практически полностью руками получилась.

    Сейчас вот немного погуглил: wordpress.org/plugins/wp-user-frontend. Оно?

    Времена меняются :)
    Ответ написан
    1 комментарий
  • Какой выбрать планировщик задач под Windows 7?

    В windows ведь есть свой встроенный планировщик задач. Толком не пользовался им, но запускать песню в itunes в 10 утра удавалось :)

    Первый линк с гугла по запросу "Планировщик задач Windows 7": technet.microsoft.com/ru-ru/library/cc721931.aspx

    Как вариант - сделать bat-файл (ну или же какой-то главный скрипт на пайтоне), который будет запускаться раз в минуту, проверять все необходимые условия (изменился ли файл, наступило ли время, включился ли компьютер :)) и запускать нужный py скрипт.
    Костыль предлагаю на случай, если назначить все необходимые условия через стандартный функцонал планировщика не удастся.
    Ответ написан
    Комментировать
  • Итерация javascript объекта с разбивкой на группы по N элементов?

    Добрый день!

    Мне кажется, что получился некий каламбур. Не совсем пойму: каждый проект делится на страницы или же на страницах выводятся проекты?

    Исходя из Вашего кода, можно сделать вывод, что происходит и то, и то, что невозможно :)

    Также, хочу заметить, что не имел дел с этим шаблонизатором, но, на мой взгляд, должно выйти что-то в духе:
    - var projects = getCollection('projects').toJSON()
    - var count = projects.length
    - var ppage = 16 // per page
    - var pages = Math.ceil(count / ppage)
    - var cpage = 1 // current page
    
    // добавляем пустые элементы в projects
    - if (count < ppage*pages)
    	- for (var n = count+1; n <= ppage*pages; n++)
    		projects[n] = null
    
    .entry-list
        each project, i in projects
        	- if (i == (1 + ppage * (cpage - 1)))	// 1,17,33,etc
            .entry-list-page.page$cpage				// не знаю, как вывести переменную
            // тут, возможно, нужен endif какой-то
    
            	- if (project != null)
                .hentry
                    a(href=project.url).entry-link
                        h3= project.title
                - else
                .hentry.empty


    Вместо добавления пустых элементо в projects можно было бы просто после each (когда он закончится уже) сделать еще for, который дописал бы "пустые" теги, но, насколько понимаю, этого сделать нельзя, т.к. див .entry-list-page.page2 будет закрыт внутри последней итерации each.

    Исходя из этого есть такой вариант еще:
    - var projects = getCollection('projects').toJSON()
    - var count = projects.length
    - var ppage = 16 // per page
    - var pages = Math.ceil(count / ppage)
    - var cpage = 1 // current page
    
    .entry-list
        each project, i in projects					// это подсмотрел на stackoverflow, должно возвращать индекс
        	- if (i == (1 + ppage * (cpage - 1)))	// 1,17,33,etc
            .entry-list-page.page$cpage				// не знаю, как вывести переменную
            // тут, возможно, нужен endif какой-то
    
                .hentry
                    a(href=project.url).entry-link
                        h3= project.title
    
                - if (i == count && count < ppage*pages)
                	- for (var n = count+1; n <= ppage*pages; n++)
                	.hentry.empty


    Извиняюсь, если мои идеи только запутают, но алгоритмически это должно работать.
    Необходимо пофиксить вывод переменной и проверить each.
    Ну и все прочие элементы синтаксиса :)
    Ответ написан
    Комментировать
  • Как получить имя caller класса PHP

    class ParentClass {
        function action() {
            echo get_class($this);
        }
    }
    Ответ написан
    Комментировать
  • Как написать скрипт оповещения смс-сообщением о новом видео на YouTube?

    Как-то так
    <?php
    
    function send_sms($to, $msg, $login, $password){
    	$u = 'http://www.websms.ru/http_in5.asp';
    	$ch = curl_init();
    
    	curl_setopt($ch, CURLOPT_HEADER, 0);
    	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    	curl_setopt($ch, CURLOPT_POST, 1);
    	curl_setopt($ch, CURLOPT_POSTFIELDS, 'Http_username='.urlencode($login). '&Http_password='.urlencode($password).  '&Phone_list='.$to.'&Message='.urlencode($msg));
    	curl_setopt($ch, CURLOPT_URL, $u);
    
     	$u = trim(curl_exec($ch));
     	curl_close($ch);
    
     	preg_match("/message_id\s*=\s*[0-9]+/i", $u, $arr_id );
     	$id = preg_replace("/message_id\s*=\s*/i", "", @strval($arr_id[0]) );
    
     	return $id;
    }
    
    // some defaults
    $url = 'https://gdata.youtube.com/feeds/users/USER/uploads'; //ссылка на канал
    
    $filename = './lastvideo.txt';
    $find = file_get_contents($filename);
    $find = !empty($find) ? $find : '<published>2014-01-26T04:00:00.000Z</published>'; //время публикации последнего видео на канале пользователя
    
    $mob = ''; //твой мобильный в формате +380123456789
    $login = ''; //твой логин на сервисе отправки смс
    $pass = '';//твой пароль на сервисе отправки смс
    
    // запрос к youtube
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11');
    curl_setopt($ch, CURLOPT_URL, $url);
    $page = curl_exec($ch);
    curl_close($ch);
    
    // parse
    if ($page == false) {
    	exit('Empty curl response.');
    }
    
    preg_match_all('/(<published>.*?<\/published>)/ui', $page, $matches);
    if (empty($matches[1])) {
    	exit('Empty parse results.');
    }
    
    if ($matches[1][0] != $find) {	// если новое видео вверху, то оно должно быть нулевым матчем, иначе - появилось что-то новое
    	file_put_contents($filename, $matches[1][0]); // пишем дату публикации нового видео, чтоб не было смс постоянно
    
    	$msg = 'You have a new video!!!';
    	//send_sms($mob, $msg, $login, $pass);
    }


    Сори, если чего не так, но идея такая же, как у @Medic84. Также, немного подправил код на мой вкус.

    Код не тестировал, проблемы могут быть в регулярке.
    Ответ написан
  • Есть ли скрипт для одновременного постинга в социальные сети?

    Если Вас интересует кросспостинг для определенной CMS — имеет смысл гуглить именно в этом контексте. Вариантов предостаточно.
    Если кросспост с самописа — тут тоже придется прийти к самописным решениям, думаю. Максимум того, что вы сможете найти — инкапсулированное решение, которое так или иначе придется интегрировать.

    Если речь идет не о кросспосте с некого ресурса в социалки, а «автономного» постинга — тут тоже вряд ли найдется решение для разных платформ. Точно есть решения для ВК (и не одно). В основном там настраивается плановый постинг.

    Проблема в том, что «импортные» разработки не берут во внимание ВК, одноклассники зачастую.

    Поэтому варианты следующие:
    * самопис
    * разные сервисы для разных сервисов :)
    * использовать какую-то CMS, для которой есть лучшее решение (думаю, этой cms мог бы стать wordpress, как претендент на звание «cms с лучшей комьюнити»)

    А вообще, исходя из моих познаний в SMM — вряд ли стоит «в лоб» кросспостить одинаковые посты в разные социалки, т.к. контент каждой публикации должен обуславливаться в первую очередь аудиторией, а в ВК/одноклассники/FB — она, как ни крути, разная.
    Ответ написан
    Комментировать
  • На чём лучше делать информационную систему в компании?

    По поводу оценки ресурсов — имеет смысл прикинуть кол-во и сложность основных модулей и считать исходя из них. Думаю, вашего опыта должно быть достаточно. Полученный результат имеет смысл сразу умножить на 1.2-1.5.

    Точно так же с деньгами — время умножаем на среднерыночную стоимость (допустим, из расчета 10-12 долл/час). И тоже умножаем на 1.2 :)
    Ответ написан
    Комментировать
  • На чём лучше делать информационную систему в компании?

    Ничего сложного в ТЗ не увидел. Пользователи, проекты, каталог. Немного не понял момент распределения товаров, но, думаю, тут тоже ничего сложного.

    Исходя из моего «бэкграунда» — codeigniter пойдет (как я понял, Вы ориентируетесь на PHP).

    Можно попытаться подпилить какое-то готовое решение системы проект-менеджмента, но в этом вопросе не подскажу, т.к. люблю redmine, а он на ruby. Каталога товаров там нет никакого, но зато есть весь остальной функционал.

    Если вернуться к идее самописа — повторюсь, ничего сложного не вижу. Идеальным решением, думаю, будет выбрать легкий движок проект-менеджмента и допилить тему с товарами и их статусами (фактически, каждый товар — это подзадача, если уж очень грубо прикинуть). В терминологии redmine — это может быть связанной задачей.

    Например, есть некий проект «новогодняя акция ШОКОЛАДКА И УТЮГ В ПОДАРОК» (контекста не знаю, привожу лишь вымышленный пример). В таком случае связанными задачами будет «закупить шоколадки», «закупить утюги». У каждой из задач покупки будет описание и статусы (закуплено полностью, итп). Вот и все :)

    Т.е. мое предложение — провести ресерч по готовым предложениям и прикинуть сложность доработки. Если найдется вариант, в котором есть типизированные задачи, то сделать тип задач «закупка» должно быть не трудно.

    По трудозатратам с нуля 1-1.5 (вся авторизация с правами доступа, проекты, каталог). Это пессимистичный расчет. На рынке фриланса можно найти и более быстрые решения, думаю.
    Ответ написан
    2 комментария
  • Зачем нужна stage area в Git?

    Думаю, ответ немного банален — чтобы можно было выбирать, какие файлы включать в коммит.

    Из практики — чаще всего случается git commit -am "...", уже до автоматизма дошло. Т.е. смотрю статус, если есть новые — добавляю, и затем коммит с флагом -a. Но это у меня. Т.к. в моем случае git по большей мере нужен для коммандной работы — сам контроль версий не особо использую. Если нужно балансировать между версиями — используются бранчи.

    Тем не менее, если действительно относиться к каждому коммиту, как к стабильной версии для продакшна, то может понадобиться именно такой подход. В этом случае как раз таки staging area и играет роль черновика, из которого можно включить те или иные файлы.

    Опять таки, из практики — порой удобно бывает закоммитить определенный файл в случае с хотфиксами.
    Ответ написан
    6 комментариев