• Стоит ли так оптимизировать?

    DevMan
    @DevMan
    твой тест - чистая синтетика. в реальности у тебя не будет таких цифр.
    как только ты это поймешь, ты осознаешь, что копаешь совсем не в ту сторону.
    Ответ написан
    4 комментария
  • Стоит ли так оптимизировать?

    zo0m
    @zo0m
    full stack developer
    Переписывать под свой велосипед - плохое решение.
    Хорошим решением может быть: заняться настройкой yii, или профилировать свой код, чтобы найти узкие места.

    Главный вопрос: проект хоть как-то в продакшене? у тебя есть хотя бы 100 пользователей онлайн, что ты переживаешь о 5мб? 1GB оперативки стоит 10 баксов в месяц на DigitalOcean, если что.

    Свой велосипед почти 100% выйдет боком. Если прямо дико хочется оптимизировать, поищи какой-нибудь более производительный фреймворк, чем Yii и переползай на него. Мне когда-то нравился Phalcon.
    Ответ написан
    Комментировать
  • Как документировать существующее решение?

    eduardtibet
    @eduardtibet
    Technical Writer / Documentation Engineer
    Чтобы понять, какие решение вам надо, вам надо задать себе следующие вопросы:
    1. Предполагается ли документацию выносить наружу?
    2. В каких выходных форматах вы хотите поставлять документацию? Предполагается ли печатка (как класс)?
    3. Предполагается ли многоуровневая документация (т.е., например, несколько модулей для клиента А, несколько для клиента Б и т.п.)?
    4. Надо ли документировать API (руками или автоматически)?
    5. Кто будет осуществлять поддержку всего этого хозяйства?
    6. Какой объем (примерно) сейчас и какой объем будет после года?
    7. Надо ли хранить версионность всего этого добра?

    Есть еще вопросы, но на текущий момент пока хватит :)
    Ответ написан
    Комментировать
  • Как сделать картинку обтекаемой другими картинками?

    AnnTHony
    @AnnTHony
    Интроверт
    Например так: https://jsfiddle.net/c2e020a4/
    Ответ написан
    Комментировать
  • Как эффективно изучать php?

    @AntohaRomaha
    FreeBSD, PHP, MySQL, Jquery
    Абсолютно согласен с GriSII.
    Все что Вам нужно (если не планируете работать с классами-объектами) - научиться делать вывод из базы mysql, делать запись, удалять и редактировать записи - средствами PHP. Вот и все:) Дальше все придет с практикой! Учебники тоже не помогали - помогли реальные задачи и товарищ, который мне подсказывал на первых порах.
    Ответ написан
    Комментировать
  • Как скрыть карту?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Оборачиваем карту в iframe и загружаем его только на широких экранах, либо если браузер растянули на достаточную ширину. При сужении экрана просто делаем карте display:none;

    Данные манипуляции достаточно легко воплотить на js.
    Ответ написан
    Комментировать
  • Кто ставит копирайт на сайте (дизайнер или разработчик)?

    dimonchik2013
    @dimonchik2013
    non progredi est regredi
    (c) 2015, разработка: студия "Рога и копыта"; дизайн: Сидор Лютый
    Ответ написан
    Комментировать
  • Как открыть свой хостинг?

    MaxDukov
    @MaxDukov
    впишусь в проект как SRE/DevOps.
    теперь научитесь администрировать сервера.
    (ну и научится гуглить неплохо-бы).
    Ответ написан
    2 комментария
  • Yii2 как правильно выполнять выборку данных из БД и отображать её?

    @Bojczuk
    all/one после where забыли:
    $answers = Answers::find()->where(['ticket_id'=> '47'])->one();
    Ответ написан
    1 комментарий
  • Как в nginx определить IP клиента?

    Комментировать
  • Как защитить код сайта при просмотре в редакторе браузера?

    mourr
    @mourr
    Passionate JS developer
    Универсальной защиты нет - код все равно исполняется на клиенте, и его в любом случае можно скачать/скопировать
    Однако, как защиту от совсем непрофесиональных - к js скриптам (втч к библиотекам типа jQuery) можно добавить такой код (предварительно обфусцировав его)

    if(document.domain!="yourdomain.com"){
       self.location.href = "http://yourdomain.com";
    }


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

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега JavaScript
    s = '2015-10-21 09:35:18';
    d = new Date(s);
    console.log(d.getHours(), d.getMinutes());


    time = '2015-10-21 09:35:18'.split(' ')[1];
    parts = time.split(':');
    console.log(parts[0], parts[1]);

    Выбирайте по вкусу.
    Ответ написан
    1 комментарий
  • Чей код чище и удобнее расширятся битрикс или модх?

    MetaDone
    @MetaDone
    Хорошо сформулированный вопрос - 50% решения
    что угодно лучше битрикса. И да простят меня бывалые битриксойды, но лично я с таким месивом работать не намерен.
    Просто кусок кода, который битрикс малый бизнес генерирует после установки в index.php
    spoiler
    <?
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    $APPLICATION->SetTitle("Интернет-магазин \"Одежда\"");
    ?>
    <h2>Лучшие коллекции</h2>
    <?$APPLICATION->IncludeComponent("bitrix:catalog.top", "", array(
    		"IBLOCK_TYPE_ID" => "catalog",
    		"IBLOCK_ID" => "2",
    		"ELEMENT_SORT_FIELD" => "name",
    		"ELEMENT_SORT_ORDER" => "asc",
    		"ELEMENT_SORT_FIELD2" => "name",
    		"ELEMENT_SORT_ORDER2" => "asc",
    		"HIDE_NOT_AVAILABLE" => "N",
    		"ELEMENT_COUNT" => "8",
    		"LINE_ELEMENT_COUNT" => "4",
    		"PROPERTY_CODE" => array(0=>"MINIMUM_PRICE",1=>"MAXIMUM_PRICE",2=>"",),
    		"OFFERS_FIELD_CODE" => array(0=>"NAME",1=>"",),
    		"OFFERS_PROPERTY_CODE" => array(0=>"ARTNUMBER",1=>"COLOR_REF",2=>"SIZES_SHOES",3=>"SIZES_CLOTHES",4=>"MORE_PHOTO",5=>"",),
    		"OFFERS_SORT_FIELD" => "sort",
    		"OFFERS_SORT_ORDER" => "asc",
    		"OFFERS_SORT_FIELD2" => "id",
    		"OFFERS_SORT_ORDER2" => "desc",
    		"OFFERS_LIMIT" => "0",
    		"VIEW_MODE" => "SLIDER",
    		"TEMPLATE_THEME" => "site",
    		"PRODUCT_DISPLAY_MODE" => "Y",
    		"ADD_PICT_PROP" => "MORE_PHOTO",
    		"LABEL_PROP" => "NEWPRODUCT",
    		"OFFER_ADD_PICT_PROP" => "MORE_PHOTO",
    		"OFFER_TREE_PROPS" => array(0=>"COLOR_REF",1=>"SIZES_SHOES",2=>"SIZES_CLOTHES",),
    		"SHOW_DISCOUNT_PERCENT" => "Y",
    		"SHOW_OLD_PRICE" => "Y",
    		"ROTATE_TIMER" => "30",
    		"MESS_BTN_BUY" => "Купить",
    		"MESS_BTN_ADD_TO_BASKET" => "В корзину",
    		"MESS_BTN_DETAIL" => "Подробнее",
    		"MESS_NOT_AVAILABLE" => "Нет в наличии",
    		"SECTION_URL" => "",
    		"DETAIL_URL" => "",
    		"BASKET_URL" => "/personal/cart/",
    		"ACTION_VARIABLE" => "action",
    		"PRODUCT_ID_VARIABLE" => "id_slider",
    		"PRODUCT_QUANTITY_VARIABLE" => "quantity",
    		"PRODUCT_PROPS_VARIABLE" => "prop",
    		"SECTION_ID_VARIABLE" => "SECTION_ID",
    		"CACHE_TYPE" => "A",
    		"CACHE_TIME" => "180",
    		"CACHE_GROUPS" => "Y",
    		"DISPLAY_COMPARE" => "N",
    		"PRICE_CODE" => array(0=>"BASE",),
    		"USE_PRICE_COUNT" => "N",
    		"SHOW_PRICE_COUNT" => "1",
    		"PRICE_VAT_INCLUDE" => "Y",
    		"PRODUCT_PROPERTIES" => array(),
    		"USE_PRODUCT_QUANTITY" => "Y",
    		"CONVERT_CURRENCY" => "N",
    		"OFFERS_CART_PROPERTIES" => array(0=>"ARTNUMBER",1=>"COLOR_REF",2=>"SIZES_SHOES",3=>"SIZES_CLOTHES",)
    	),
    	false
    );?>
    <h2>Тренды сезона</h2>
    <?$APPLICATION->IncludeComponent(
    	"bitrix:catalog.top",
    	"",
    	Array(
    		"IBLOCK_TYPE" => "catalog",
    		"IBLOCK_ID" => "2",
    		"VIEW_MODE" => "SECTION",
    		"TEMPLATE_THEME" => "site",
    		"PRODUCT_DISPLAY_MODE" => "Y",
    		"ADD_PICT_PROP" => "MORE_PHOTO",
    		"LABEL_PROP" => "NEWPRODUCT",
    		"OFFER_ADD_PICT_PROP" => "MORE_PHOTO",
    		"OFFER_TREE_PROPS" => array("COLOR_REF", "SIZES_SHOES", "SIZES_CLOTHES"),
    		"SHOW_DISCOUNT_PERCENT" => "Y",
    		"SHOW_OLD_PRICE" => "Y",
    		"MESS_BTN_BUY" => "Купить",
    		"MESS_BTN_ADD_TO_BASKET" => "В корзину",
    		"MESS_BTN_DETAIL" => "Подробнее",
    		"MESS_NOT_AVAILABLE" => "Нет в наличии",
    		"ELEMENT_SORT_FIELD" => "sort",
    		"ELEMENT_SORT_ORDER" => "asc",
    		"ELEMENT_SORT_FIELD2" => "name",
    		"ELEMENT_SORT_ORDER2" => "asc",
    		"SECTION_URL" => "",
    		"DETAIL_URL" => "",
    		"BASKET_URL" => "/personal/cart/",
    		"ACTION_VARIABLE" => "action",
    		"PRODUCT_ID_VARIABLE" => "id_section",
    		"PRODUCT_QUANTITY_VARIABLE" => "quantity",
    		"PRODUCT_PROPS_VARIABLE" => "prop",
    		"SECTION_ID_VARIABLE" => "SECTION_ID",
    		"DISPLAY_COMPARE" => "N",
    		"ELEMENT_COUNT" => "12",
    		"LINE_ELEMENT_COUNT" => "4",
    		"PROPERTY_CODE" => array("MINIMUM_PRICE", "MAXIMUM_PRICE"),
    		"OFFERS_FIELD_CODE" => array("NAME"),
    		"OFFERS_PROPERTY_CODE" => array("ARTNUMBER", "COLOR_REF", "SIZES_SHOES", "SIZES_CLOTHES", "MORE_PHOTO"),
    		"OFFERS_SORT_FIELD" => "sort",
    		"OFFERS_SORT_ORDER" => "asc",
    		"OFFERS_SORT_FIELD2" => "id",
    		"OFFERS_SORT_ORDER2" => "desc",
    		"OFFERS_LIMIT" => "0",
    		"PRICE_CODE" => array("BASE"),
    		"USE_PRICE_COUNT" => "N",
    		"SHOW_PRICE_COUNT" => "1",
    		"PRICE_VAT_INCLUDE" => "Y",
    		"PRODUCT_PROPERTIES" => array(),
    		"USE_PRODUCT_QUANTITY" => "Y",
    		"CACHE_TYPE" => "A",
    		"CACHE_TIME" => "180",
    		"CACHE_GROUPS" => "Y",
    		"HIDE_NOT_AVAILABLE" => "N",
    		"CONVERT_CURRENCY" => "N",
    		"OFFERS_CART_PROPERTIES" => array("ARTNUMBER", "COLOR_REF", "SIZES_SHOES", "SIZES_CLOTHES")
    	)
    );?>
    <?$APPLICATION->IncludeComponent("bitrix:sale.bestsellers", ".default", array(
    		"HIDE_NOT_AVAILABLE" => "N",
    		"SHOW_DISCOUNT_PERCENT" => "Y",
    		"PRODUCT_SUBSCRIPTION" => "Y",
    		"SHOW_NAME" => "Y",
    		"SHOW_IMAGE" => "Y",
    		"MESS_BTN_BUY" => "Купить",
    		"MESS_BTN_DETAIL" => "Подробнее",
    		"MESS_NOT_AVAILABLE" => "Нет в наличии",
    		"MESS_BTN_SUBSCRIBE" => "Подписаться",
    		"PAGE_ELEMENT_COUNT" => "4",
    		"LINE_ELEMENT_COUNT" => "4",
    		"TEMPLATE_THEME" => "site",
    		"DETAIL_URL" => "",
    		"AJAX_MODE" => "N",
    		"AJAX_OPTION_JUMP" => "N",
    		"AJAX_OPTION_STYLE" => "Y",
    		"AJAX_OPTION_HISTORY" => "N",
    		"CACHE_TYPE" => "A",
    		"CACHE_TIME" => "86400",
    		"BY" => "AMOUNT",
    		"PERIOD" => "30",
    		"FILTER" => array(
    			0 => "CANCELED",
    			1 => "ALLOW_DELIVERY",
    			2 => "PAYED",
    			3 => "DEDUCTED",
    			4 => "N",
    			5 => "P",
    			6 => "F",
    		),
    		"DISPLAY_COMPARE" => "N",
    		"SHOW_OLD_PRICE" => "N",
    		"PRICE_CODE" => array(
    			0 => "BASE",
    		),
    		"SHOW_PRICE_COUNT" => "1",
    		"PRICE_VAT_INCLUDE" => "Y",
    		"CONVERT_CURRENCY" => "N",
    		"BASKET_URL" => "/personal/cart/",
    		"ACTION_VARIABLE" => "action",
    		"PRODUCT_ID_VARIABLE" => "id",
    		"PRODUCT_QUANTITY_VARIABLE" => "quantity",
    		"ADD_PROPERTIES_TO_BASKET" => "Y",
    		"PRODUCT_PROPS_VARIABLE" => "prop",
    		"PARTIAL_PRODUCT_PROPERTIES" => "N",
    		"USE_PRODUCT_QUANTITY" => "N",
    		"SHOW_PRODUCTS_2" => "Y",
    		"CART_PROPERTIES_2" => array(
    			0 => "BRAND_REF",
    			1 => "NEWPRODUCT",
    			2 => "SALELEADER",
    			3 => "",
    		),
    		"ADDITIONAL_PICT_PROP_2" => "MORE_PHOTO",
    		"LABEL_PROP_2" => "SALELEADER",
    		"CART_PROPERTIES_3" => array(
    			0 => "COLOR_REF",
    			1 => "SIZES_SHOES",
    			2 => "SIZES_CLOTHES",
    			3 => "",
    		),
    		"ADDITIONAL_PICT_PROP_3" => "MORE_PHOTO",
    		"OFFER_TREE_PROPS_3" => array(
    			0 => "COLOR_REF",
    			1 => "SIZES_SHOES",
    			2 => "SIZES_CLOTHES",
    		),
    		"AJAX_OPTION_ADDITIONAL" => ""
    	)
    );?>
    <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>


    Еще вся эта ересь безбожно терзает БД.
    А если глянуть ядро - то там несмотря на всякие придуманные штуки типа пространств имен, трейтов и т.п. до сих пор глобальные переменные и куча констант. Есть классы, методы в которых непонятно зачем оборачивают суперглобальные массивы. В общем смотрите сами, это чисто мое мнение и я не собираюсь работать с битриксом, чего и вам желаю
    Ответ написан
    4 комментария
  • Зачем нужны CMS если есть phpmyadmin?

    zooks
    @zooks
    Frontend
    phpmyadmin не обладает защитой от дурака.
    Ответ написан
    Комментировать
  • Как подсчитать кол-во тегов из 2 таблиц?

    DmitriyEntelis
    @DmitriyEntelis
    Думаю за деньги
    SELECT 
      tag.id,
      tag.name,
      IFNULL(sum(tmp.cnt),0) as tag_cnt
    FROM
    tag 
    LEFT JOIN
    (
    select tag_id, count(id) as cnt from tagpost group by tag_id
    union all
    select tag_id, count(id) as cnt from tagoffers group by tag_id
    ) as tmp on tag.id = tmp.tag_id
    GROUP BY tag.id, tag.name
    Ответ написан
    4 комментария
  • Нормально ли хранить json в MySql?

    finnish
    @finnish
    Теория
    Реляционные базы подразумевают, что все часто используемые поля должны храниться в отдельных столбцах. В какой-то момент Вам понадобится искать/сортировать по городу, а его хранение внутри JSON сделает эту операцию крайне сложной.
    Все преимущества JSON-а сводятся к тому, что в одной записи можно "легко" добавить или удалить какое-то поле, не прибегая к модификации таблицы. Лёгкость написана в кавычках потому, что модификация одного поля выполняется сложнее, чем первоначальная запись всего объекта: взять JSON; преобразовать в объект; модифицировать значение нужного поля; преобразовать в строку; записать её в базу данных. И делать это нужно будет средствами приложения, MySQL на это просто не способен.

    Практика
    Использование JSON является нормальной практикой. Если возникает необходимость выполнять поиск по какому-то полю, оно выносится в отдельную колонку. Работы по переносу рутинные, но требуют внимательности от программиста, т.к. путь до значения изменился. Например, раньше было user.data.city и стало user.city.

    Сейчас набирает популярность PostgreSQL, где работа с JSON выведена на уровень SQL-синтаксиса. Там Вы сможете легко добавлять/модифицировать/удалять отдельные JSON-поля, не прибегая к помощи приложения. Даже индексы поддерживаются!..
    Ответ написан
    3 комментария
  • Где хранить данные на клиенте?

    AMar4enko
    @AMar4enko
    Что ж вы такое собираетесь хранить в localStorage, что боитесь ограничения в 5мб?
    Переход можно сделать при запуске приложения - сохранять в тот же localStorage версию приложения, при старте ее проверять. Если версия в localStorage старая, значит приложение обновили - самое время сконвертировать данные из localStorage в какой-то другой формат.

    Вот нативный SQLite
    https://github.com/litehelpers/Cordova-sqlite-storage
    Ответ написан
    2 комментария
  • Конфликтуют пространства имен в yii2 - sphinx\Query и db\Query, как это обойти?

    use yii\sphinx\Query as SphinxQuery;
    use yii\db\Query as DbQuery;
    Ответ написан
    Комментировать