• PSR-0 или PSR-4, и как правильно построить структуру проекта?

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    /path/to/project/ это путь к проекту и данный путь нигде не фигурирует, это та директория из которой запускается основной index.php

    Нет. Этот корневая директория проекта. Из нее запускается композер. В ней же обычно лежит DOCUMENT_ROOT каталог, в котором уже и находится точка входа index.php. Также здесь лежат директории vendor (для сторонних пакетов) какой нибудь application/ для ваших файлов.

    Давайте попробую объяснить на примере.

    Пусть будет такая структура, например.

    60926735302a7422195552.png

    в vendor - вам ничего самому писать не нужно. Этот папка для композера.
    public_html - в ней только index.php и все ваши css, images, js. Это папка на которую указывает DOCUMENT__ROOT в настройках домена вашего сервера. Только эти файлы доступны "по интернету".
    application - здесь все ваши самописные php файлы.
    (На остальные каталоги не обращаем внимания, в корне проекта можно располагать все что вам удобно, это не будет доступно из web)

    Под такую структуру написан подобный composer.sjon
    {
      "require": {
        "php": ">=5.5.9",
        "slim/slim": "2.*",
        "twig/twig": "~1.18",
        "slim/views": "^0.1.3",
        "robmorgan/phinx": "^0.4.4",
        "illuminate/database": "^5.1"
      },
      "minimum-stability": "stable",
      "autoload": {
        "psr-4": {
          "MyName\\MyProject\\": "application"
        }
      }
    }

    Тут вроде бы все просто. В require перечислены используемые пакеты. Поясню только autoload. Автозагрузка по стандарту PSR-4. Указано пространство имен ваших файлов и папка в которой они лежат.
    Если ваш класс MyClass лежит в папке application - то у него должно быть пространство имен \MyName\MyProject (полное имя класса получается \MyName\MyProject\MyClass). Если ваш класс MyController лежит в папке application/Mvc/Controllers, то, соответственно \MyName\MyProject\Mvc\Controllers\MyController.

    При этом вам не нужно заморачиваться и писать автозагрузчик. Просто выполните команду php composer.phar install (или php composer.phar dumpautoload для пересборки аавтозагрузчика) и подключите файл автозагрузчика в index.php
    include '../vendor/autoload.php';

    Не использовать композер не имеет смысла, т.к. это очень просто. Просто скачайте файл https://getcomposer.org/composer.phar в корень проекта и пользуйтесь (см выше).
    Ответ написан
    5 комментариев
  • PSR-0 или PSR-4, и как правильно построить структуру проекта?

    27cm
    @27cm
    TODO: Написать статус
    Первый вопрос который меня интересует это PSR-0 или PSR-4. На сколько я понял по состоянию на 21 октября 2014 года PSR-0 был помечен как устаревший.

    PSR-4 не замена PSR-0, а дополнением к нему.
    github.com/php-fig/fig-standards/blob/master/accep...


    про PSR-3 я вообще как-то не нашел русскоязычной информации, словно такого стандарта нет

    Видать, не перевели. Читайте в оригинале:
    github.com/php-fig/fig-standards/blob/master/accep...


    /path/to/project/ это путь к проекту и данный путь нигде не фигурирует, это та директория из которой запускается основной index.php

    Да, это пусть к PHP файлам проекта. Но index.php обычно выносят в отдельный каталог (например, /public), а все классы проекта хранятся, например, в /src (или /lib или ещё как угодно). В конфигурации веб-сервера запрещают отправлять запросы к любым файлам, не лежащим в /public, благодаря этому /public/index.php является единственной точкой входа для внешних запросов.


    ./vendor это папка назначение которой я не понимаю

    Это папка для сторонних библиотек, используемых в вашем проекте. Используется composer'ом. Внутрь лезть особо причин нет, composer сам решит как ему там всё разложить. Свои классы вы туда тоже не должны писать.


    в итоге честно говоря я запутался в том как правильно надо строить свои каталоги, какие папки обязательные какие нет, когда использовать src, когда lib, когда tests, почему в некоторых структурах приходится дважды указывать имя поставщика и имя пкета и т.д.

    src и lib - скажем так, синонимы. Кому как больше нравится. Главное, что внутри лежат сами PHP файлы проекта, следующие стандарту PSR-4. Лежат там только файлы, написанные авторами проекта. Поэтому нет смысла класть vendor внутрь src (или lib).
    test - каталог для тестов проекта.
    В папке vendor имя поставщика и имя проекта могут совпадать, вот они и дублируются.

    Так как вы изобретаете свой велосипед, то и структуру каталогов делайте свою, или посмотрите на популярные CMS/фреймворки, но везде будет по-разному. Joomla, WordPress, Yii, Zend Framework, Symfony.

    Я придерживаюсь такой структуры:
    /config                     Глобальные настройки проекта.
    /data                       Временные файлы. Например:
    /data/cache	            Файлы кеша.
    /data/logs	            Логи.
    /data/tmp	            Прочие временные файлы.
    /module                     Модули проекта. Например:
    /module/Backend	        
    /module/Backend/config      Настройки модуля.
    /module/Backend/src	    Файлы PHP модуля. Например:
    /module/Backend/src/Backend/Path/To/ExampleClass.php
    /module/Backend/test	    Unit-тесты модуля.
    /module/Backend/view	    Шаблоны модуля.
    /module/Frontend/...
    /public/index.php
    /public/css
    /public/font
    /public/img
    /public/js
    /vendor


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

    sabramovskikh
    @sabramovskikh
    Покупать 18 доп. сайтов вы не будете?
    Если нет, то делается на одном сайте.
    Просто разным папкам делаете разные шаблоны (ну или один и тот же шаблон). Делаете поддомены где документ_рут это папка в одном сайте, туда пихаете симлинки битрикса, аплоада и прочее.
    Если это разные шабллоны, то в выборе шаблона надо указать Выражение-пхп $_SERVER['HTTP_HOST'] == 'domen.site.ru'
    Ответ написан
    Комментировать
  • Можно ли вывести названия всех компонентов на странице и пути к ним?

    Попробуйте методы
    getCurrentIncludedComponent()
    getComponentStack()

    у CMain ($APPLICATION)

    Если не сработает, то всегда можете включить режим отладки, и все компоненты будут подсвечены

    5a38c9b4b0579361538558.png5a38caba06f60831337227.png5a38cac22c6ac892954309.png
    Ответ написан
    Комментировать
  • Что лучше для интернет-магазина bitrix или opencart?

    Битрикс по популярности находится на 4 месте в мире, притом после 3 бесплатных.
    И он заточен под ИМАГ
    инструментария в нем более чем достаточно.
    Но это как сравнить фотошоп и pbrush одно лучше н о тяжелее второе проще и дешевле.
    Ответ написан
    44 комментария
  • В каких бесплатных IDE работают PHP разработчики?

    sabramovskikh
    @sabramovskikh
    Окей, гугл, Гугл ты тупой? Я хочу чтобы люди ответили именно на мой вопрос. Мой вопрос уникальный, а не такой-же как 336 тысяч других вопросов.
    Ответ написан
    1 комментарий
  • Как решить проблему с созданием заказа?

    @eternalfire Автор вопроса
    Проблема решилась установкой бета-версии модуля каталог с главным модулем
    Ответ написан
    Комментировать
  • Как в bitrix сделать редактирование в визуальном редакторе определенного (контентного) блока?

    @Maksim37rus
    <?
      require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
      $APPLICATION->SetTitle("О центре");
    echo '
    <div class="side"><!-- Тут боковое меню --></div>
    <div class="main">
        <!-- Тут контент, который надо редактировать -->
    	
        <p>';
    	?>
    	Текст
    	<?
    	echo '</p>
    </div>';
    require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?>


    Это для конкретной страницы. Вообще лучше<div class="side"> и <div class="main"> вынести в шаблон.
    Ответ написан
    1 комментарий
  • Битрикс, не добавляет товар в корзину?

    Выполните в командная PHP-строке битрикса код (подставив id товара на свой):

    //<?php
    
    $productId = -1;
    
    if (!\Bitrix\Main\Loader::includeModule('catalog')) {
        throw new \Bitrix\Main\SystemException('Ошибка подключения модуля "catalog"');
    }
    
    $addResult = Add2BasketByProductID(
        $productId, 
        1, 
        [
            'LID' => 's1',
        ], 
        []
    );
    
    if (!$addResult) {
    
        $strError = '';
    
        /** @global $APPLICATION $ex */
        if ($ex = $APPLICATION->GetException()) {
            $strError = $ex->GetString();
        }
    
        echo sprintf('Ошибка добавления товара %s в корзину: %s', $productId, $strError);
    
    } else {
    
        echo sprintf('Товар %s успешно добавлен в корзину', $productId);
    
    }


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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Простите конечно, но дичь в данном случае то, что предлагаете Вы. Ни один фрейморк не поддерживает "не кеширование определенной области внутри кешируемой" (найдете опровержение - с удовольствием побеседуем и рассмотрим как возможно применение данного алгоритма).

    Собственно в Битриксе есть 2 механизма для решения Вашего кейса:

    1) Убрать кеширование результата (html) и сделать кеширование данных.
    На мой взгляд не лучший вариант, так как на рендеринг тоже нужны ресурсы, которые и так дорогие

    2) Определить дополнительный ключ кеширования.
    В StartResulCache во 2 параметр можно добавить свои ключи, и в данном случае у Вас это будет ключ устройства пользователя (mobile / desktop), после чего будет хранится 2 кеша: для мобильных и для десктопных клиентов.
    Ответ написан
    4 комментария
  • Почему не заполняется наименование контрагента при экспорте заказов из Bitrix?

    @photosho Автор вопроса
    Разобрался, следовало настроить Профили обмена: "Магазин > Настройки > Интеграция с 1С > Профили обмена".
    Ответ написан
    Комментировать
  • Как отловить завершение выгрузки справочника из 1с на сайт?

    @nikegk Автор вопроса
    Разобрался. Источник.
    use Bitrix\Main;
    use Bitrix\Main\Entity;
     
    $eventManager = Main\EventManager::getInstance();
    $eventManager->addEventHandler("", "TransactionOnBeforeUpdate", "TransactionBeforeUpdate");
     
    function TransactionBeforeUpdate(Entity\Event $event)
    { 
        echo "<pre>";
        $arParameters = $event->getParameters();
        var_dump($arParameters);
        return 1;
    }

    Где Transaction - название ИБ
    Ответ написан
    Комментировать
  • Как в Bitrix проверить есть ли у товара подарки?

    Я как то писал метод, который по id товара возвращает массив id подарков. Можете воспользоваться:
    use Bitrix\Sale\Compatible\DiscountCompatibility;
    use Bitrix\Sale\Basket;
    use Bitrix\Sale\Discount\Gift;
    use Bitrix\Sale\Fuser;
    
    class DiscountsHelper
    {
        /**
         * Возвращает массив id всех доступных подарков для товара
         *
         * @param int $productId - идентификатор товара
         * @return array - массив с id подарков для товара
         */
        public static function getGiftIds($productId)
        {
            $giftProductIds = [];
    
            if (!$productId) {
                return $giftProductIds;
            }
    
            DiscountCompatibility::stopUsageCompatible();
    
            $giftManager = Gift\Manager::getInstance();
    
            $potentialBuy = [
                'ID'                     => $productId,
                'MODULE'                 => 'catalog',
                'PRODUCT_PROVIDER_CLASS' => 'CCatalogProductProvider',
                'QUANTITY'               => 1,
            ];
    
            $basket = Basket::loadItemsForFUser(Fuser::getId(), SITE_ID);
            
            $basketPseudo = $basket->copy();
    
            foreach ($basketPseudo as $basketItem) {
                $basketItem->delete();
            }
    
            $collections = $giftManager->getCollectionsByProduct($basketPseudo, $potentialBuy);
    
            foreach ($collections as $collection) {
                /** @var \Bitrix\Sale\Discount\Gift\Gift $gift */
                foreach ($collection as $gift) {
                    $giftProductIds[] = $gift->getProductId();
                }
            }
    
            DiscountCompatibility::revertUsageCompatible();
    
            return $giftProductIds;
        }
    }


    Суть в том, что мы создаем пустую псевдокорзину и на основе её определяем, есть ли для переданного товара подарки.
    Ответ написан
    Комментировать
  • Как вывести информацию highload блока 1c битрикс?

    @dibarboss
    Программист 1С-Bitrix
    \Bitrix\Main\Loader::IncludeModule("highloadblock");
    
    $xmlID = '21XlirMU'; //подставьте нужный вам внешний код        
    $tblName = 'years';
    $select = ['UF_NAME']; // или как у вас поле называется
    $filter = ['UF_XML_ID'=>$xmlID];
    $limit = 1;
    
    
    $hlblock = \Bitrix\Highloadblock\HighloadBlockTable::getList(
                array("filter" => array('TABLE_NAME' => $tblName))
            )->fetch();
            $entity = \Bitrix\Highloadblock\HighloadBlockTable::compileEntity($hlblock);
            $Query = new \Bitrix\Main\Entity\Query($entity);
    
            $Query->setSelect($select);
            $Query->setFilter($filter);
            $Query->setOrder([]);
            $Query->setLimit($limit);
    
            $result = $Query->exec();
    
            $arResult = new \CDBResult($result);
    Ответ написан
    Комментировать
  • Как автоматизировать очистку кэша битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Увы, очищать папку через cron не лучшая идея. По факту Вы боретесь не с проблемой, а с симптомом.
    Почему разрастается папка кеша?
    1) У Вас очень большой и сложный сайт.
    Например при 10 тысячах товаров в одной категории, если Вы будете пытаться кешировать каждую страницу, то размер будет большой. Предположим на страницу с 10 товарами уходит 10КБ кеша (на самом деле, все зависит от верстки и может достигать и бОльшего размера), тогда общий кеш каталога будет 10КБ * 10 000 = ~100МБ (учетных, на самом деле около 90МБ).
    Теперь посчитаем, что может быть 2 вида отображения: списком или плиткой. Соответственно уже 180МБ. А если товаров не 10 тысяч, а 100 ? А если есть еще и фильтр и его результаты могут быть кешированы? И это мы посчитали только каталог и довольно малый размер кеша.

    Решение: подобрать время кеширования и увеличить дисковое пространство

    2) Неправильно определено время кеширования.
    Например: у Вас ttl кеша стоит 3 месяца. И даже если за 3 месяца на него никто не зашел, он все-равно хранится. Например у Вас очень объемный кеш (что очень плохо), который занимае 500КБ (а иной раз и 1 МБ), получается что этот 1МБ будет хранится на протяжении длительного времени, даже если к нему нет обращения.

    Решение: подобрать время кеширования (возможно где-то стоит уменьшить) и параметры компонентов (возможно что-то не стоит кешировать)

    3) Неправильно настроен кеш собственных или битриксовых компонентов.
    Например есть очень большой пунктик в битриксе с кешем меню - если указать MENU_CACHE_VARS (вроде так пишется, по памяти писал), то он будет под каждый набор параметров создавать кеш. И тогда кеш меню начинает сильно пухнуть и еще и кешироваться на длительное время.

    Решение: нужно проверить параметры кеширования в компонентах. Возможно в своих компонентах переписать или посмотреть на основании чего он формируется

    4) Ошибка с механизмом очищения кеша.
    Например, когда кеш не успевает удаляться, и накапливается. Таким образом происходит дублирование одного и того же кеша в разных компонентах.
    Ответ написан
    Комментировать
  • Почему возникает ошибка MySQL в Битрикс?

    @miniven Автор вопроса
    В общем, запустил проверку, обнаружилась одна ошибка в БД. Битрикс сам успешно её исправил. Всем спасибо
    Ответ написан
  • Как в битриксе D7 прикрепить к письму вложенный файл?

    alexfilus
    @alexfilus
    Senior backend developer
    https://yadi.sk/i/a59pfaGq3MtEJi
    судя по этому надо в массив параметров, передать в ключ FILE id файла в системе, либо массив id.
    Ответ написан
    2 комментария
  • Как подключить платежные системы к сайту на Битрикс Старт?

    ArtamonovDenis
    @ArtamonovDenis
    Full-stack developer
    Вы сами на всё уже ответили.

    в этой редакции нету в разделе Магазин пункта Платежные системы


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

    И как админ сможет просматривать оплаченные заказы? С помощью инфоблоков?


    Зависит от программиста, т.е. от того, каким образом он будет хранить и обрабатывать данные.
    Это могут быть и инфоблоки, и хайлоад-блоки (предпочтительнее).
    Ответ написан
    Комментировать
  • Как создать кастомное действие с привязкой к элементу?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Впринципе не сложно.

    Для начала Вы подписываетесь на событие OnAdminListDisplay модуля Main.
    Именно оно отвечает за действие ДО вывода любого списка элементов в административной панели (за исключением под-листов у инфоблоков и модуля производительности).
    На вход оно принимает лишь 1 параметр - экзепляр класса CAdminList (см. /bitrix/modules/main/interface/admin_list.php)

    Чтобы обрабатывать нужную таблицу, нужно ограничить выборку. Т.е. Ваш обработчик будет выглядеть как-то так:

    <?php
    AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
    function MyOnAdminContextMenuShow(&$oAdminList)
    {
        /**
         * $type - тип кода инфоблока, например news, events и т.д.
         * $iblock - идентификатор инфоблока
         * 
         * Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
         */
        if ( $oAdminList->table_id == "tbl_iblock_list_".md5($type.".".$iblock) )
        {
            // полезные действия
        }
    }
    ?>


    Собственно так, мы получаем возможность работать с выводом.
    Для более подробного пояснения лучше прочитать про заказные элементы в административной панели в документации: https://dev.1c-bitrix.ru/api_help/main/general/adm...

    Собственно добавим нужные нам данные для работы. Предположим, я хочу логгировать выделенные элементы на странице, тогда мой код будет выглядеть так:
    AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
    function MyOnAdminContextMenuShow(&$oAdminList)
    {
        /**
         * $type - тип кода инфоблока, например news, events и т.д.
         * $iblock - идентификатор инфоблока
         * 
         * Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
         */
        if ( $oAdminList->table_id == "tbl_iblock_list_".md5("structure.4") )
        {
        	$arActions = $oAdminList->arActions;
    
        	$arActions['alert'] = 'Ругаться!';
    
        	$oAdminList->AddGroupActionTable($arActions);
        }
    }
    
    AddEventHandler("main", "OnAfterEpilog", "iblockAlert");
    
    function iblockAlert()
    {
    	$oRequest = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
    
    	// Проверяем, что работает только в админке
    	if ( $oRequest->isAdminSection() )
    	{
    		if (
    			// Интересуют только интерактивные запросы
    			$oRequest->get('mode')=='frame'
    			// Где передана переменна IBLOCK_ID
    			&& $oRequest->get('IBLOCK_ID')==4
    			// Соответствующие нашему action
    			&& $oRequest->get('action')=='alert'
    			)
    		{
    			/**
    			 * Вот тут можно сделать что угодно
    			 * Можно получить выделенные ID
    			 * через $oRequest->get('ID')
    			 * Если он пуст, значит действие на всех элементах инфоблока
    			 */
    		}
    	}
    }


    На самом деле параметров гораздо больше - есть еще custom области, которые можно выводить, но суть та же. Если захотите добавить свое поле (я добавлял простой action), то лучше глянуть в исходники и там уже по аналогии разрбраться
    Ответ написан
    3 комментария
  • Как сделать генерацию id?

    webinar
    @webinar Куратор тега PHP
    Учим yii: https://youtu.be/-WRMlGHLgRg
    но я не шарю в php

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

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