• Symfony меняет даты взятые из таблицы. Как получать не отформатированые данные?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    что значит "меняет"? Она конвертит строки в DateTime, дальше вы сами уже форматируйте как вам хочется.
    Ответ написан
    Комментировать
  • Как эффективно изучать php?

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

    Logic87
    @Logic87
    Программист/администратор сайтов на 1С-Битрикс.
    Нужно смотреть на ваш сайт, что он в себе вмещает, качество разработки. Ну а дальше железо подбираете по-тихонько тестируя нагрузку и выживаемость.
    Ответ написан
    Комментировать
  • Как правильнее реализовать получение данных со стороннего API?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    >Как правильнее обращаться к сторонниму API
    Лучше всего, сделать сервис, в котором будет ваш код связи с-чем-угодно. А в самом приложении использовать сервис, как высокоуровневый элемент. Если вы видите, что этот код может в будущем будет использоваться в разных проектах, то тогда есть смысл вынести в отдельный бандл. Я не вижу большого смысла разделять один проект на разные бандлы (разве что специально сделать их очень слабо связанными).
    Почитайте мой ответ в другом вопросе.

    >как дополнять либы новым функционалом?
    Форкнуть либу, дополнить вашим кодом, и подключать ваш форк. Это общее правило, не только для Symfony, и не только composer. Иначе, если автор библиотеки выпустит новую версию (новую функцию или исправление бага), то ваше изменение будет конфликтовать с новой версией либы.
    Ответ написан
    Комментировать
  • Как правильнее реализовать получение данных со стороннего API?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    я опущу свою тираду по поводу бандлов в рамках одного приложения (должен быть только один бандл - AppBundle, остальное нужно только для реюзабельных вещей. Если вы не можете реюзать ваше решение то нет смысла запирать это в бандле), сосредоточусь на контроллерах.

    Как вы написали, контроллеры должны обрабатывать HTTP запросы, вот пусть они этим и занимаются. Берут запрос, забирают и обрабатывают данные, просят сервисы что-то сделать (а не делают сами) и потом выплевывают результат работы этих сервисов наружу.

    API инстаграма это хранилище данных и только. Для работы с хранилищами существует шаблон "репозиторий". То есть мы делаем маленький сервис, который будет работать с API, а всему остальному коду и дела нет откуда эти данные берутся. Если вам надо будет добавить кеширование ответов API -можно завести сервис-декоратор, ну и т.д. Ну и для взаимодействия с самим API есть море готовых решений вплодь до готовых клиентов к инстаграму. Ваша задача все это дело закрыть фасадом, красивым интерфейсом через который ваши задачи решаются просто. Таким образом мы сокроем для приложения все сложность доставания картинок и т.д.

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

    А еще было бы неплохо попрактиковать TDD но это если вам позволяет время. Вообще настоятельно рекомендую перейти на практику TDD (почитайте Кента Бэка на эту тему).

    И еще говорят, что считается правка composer библиотеки напрямую изменяя код в vendor не хорошим, как дополнять либы новым функционалом?


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

    Меня от слова "битрикс" выворачивает
    Ответ написан
    Комментировать
  • Движок для сервиса какой выбрать?

    junk1114
    @junk1114
    Web-программист
    На фреймворке лучше делать, какая CMS? Вы же не блог или ИМ делаете.
    Ответ написан
    2 комментария
  • Чей код чище и удобнее расширятся битрикс или модх?

    mr_T
    @mr_T
    Web-разработчик
    Если хочется заниматься программированием, а не борьбой с кодом, то нужно брать framework. Любая CMS - это решение, которое в первую очередь заточено под управление контентом (отсюда, собственно, и название), а программирование вторично.
    Ответ написан
    6 комментариев
  • Чей код чище и удобнее расширятся битрикс или модх?

    kompi
    @kompi
    nullstack devoops
    Тут даже нечего сравнивать, в битриксе полно легаси кода со времён php 4.x.
    Ответ написан
    Комментировать
  • Чей код чище и удобнее расширятся битрикс или модх?

    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 комментария
  • За что программист получает деньги?

    sabramovskikh
    @sabramovskikh
    За работу. Если грузчику платят за то, что он загружает фуры, почасовая оплата, то зачем ему платить когда он таскает мешки и возвращается за мешком на легке, ведь он не работает?
    Код нельзя написать хорошо никогда. Можно стремится только к этому. Пока он разбирается это процесс разработки продукта. Почитайте книгу о циклах разработки ПО и все поймете
    Ответ написан
    8 комментариев
  • Сайт php + AJAX, приехали?

    skobkin
    @skobkin
    Гентушник, разработчик на PHP и Symfony.
    Тут очень, очень много чего можно приводить к божескому виду. Вам, наверное, надо попробовать какой-нибудь не очень сложный MVC-фреймворк для начала.
    Пока что весь код - сплошная каша, которую чуть проще поддерживать, чем если бы всё было в одном файле, но всё ещё значительно сложнее, чем уже проработанные решения.
    $data .=  '<div class="newsPhoto">';
            $data .=  '<img src="'.getImgUrl($news['photo']).'">';
            $data .=  '</div>';
            // ...

    Вообще, если вам так хочется всё это делать именно в PHP - можно использовать либо Heredoc/Nowdoc, либо просто записывать в кавычках без лишних конкатенаций кода с самим собой. Хотя лучше, конечно, всё это делать в слое View (см. MVC) - попробовав вы быстро поймёте - насколько это круто, когда логика (операции с данными) и представление (вывод данных) разделены.
    $sql = mysql_query("SELECT news_id, title, description, photo FROM news WHERE category='1' ORDER BY news_id DESC LIMIT 10") or die(mysql_error());

    Используйте PDO и подготовленные запросы с биндингом параметров.
    А ещё у вас везде одинарные кавычки (что хорошо), а тут - двойные. Зачем? Одинарную кавычку можно экранировать с помощью бэкслеша.
    if (isAJAX() == false) {
    echo head('Новости',array('common.css', 'news.css'),array('common.js'));
    echo body();
    echo news_menu();
    echo news();
    echo footer();
    }

    Это очень мило. Вы почти пришли к шаблонам :)

    Могу порекомендовать вам для приобретения понимания как лучше коду выглядеть сделать три вещи:
    1. Ознакомиться с PSR-2 как минимум.
    2. Прочесть и постараться максимально понять Php The Right Way.
    3. Переписать всё это на каком-нибудь более-менее современном, но ещё не очень сложном фреймворке, который из коробки имеет MVC. В памяти пока что всплывает, например, FuelPHP.

    Ну и дальше как разберётесь - уже просто набираться опыта, смотреть как делают другие (опенсорс всегда в помощь), пробовать делать какие-то маленькие вещи для себя, чтобы разобраться в чём-то.
    Ответ написан
    5 комментариев
  • Знаете примеры красивого php-кода?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Действительно ли Ruby сложнее PHP/Python? Если да, то почему?

    @thepry
    Ruby on rails, 1С разработчик
    Чем рубин сложнее, например PHP, JS?


    Мне не кажется сложнее, учитывая, что код в руби ведет себя предсказуемо.

    Куда потом двигаться дальше?

    Подтянуть весь стек веб разработки - git, sql, js с фронтенд фрейморками(backbone, react...).

    Вакансий в этой сфере относительно мало, работодатели ищут сразу сеньоров.

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

    Я для себя как-то сформулировал правило - человек должен отправить 100 откликов на вакансии прежде чем жаловаться на то, что «работы нет».
    Ответ написан
    Комментировать
  • CMS vs. Native?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    как влияет разработка cайтов с помощью CMS на общие знания по PHP?

    вы же видите результаты тестов - никак. Ни положительно ни отрицательно.

    На знания языка влияют задачи которые вы при помощи этого языка решаете.
    Ответ написан
    Комментировать
  • Как создать проект на Symfony2 с конфигами на PHP, а не на YAML?

    @unity_ultra_hardcore
    В бандле у вас есть файл DependencyInjection/AcmeAppExtension.php.
    Если его содержимое привести примерно к такому виду, то должно получиться (правда сам я не пробовал этим заниматься).
    <?php
    
    namespace Acme\AppBundle\DependencyInjection;
    
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\HttpKernel\DependencyInjection\Extension;
    use Symfony\Component\DependencyInjection\Loader;
    
    /**
     * This is the class that loads and manages your bundle configuration.
     *
     * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
     * @codeCoverageIgnore
     */
    
    class AcmeAppExtension extends Extension
    {
        /**
         * {@inheritdoc}
         */
        public function load(array $configs, ContainerBuilder $container)
        {
            $configuration = new Configuration();
            $this->processConfiguration($configuration, $configs);
    
            $loader = new Loader\PhpFileLoader($container, new FileLocator(__DIR__ . '/../config/'));
            $loader->load('services.php');
    
            if ($container->getParameter('kernel.environment') == 'dev') {
                $loader->load('services_dev.php');
            }
    
            if ($container->getParameter('kernel.environment') == 'test') {
                $loader->load('services_test.php');
            }
        }
    }

    P.S. я лично тоже считаю, что это большая глупость - отказываться от yml в пользу php-конфигов: это нарушает основной принцип конфигурации - ее детерминированность. В php-конфиге можно наворотить какой-то логики при вычислении того или иного параметра, что отрицательно скажется на удобстве поддержки проекта.
    Ответ написан
    Комментировать
  • Как создать проект на Symfony2 с конфигами на PHP, а не на YAML?

    sayber
    @sayber
    Да, я программирую на PHP и еще асинхронно!
    Вероятно указать в параметрах php (как при создании бандла).
    Хотя не могу себе представить причины, создавать php конфиги.
    Ответ написан
    1 комментарий
  • Как лучше: повторять стили или ставить много классов?

    @bromzh
    Drugs-driven development
    Никак, давай элементам осмысленные имена. Не как они должны выглядеть, а что они из себя представляют. И не надо делать классы, явно указывающие на размер/цвет и т.д. Потому что это почти ничем не лучше, чем вёрстка прямо в html-коде через атрибут style.
    Можешь посмотреть как рекомендуют чуваки из яндекса.
    Ответ написан
    Комментировать
  • Знаете ли вы программистов которые в одиночку создали крутой проект?

    @asd111
    Google - два парня Сергей Брин и Ларри Пейдж
    Facebook - начал Марк Цукерберг
    Instagram - два парня, один делал приложение для iPhone, другой делал сайт, потом заработали расширились
    MsDOS - первую версию сделал один человек, потом Баллмер у него купил за 50 000 $ и права перешли Microsoft
    Nginx - начал Игорь Сысоев
    Компьютер Apple I - дело рук Стива Возняка
    Linux - начал Линус Торвальдс
    Git - начал Линус торвальдс
    Redis - Salvatore Sanfilippo ( antirez )
    Minecraft - начал Маркус Перссон ( также известный как notch )
    Dropbox - начал Дрю Хьюстон
    Shadertoy - создан Iñigo Quilez ( также известен как iq )
    C++ - начал Бьёрн Страуструп
    Python - Гвидо ван Россум
    PHP - Расмус Лердорф

    SimplaCMS - начал один человек
    DLE CMS - начал один человек
    TYPO3 CMS - начал один человек

    P.S. ответ редактировался и дополнялся
    Ответ написан
    20 комментариев