Задать вопрос
  • Как наиболее рационально обновлять данные в моделях Laravel?

    @voland700 Автор вопроса
    Благодарю Всех за помощь и информацию в решении задачи.

    Учитывая, что данная информация возможно будет полезна для других, опишу выбранный мною способ решения.
    Действительно, задачу регулярного обновления цен в зависимости от курса валют, можно решить разными способами. Для себя я выбрал способ обновления данных с использованием сырых raw запросов к базе данных. Учитывая, что данные курса валют обновляются не часто, только раз в сутки – считаю это будет оптимальным, не ресурсозатратным способом.

    Данные товаров, в том числе их стоимости, хранятся в таблице ‘ product’, в которой так же содержаться поля для определения цены товара:
    1. ‘base_price’ – Базовая цена товара, стоимость в рублях, долларах, евро
    2. ‘currency’ – Тип, в какой валюте задана базовая цена: в рублях RUB, в евро EUR или долларах USD
    3. ‘price’ – конвертированная цена, с учетом текущего курса валюты.

    5ff458415c119314189916.jpeg

    Свежие данные о курсе валют получаются по API Центрбанка РФ и сохраняются в таблице ‘currency’.
    5ff4585ae2d92902315016.jpeg
    В контроллере получаю коллекцию и преобразую в массив с необходимыми данными о типе валюты, номинале и значении действующего курса.
    $currency = Currency::select('currency', 'Nominal', 'value')->get()->keyBy('currency')->toArray();


    Затем с помощью RAW запросов обращаюсь к базе для обновления каждого типа валюты. На пример, для товаров, базовая цена которых задана в ЕВРО (‘currency’ = 'EUR'), обновление данных будет происходить следующим запросом:
    $countUpdate = DB::update("UPDATE `product` SET `price` = (`base_price` * ?)  WHERE `currency`='EUR'", [ $currency['EUR']['value'] ]);


    То есть из таблицы товаров ("UPDATE `product`) выбираются данные товаров где поле ‘currency’ – тип валюты, задано как (WHERE `currency`='EUR'), и для поля `price` устанавливаются значения, где данные базовой цены умножаются на сумму действующего курса валюты (`price` = (`base_price` * $currency['EUR']['value']).

    Таким образом, четырьмя аналогичными запросами происходит конвертация в рубли и обновление цен товаров, цена которых задана в валюте. Используя функции MySQL ELT() и FIELD() данные запросы можно объединить в один.
    Ответ написан
    Комментировать
  • Laravel Nestedset - дерево категорий, проблема с обновлением данных. Как исправить?

    @voland700 Автор вопроса
    Проблема решена, опишу решение.
    1. В моем случае была ошибка в логике. Пытался ID - редактируемой категории сохранить как parent_id, в результате получал сообщение Kalnoy\Nestedset\NodeTrait об ошибке, что категория не может быть вложена сама в себя. Ошибка возникла при копировании формы для создания категории в шаблон для редактирования данных.
    2. Просто присвоить parent_id - данные id родительской категории, для построения Kalnoy\Nestedset\NodeTrait дерева вложенных категорий недостаточно. Для пересчета дерева, если новой категории напрямую присвоить parent_id, необходимо запустить метод:
    $category::fixTree();
    данный метод запускает перерасчет дерева на основе данных parent_id, заполняет в таблице значения полей _lft и _rgt, на основе которых строится дерево вложенности.
    Ответ написан
    Комментировать
  • Какую панель выбрать для хостинга?

    Пользуюсь BrainyCP - бесплатная и функциональная серверная хостинг-панель. Ставлю на VDS, весь необходимый функционал в наличии.
    Ответ написан
    Комментировать
  • Ошибка 419 после переноса сайта на Laravel на хостинг. Как исправить?

    @voland700 Автор вопроса
    Проблема решена. В моем случае проблема была в конфигурации сервера. Сайт размещен на VDS сервере с панелью управления BrainyCP. Панель была сконфигурирована для работы сайтов на Битрикс, в том числе необходимый параметр для работы Битрикс - BrainyCP mbstring.func_overload.
    Согласно логам сервера - при попытке сохранить какие либо данные через форму на сайте отрабатывала 419 ошибка.
    В логах сервера запись о данной ошибке в виде:
    [Fri Nov 13 12:35:33.249913 2020] [proxy_fcgi:error] [pid 18854:tid 140666176743168] [client 212.45.19.58:43938] AH01071: Got error 'PHP message: PHP Deprecated:  The mbstring.func_overload directive is deprecated in Unknown on line 0', referer: http://hight-control.ru/

    Что говорит о проблемах с настройкой PHP mbstring.func_overload.

    Проблема была решена установкой на сервере новой версии PHP 7.4 с параметрами по умолчанию, и переключению сайта на работу на данной версии PHP.
    Ответ написан
    Комментировать
  • После переноса приложения на Laravel на сервер приложение не видит контроллеры. Как исправить?

    @voland700 Автор вопроса
    Проблема устранена. Причина имя файла контроллера было с маленькой буквы InfoController.php, название класса указано с большой
    class InfoController extends Controller
    	{
    		//
    	}

    На локальном сервер под Windows все работало, но на перенеосе на хостинг проблема появилась.
    Ответ написан
    Комментировать
  • Как удалить несколько файлов при одновременном удалении поста и информации в базе данных?

    @voland700 Автор вопроса
    Опишу решение данной задачи. Мною задача по одновременному удалению файлов галерей при удалении поста, решена так:
    //Pechnik -  модель/таблица содержит данные поста
    //Images - модель/таблица содержит информацию о  изображениях галереи 
     
    // - метод ресурсного контролера для удаления поста
        public function destroy($id)
        {
            $images = Images::where('pechnik_id', $id); //получаю колекцию файлов галереи превязанных к ID поста p из таблицы Images
            $pathImages = $images->get('img'); //получаю данные наименование и путь файлов галереи превязанных к ID поста
            if (!$pathImages->isEmpty()){ 
                foreach ($pathImages as $img){ 
                    $path = $img->img; 
                    Storage::disk('public')->delete(str_replace('storage', '', $path)); //в цикле удаляю фалы галереи превязанных к ID поста
                }
            }
            $images->delete(); // удаляю записи в таблице Images:: о файлах галереи
            $pechnik= Pechnik::find($id);   // получаю данные поста по ID из таблицы Pechnik::
            Pechnik::find($id)->delete();  // удаляю запись в таблице Pechnik:: - данные поста
            return redirect()->route('admin.index')->with('success', 'Информаця успешно удалена');
        }
    Ответ написан
    Комментировать
  • Как получить список товаров каталога по ID, с данными о ценах и размерах скидки?

    @voland700 Автор вопроса
    Задача решена. Опишу решение, возможно кому-нибудь пригодится.

    Изначально, необходимо было вывести на главной странице каталога блок с товарами каталога, по свойству PROPERTY_STICKERS – типа список, которым заданы значения Хит, Советуем, Новинки, Акции для вывода товаров с соответствующими стикерами. При этом товары должны выводится с размером скидок, указанием старой цены, ценой конвертированной из Валюты в рубли.

    5ef994cd5227f620637405.jpeg

    Методы битрикс CIBlockElement::GetList и CCatalogDiscount::GetList не идеальны для решения данной задачи. По моему мнению целесообразней использовать компонент catalog.section с фильтром по свойству. Для чего в параметрах компонента задан фильтр:
    "USE_FILTER" => "Y",
         "FILTER_NAME" => "arrFilterAdvice",


    И для получения всех товаров каталога, в которых заданы значения свойству PROPERTY_STICKERS (свойство не пустое) задан фильтр.

    <? $GLOBALS['arrFilterAdvice'] = array('ACTIVE' => 'Y', '!PROPERTY_STICKERS' => false);
    $APPLICATION->IncludeComponent(
    	"bitrix:catalog.section", 
    	"shop_window", 
    	array(
              …
              "USE_FILTER" => "Y",
              "FILTER_NAME" => "arrFilterAdvice", 
              …


    Таким образом получен список товаров которым заданы значения, и уже в файле result_modifier.php сортирую полученные элементы по массивам - Хит, Советуем, Новинки, Акции, добавляю в результатирующий массив $arResult для кеширования.

    if(!$arResult["ADVICE"]){
    	foreach($arResult["ITEMS"] as $Element){
    		foreach($Element["PROPERTIES"]["STICKERS"]["VALUE_XML_ID"] as $type){		
    			if($type == "HIT") $arResult["ADVICE"]["HIT"][$Element["ID"]] = $Element;
    			if($type == "RECOMMEND") $arResult["ADVICE"]["RECOMMEND"][$Element["ID"]] = $Element;
    			if($type == "NEW") $arResult["ADVICE"]["NEW"][$Element["ID"]] = $Element;
    			if($type == "STOCK") $arResult["ADVICE"]["STOCK"][$Element["ID"]] = $Element;
    		}
    	}
    }


    Полученные данные вывожу в шаблоне компонента catalog.section в виде табов.
    Ответ написан
    Комментировать
  • Почему не работает фильтр для выборки элементов инфоблока по ID?

    @voland700 Автор вопроса
    Проблема решена - способы решения находятся в комментариях.
    Суть проблемы в том, что данные содержащиеся в $arResult в файле component.epilog.php недоступны. Для передачи необходимых параметров содержащихся $arResult необходимо их пробросить из кешируемой области компонента в component_epilog.php:
    $cp = $this->__component;
    if (is_object($cp))
    {
      $cp->arResult["ASSOCIATED"] = $arResult["PROPERTIES"]["ASSOCIATED"]["VALUE"];
      $cp->SetResultCacheKeys(array("ASSOCIATED")); //cache keys in $arResult array
    }


    Либо передавать через $arParams параметры настроек компонента:
    $templateData["ASSOCIATED"] = $arResult["PROPERTIES"]["ASSOCIATED"]["VALUE"];
    Ответ написан
    Комментировать
  • Как задать рядам элементов DOM дерева HTML документа одинаковую высоту?

    @voland700 Автор вопроса
    Благодарю за советы ограничится возможностями CSS. В моем случае это не получится, по крайней мере я не представляю как это возможно сделать, так как карточка товара несколько сложнее чем на первом скриншоте.

    На некоторых товарах выводятся блоки с разными типами цен - скидками. Кроме того на Hоver - появляется кнопка купить с выбором количества. Вобщем без JS не обойтись.

    5ede2362ab597185986899.jpeg

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

    function funcItemsHeight(domItem) {
    	var menuItems = document.querySelectorAll(domItem);
    	var top = menuItems[0].offsetTop;
    	var arrHeight = [];
    	var arrItems = [];
    	for (var i = 0; i < menuItems.length; i++) {
    		menuItems[i].style.height = 'auto';
    	}
    	for (var i = 0; i < menuItems.length; i++) {
    		if (top != menuItems[i].offsetTop) {
    			arrHeight.sort(function (a, b) { return b - a });
    			for (var j = 0; j < arrItems.length; j++) {
    
    				arrItems[j].style.height = arrHeight[0] + 'px';
    			}
    			top = menuItems[i].offsetTop;
    			arrHeight.length = arrItems.length = 0;
    			i = i - 1;
    			continue;
    		}
    		arrHeight[arrHeight.length] = menuItems[i].offsetHeight;
    		arrItems[arrItems.length] = menuItems[i];
    	}
    	arrHeight.sort(function (a, b) { return b - a });
    	for (var j = 0; j < arrItems.length; j++) {
    		arrItems[j].style.height = arrHeight[0] + 'px';
    	}
    }
    window.onresize = funcItemsHeight;
    
    funcItemsHeight('.ВАШ_ЭЛЕМЕНТ');
    Ответ написан
    Комментировать
  • Как настроить правильный вывод цен в каталоге Bitrix, шаблон Аспро.Next?

    @voland700 Автор вопроса
    Проблема решена - помог ответ из комментариев:
    PetrPo,

    В настройках самого решения Аспро.Next - убрать старую цену нет. Есть поле формы "Старая цена для товара" - где указана базовая, - но сделать её не активной не получается.


    ctrl + лкм (зажми ctrl и щелкни левой кнопкой мыши на том куда вопросик на скрине адресован, чтобы снять выделение)
    Ответ написан
    Комментировать
  • Битрикс GetList - как получить самые просматриваемые элементы инфоблока?

    @voland700 Автор вопроса
    Вопрос решен. Возможно решение пригодится кому-нибудь, опишу решение.
    С помощью CIBlockElement::GetList - получаем список элементов инфоблока, сортируем по убыванию по полю SHOW_COUNTER - в котором содержаться данные о количестве просмотров, и ограничиваем лимит 5 элементами.

    if(CModule::IncludeModule('iblock'))
    {
    	$res = CIBlockElement::GetList(
    		array("SHOW_COUNTER"=>"DESC"), // сортировка по количеству просмотров;
    		array("IBLOCK_ID"=>1," ACTIVE"=>"Y"), //Получаем  активные элементы , в данном случае из инфоблока с ID = 1;
    		false, 
    		array("nTopCount"=>5), //ограничиваем количество элементов - только 5.
    		array("NAME","PREVIEW_PICTURE", "DETAIL_PAGE_URL")// Выбираем только указанные поля
    	); 
    	while($ar = $res->GetNext())
    	{
    		$arTheBest[]=$ar;	//массив с данными 5 самых просматриваемых элементов инфоблока				
    	}
    }
    Ответ написан
    Комментировать
  • VUE.JS Ошибка Error in v-on handler: "TypeError: handler.apply is not a function" - в чем причина?

    @voland700 Автор вопроса
    v-on:autorchange должен попадать метод (функция) а не computed свойство
    - было причиной проблемы.
    Ответ написан
    Комментировать
  • Почему не отрабатывает V-for после обновления DATA свойства полученными из базы данных?

    @voland700 Автор вопроса
    Вопрос снят. Ошибка найдена.
    Пытался работать с this data- внутри другой функции, которая имеет свой контекст!
    Ответ написан
    Комментировать
  • Как развернуть резервную копию созданную средствами веб окружения VMBitrix v7.3?

    @voland700 Автор вопроса
    Вопрос закрыт. Возможно данная информация будет полезна для других пользователей опишу процесс восстановления сайта или разворачивания из резервной копии созданной при автоматическом резервном копировании средствами Битрикс веб окружения.

    При автоматическом резервном копировании VMBitrix - фалы с backup-архивом помещаюстя в деректорию сервера /home/bitrix/backup/archive/www_backup_sitemanager_15.04.2019_8akRLwVX.tar.gz

    1. Копируем резервную копию в корневую директорию сайта:
    cp -R /home/bitrix/backup/archive/www_backup_sitemanager_15.04.2019_8akRLwVX.tar.gz /home/bitrix/www/www_backup_sitemanager_15.04.2019_8akRLwVX.tar.gz

    2. Переходим в дирeкторию сайта с архивом
    cd /home/bitrix/www/

    3. Распаковываем архив, воcтонавливаем файловую систему сайта.
    tar xzvvf www_backup_sitemanager_15.04.2019_8akRLwVX.tar.gz ./

    4. Воcтонавливаем MySQL - Базу данных.
    Дамп базы данных при резервном копировании средствами VMbitrix - размещается в директории /home/bitrix/ в виде двух файлов - с окончанием *.sql и *_after_connect.sql.
    Так же данные файлы находятся в самом архиве в директории /home/bitrix/ - от корня архива, при необходимости их можно извлечь от туда.

    Если база данных не нарушена - для восстановления достаточно дать команду на восстановление из файла *_after_connect.sql:
    mysql sitemanager
    < home/bitrix/mysql_dump_sitemanager_15.04.2019_8akRLwVX_after_connect.sql


    При необходимости полного восстановления базы данных необходимо последовательно дать команду на восстановление двух фалов:
    mysql sitemanager < home/bitrix/mysql_dump_sitemanager_15.04.2019_8akRLwVX.sql
    mysql sitemanager < home/bitrix/mysql_dump_sitemanager_15.04.2019_8akRLwVX_after_connect.sql


    5. При необходимости развернуть резервную копию на другом сервере, с установленным Веб окружением потребуется изменить пароль для пользователя базы. Для одного сайта в Битрикс веб окружением создастся база данных - sitemanager, с пользователем bitrix0.
    Пароль для пользователя bitrix0 при установке веб окружения генерируется автоматически, и соответственно не будет совпадать со старым паролем в конфигурационных файлах Битрикс. Посмотреть старый пароль можно в конфигурационных фалах Битрикс:
    /home/bitrix/www/bitrix/.settings.php или /home/bitrix/www/bitrix/php_interface/dbconn.php

    Необходимо поменять пароль для пользователе - bitrix0, привести в соответствие с паролем указанным в конфигурационных фалах:
    mysql -uroot
    SET PASSWORD FOR 'bitrix0'@'localhost' = PASSWORD('ПАРОЛЬ');
    Ответ написан
    Комментировать
  • Как создать сайт на поддомене (субдомене) на сервере с панелью BrainyCP?

    @voland700 Автор вопроса
    Благодарю Всех за ответы!
    Задача решена. Как и советовали, решением было создании в панели управления хостера подзоны: subdomen - с указанием того же IP на котором работает основной домен. Проблема была в том, что в панели управления хостинга при создании поддзоны, хостер присваивал другой IP - адрес для созданной подзоны. Просто заменил IP - адрес на правильный.
    Ответ написан
    Комментировать
  • Кто напомнит ресурс, который помогает строить предложения на английском?

    https://puzzle-english.com
    Много полезных практических материалов для изучения английского, с разным уровнем сложности.
    Есть возможность аудио, песни, фильмы сериалы, после прослушивания - раскладывать фразы -как пазлы из слов. В игровой форме - занимательно и интересно. Но ресурс доступен по подписке.
    Ответ написан
    Комментировать
  • Где найти практику по javascript?

    Занимательные задачи JavaScript и jQuery: https://vk.com/zadachi_javascript_jquery
    Ответ написан
    Комментировать