Страницы

Поиск по вопросам

Показаны сообщения с ярлыком битрикс. Показать все сообщения
Показаны сообщения с ярлыком битрикс. Показать все сообщения

среда, 15 апреля 2020 г.

1С-Битрикс: сайт на поддомене

#домен #php #битрикс

                    
Доброго дня. Как всегда, есть проблема.
У сайта site.ru есть поддомен lk.site.ru. Физически они раположены в папках /www/site.ru/
и /www/lk.site.ru/. На site.ru стоит старенький 1С-Битрикс: Управление сайтом 9.0.2,
а на lk.site.ru нет вообще ничего. Каким образом можно заставить оба сайта работать
c одной админкой?
Заранее спасибо.
Добавлено
Воспользовался указаниями http://dev.1c-bitrix.ru/community/blogs/howto/336.php:
создал симлинки, скопировал access и index, прописал в админке хосты и папки, однако
CMainPage::GetSiteByHost(); на lk.site.ru показывает id сайта site.ru. Что, в общем-то,
логично: ибо поддомен. Как побороть эту проблему?    


Ответы

Ответ 1



Вот тут - многосайтовость на пальцах - про это подробно расписано. Только я не совсем понял, будет ли это работать с поддоменами. Посмотрите, может поможет.

воскресенье, 29 марта 2020 г.

Как устранить ошибку 403?

#linux #htaccess #битрикс #веб_сервер #хостинг


Есть выделенный сервер на CentOS 7 на котором хостится муниципальный сайт на битриксе.
Проблема в том, что сайт (в основном, по ночам) становится не доступен и судя по логам
Nginx выдаёт ошибку 403. "Ложится" он на время от 5 до 50 минут и потом сам "поднимается".
Доступ для пользователей к директории с битрексом есть на чтение и запись. htaccess
(на сколько я могу судить) стандартный битрексовский. Наименование файлов корректное.
Думал, что это может быть из-за бэкапов, но "ложится" сайт по времени рандомно. Подскажите,
пожалуйста, что может быть?
    


Ответы

Ответ 1



Требуется для начала исследовать кто выдает ошибку 403: Nginx/Apache или PHP-код. Найти это можно в логах nginx/apache и по заголовкам ответа (X-Powered-By). Далее требуется разбиратся с логами конкретного сервера nginx/apache (и искать в логе ошибок причину ошибки 403) либо при выдаче этого кодом php - разбиратся в нём

Ответ 2



Нашёл причину (точнее, помог коллега). Оказалось, всё было в банальном фишинге сайта (использовали rk.php для перенаправления на свои сайты). По этой причине, сервер временно блокировал балансировщик пересылающий эти запросы серверу. Решается это всё в настройках Битрикса. Нужно зайти в интерфейс Битрикса, в раздел меню "Проактивная защита", дальше в "Защита редиректов" и включить защиту редиректов. Битрикс будет подписывать ссылки через rk.php.

понедельник, 9 марта 2020 г.

Почему упал сайт? 500

#php #mysql #битрикс #администрирование


Ребят, не очень шарю в администрировании, есть такая проблема: сайт выдаёт 500 ошибку,
глянул логи там спамит вот такая ошибка: 


  ri Apr 22 04:07:31.657989 2016] [:error] [pid 16512] [client
  85.14.245.175:48527] PHP Fatal error: Namespace declaration statement has to be
the very first statement in the script in
  /var/www/maxkondaurov/data/www/maxkondaurov.ru/bitrix/modules/main/lib/db/mysqlcommonconnection.php
  on line 2 [Fri Apr 22 04:07:33.244247 2016] [:error] [pid 16513]
  [client 85.14.244.114:48794] PHP Fatal error: Namespace declaration
  statement has to be the very first statement in the script in
  /var/www/maxkondaurov/data/www/maxkondaurov.ru/bitrix/modules/main/lib/db/mysqlcommonconnection.php
  on line 2


Зашел в этот файлик на второй строчке там
namespace Bitrix\Main\DB;

В чем может быть проблема? это же стандартный файл битрикса, при чем сайт работал,
но что то произошло и стала 500 ошибка вылетать, могу кинуть полный код файла mysqlcommonconnection.php

