Задать вопрос
  • Как перейти по URL Java?

    nowm
    @nowm
    Можно воспользоваться методом encode класса URLEncoder. Только нужно не всю строку с адресом перегонять через encode, а только GET-переменные. Можно так сделать:

    try {
        Desktop d=Desktop.getDesktop();
    
        d.browse(new URI(
            String.format( 
                "http://www.google.ru/search?sourceid=chrome&ie=UTF-8&q=%s", 
                URLEncoder.encode( "запрос с кучей пробелов" , "UTF8" )
            )
        ));
    } catch (IOException ioe) {
        ioe.printStackTrace();
    } catch (URISyntaxException use) {
        use.printStackTrace();
    }
    Ответ написан
    4 комментария
  • Проблема с sql запросом (NOT IN)

    nowm
    @nowm
    Если у вас `usr-ex4-ids` — это строка, в которой через запятую перечислены идентификаторы, то неработающий запрос, после выполнения подзапроса, выглядит так:

    # . . .
    AND `ex4-id` NOT IN ("17,18,19,20")

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

    Есть несколько вариантов.

    1. Можно сделать дополнительную таблицу, в которую записывается соответствие ex4-id и user-id.

    CREATE TABLE `usr-ex4-ids` (
     `ex4-id` int(11) NOT NULL,
     `usr-id` int(11) NOT NULL,
     PRIMARY KEY (`ex4-id`,`usr-id`)
    )


    Далее эта таблица заполняется соответствующими значениями (один ex4-id на строку, а не перечисление ex4-id в одной строке через запятую). Итоговый запрос, который сейчас у вас не работает, будет выглядеть так:

    # . . .
    AND `ex4-id` NOT IN (SELECT `ex4-id` FROM `usr-ex4-ids` WHERE `usr-id` = 51)


    2. Можно попытаться сделать конвертацию строки в массив. Встроенных функций в MySQL для таких задач нет. Советую посмотреть комментарии пользователей к списку строковых функций MySQL — там есть несколько интересных решений (комментарии, как и положено комментариям, находятся в конце страницы).

    Но вообще, я советую первый вариант, так как он логичнее, проще и быстрее. По второму варианту вам скорее всего придётся собственные функции MySQL писать. И они будут работать гораздо медленнее, чем вариант с нормализацией БД.
    Ответ написан
    Комментировать
  • Стоит ли давать ссылку на свой профайл на фриланс биржах?

    nowm
    @nowm
    Огромное спасибо Службе психологической помощи «Тостера» за то, что помогли восстановить текст ответа, который я отправлял в дубликат этого вопроса.

    Я бы на вашем месте опасался не того, что кто-то из России что-то за уши притянет. Вы лучше позаботьтесь о том, чтобы у вас в стране вашего проживания всё было честно с законом и налогами. Или, во всяком случае, старайтесь не светиться сильно.

    Ситуация с налогами в России. Если вы уехали из России меньше, чем 180 дней назад, то всё равно должны платить налоги на любой доход. Как только пройдут 180 дней, вы освобождаетесь от уплаты налогов, полученных от нерезидентов РФ (тех, кто в России не живёт больше 180 дней, или вообще не имеет Российского гражданства). Но вы всё так же должны платить налоги на те суммы, которые вы получили от резидентов Российской федерации. Чтобы вас гарантированно не притянули за уши в России, постарайтесь не получать деньги из России.

    Следующий момент: практически в любой стране нужно разрешение на работу, и нужно платить налоги в этой стране. Если вы фрилансер, который зарабатывает через Интернет, вас тяжелее поймать за руку, по сравнению с нелегальным гидом или фотографом, но тоже возможно. Если вы упорно не хотите честно оформляться в стране проживания/нахождения, не хотите заморочки с оформлением всех пермитов и т.д., то рано или поздно можете поиметь проблемы. Если не будете сильно светить свою деятельность и расклеивать на улицах рекламу своих услуг, то будет больше шансов, что всё и дальше будет нормально.

    Просто не надейтесь, что в Юго-Восточной Азии умственно недоразвитые люди живут, которые не понимают, что доход полученный через Интернет — тоже доход. Я про Юго-Восточную Азию упоминаю потому, что фраза «Я в России не живу, следовательно, налоги не плачу» чаще всего встречается от тех людей, которые живут именно там.

    Так что (если вы больше полугода не были в России), замените слово «Россия» в вашем вопросе на название страны, где вы находитесь.
    Ответ написан
    8 комментариев
  • Почему получается неверный результат RegExp в javascript?

    nowm
    @nowm
    r.test("абвabc"), кстати, тоже покажет true. У вас регулярка написана так, что она возвращает true, если в строке есть хотя бы один символ из [A-Za-z0-9], но она совсем не запрещает использовать кроме разрешённых символов остальные. Если в куче неразрешённых символов будет хотя бы один разрешённый, она вернёт true. Нужно по краям регулярки добавить символы начала и конца строки:

    var r = new RegExp("^[A-Za-z0-9]+$");
    Ответ написан
    Комментировать
  • Почему не работает javascript, если к домену приписать "www.", и как выйти из положения?

    nowm
    @nowm
    Если вы посмотрите содержимое страницы, которая открывается с www, то в теге «BASE» будет прописан адрес без www. Это такая особенность опенкарта. В кнопке «заказать» адрес выглядит как «index.php?route=бла-бла-бла». Так как у этого адреса нет в начале знака «/», браузер возьмёт для построения полного адреса значение из BASE. Тогда получается, что на странице «http://www.site.ru» ссылка для кнопки «заказать» выглядит как «http://site.ru/index.php?route=бла-бла-бла». И это уже кросс-доменный запрос, который в вашем случае не работает.

    Как решение, все страницы должны открываться по одному домену. Нужно сделать перенаправление с www-адресов на адреса без www с помощью .htaccess.

    RewriteCond %{HTTP_HOST} ^www.site.ru
    RewriteRule (.*) http://site.ru/$1 [R=301,L]


    Это будет более простое решение, чем исправлять адреса в движке Opencart, так как я находил там около 90 адресов, которые в таком случае придётся править. Вы, допустим, правкой адреса поправите работу кнопки «заказать», но от этого не начнут работать кнопки «добавить в желаемое», «добавить в сравнение» и т.п. Там куча таких моментов. Так что, настройка перенаправления в .htaccess позволит решить сразу все эти проблемы.
    Ответ написан
    2 комментария
  • Как исправить некорректный редирект с www?

    nowm
    @nowm
    Вместо:
    RewriteCond %{HTTP_HOST} ^site.ru [NC]
    RewriteRule ^(.+[^/])$ http://www.site.ru/$1/ [QSA]
    redirect 301 /index.php/ http://www.site.ru


    Напишите:
    RewriteCond %{HTTP_HOST} ^site.ru
    RewriteRule (.*) http://www.site.ru/$1 [R=301,L]


    Только писать это желательно не в конце файла, а на следующей строке после после «RewriteBase /».

    Редирект у вас происходит из-за того, что строчкой «RewriteRule ^(.+[^/])$ www.site.ru/$1 [QSA]» вы указываете, что нужно по адресу без «www» показывать содержимое со страницы с «www». При этом, в этой строке речь не идёт вообще о редиректе, так как указан флаг «QSA», а не «R». А раз в этой строке ещё и нет дополнительного флага «L», выполнение не прекращается и начинает работать инструкция «redirect 301 /index.php/ http://www.site.ru», которая редиректит запрос в корень сайта.
    Ответ написан
  • CSS width - дробное число в пикселях возможно?

    nowm
    @nowm
    По стандарту, дробное число для пикселя можно использовать. Я указываю ссылку на версию CSS 2.1, так как в данный момент это действующая спецификация.

    The format of a length value (denoted by < length > in this specification) is a < number > (with or without a decimal point) immediately followed by a unit identifier (e.g., px, em, etc.). After a zero length, the unit identifier is optional.

    Субъективно, кому-то может это казаться странным, неподходящим или неприемлемым, но дробные значения px корректно обрабатываются браузерами, так как браузеры ориентируются на стандарты.
    Ответ написан
    1 комментарий
  • В какой программе рисуют подобные схемы?

    nowm
    @nowm
    Я не в курсе про амазоновские картинки, но иллюстрацию для блога про яндексовский кокаин делала Ольга Баранова. Возможно, есть смысл спросить лично у неё. www.behance.net/oriami1
    Ответ написан
    Комментировать
  • Как при установке CMS сделать следующее?

    nowm
    @nowm
    У вас в ответе сервера написано, что таблица уже существует. Вы пытаетесь создать таблицу post, но она уже есть.

    Нужно вместо CREATE TABLE posts писать CREATE TABLE IF NOT EXISTS `posts`.

    Везде, где есть CREATE TABLE, нужно писать CREATE TABLE IF NOT EXISTS. Эта инструкция указывает, что новую таблицу не нужно создавать, если она уже существует.

    Фишка с импортом состоит в том, что когда у вас появляется ошибка, исполнение скрипта останавливается. Если у вас есть CREATE TABLE `posts`, а после него идёт INSERT INTO `posts`, то выполнения INSERT не будет, потому что в момент CREATE TABLE произошла ошибка и работа скрипта сразу прекращается. Дополнительные директивы «IF NOT EXISTS» гарантируют, что шаг создания таблицы просто будет пропущен, если она уже есть. Просто будет пропущен — без прерывания работы скрипта.
    Ответ написан
  • Как передать значение переменной из php-скрипта в javascript?

    nowm
    @nowm
    Первый способ: Отдельный AJAX-запрос к PHP-файлу, который вернёт что-нибудь вроде JSON-данных, которые потом будут доступны из JS.

    Второй способ: В PHP-файле можно определить какую нибудь переменную во время генерации страницы, а потом из любых скриптов к ней обращаться. Например так:

    PHP-файл:
    <?php
    $a = 'text for js_variable';
    ?>
    <!DOCTYPE html>
    <html>
      <head>
        <script>
          //Определяется переменная, которая будет доступна для 
          // всех JavaScript, подключаемых на данной странице
          var js_variable = '<?php echo $a; ?>';
        </script>
        <!-- 
          В файле /scripts/myscript.js происходит обращение 
          к переменной js_variable 
        -->
        <script src="/scripts/myscript.js"></script>
      </head>
      <body>blah-blah-blah</body>
    </html>


    Файл /scripts/myscript.js:
    // Выскочит алерт с текстом «text for js_variable».
    alert(js_variable);


    Вот. В HEAD-части HTML-страницы вы определяете переменную, которая будет доступна для остального JS-кода. Главное — нужно её определять до того, как будут подключены скрипты, которые будут её использовать.

    Третий способ: Если ваш web-сервер — Apache, то можно добавить в .htaccess в корне сайта такие строки:
    AddType application/x-httpd-php .js
    AddHandler x-httpd-php5 .js
    
    <FilesMatch "\.js$">
    SetHandler application/x-httpd-php
    </FilesMatch>


    Тогда вы сможете прямо в JS-файлах выполнять PHP-код. Но выполняться он будет только в тех JS-файлах, которые находятся в папке с сайтом. Если будут загружаться скрипты со сторонних ресурсов, там PHP-код работать не будет.
    Ответ написан
    Комментировать
  • Как вырасти из верстальщика в JS-программиста?

    nowm
    @nowm
    «Гордое звание» — это когда есть награды, дипломы, сертификации и прочее. Вообще, к слову, я уже лет 5 пишу на PHP почти каждый день и всё равно не считаю себя программистом. Возможно, когда у меня будет диплом от Zend, я буду думать, что я что-то вроде программиста.

    Если вам шашечки нужны, то сдавайте всякие_сертификации, если же нужно ехать, то лучше просто писать код и не загоняться, гордое у вас звание или нет.

    Upd. А вообще, извините за ёрничество. Возможно вам помогут некоторые мысли на эту тему:

    Выражение «просто пиши код», на самом деле, — это квинтэссенция. Просто некоторым людям становится неохота несколько раз разными словами описывать одно и тоже, и родился такой концентрат — который, как Yupi, куда можно «просто добавить воды», и получится готовый продукт. По сути, большую часть советов можно свести к этой одной фразе [пиши код]. Можно (даже нужно) для развития прочитать кучу книжек, но если вы мысли из этих книг не оформите кодом, толка от этого развития не будет, и программистом вы не станете. Мышцы будут развиваться только в том случае, если вы их напрягаете, а не только читаете инструкции, как их правильно напрягать. Инструкции помогут это делать правильно, но без практики не будет никакого развития.

    Для постоянного развития нужен постоянный поток работы с новыми необычными заданиями. В веб-студиях обычно с новыми необычными заданиями очень туго бывает. Моё мнение, что долгая работа в веб-студии — дорога, которая убивает любознательность начисто. Через некоторое время работа становится настолько однотипной, что, кажется, можно бота написать, который будет за вас её делать. Новые задачи, которые напрягают мозги и не позволяют пользоваться готовыми решениями — очень хороший движитель, но за целый день делания однотипной работы в веб-студии, самостоятельно искать новые задачи становится неохота — всё же есть такая штука как оффлайн и, вообще, банальная усталость и тупиздняк от однотипной работы.

    Когда вы пользуетесь каким-нибудь готовым решением, полезно заглядывать к нему под капот. У меня примерно похожая история была с Opencart. Я в какой-то момент очень сильно начал загоняться процессами, происходящими на этапе инициализации движка и отдельными классами, входящими в его состав. В результате родилось решение, которое позволило использовать PDO, вместо mysql_*, при этом, оно хорошо работало на боевых серверах и не ломало модули, где использовался старый подход. По сути, особенно заметной разницы в быстродействии не стало, но лично для меня это был хороший буст. (Я потом ещё загнался тем, чтобы выдрать из опенкарта костяк и использовать его в качестве своеобразного бутстрапа, на котором можно собрать любой сайт. Вряд ли я всё это дело буду где-то публиковать и использовать, но, опять же, лично для меня это было полезным для развития процессом.)

    После того, как вы сделали работу, тысячу раз её перепроверьте и сделайте кучу ненужных замеров производительности и потребления ресурсов. Попробуйте всё это дело как-нибудь оптимизировать. Например, сдали работу — всех всё устраивает, денег заплатили и т.п. В этой ситуации нужно загнаться тем, чтобы снизить потребление памяти на 10% процентов. Никто не заметит, что вы огромную работу сделали, чтобы снизить потребление, но это будет лично для вас практика. Можно сделать какую-нибудь ненужную работу, вроде выкидывания из исходников jQuery всех функций, которые вы никогда не будете использовать. Или, наоборот, можно что-то своё добавить. По сути, постоянное развитие — это как жизнь киргизского комсомольца, который постоянно ищет себе проблемы, чтобы потом их героически преодолевать.

    А ещё... а ещё... У меня очень большая куча мыслей — я наверное когда-нибудь напишу книжку, чтобы все их аккуратно уложить в голове.

    Первый шаг, который нужно сделать: заняться каким-нибудь личным проектом, где вы сможете развивать свои навыки (и, даже, не обязательно его выпускать за пределы локальной машины). Что угодно. Например, калькулятор с какими-нибудь расширенными функциями. Тут как раз на вёрстку будет минимальный упор. В этом проекте нужно отказаться от использования любых сторонних библиотек и изобретать свои решения. Например, вам хочется делать выбор элементов из DOM простыми селекторами с синтаксисом, похожим на jQuery, смотрите, как это реализовано в jQuery и пишите с нуля свой аналог. Главное не копипастить, а писать самостоятельно. Пусть будет похоже, но будет не точная копия. Вы в процессе будете напрягать мозги и развиваться. Будете часто лазать в документацию по языку. У вас появится понимание не многочисленных фреймворков, а именно чистого нативного кода и функций. И мыслить вы начнёте не категориями «какую функцию jQuery можно использовать», а категориями «какой алгоритм сюда можно придумать».

    Это всё сравнимо с обычной грамотностью и умением выражать мысли — чтобы развиваться, нужно читать и писать. В любом случае, писать код всё равно придётся. Без этого программистом не станешь.
    Ответ написан
    4 комментария
  • Как называется подход, обеспечивающий работоспособность сайта с отключенным javascript?

    nowm
    @nowm
    Как один из вариантов, это называется Progressive enhancement (EN). На хабре ещё есть статья про такой подход.
    Ответ написан
    Комментировать
  • Связка Nginx+Apache. Странное поведение virtual hosts - почему?

    nowm
    @nowm
    Я сначала немного «теории» опишу, а в конце скажу, что в ваших конфигах нужно поправить.

    Вообще, у вас Apache не должен принимать никаких запросов от сторонних серверов. Связка Apache + Nginx делается потому, что Nginx очень хорошо отдаёт статичный контент, а Apache выигрывает в работе с PHP. К тому же, Apache даёт возможность использовать файлы .htaccess, которые позволяют очень гибко конфигурировать работу на уровне директорий одного сервера.

    Так вот. Суть связки Apache + Nginx в том, что Apache обрабатывается входящие запросы только от одного сервера. Обычно они оба ставятся на одной машине, и в этом случае Apache должен принимать запросы только от 127.0.0.1. Он не должен заботиться о том, чтобы обрабатывать имена dev1.site, dev2.site и так далее. Эта задача лежит на Nginx, который будет перенаправлять внешние запросы соответствующим образом.

    Для этого Apache конфигурируется таким образом, чтобы каждый его виртуальный хост слушал свой порт. Например, я строю всю систему таким образом, чтобы у меня было два сервера: task.site и dev.site. Для этого я делаю так:

    /etc/apache2/ports.com:
    NameVirtualHost 127.0.0.1:8080
    NameVirtualHost 127.0.0.1:8090
    Listen 127.0.0.1:8080
    Listen 127.0.0.1:8090


    Это значит, что у меня будет два инстанса, один из которых будет обслуживать имя dev.site, а другой — task.site (при этом, сам Apache как бы будет не в курсе, какой он домен обслуживает. Он знает только что запрос на порт 8080 нужно так обработать, а на 8090 — ещё как-то). Всё, что теперь от апача понадобится — сделать виртуальные хосты, чтобы определить папки, из которых будут вызываться скрипты для каждого из сайтов.

    /etc/apache2/sites-enabled/default.conf:
    <VirtualHost 127.0.0.1:8090>
    	. . .
    	DocumentRoot /usr/share/redmine/public
    	. . .
    </VirtualHost>
    <VirtualHost 127.0.0.1:8080>
    	. . .
    	DocumentRoot /var/www/dev.site
    	. . .
    </VirtualHost>


    Всё. Если запрос будет на 127.0.0.1:8080, то будут выполняться скрипты из папки /var/www/dev.site. Если на 127.0.0.1:8090, то — /usr/share/redmine/public. Сам Apache вообще не в курсе, какие он домены обслуживает, так как снаружи его не видно.

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

    /etc/nginx/sites-available/default.conf:
    server {
    	listen 80;
    	server_name dev.site;
    	server_name_in_redirect off;
    
    	location / {
    		proxy_pass http://127.0.0.1:8080/;
    		proxy_redirect off;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		client_max_body_size 10m;
    		proxy_connect_timeout 90;
    	}
    }
    
    server {
    	listen 80;
    	server_name task.site;
    	server_name_in_redirect off;
    	
    	location / {
    		proxy_pass http://127.0.0.1:8090/;
    		proxy_redirect off;
    		proxy_set_header Host $host;
    		proxy_set_header X-Real-IP $remote_addr;
    		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    		client_max_body_size 10m;
    		proxy_connect_timeout 90;
    	}
    }


    Как видно из листинга, он для dev.site делает proxy_pass http://127.0.0.1:8080/, а для task.siteproxy_pass http://127.0.0.1:8090/.

    Теперь о том, что нужно поправить в ваших конфигах. В апаче нужно все сервера раскидать по отдельным портам. Сначала нужно прописать NameVirtualHost и Listen для каждого из них. При этом, обязательно нужно указывать не *:8080 или *:8081, *:8082, а конкретно 127.0.0.1:8080, 127.0.0.1:8081 и т.п., потому что «*» позволяет делать прямые запросы с любой машины, а «127.0.0.1» разрешает принимать соединения только с localhost.

    То же самое — в блоках VirtualHost. Вместо <VirtualHost *:8080> нужно писать <VirtualHost 127.0.0.1:8080>

    Из блока VirtualHost нужно выкинуть ServerName и ServerAlias, так как всё это будет обрабатываться на уровне Nginx.

    В итоге вы получите такую ситуацию, что напрямую у вас sub.myhost.ru:8080 открываться не будет, так как Apache принимает запросы только от localhost. Он будет открываться только по запросу от Nginx, который будет определять какой сервер куда проксировать.

    В вашем конфиге Nginx вместо server_name *.myhost.ru; нужно писать полное имя хоста. И для каждого хоста нужно создать отдельный блок server {}.

    В конфигах Nginx ещё не забудьте приписать обработку статики (хотя у вас она и так прописана). Я из листинга этот момент выкинул, но его вообще нужно добавить, потому что одна из прелестей Nginx — как раз обработка статики. В каждый блок server {} можно добавить что-нибудь вроде:

    location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|js|pdf)$ {
    	root /var/www/dev.site;
    }


    И далее, если вы хотите добавить подсервер: создаёте виртуальный хост апача на свободном порту, а в Nginx добавляете для него блок server {}.

    В данный момент у вас просто небольшая каша получилась в конфигах.
    Ответ написан
    8 комментариев
  • Две линии в таблице, или что то мешает?

    nowm
    @nowm
    border-collapse применяется только к таблице. Или к любому элементу, у которого свойство display равно table. Оно указывает на то, что у всех дочерних элементов с display: table-cell границы будут склеиваться. Для всех остальных типов display это правило смысла не имеет.

    В вашем примере «a» — блочный элемент. Если вы хотите, чтобы не было двойной рамки в этой ситуации, нужно будет играть с margin, делая отрицательные отступы, чтобы рамки накладывались друг на друга.
    Ответ написан
    2 комментария
  • Как добавить комментарий любому файлу или папке в Windows 7?

    nowm
    @nowm
    В Total Commander есть поддержка подобных комментариев. Для их хранения в текущей папке создаётся файл descript.ion. Работает функция так:
    • Вы ставите курсор на файл, для которого нужно добавить комментарий и нажимаете Ctrl+Z. Открывается окно редактирования комментария — вводите нужную информацию и сохраняете.
    • Если (после сохранения комментария) навести курсор мыши на файл, созданный вами комментарий будет виден во всплывающей подсказке.
    • Комбинация клавиш Ctrl+Shift+F2 меняет набор колонок на текущей панели таким образом, что в одной из колонок отображаются комментарии.

    Всё это будет работать только внутри Total Commander. Увы, в Проводнике ничего появляться не начнёт. Не будет ни комментария во всплывающей подсказке, ни дополнительных колонок в табличном представлении.

    Если вы будете копировать файлы (для которых есть комментарии) с помощью Total Commander, то комментарий тоже скопируется (в целевой папке будет либо создан новый файл descript.ion, либо обновлён существующий). Если в TC создать комментарий к файлу, но скопировать файл с помощью Проводника, в новом месте комментарий к файлу потеряется, так как всё это работает только в рамках TC, и комментарий сохранится только если копировать/переносить в самом Total Commander.
    Ответ написан
    2 комментария
  • {Правая кнопка мыши}->{Создать}->"Как сюда надо добавить {Документ с расширением .xml}"?

    nowm
    @nowm
    Можно создать файл с расширением .reg и добавить туда такой код:

    Windows Registry Editor Version 5.00
     
    [HKEY_CLASSES_ROOT\.xml\ShellNew]
    "NullFile"=""


    После этого запустите REG-файл. Данные добавятся в реестр, после чего у вас появится соответствующий пункт меню. Возможно, нужно будет немного подождать. В Total Commander в контекстном меню он у меня сразу появился, а в контекстном меню Проводника только минут через 5.
    Ответ написан
  • PHP: из-за чего странное поведение при статическом вызове метода?

    nowm
    @nowm
    Это такой небольшой глюк PHP. До тех пор, пока в функции foo() нет обращения к нестатическим переменным, вроде $this, её можно будет вызывать статическим способом.
    Ответ написан
    2 комментария
  • Стоит ли переходить ли на OpenCart с PHPShop?

    nowm
    @nowm
    В целом, насколько я вижу из своего опыта (я «переезжал» сайты с Bitrix, WebAsyst и Shop-Script), переезд на Опенкарт может обойтись примерно в 17-20 тысяч (миграция категорий/товаров/производителей/атрибутов/опций, создание/миграция шаблона).

    Сам движок вообще прикольный, хотя в нём до сих пор используется mysql-функции. Я недавно пытался сделать пулл-реквест, который нормально организовывал поддержку PDO с обратной совместимостью, но Даниэль меня, образно говоря, послал нахер (даже при условии, что несколько человек меня поддержали), и я что-то теперь разочаровался в этом движке, хотя целый год вообще работал только с ним — излазал вдоль и поперёк, делал кучу архитектурных усовершенствований для клиентов, писал модули.

    Сорри за лирическое отступление — я всё никак не найду, кому поплакаться в жилетку. :)

    Реально ли вообще построить на Open Cart серьезный проект?

    Да, на Opencart вполне возможно построить серьёзный магазин. У него большой плюс в том, что модули к нему можно очень легко и быстро писать. Даже, в принципе, начинающий программист может с этим справиться. И людей, которые что-то дорабатывают/пишут, очень много. Много всего можно найти на opencartforum.ru.

    С какими проблемами можно столкнуться в первое время?

    В первое время можно столкнуться с тем, что он будет тормозить на большом количестве продуктов и категорий. Он всё время пытается считать количество товаров в каждой категории, даже если в настройках это отключено. В официальный репозиторий больше года назад была принята правка, которая этот момент исправляет, но почему-то в последние версии эта правка так и не попала, как я вижу (и в v1.5.6 и в v1.5.6.1 эта недоработка всё ещё присутствует). Если этот момент исправить, скорость поразительно увеличивается. Я один раз умудрился $150 заработать на этом моменте — за пару минут работы. Там всего-то две небольшие правки сделать нужно.

    В остальном, движок особенно неприятных сюрпризов больше не доставляет.

    Какие могут быть размеры вложений для исправления основных проблем этой CMS?

    150 долларов — это была удача. Вообще, цена такой правки — примерно рублей 500, но вы наверняка можете и дешевле найти на профильных ресурсах. В MaxyStore, кажется, вообще этот момент поправлен. Так что он вполне нормально будет из коробки работать, и никаких основных проблем исправлять вообще не придётся.

    Оправданы ли мои опасения насчет того, что бесплатный продукт может принести слишком много проблем?

    Продукт продукту рознь. Сам Opencart особенно много проблем вам не принесёт. Но проблемы могут принести дополнительные модули. У Opencart довольно-таки низкий порог вхождения, поэтому качество кода может быть ужасным. Один модуль может начисто убить весь jQuery на странице. Другой сделает так, что у вас отзывы о продукте не будут отправляться. Третий (от какого-нибудь французского разработчика, который очень любит делать навигационные модули) будет на каждый пук дёргать базу данных, генерируя по 86 дополнительных запросов к БД на одной странице. Вообще, в ситуации с Опенкартом, лучше постоянно работать с одним и тем же программистом, который будет и модули устанавливать и дорабатывать и ошибки устранять и т.д. Мороки будет меньше, потому что на русскоязычных ресурсах расспрашивать, почему выскакивает такая-то и такая-то ошибка — неблагодарное дело.

    Есть проект MaxyStore на основе OpenCart - может стоит взглянуть в его сторону или нет смысла?

    Попробуйте ещё посмотреть в сторону ocStore с сайта opencartforum.ru. Мне кажется, что он немного лучше. С позиции разработчика мне лично MaxyStore не нравится. Я не могу внятно описать причины, но в ситуации, когда есть выбор между MaxyStore и Opencart, я однозначно выберу Opencart.

    У таких сборок, как MaxyStore и ocStore плюс в том, что они интегрируют много полезных модулей.

    Минусы. Они часто отстают по версиям на 1-2 релиза. К примеру, какой-нибудь новейший ***Store может быть основан на версии Opencart, которая вышла больше года назад.

    Зачастую финтиклюшки, которые разработчики сборок добавляют в ядро, замедляют работу движка. Как я вижу (может быть я не прав), разработчики движков на основе Opencart больше внимания уделяют внешнему виду, а не архитектурным вопросам, которые позволят повысить скорость или безопасность. А если они и начинают заниматься архитектурными вопросами, то движок частично теряет совместимость с модулями, написанными для оригинального Opencart.

    На какие еще CMS стоит обратить внимания, учитывая мои требования?

    Я вообще после того, как мой пул-реквест отшили, решил вообще больше не заниматься Opencart (такой вот я чувствительный) и перейти на разработку для Magento. Из всех движков, о которых я слышал (или которые щупал) он мне больше всего нравится. Хотя, вообще-то, я не так уж и много движков щупал.
    Ответ написан
    3 комментария
  • Как сделать слайд-шоу по фотографиям товара open cart?

    nowm
    @nowm
    Для каждого тега A, который ссылается на картинку и который должен стать частью серии, нужно указать класс «colorbox». А во время инициализации Colorbox нужно добавить параметр, который их свяжет по этому классу.

    $(document).ready(function() {
    	$('.colorbox').colorbox({
    		overlayClose: true,
    		opacity: 0.5,
    		rel: "colorbox"
    	});
    });


    Здесь rel: "colorbox" как раз указывает на то, что нужно связать в серию всё, что имеет класс colorbox.
    Ответ написан
    4 комментария
  • Почему функция wp_signon() на wordpress не авторизирует?

    nowm
    @nowm
    Этот код, кажется, нужно поместить внутрь функции. А саму функцию вызывать до того, как движок отправит заголовки клиенту. Вот так:

    function custom_login() {
        $user['user_login'] = $_POST['log'];
        $user['user_password'] = $_POST['pwd'];
        $user['remember'] = true;
        $signon = wp_signon($user, false);
        if (is_wp_error($signon)) echo $signon->get_error_message();
        //print_r($signon);
    }
    
    add_action( 'after_setup_theme', 'custom_login' );


    Потому что wp_signon ещё кажется куки какие-то создаёт в процессе. Так что она должна вызываться до момента, когда всё это отправляется клиенту. А у вас код наверняка где-нибудь прямо в шаблоне прописан, когда уже поздно вызывать wp_signon.
    Ответ написан
    Комментировать