Задать вопрос
  • Как правильно сверстать на Bootstrap 4?

    Madeas
    @Madeas
    UI / UX Designer, Frontend Developer
    Используйте flexbox https://getbootstrap.com/docs/4.0/utilities/flex/

    Набросал быстренько https://jsfiddle.net/4dsw9but/
    Ответ написан
    Комментировать
  • Как сделать добавление товаров в корзину только из одной родительской категории?

    serginhold
    @serginhold
    сразу видно уровень типичных "битриксойдов".

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

    можно конечно использовать всякие CIBlockElement::GetElementGroups и CIBlockSection::GetNavChain, но это приведет к тьме запросов в цикле, чем больше разделом, тем больше запросов и тем медленнее все работает.

    я так понимаю тебе нужно узнать все родительские категории первого уровня, зная только id товара.
    смотрим исходники ядра битрикса, и понимаем что
    b_iblock_section - таблица разделов
    b_iblock_section_element - таблица связи элементов и разделов

    способ хранения дерева разделов в битриксе - nested sets
    гуглим что это, читаем и разбираемся, поверь это более полезная информация, чем запоминание древнего api битрикса

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

    select 
        s.ID
    from b_iblock_section_element se
    inner join b_iblock_section l
        on l.ID = se.IBLOCK_SECTION_ID
    inner join b_iblock_section s
        on s.IBLOCK_ID = l.IBLOCK_ID
        and s.LEFT_MARGIN <= l.LEFT_MARGIN
        and s.RIGHT_MARGIN >= l.RIGHT_MARGIN
        and s.DEPTH_LEVEL = 1
    where se.iblock_element_id = 2212954
    group by s.ID
    Ответ написан
    Комментировать
  • Как сделать добавление товаров в корзину только из одной родительской категории?

    У товара есть основной раздел, к которому он привязан, его можно менять через админку (https://dev.1c-bitrix.ru/learning/course/?COURSE_I... Поэтому получая родительский раздел по товару, вы будете всегда получать один и тот же, основной раздел. Как выше сказали, смотреть нужно на раздел, в котором сейчас пользователь находится, если он не совпадает с основным разделом товара, то такой товар в корзину добавлять не следует
    Ответ написан
    Комментировать
  • Как сделать добавление товаров в корзину только из одной родительской категории?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Давай поговорим немножко о другом.
    Предположим, что у тебя следующая структура:

    Москва (id: 1)
    Приборы (id: 2)
    Инструменты (id: 5)
    Санкт-Петербург (id: 3)
    Инструменты (id: 4)

    Если товар принадлежит к категории 5, то он точно из Москвы и соответственно при добавлении товара из id:2 он должен добавиться.
    А если товар у тебя есть одновременно и там и там? Ну скажем, товар был добавлен и в id:4 и в id:5 - ситуация может быть и такой. В твоем коде, если товар так был занесен, то при добавлении родительский раздел может быть как СПБ, так и Москва, тогда в одном из городов твоя логика работать не будет, а это неправильно.

    Я тут набросал пару примеров и сделал пару допущений:
    1) Какой-то товар уже в корзине
    2) Ты уже знаешь ID города, товар из которого добавлен в корзину

    Весь код (без магии), отвечающий за проверку возможности добавлять товар:
    /**
     * @var integer Идентификатор товара из CITY_PRODUCTS_IBLOCK_ID, добавляемого в корзину
     */
    $iProductId = 650;
    
    /**
     * @var integer Идентификатор города, товар которого уже добавлен в корзину
     */
    $iCityId = 91;
    
    if ( canAddByCity($iProductId, $iCityId) )
    {
    	echo "Можно добавить";
    }
    else
    {
    	echo "Нельзя добавить";
    }


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

    /**
     * @var int Уровень вложенности, где находятся города (у меня 2)
     */
    define('CITY_DEPTH_LEVEL', 2);
    
    /**
     * @var integer Идентификатор инфоблока, где ищем товары
     */
    define('CITY_PRODUCTS_IBLOCK_ID', 5);
    
    /**
     * Возвращает true, если товар $product можно добавить в корзину
     * @param integer $product 
     * @param integer $city 
     * @return boolean
     */
    function canAddByCity( $product, $city = 0 )
    {
    	if ( empty($city) )
    	{
    		return true;
    	}
    
    	if ( !\Bitrix\Main\Loader::IncludeModule('iblock') )
    	{
    		return false;
    	}
    
    	/**
    	 * @var array Список категорий верхнего уровня для сравнения
    	 */
    	$arRootGroups = [];
    
    	/**
    	 * @var CDBResult
    	 * @see https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getelementgroups.php
    	 */
    	$resGroups = \CIBlockElement::GetElementGroups($product, true);
    
    	while( $arGroup = $resGroups->fetch() )
    	{
    		/**
    		 * А вдруг товар без категории и сразу добавлен в город
    		 * т.е. без привязки?
    		 */
    		if ( $arGroup['DEPTH_LEVEL'] == \CITY_DEPTH_LEVEL )
    		{
    			$arRootGroups[] = $arGroup['ID'];
    			continue;
    		}
    
    		/**
    		 * @todo Запросы в цикле это очень плохо. 
    		 * Лучше запомнить где-то разделы и лишние уровни и дополнительным
    		 * циклом пройтись после - запросов будет меньше и будет быстрее работать
    		 */
    		$iRootSectionId = getSectionIdByDepthLevel($arGroup['ID']);
    
    		if ( !empty($iRootSectionId) )
    		{
    			$arRootGroups[] = $iRootSectionId;
    			continue;
    		}
    	}
    
    	// Какие корневые группы имеет этот товар
    	// можно посмотреть через код
    	//var_dump($arRootGroups);
    
    	return in_array($city, $arRootGroups);
    
    }
    
    /**
     * Возвращает код родительского раздела $section из инфоблока $iblockId
     * на уровне CITY_DEPTH_LEVEL. В случае отсутствия возвращает 0
     * @param integer $section 
     * @param integer $iblockId 
     * @return integer
     */
    function getSectionIdByDepthLevel( $section, $iblockId = \CITY_PRODUCTS_IBLOCK_ID )
    {
    	$section = intval($section);
    
    	if ( empty($section) )
    	{
    		return 0;
    	}
    
    	if ( empty($iblockId) )
    	{
    		return 0;
    	}
    
    	if ( !\Bitrix\Main\Loader::IncludeModule('iblock') )
    	{
    		return 0;
    	}
    
    	$resChain = \CIBlockSection::GetNavChain($iblockId, $section, ['ID','DEPTH_LEVEL','IBLOCK_SECTION_ID']); 
    
    	while( $arSection = $resChain->fetch() )
    	{
    		if ( $arSection['DEPTH_LEVEL'] == \CITY_DEPTH_LEVEL)
    		{
    			return $arSection['ID'];
    		}
    	}
    
    	return 0;
    }
    Ответ написан
    Комментировать
  • Как настроить права для новых папок и файлов?

    shambler81
    @shambler81 Куратор тега Linux
    В windows не было просо, да обычные права вы выставляли легко, но если я вам задам вопросы по владельцам и группами тд, то вы скорее всего засыпитесь.
    В линуксе все права пишутся в одну строчку что очень удобно и понятно.
    Ваша проблемма не в правах 755 и 777 а в том что вы не понимаете их до конца. Права это не только эти 3 цифры.
    А так же еще и владелец и группа.
    В вашем случае что происходит.
    Вы как владелец попадаете в группу 1 и у вас права 7
    А вот второй пользователь уже не попадает ни в группу "доверительных" а смело в последнюю, что в вашем случае уже не принципиально поскольку и там и там 5 5 соответственно.
    Обратите внимание более внимательно на права файла.
    777 root root вот права на файл, на самом деле там еще есть пара специфических прав но сейчас вам они будут не нужны
    Владельца файла меняют через chown -R user:group /home/www/test.ru
    НО УЧТИТЕ! их нужно менять очень внимательно поскольку если смените на системной папке то убьете ее!
    По сути что вам нужно сделать
    Выставлять качественные права 755 ибо 777 это костыль
    В идиале вам для этого нужно чтоб юзер и группа совпадали и там и там, в таком случае вы попадете в 7 и там и тут.
    Второй вариант 775 и добавить пользователя в доверительную группу.

    Посмотрите тут все есть и владелец и группа https://sheensay.ru/wp-content/uploads/2015/06/ls-l.png
    Ответ написан
    2 комментария
  • Как правильно сверстать подобное?

    JaredWinter
    @JaredWinter
    Помог? - Отметь решением.
    Вам повезло, что у меня хорошее настроение
    Ответ написан
    Комментировать
  • Как вывести последние обновления?

    parotikov
    @parotikov
    Wordpress, Laravel, OctoberCMS, Vue, Nuxt.js
    Запросы query-buldera:
    //достаем категории для главной
    $categories = Category::where('display_home', 1)->get('id', 'name', 'slug');
    
    //сюда будем схоронять посты, которые не должны повторяться
    $posts_exclude = collection();
    
    //для каждой категории
    foreach ($categories as $category) {
    	
    	$posts_array[$category->title] = Post:: //ищем посты,
    		whereHas('categories', function ($q) use ($category) { //у которых категория
    			$q->where('id', $category->id); // одна из найденных для главной,
    		})
    		->whereNotIn('id', $posts_exclude->pluck('id')) // и постов нет в исключаемых
    		->get('id', 'title', 'slug'); // только с нужными полями
    	$posts_exclude->merge($posts_array[$category->id]); // добавили найденные посты в коллекцию с исключаемыми
    }

    Затем уже выводим массив с постами (псевдокод, это надо в блейд переписать):
    <ul>
    foreach ($posts_array as $category => $posts) {
    	<li>
    		$category //ключ основного массива - название категории 
    		<ul>
    		foreach ($posts as $post) { //значение элементов основного массива - набор постов из категории
    			<li>$post->title</li>
    		}
    		</ul>
    	</li>
    }
    </ul>


    То есть, получаем n+1 запрос, где n - количество категорий.
    Это в query-builder style. Можно, в принципе, написать один raw-запрос, но это уже за пределами топика.
    Сложный одиночный query-builder запрос, полагаю, можно написать, но не вижу смысла, т.к. он будет не поддерживаемый. Да и закешить это всё можно, так что не в быстродействии дело.

    p.s: Код негде проверить, писал по памяти. Надеюсь, ход мысли понятен
    Ответ написан
    Комментировать
  • Как сделать правильный Redirect 301?

    shambler81
    @shambler81 Куратор тега htaccess
    Вы конечно простите но у вас нет прямой связи в ссылках.
    Вы хоть файлик экселевский чтоли скиньте.
    Вот ваш пример
    RewriteRule ^5458\-zabavnaya\-reklama\-ne\-teryaet\-aktualnosti\.html$ /journal/zabavnaya-reklama-ne-teryaet-aktual? [L,R=301]

    Но я так предполагаю что вам нужно удалить все цифры и вместо них написать journal
    и удалить html
    RewriteRule ^[0-9]{1,}\-(.+)\.html$ /journal/$1? [L,R=301]

    цфирф от 0-9 не менее 1 раза до -далее (тут ваш урл) до .html в конце, подставляем то что в скобках в ур
    Ответ написан
    Комментировать
  • Как выравнить блоки ряда?

    webirus
    @webirus
    Тыжверстальщик! Наверстай мне упущенное...
    Вариант 1) Для блоков
    display: inline-block;
    vertical-aligm: top;

    Вариант 2) Для родителя
    display: flex;
    dlex-direction: row;
    flex-wrap: wrap;


    Читал статьи, связанные с flex. Но это все не то, т.к. у меня несколько рядов.

    Эта проблема как раз и решается через flex-wrap: wrap;.
    Ответ написан
    3 комментария
  • Как связать 3 таблицы?

    @masterfreelance
    программист со стажем
    SELECT * FROM categories
    INNER JOIN item_category ON item_category.category_id = category.id
    INNER JOIN posts ON posts.id = item_category.post_id
    Ответ написан
    2 комментария
  • Как построить отношения между моделями?

    @Result007
    P|-|P
    Привет! Давай по порядку :)

    1. Так как у тебя отношения много ко многим (если это не так, будет по другому), то ты правильно сделал третью табличку. Модель для нее делать не нужно! Отношения будут выглядеть так:
    Модель категории: Category.php
    protected $table = 'categories';
    public function posts()
    {
        return $this->belongsToMany('App\Models\Post', 'post_id', 'category_id);
    }

    Модель поста: Post.php
    protected $table = 'posts';
    public function categories()
    {
        return $this->belongsToMany('App\Models\Category', 'post_id', 'category_id);
    }


    2. Для того, чтобы работать с категориями поста ( и в обратном порядке):
    $post = Post::where('slug', $slug)->first();  -----> равенство идет по дефолту
    $categories = $post->categories;
    foreach ($categories as $category)
    {
        echo $category->id. '<br>';   -----------------> любые данные категории.
    }
    Ответ написан
    2 комментария
  • Как вытащить текст с помощью регулярных выражений?

    DevMan
    @DevMan
    /poster\|(.*)\|/U
    ideone.com/JHsboD
    Ответ написан
    Комментировать
  • Как разобраться в данном коде и понять его алгоритм?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Ответ написан
    Комментировать
  • Загрузка файла на сервер?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Ничего не мешает поменять метод на post. В коде изменится только $_GET на $_POST переменные.
    Перед заливкой в базу обычно неплохо проверять данные на "качество", загружать данные в базу прямо из пост/гет - плохая практика.
    Подумайте о том как будут именоваться файлы, как их структурировано хранить и привязать к определенной записи.
    Как избежать дублей и как удалять их при удалении записи.
    Удачи )
    Ответ написан
    Комментировать
  • Как отсортировать данные из БД таким образом?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    $curdate = '';
    while (($row = $result_set -> fetch_assoc()) != false) {
      $date = sdate("M Y", 0, $row["date"]);
      if ($curdate != $date) {
        echo "<h2>Отчетность за ".sdate("M Y", 0, $row["date"])."</h2>";
        $curdate = $date;
      }
      echo "<a href=\"".$row["link"]."\">".$row["name"]."</a>";
      echo "<span>(".fdate("d M Y h:i", 0, $row["date"]).")</span><hr>";
    }
    Ответ написан
    3 комментария
  • Обновление таблиц?

    sabramovskikh
    @sabramovskikh
    Некоторые модули ставят свои таблицы в базу данных. Поэтому создание своих таблиц вполне нормальное дело
    Ответ написан
    Комментировать
  • Обновление таблиц?

    Битрикс при обновлении может делать всё, что угодно, со своими таблицами, но чужие трогать не станет.
    Ответ написан
    Комментировать
  • CSite::InDir для подразделов раздела?

    добавить свойства для раздела, в которое запихнуть необходимую инфу/картинку, в компоненте через result_modifier.php получить эти данные через CIBlockSection::GetList, буферизовать, вывести через отложенные функии в хэдере

    для подразделов, родителя можно получить через = CIBlockSection::GetNavChain
    далее так же выбрать свойства у родителя и как выше описано
    Ответ написан
    Комментировать