вот начало кода,в 3 строке убрал пробел, не помогло


 * 
  • host *
  • database *
  • login *
  • password *
  • initCommand *
  • options *
  • engine * * * @param array $configuration Array of Name => Value pairs. */ public function __construct(array $configuration) { parent::__construct($configuration); $this->engine = isset($configuration['engine']) ? $configuration['engine'] : ""; } /** * Checks if a table exists. * * @param string $tableName The table name. * * @return boolean */ public function isTableExists($tableName) { $tableName = preg_replace("/[^a-z0-9%_]+/i", "", $tableName); $tableName = trim($tableName); if (strlen($tableName) <= 0) { return false; } $result = $this->query("SHOW TABLES LIKE '".$this->getSqlHelper()->forSql($tableName)."'"); return (bool) $result->fetch(); } /** * Checks if an index exists. * Actual columns in the index may differ from requested. * $columns may present an "prefix" of actual index columns. * * @param string $tableName A table name. * @param array $columns An array of columns in the index. * * @return boolean * @throws \Bitrix\Main\Db\SqlQueryException */ public function isIndexExists($tableName, array $columns) { return $this->getIndexName($tableName, $columns) !== null; } /** * Returns the name of an index. * * @param string $tableName A table name. * @param array $columns An array of columns in the index. * @param bool $strict The flag indicating that the columns in the index must exactly match the columns in the $arColumns parameter. * * @return string|null Name of the index or null if the index doesn't exist. * @throws \Bitrix\Main\Db\SqlQueryException */ public function getIndexName($tableName, array $columns, $strict = false) { if (!is_array($columns) || count($columns) <= 0) return null; $tableName = preg_replace("/[^a-z0-9_]+/i", "", $tableName); $tableName = trim($tableName); $rs = $this->query("SHOW INDEX FROM `".$this->getSqlHelper()->forSql($tableName)."`"); if (!$rs) return null; $indexes = array(); while ($ar = $rs->fetch()) { $indexes[$ar["Key_name"]][$ar["Seq_in_index"] - 1] = $ar["Column_name"]; } $columnsList = implode(",", $columns); foreach ($indexes as $indexName => $indexColumns) { ksort($indexColumns); $indexColumnList = implode(",", $indexColumns); if ($strict) { if ($indexColumnList === $columnsList) return $indexName; } else { if (substr($indexColumnList, 0, strlen($columnsList)) === $columnsList) return $indexName; } } return null; } /** * Returns fields objects according to the columns of a table. * Table must exists. * * @param string $tableName The table name. * * @return Entity\ScalarField[] An array of objects with columns information. * @throws \Bitrix\Main\Db\SqlQueryException */ public function getTableFields($tableName) { if (!isset($this->tableColumnsCache[$tableName])) { $this->connectInternal(); $query = $this->queryInternal("SELECT * FROM ".$this->getSqlHelper()->quote($tableName)." LIMIT 0"); $result = $this->createResult($query); $this->tableColumnsCache[$tableName] = $result->getFields(); } return $this->tableColumnsCache[$tableName]; } /** * @param string $tableName Name of the new table. * @param \Bitrix\Main\Entity\ScalarField[] $fields Array with columns descriptions. * @param string[] $primary Array with primary key column names. * @param string[] $autoincrement Which columns will be auto incremented ones. * * @return void * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\Db\SqlQueryException */ public function createTable($tableName, $fields, $primary = array(), $autoincrement = array()) { $sql = 'CREATE TABLE '.$this->getSqlHelper()->quote($tableName).' ('; $sqlFields = array(); foreach ($fields as $columnName => $field) { if (!($field instanceof Entity\ScalarField)) { throw new ArgumentException(sprintf( 'Field `%s` should be an Entity\ScalarField instance', $columnName )); } $sqlFields[] = $this->getSqlHelper()->quote($columnName) . ' ' . $this->getSqlHelper()->getColumnTypeByField($field) . ' NOT NULL' // null for oracle if is not primary . (in_array($columnName, $autoincrement, true) ? ' AUTO_INCREMENT' : '') ; } $sql .= join(', ', $sqlFields); if (!empty($primary)) { foreach ($primary as &$primaryColumn) { $primaryColumn = $this->getSqlHelper()->quote($primaryColumn); } $sql .= ', PRIMARY KEY('.join(', ', $primary).')'; } $sql .= ')'; if ($this->engine) { $sql .= ' Engine='.$this->engine; } $this->query($sql); } /** * Creates index on column(s) * @api * * @param string $tableName Name of the table. * @param string $indexName Name of the new index. * @param string|string[] $columnNames Name of the column or array of column names to be included into the index. * @param string[] $columnLengths Array of column names and maximum length for them. * * @return Result * @throws \Bitrix\Main\Db\SqlQueryException */ public function createIndex($tableName, $indexName, $columnNames, $columnLengths = null) { if (!is_array($columnNames)) { $columnNames = array($columnNames); } $sqlHelper = $this->getSqlHelper(); foreach ($columnNames as &$columnName) { if (is_array($columnLengths) && isset($columnLengths[$columnName]) && $columnLengths[$columnName] > 0) { $maxLength = intval($columnLengths[$columnName]); } else { $maxLength = 0; } $columnName = $sqlHelper->quote($columnName); if ($maxLength > 0) { $columnName .= '('.$maxLength.')'; } } unset($columnName); $sql = 'CREATE INDEX '.$sqlHelper->quote($indexName).' ON '.$sqlHelper->quote($tableName).' ('.join(', ', $columnNames).')'; return $this->query($sql); } /** * Renames the table. Renamed table must exists and new name must not be occupied by any database object. * * @param string $currentName Old name of the table. * @param string $newName New name of the table. * * @return void * @throws \Bitrix\Main\Db\SqlQueryException */ public function renameTable($currentName, $newName) { $this->query('RENAME TABLE '.$this->getSqlHelper()->quote($currentName).' TO '.$this->getSqlHelper()->quote($newName)); } /** * Drops the table. * * @param string $tableName Name of the table to be dropped. * * @return void * @throws \Bitrix\Main\Db\SqlQueryException */ public function dropTable($tableName) { $this->query('DROP TABLE '.$this->getSqlHelper()->quote($tableName)); } /********************************************************* * Transaction *********************************************************/ /** * Starts new database transaction. * * @return void * @throws \Bitrix\Main\Db\SqlQueryException */ public function startTransaction() { $this->query("START TRANSACTION"); } /** * Commits started database transaction. * * @return void * @throws \Bitrix\Main\Db\SqlQueryException */ public function commitTransaction() { $this->query("COMMIT"); } /** * Rollbacks started database transaction. * * @return void * @throws \Bitrix\Main\Db\SqlQueryException */ public function rollbackTransaction() { $this->query("ROLLBACK"); } /********************************************************* * Type, version, cache, etc. *********************************************************/ /** * Sets default storage engine for all consequent CREATE TABLE statements and all other relevant DDL. * Storage engine read from .settings.php file. It is 'engine' key of the 'default' from the 'connections'. * * @return void * @throws \Bitrix\Main\Db\SqlQueryException */ public function setStorageEngine() { if ($this->engine) { $this->query("SET storage_engine = '".$this->engine."'"); } } } ?>

  • Ответы

    Ответ 1



    Вероятнее всего дело в символах в начале файла. По нормальному, код должен начинаться с

    суббота, 22 февраля 2020 г.

    Ошибка при добавление поля на событие bitrix 16.5?

    #sql #битрикс

    
    Переходим на новую версию php 7 в bitrix 16.5 и я пытаюсь записать в базу имя физического
    лица при помощи кода:
    
    https://gist.github.com/vasilukwolf/c2dfaf819de9d9b65a18b0264757c3a0
    
    Однако происходит сбой записи. Пробовал менять события, пробовал просто отправить,
    результат один и тот же. Запись заблокирована.
    Пытался даже использовать совет:
    
    http://fmwd.ru/stati/cms/1c-bitrix/pochemu-ne-rabotaet-csaleorderpropsvalue.html
    
    Но запись в базу не происходит. Однако все прекрасно пишет в кеш. Вопрос состоит
    в том, как записать эту информацию базу, аналогично OnOrderSave:
    
    https://gist.github.com/vasilukwolf/995446e77fedf29014d5bfa640734b94
        
    


    Ответы

    Ответ 1



    К сожалению, помогло только это: https://stackoverflow.com/questions/11761140/mysql-on-duplicate-key-update-trouble В результате составил прямой запрос: $strSql = "INSERT INTO `b_sale_order_props_value` SET `ORDER_ID`=" . $value_id . ", `ORDER_PROPS_ID`=" . $ar['ID'] . ", `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "' ON DUPLICATE KEY UPDATE `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "';" Который отправил в базу и всё работает. Почему происходит другой запрос в штатной функции bitrix. Я написал запрос в bitrix, возможно еще дополню.

    Ответ 2



    Вот ответ на вопрос: \Bitrix\Main\EventManager::getInstance()-> addEventHandler("sale", "OnSaleOrderBeforeSaved", "OnSHandler"); function OnSHandler(Bitrix\Main\Event $event) { $order = $event->getParameter("ENTITY"); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if (15 == $p["ID"]) { $family = $property->getField("VALUE"); } if (19 == $p["ID"]) { $name = $property->getField("VALUE"); } if ("PRIVATE_PERSON" == $p["CODE"]) { $property->setValue($name . ' ' . $family); } } } } Публикую с целью CodeReview. Поддержка ответила: ЦИТАТА Вам не нужно писать в базу в этом событии. Вам нужно просто взять коллекцию свойств объекта $order и дописать в нее свои данные, или изменить уже существующие. Система сама потом сохранит всё в базу: $propertyCollection = $order->getPropertyCollection(); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if( $p["CODE"] == "CONTACT_PERSON") $property->setValue("VASYA"); } } С уважением, ведущий специалист отдела технической поддержки Шестопалов Лев При этом мы использовали событие OnSaleOrderBeforeSaved. Допилить мне его помог: https://mrcappuccino.ru/blog/post/work-with-basket-bitrix-d7

    Ответ 3



    Так а при чем здесь PHP7. У вас черным по белому пишет: нарушение уникальности ключа IX_SOPV_ORD_PROP_UNI. Это не зависит от версии PHP ни коим образом. По всему похоже, что есть некий тригер срабатывающий на обновление записив этой таблице. Вам надо с этим разбираться... Возможно что то не так у вас обновилось при серьезном обновлении или где то обращаетесь к БД в обход АПИ и там что то нкосячили.

    воскресенье, 16 февраля 2020 г.

    Ошибка при добавление поля на событие bitrix 16.5?

    #sql #битрикс

    
    Переходим на новую версию php 7 в bitrix 16.5 и я пытаюсь записать в базу имя физического
    лица при помощи кода:
    
    https://gist.github.com/vasilukwolf/c2dfaf819de9d9b65a18b0264757c3a0
    
    Однако происходит сбой записи. Пробовал менять события, пробовал просто отправить,
    результат один и тот же. Запись заблокирована.
    Пытался даже использовать совет:
    
    http://fmwd.ru/stati/cms/1c-bitrix/pochemu-ne-rabotaet-csaleorderpropsvalue.html
    
    Но запись в базу не происходит. Однако все прекрасно пишет в кеш. Вопрос состоит
    в том, как записать эту информацию базу, аналогично OnOrderSave:
    
    https://gist.github.com/vasilukwolf/995446e77fedf29014d5bfa640734b94
        
    


    Ответы

    Ответ 1



    К сожалению, помогло только это: https://stackoverflow.com/questions/11761140/mysql-on-duplicate-key-update-trouble В результате составил прямой запрос: $strSql = "INSERT INTO `b_sale_order_props_value` SET `ORDER_ID`=" . $value_id . ", `ORDER_PROPS_ID`=" . $ar['ID'] . ", `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "' ON DUPLICATE KEY UPDATE `NAME`='PRIVATE_PERSON', `VALUE`='" . $PRIVATE_PERSON_VALUE . "';" Который отправил в базу и всё работает. Почему происходит другой запрос в штатной функции bitrix. Я написал запрос в bitrix, возможно еще дополню.

    Ответ 2



    Вот ответ на вопрос: \Bitrix\Main\EventManager::getInstance()-> addEventHandler("sale", "OnSaleOrderBeforeSaved", "OnSHandler"); function OnSHandler(Bitrix\Main\Event $event) { $order = $event->getParameter("ENTITY"); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if (15 == $p["ID"]) { $family = $property->getField("VALUE"); } if (19 == $p["ID"]) { $name = $property->getField("VALUE"); } if ("PRIVATE_PERSON" == $p["CODE"]) { $property->setValue($name . ' ' . $family); } } } } Публикую с целью CodeReview. Поддержка ответила: ЦИТАТА Вам не нужно писать в базу в этом событии. Вам нужно просто взять коллекцию свойств объекта $order и дописать в нее свои данные, или изменить уже существующие. Система сама потом сохранит всё в базу: $propertyCollection = $order->getPropertyCollection(); $propertyCollection = $order->getPropertyCollection(); foreach ($propertyCollection->getGroups() as $group) { foreach ($propertyCollection->getGroupProperties($group['ID']) as $property) { $p = $property->getProperty(); if( $p["CODE"] == "CONTACT_PERSON") $property->setValue("VASYA"); } } С уважением, ведущий специалист отдела технической поддержки Шестопалов Лев При этом мы использовали событие OnSaleOrderBeforeSaved. Допилить мне его помог: https://mrcappuccino.ru/blog/post/work-with-basket-bitrix-d7

    Ответ 3



    Так а при чем здесь PHP7. У вас черным по белому пишет: нарушение уникальности ключа IX_SOPV_ORD_PROP_UNI. Это не зависит от версии PHP ни коим образом. По всему похоже, что есть некий тригер срабатывающий на обновление записив этой таблице. Вам надо с этим разбираться... Возможно что то не так у вас обновилось при серьезном обновлении или где то обращаетесь к БД в обход АПИ и там что то нкосячили.

    пятница, 24 января 2020 г.

    Каковы алгоритмы одновременной работы администраторов в популярных CMS?

    #wordpress #битрикс #joomla #cms #drupal

    
    Каковы алгоритмы одновременной работы администраторов в популярных CMS?
    А именно, интересны: 
    
    возможность авторизации двух человек с разными ip из-под одного логина;
    возможность одновременной редакции контента одной страницы двумя пользователями;
    возможность удаления страницы одним пользователем в тот  момент, когда ее редактирует
    другой;
    и т.п.
    
    Кто с какими системами разбирался, какие варианты реализаций знает - подскажите.
    Очень интересно любое мнение.    
    


    Ответы

    Ответ 1



    Из всего обследованно более всего нравится реализация в cms MODx... Мультиавторизация - разрешена. Но стоит правильная защита от подбора пароля (считает ошибки подряд) хотя и задалбывает - стоит увеличивать квоту.. Пока идет редактированние вводится блок на страницу. При улете сессии блоки можно снимать, но минус в том что только все сразу. Редактировать одно и тоже нельзя. Удалить редактируемое - нельзя. Есть возможность накладывать групповые политика на ресурсы и таким образом закрывать часть ресурсов от изменения и удаления. Админ, естественно может всё. Удаление идет в два такта - пометка на удалении и физическое удаление (естественно права настраиваются). Пометка закрывает ресурс от видимости снаружи, но может быть безболезненно снята. И всё это даже условно-шустро работает.

    Ответ 2



    Битрикс. Количество одновременных авторизаций с одним логином не ограничивается. Настраивается только "Максимальное количество компьютеров, на которых может быть одновременно запомнена авторизация" Редактировать/удалять дает одновременно - все на откуп организации работы внутри команды работающей по сайту. В прочем, при необходимости, легко реализуемо. Единственное редактирование заказа (через админку). Система предупреждает, что в данный момент заказ открыт на редактирование еще кем то. И есть кнопка "Снять блокировку" Вообще все же "под одним логином" это плохая практика не зависимо от CMS. Гораздо правильнее каждому иметь свой аккаунт, тогда будет гибкость в настройках прав. И, как показывает практика, в случае ЧП выстреливающих раз в пятилетку может помочь в разборе полетов.

    четверг, 23 января 2020 г.

    1C. PHP Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0, referer

    #php #битрикс #1с

    
    При вызове метода 1С вылетает ошибка
    
    
      PHP Fatal error:  Unknown: Cannot use output buffering in output buffering display
    handlers in Unknown on line 0, referer
    
    
    Сам метод возвращает документ для печати. Пытался увеличить memory_limit но это не
    помогло
        
    


    Ответы

    Ответ 1



    В файле /etc/php/7.0/cli/php.ini отключите output_buffering для php-cli, он у вас скорее всего установлен в 4096, а должен быть отключен по умолчанию.

    пятница, 10 января 2020 г.

    Отменить оплату со внутреннего счета

    #php #битрикс

    
    IncludeComponent("bitrix:sale.order.ajax", "uni_sale_order_ajax", Array(
        "PATH_TO_BASKET" => "/personal/cart/",  // Страница корзины
        "PATH_TO_PERSONAL" => "/personal/order/",   // Страница персонального раздела
        "PATH_TO_PAYMENT" => "/personal/order/payment/",    // Страница подключения платежной
    системы
        "PATH_TO_AUTH" => "/personal/profile/", // Страница авторизации
        "PAY_FROM_ACCOUNT" => "N",  // Позволять оплачивать с внутреннего счета
        "COUNT_DELIVERY_TAX" => "N",    // Рассчитывать налог для доставки
        "COUNT_DISCOUNT_4_ALL_QUANTITY" => "N", // Рассчитывать скидку для каждой позиции
    (на все количество товара)
        "ONLY_FULL_PAY_FROM_ACCOUNT" => "N",    // Позволять оплачивать с внутреннего
    счета только в полном объеме
        "ALLOW_AUTO_REGISTER" => "N",   // Оформлять заказ с автоматической регистрацией
    пользователя
        "SEND_NEW_USER_NOTIFY" => "N",  // Отправлять пользователю письмо, что он зарегистрирован
    на сайте
        "DELIVERY_NO_AJAX" => "Y",  // Рассчитывать стоимость доставки сразу
        "DELIVERY_NO_SESSION" => "N",   // Проверять сессию при оформлении заказа
        "TEMPLATE_LOCATION" => ".default",  // Шаблон местоположения
        "DELIVERY_TO_PAYSYSTEM" => "d2p",   // Последовательность оформления
        "SET_TITLE" => "Y", // Устанавливать заголовок страницы
        "USE_PREPAYMENT" => "N",    // Использовать предавторизацию для оформления заказа
    (PayPal Express Checkout)
        "PROP_1" => "", // Не показывать свойства для типа плательщика "Физическое лицо" (s1)
        "PROP_2" => "", // Не показывать свойства для типа плательщика "Юридическое лицо" (s1)
        ),
        false
    );
    
    ?>
    
    
    вроде правильно, но оплачивается со внутреннего счета.
    Я даже в шаблоне template.php закомментировала строку //include($_SERVER["DOCUMENT_ROOT"].$templateFolder."/paysystem.php");
    
    UPD
    
    
    
    $arParams["PAY_FROM_ACCOUNT"] ="N" ;
    $arParams["COUNT_DELIVERY_TAX"] ="N"; 
    $arParams["COUNT_DISCOUNT_4_ALL_QUANTITY"] = "N";
    $arParams["ONLY_FULL_PAY_FROM_ACCOUNT"] ="N";
    $arParams["DELIVERY_NO_AJAX"] = (($arParams["DELIVERY_NO_AJAX"] == "Y") ? "Y" : "N");
    $arParams["USE_PREPAYMENT"] = $arParams["USE_PREPAYMENT"] == 'Y' ? 'Y' : 'N';
    $arParams["DISPLAY_IMG_HEIGHT"] = Intval($arParams["DISPLAY_IMG_HEIGHT"]) <= 0  ?
    90 : Intval($arParams["DISPLAY_IMG_HEIGHT"]);
    $arParams["DISPLAY_IMG_WIDTH"] = Intval($arParams["DISPLAY_IMG_WIDTH"]) <= 0  ? 90
    : Intval($arParams["DISPLAY_IMG_WIDTH"]);
    
    
    
    
    Я поменяла в самом родном компоненте битрикса. Ничего не получилось.
    
    UPD от 21.12
    
    
    
        if($arResult["USER_VALS"]["CONFIRM_ORDER"] == "Y")
    	{
    		
    		if(strlen($arResult["REDIRECT_URL"]) > 0)
    		{
    			?>
    			
    			


    Ответы

    Ответ 1



    Оплата с аккаунта если отключена опция PAY_FROM_ACCOUNT не будет работать, скорее всего 2 варианта надо искать вы смотрите не тот компонент В каком-то из локальных модулях или в init.php созданы события на оформление покупки в которых вручную применен метод CSaleUserAccount::Withdraw или CSaleUserAccount::Pay

    пятница, 3 января 2020 г.

    Авторские права на GitHub?

    #битрикс #github #cms #лицензирование #авторские_права

    
    Не пойму какое реальное практическое применение имеет сервис github и как обстоят
    дела с авторскими правами? 
    
    
    В чем логика выкладывать свой код на всеобщее обозрение, чтобы
    его скопировали и потом продавали? Или там реальные вещи, которые
    несут материальную ценность не выкладываются? Или там что-то типа: о
    посмотрите, я написал новый супер-аудиоплеер, качайте на здоровье и
    пользуйтесь. Или сервис наполовину коммерческий, типа вот
    ограниченные версии кода, можете пользоваться, а если хотите что-то
    нормальное - покупайте лицензию?
    И что понимается под авторскими правами на GitHub-e, да и вообще
    впринципе. Верстка сайта (сами блоки, расположение), если
    скопировать (кроме дизайна) - это считается нарушением авторских
    прав? С дизайном понятно, если макет один в один - это вроде как
    нарушение авторских прав. И кстати, сам дизайн макет по сути
    налеплен из разных фоток, зачастую с лицами людей - сами-то
    дизайнеры откуда берут это все, тупо качают из интернета чужие
    фотки?
    Если взять код с функционалом типа CMS - это тоже нарушение
    авторских прав? Может я что-то не понимаю, но принцип CMS же
    примерно одинаковый, генерить статичные страницы, каталог и прочее
    взаимодействие? Взять тот же Bitrix, это что-то супер-уникальное
    чего нет в открытом доступе? Неужели за столько лет развития
    интернета в сети не появилось бесплатного качественного аналога
    платной CMS?
    
        
    


    Ответы

    Ответ 1



    В чем логика выкладывать свой код на всеобщее обозрение, чтобы его скопировали и потом продавали? Есть такое понятие, как свободное ПО. Это когда вы выкладываете свой код под свободной лицензией, а в ответ получаете сообщество (по сути, бесплатных программистов, тестировщиков, авторов документации и многопрофильную службу поддержки на добровольных началах, мотивированных исключительно интересом к вашему продукту). Этот подход, кстати, применим и в бизнесе. В этом случае разработчик зарабатывает за счёт продажи не самого продукта (платформы), а своего рода премиум-услуг к нему (дополнительные модули, расширенная поддержка, помощь в интеграции и т. д.). В этом случае копирование кода не принесёт какого-либо вреда — всё равно дохода непосредственно от него ноль. Также компании могут выкладывать свои старые разработки, которые потеряли коммерческую ценность. Или там реальные вещи, которые несут материальную ценность не выкладываются? Вот вам пара примеров продуктов, живущих и здравствующих с такой бизнес-моделью: NGINX (некоммерческая версия: https://nginx.ru/ru/ и коммерческая версия: https://www.nginx.com/), Qt (https://www.qt.io/). Эти вещи реальны и приносят доход своим компаниям-владельцам. Насчёт web-фреймворков сказать ничего не могу — не моя область. Или сервис наполовину коммерческий, типа вот ограниченные версии кода, можете пользоваться, а если хотите что-то нормальное — покупайте лицензию? Исходные коды продукта выложены в репозиторий, поэтому ни о какой пробной версии речи идти не может. И что понимается под авторскими правами на GitHub-e, да и вообще в принципе. То, что прописано в местных законах об авторском праве. Процитирую свой старый ответ на смежную тему: ... если планируете распространять программу в странах, принявших Бернскую конвенцию (среди которых есть РФ и США). Упоминание авторства — это реализация права на авторство, относящегося к неисключительным правам. Упоминание лицензии — указание на условия, по которым вам была передана копия библиотеки. Дело в том, что ничто не мешает автору раздавать одну и ту же библиотеку под различными лицензиями различным людям и предприятиям. Соответственно, при дальнейшем распространении (если лицензия это разрешает) вы мало того что тоже должны предоставить пользователям условия и разрешения, так ещё и указать, что это самое распространение вообще законно. Верстка сайта (сами блоки, расположение), если скопировать (кроме дизайна) — это считается нарушением авторских прав? С дизайном понятно, если макет один в один — это вроде как нарушение авторских прав. Тут весьма тонкая грань — надо обращаться к юристу. И кстати, сам дизайн макет по сути налеплен из разных фоток, зачастую с лицами людей — сами-то дизайнеры откуда берут это все, тупо качают из интернета чужие фотки? Кстати да, покупая макет, вы имеете право запросить копии всех лицензионных соглашений дизайнера этого макета с авторами фотографий или фотобанками. Если взять код с функционалом типа CMS — это тоже нарушение авторских прав? Зависит от лицензии (лицензионного соглашения), под которой этот код распространялся. Если она это разрешает, то нет, не является. Может я что-то не понимаю, но принцип CMS же примерно одинаковый, генерить статичные страницы, каталог и прочее взаимодействие? Взять тот же Bitrix, это что-то супер-уникальное чего нет в открытом доступе? Неужели за столько лет развития интернета в сети не появилось бесплатного качественного аналога платной CMS? С одной стороны, эту генерацию можно производить по разному. Но, с другой стороны, имеется нехороший прецедент судебной тяжбы между Oracle и Google из-за девяти строк кода. Так что с этим, опять же, только к юристу.

    среда, 18 декабря 2019 г.

    Возможен ли обмен 1c 1c bitrix через связку nginx + php-fpm?

    #nginx #1с #php_fpm #битрикс

    
    у нас есть инет-магазин, на битриксе и настроен новый обмен с 1ской через wsap22
    модуль для apache. Сейчас появилась потребность в переводе сайта на связку nginx+php-fpm,
    все переделано, кроме собственно этого обмена. Вопросы на засыпку:
    
    
    Есть ли аналог wsap22 для nginx для обмена 1с? 
    Если нет, то можно ли каким-то другим способом организовать обмен? Будет ли это быстрее-медленнее,
    чем сейчас?
    
        
    


    Ответы

    Ответ 1



    Есть ли аналог wsap22 для nginx для обмена 1с? Нету. И подозреваю что не будет. Если нет, то можно ли каким-то другим способом организовать обмен? Будет ли это быстрее-медленнее, чем сейчас? Я подозреваю что 1С у вас в интернете и тонкие клиенты подсоединяются к ней через ISS. Сайт сбрасывает заказы в 1С через ISS. Поэтому настраиваем 1c<->apache-backend(wsap22)<->nginx для снижения расходов по памяти и процессору. Работает быстрее чем просто ISS.

    суббота, 14 декабря 2019 г.

    Битрикс и Яндекс касса , почему разные номера заказов

    #битрикс #яндекс

    
    Доброго времени суток ! На сайте реализована многосайтовость, два ИМ на которых можно
    оформлять заказы, подключена яндекс касса. В аккаунте яндекс кассы прописаны ссылки:
    
    Check URL https://site1.ru/bitrix/tools/sale_ps_result.php
    
    Aviso URL https://site1.ru/bitrix/tools/sale_ps_result.php
    
    Success URL http://site1.ru/bitrix/tools/sale_ps_success.php
    
    Fail URL http://site1.ru/bitrix/tools/sale_ps_fail.php
    
    
    т.е ссылки от первого сайта, когда клиент делает заказа на втором сайте site2.ru
    то в случае успешной оплаты соответственно от попадает на site1.ru , мне нужно сделать
    перенаправление на site2.ru т.е на тот сайт в котором был сделан заказ. 
    
    В файле /bitrix/tools/sale_ps_success.php я хочу сделать редирект , как мне показалось
    что это можно сделать получив ID заказа из URL который формирует яндекс касса в случае
    успешной оплаты, в котором есть параметр orderNumber=273 . Но заметил что номер заказа
    в яндекс кассе не совпадают с номером заказа на сайте. К примеру если а ЯК это 273
    то на сайте 280 . 
    И итог того что хочу сделать:
    Получить номер заказа из URL, в файле sale_ps_success.php проверить  какому сайту
    пренадлежит заказ и сделать редиррект на нужный сайт https://site2/personal/order/make/?ORDER_ID=".$OrderID
    
    Кто нибудь сталкивался с подобным? Почему номера заказов разные?  
    
    По совету Mihanik71  использовать класс Bitrix\Sale\Internals\PaymentTable оказалось
    верным решением за что ему большое спасибо, ниже пример кода который в файле(sale_ps_success.php)
    я запилил у себя на сайте:
    
    
    
       $orderNumbder = $_GET['orderNumber']; // тут приходит номер оплаты 
    
    
    CModule::IncludeModule("sale");
     c
    $obj = new Bitrix\Sale\Internals\PaymentTable; // класс с помощью которого можно
    вытащить id заказа, был обнаружен с помощью модуля live ip
    
    $shimpentCode = $obj->getlist(array('select' => array('ID','ORDER_ID'),'filter' =>
    array('ID' => $orderNumbder)))->fetch();
    
    $SiteOrder = CSaleOrder::GetByID($shimpentCode['ORDER_ID']); // вытаскиваем свойства
    заказа, нас интересует поле LID
    
    $SiteID = $SiteOrder['LID']; // id сайта на котором была покупка 
    
    $OrderID = $shimpentCode['ORDER_ID'];
    
    $successUrl = "";
    // простое условие , выбираем куда редиректить покупателя 
    if($SiteID == 's1'){
       $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y";
    // параметр PAY=Y добавил для своих нужд   
    }
    if($SiteID == 's2'){
       $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y";
    }
    
    
    $successPath = COption::GetOptionString("sale", "sale_ps_success_path", "/");
    
       if(!empty($successUrl)){
          LocalRedirect($successUrl);   
       }
    }
    
        
    


    Ответы

    Ответ 1



    Есть класс Bitrix\Sale\Internals\PaymentTable там по номеру оплаты поле ID можно получить номер заказа ORDER_ID.

    Ответ 2



    Ваше решение не совсем верно с точки зрения нового ядра D7 Битрикс. Нежелательно использовать API старого ядра, когда есть аналоги нового. К тому же было бы неверно использовать Bitrix\Sale\Internals\PaymentTable, потому что нет гарантий, что данное поведение функции сохраниться в дальнейшем, а именно: Подпространство Bitrix\Sale\Internals содержит классы для работы с таблицами модуля Интернет-магазин. Важно! Прямое использование данных классов не рекомендуется и совместимость не гарантируется. https://dev.1c-bitrix.ru/api_d7/bitrix/sale/internals/ Гораздо лучше использовать доступные публичные статические методы: //Вместо CModule::IncludeModule("sale"); \Bitrix\Main\Loader::includeModule('sale'); //Вместо создания объекта класса Bitrix\Sale\Internals\PaymentTable $payment = \Bitrix\Sale\Payment::getList( array( "filter" => array('ID' => $_GET['orderNumber']), "select" => array('ORDER_ID') ) ); $paymentFields = $payment->fetch(); //Поднимаем объект заказа по id $order = \Bitrix\Sale\Order::load($paymentFields['ORDER_ID']); //Получаем поле 'LID' $SiteID = $order->getField('LID'); //'ID' заказа можно получить и из заказа тоже, например: $OrderID = $order->getId() $OrderID = $paymentFields['ORDER_ID']; $successUrl = ""; // простое условие , выбираем куда редиректить покупателя if($SiteID == 's1') { $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; // параметр PAY=Y добавил для своих нужд } if($SiteID == 's2') { $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; } if(!empty($successUrl)) { LocalRedirect($successUrl); } Можно еще и $_GET['orderNumber'] через API получать, но это уже так, легкое ООП извращение: $request = \Bitrix\Main\Context::getCurrent()->getRequest(); $request->get("orderNumber");

    пятница, 12 июля 2019 г.

    Нужен ли CMS сайту?

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


    Ответ

    CMS просто экономят ваше время на разработку подобного функционала (в этом случае торговых предложений) + дают удобный UI для контентщиков, но за это иногда, как битрикс, требуют денег

    среда, 10 июля 2019 г.

    Неправильная вложенность меню

    Подскажите, как поставить правильную вложенность в меню.У меня получается последовательность элементов


    а мне нужна такая последовательность

    нужно поменять условие в коде,помогите поправить
    ";print_r($arResult);echo "";?>
    ';var_dump($arResult[$i]["SELECTED"]); echo''; ?>
    ">
    1 || $arResult[$i+1]["PARAMS"]["DEPTH_LEVEL"] > 2) {?>
      1 ) {?> 2) {?>
      • ">
      • 2) {?>
    |  


    Ответ

    У Вас в этом участке кода требуется изменение
    1 ) {?> 2) {?>

    • ">
    • 2) {?>

    Здесь не проверяется предыдущая глубина и потому выводится подменю на каждую строку, как и закрывается в каждой строке, вместо того, чтобы подменю печаталось именно при увеличении глубины, и закрывалось только при уменьшении глубины. Как вариант так:
    if($arr[i+1]['params']['deph'] > $arr[i]['params']['deph']) { echo ''; }
    Возможны варианты с использованием переменных или иного способа контроля изменения вложенности.

    суббота, 6 июля 2019 г.

    1С-Битрикс: сайт на поддомене

    Доброго дня. Как всегда, есть проблема. У сайта site.ru есть поддомен lk.site.ru. Физически они раположены в папках /www/site.ru/ и /www/lk.site.ru/. На site.ru стоит старенький 1С-Битрикс: Управление сайтом 9.0.2, а на lk.site.ru нет вообще ничего. Каким образом можно заставить оба сайта работать c одной админкой? Заранее спасибо. Добавлено Воспользовался указаниями http://dev.1c-bitrix.ru/community/blogs/howto/336.php: создал симлинки, скопировал access и index, прописал в админке хосты и папки, однако CMainPage::GetSiteByHost(); на lk.site.ru показывает id сайта site.ru. Что, в общем-то, логично: ибо поддомен. Как побороть эту проблему?


    Ответ

    Вот тут - многосайтовость на пальцах - про это подробно расписано. Только я не совсем понял, будет ли это работать с поддоменами. Посмотрите, может поможет.

    пятница, 21 июня 2019 г.

    Как поулучить элементы каталога из json строки?1с-Bitrix

    Дано:
    Сервер под управлением centos 6 , там я развернул малый битрикс Также есть http://gw.open.1688.com:80/openapi/param2/1/cn.ali... запрос по которому мы получаем список элементов с сайта 1688.com
    Необходимо, на основе полученных данных, в торговом каталоге сайта создать раздел с элементами. Элемент должен содержать цену, свойства, изображения, одним словом все, что есть в выгрузке.
    Например, я на чистом битриксе сделаю компонент "КАТАЛОГ", там выведу раздел с элементами, как я понял надо написать какой то скрипт, который берет этот json, проходит по нему циклом и кидает данные через api функции в базу, то бишь после того как скрипт отработал у меня в базе будут товары и строку мусолить больше не нужно?
    Вообщем, ребят подскажите плиз как подступиться? как написать этот скрипт? Как правильно вывести каталог?, желательно подробно, с примерами кода если можно) Или документацией


    Ответ

    у битрикса есть класс Bitrix\Main\Web\HttpClient его можно использовать для получения строки json и затем декодировать
    use Bitrix\Main\Web\HttpClient;
    $httpClient = new HttpClient($options); $httpClient->get($url); $res = $httpClient->getResult();
    try { $ar = json_decode($httpClient->getResult(), true); } catch (\Exception $e){
    }
    if(is_array($ar)) { # если данные непосредственно в $ar foreach($ar => $product) { # добавление в базу } }
    добавление элемента в инфоблок https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/add.php
    $el = new CIBlockElement;
    $PROP = array(); $PROP[12] = 11;
    $arLoadProductArray = Array( "MODIFIED_BY" => $USER->GetID(), // элемент изменен текущим пользователем "IBLOCK_SECTION_ID" => false, // элемент лежит в корне раздела "IBLOCK_ID" => 18, "PROPERTY_VALUES"=> $PROP, "NAME" => "Элемент", "ACTIVE" => "Y", // активен "PREVIEW_TEXT" => "текст для списка элементов", "DETAIL_TEXT" => "текст для детального просмотра", "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif") );
    if($PRODUCT_ID = $el->Add($arLoadProductArray)) { # добавляем информацию для каталога # https://dev.1c-bitrix.ru/api_help/catalog/classes/ccatalogproduct/add.php
    # цены # https://dev.1c-bitrix.ru/api_help/catalog/classes/cprice/add.php
    }
    для вывода можно воспользоваться стандартным компонентов bitrix:catalog

    вторник, 26 февраля 2019 г.

    Отменить оплату со внутреннего счета

    IncludeComponent("bitrix:sale.order.ajax", "uni_sale_order_ajax", Array( "PATH_TO_BASKET" => "/personal/cart/", // Страница корзины "PATH_TO_PERSONAL" => "/personal/order/", // Страница персонального раздела "PATH_TO_PAYMENT" => "/personal/order/payment/", // Страница подключения платежной системы "PATH_TO_AUTH" => "/personal/profile/", // Страница авторизации "PAY_FROM_ACCOUNT" => "N", // Позволять оплачивать с внутреннего счета "COUNT_DELIVERY_TAX" => "N", // Рассчитывать налог для доставки "COUNT_DISCOUNT_4_ALL_QUANTITY" => "N", // Рассчитывать скидку для каждой позиции (на все количество товара) "ONLY_FULL_PAY_FROM_ACCOUNT" => "N", // Позволять оплачивать с внутреннего счета только в полном объеме "ALLOW_AUTO_REGISTER" => "N", // Оформлять заказ с автоматической регистрацией пользователя "SEND_NEW_USER_NOTIFY" => "N", // Отправлять пользователю письмо, что он зарегистрирован на сайте "DELIVERY_NO_AJAX" => "Y", // Рассчитывать стоимость доставки сразу "DELIVERY_NO_SESSION" => "N", // Проверять сессию при оформлении заказа "TEMPLATE_LOCATION" => ".default", // Шаблон местоположения "DELIVERY_TO_PAYSYSTEM" => "d2p", // Последовательность оформления "SET_TITLE" => "Y", // Устанавливать заголовок страницы "USE_PREPAYMENT" => "N", // Использовать предавторизацию для оформления заказа (PayPal Express Checkout) "PROP_1" => "", // Не показывать свойства для типа плательщика "Физическое лицо" (s1) "PROP_2" => "", // Не показывать свойства для типа плательщика "Юридическое лицо" (s1) ), false );
    ?>
    вроде правильно, но оплачивается со внутреннего счета. Я даже в шаблоне template.php закомментировала строку //include($_SERVER["DOCUMENT_ROOT"].$templateFolder."/paysystem.php");
    UPD
    $arParams["PAY_FROM_ACCOUNT"] ="N" ; $arParams["COUNT_DELIVERY_TAX"] ="N"; $arParams["COUNT_DISCOUNT_4_ALL_QUANTITY"] = "N"; $arParams["ONLY_FULL_PAY_FROM_ACCOUNT"] ="N"; $arParams["DELIVERY_NO_AJAX"] = (($arParams["DELIVERY_NO_AJAX"] == "Y") ? "Y" : "N"); $arParams["USE_PREPAYMENT"] = $arParams["USE_PREPAYMENT"] == 'Y' ? 'Y' : 'N'; $arParams["DISPLAY_IMG_HEIGHT"] = Intval($arParams["DISPLAY_IMG_HEIGHT"]) <= 0 ? 90 : Intval($arParams["DISPLAY_IMG_HEIGHT"]); $arParams["DISPLAY_IMG_WIDTH"] = Intval($arParams["DISPLAY_IMG_WIDTH"]) <= 0 ? 90 : Intval($arParams["DISPLAY_IMG_WIDTH"]);
    Я поменяла в самом родном компоненте битрикса. Ничего не получилось.
    UPD от 21.12
    if($arResult["USER_VALS"]["CONFIRM_ORDER"] == "Y") { if(strlen($arResult["REDIRECT_URL"]) > 0) { ?>


    Ответ

    Оплата с аккаунта если отключена опция PAY_FROM_ACCOUNT не будет работать, скорее всего 2 варианта надо искать
    вы смотрите не тот компонент В каком-то из локальных модулях или в init.php созданы события на оформление покупки в которых вручную применен метод CSaleUserAccount::Withdraw или CSaleUserAccount::Pay

    понедельник, 11 февраля 2019 г.

    Авторские права на GitHub?

    Не пойму какое реальное практическое применение имеет сервис github и как обстоят дела с авторскими правами?
    В чем логика выкладывать свой код на всеобщее обозрение, чтобы его скопировали и потом продавали? Или там реальные вещи, которые несут материальную ценность не выкладываются? Или там что-то типа: о посмотрите, я написал новый супер-аудиоплеер, качайте на здоровье и пользуйтесь. Или сервис наполовину коммерческий, типа вот ограниченные версии кода, можете пользоваться, а если хотите что-то нормальное - покупайте лицензию? И что понимается под авторскими правами на GitHub-e, да и вообще впринципе. Верстка сайта (сами блоки, расположение), если скопировать (кроме дизайна) - это считается нарушением авторских прав? С дизайном понятно, если макет один в один - это вроде как нарушение авторских прав. И кстати, сам дизайн макет по сути налеплен из разных фоток, зачастую с лицами людей - сами-то дизайнеры откуда берут это все, тупо качают из интернета чужие фотки? Если взять код с функционалом типа CMS - это тоже нарушение авторских прав? Может я что-то не понимаю, но принцип CMS же примерно одинаковый, генерить статичные страницы, каталог и прочее взаимодействие? Взять тот же Bitrix, это что-то супер-уникальное чего нет в открытом доступе? Неужели за столько лет развития интернета в сети не появилось бесплатного качественного аналога платной CMS?


    Ответ

    В чем логика выкладывать свой код на всеобщее обозрение, чтобы его скопировали и потом продавали?
    Есть такое понятие, как свободное ПО. Это когда вы выкладываете свой код под свободной лицензией, а в ответ получаете сообщество (по сути, бесплатных программистов, тестировщиков, авторов документации и многопрофильную службу поддержки на добровольных началах, мотивированных исключительно интересом к вашему продукту). Этот подход, кстати, применим и в бизнесе. В этом случае разработчик зарабатывает за счёт продажи не самого продукта (платформы), а своего рода премиум-услуг к нему (дополнительные модули, расширенная поддержка, помощь в интеграции и т. д.). В этом случае копирование кода не принесёт какого-либо вреда — всё равно дохода непосредственно от него ноль. Также компании могут выкладывать свои старые разработки, которые потеряли коммерческую ценность.
    Или там реальные вещи, которые несут материальную ценность не выкладываются?
    Вот вам пара примеров продуктов, живущих и здравствующих с такой бизнес-моделью:
    NGINX (некоммерческая версия: https://nginx.ru/ru/ и коммерческая версия: https://www.nginx.com/), Qt (https://www.qt.io/).
    Эти вещи реальны и приносят доход своим компаниям-владельцам.
    Насчёт web-фреймворков сказать ничего не могу — не моя область.
    Или сервис наполовину коммерческий, типа вот ограниченные версии кода, можете пользоваться, а если хотите что-то нормальное — покупайте лицензию?
    Исходные коды продукта выложены в репозиторий, поэтому ни о какой пробной версии речи идти не может.
    И что понимается под авторскими правами на GitHub-e, да и вообще в принципе.
    То, что прописано в местных законах об авторском праве. Процитирую свой старый ответ на смежную тему:
    ... если планируете распространять программу в странах, принявших Бернскую конвенцию (среди которых есть РФ и США). Упоминание авторства — это реализация права на авторство, относящегося к неисключительным правам. Упоминание лицензии — указание на условия, по которым вам была передана копия библиотеки. Дело в том, что ничто не мешает автору раздавать одну и ту же библиотеку под различными лицензиями различным людям и предприятиям. Соответственно, при дальнейшем распространении (если лицензия это разрешает) вы мало того что тоже должны предоставить пользователям условия и разрешения, так ещё и указать, что это самое распространение вообще законно.

    Верстка сайта (сами блоки, расположение), если скопировать (кроме дизайна) — это считается нарушением авторских прав? С дизайном понятно, если макет один в один — это вроде как нарушение авторских прав.
    Тут весьма тонкая грань — надо обращаться к юристу.
    И кстати, сам дизайн макет по сути налеплен из разных фоток, зачастую с лицами людей — сами-то дизайнеры откуда берут это все, тупо качают из интернета чужие фотки?
    Кстати да, покупая макет, вы имеете право запросить копии всех лицензионных соглашений дизайнера этого макета с авторами фотографий или фотобанками.
    Если взять код с функционалом типа CMS — это тоже нарушение авторских прав?
    Зависит от лицензии (лицензионного соглашения), под которой этот код распространялся. Если она это разрешает, то нет, не является.
    Может я что-то не понимаю, но принцип CMS же примерно одинаковый, генерить статичные страницы, каталог и прочее взаимодействие? Взять тот же Bitrix, это что-то супер-уникальное чего нет в открытом доступе? Неужели за столько лет развития интернета в сети не появилось бесплатного качественного аналога платной CMS?
    С одной стороны, эту генерацию можно производить по разному. Но, с другой стороны, имеется нехороший прецедент судебной тяжбы между Oracle и Google из-за девяти строк кода. Так что с этим, опять же, только к юристу.

    среда, 24 октября 2018 г.

    Битрикс и Яндекс касса , почему разные номера заказов

    Доброго времени суток ! На сайте реализована многосайтовость, два ИМ на которых можно оформлять заказы, подключена яндекс касса. В аккаунте яндекс кассы прописаны ссылки:
    Check URL https://site1.ru/bitrix/tools/sale_ps_result.php
    Aviso URL https://site1.ru/bitrix/tools/sale_ps_result.php
    Success URL http://site1.ru/bitrix/tools/sale_ps_success.php
    Fail URL http://site1.ru/bitrix/tools/sale_ps_fail.php
    т.е ссылки от первого сайта, когда клиент делает заказа на втором сайте site2.ru то в случае успешной оплаты соответственно от попадает на site1.ru , мне нужно сделать перенаправление на site2.ru т.е на тот сайт в котором был сделан заказ.
    В файле /bitrix/tools/sale_ps_success.php я хочу сделать редирект , как мне показалось что это можно сделать получив ID заказа из URL который формирует яндекс касса в случае успешной оплаты, в котором есть параметр orderNumber=273 . Но заметил что номер заказа в яндекс кассе не совпадают с номером заказа на сайте. К примеру если а ЯК это 273 то на сайте 280 . И итог того что хочу сделать: Получить номер заказа из URL, в файле sale_ps_success.php проверить какому сайту пренадлежит заказ и сделать редиррект на нужный сайт https://site2/personal/order/make/?ORDER_ID=".$OrderID
    Кто нибудь сталкивался с подобным? Почему номера заказов разные?
    По совету Mihanik71 использовать класс Bitrix\Sale\Internals\PaymentTable оказалось верным решением за что ему большое спасибо, ниже пример кода который в файле(sale_ps_success.php) я запилил у себя на сайте:

    $orderNumbder = $_GET['orderNumber']; // тут приходит номер оплаты
    CModule::IncludeModule("sale"); c $obj = new Bitrix\Sale\Internals\PaymentTable; // класс с помощью которого можно вытащить id заказа, был обнаружен с помощью модуля live ip
    $shimpentCode = $obj->getlist(array('select' => array('ID','ORDER_ID'),'filter' => array('ID' => $orderNumbder)))->fetch();
    $SiteOrder = CSaleOrder::GetByID($shimpentCode['ORDER_ID']); // вытаскиваем свойства заказа, нас интересует поле LID
    $SiteID = $SiteOrder['LID']; // id сайта на котором была покупка
    $OrderID = $shimpentCode['ORDER_ID'];
    $successUrl = ""; // простое условие , выбираем куда редиректить покупателя if($SiteID == 's1'){ $successUrl = "https://site1.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; // параметр PAY=Y добавил для своих нужд } if($SiteID == 's2'){ $successUrl = "https://site2.ru/personal/order/make/?ORDER_ID=".$OrderID . "&PAY=Y"; }
    $successPath = COption::GetOptionString("sale", "sale_ps_success_path", "/");
    if(!empty($successUrl)){ LocalRedirect($successUrl); } }


    Ответ

    Есть класс Bitrix\Sale\Internals\PaymentTable там по номеру оплаты поле ID можно получить номер заказа ORDER_ID.