abstract class Base extends DataManager { public static function add(array $arFields) { try{ return parent::add($arFields); } catch (\Bitrix\Main\DB\SqlQueryException $e) { $msg = $e->getMessage(); if (strpos($msg, 'Duplicate entry') !== false) throw new Lib\Exception\DuplicateElement($e); elseif (strpos($msg, 'foreign key') !== false) throw new Lib\Exception\ForeignKey($e); else throw new \Bitrix\Main\DB\SqlQueryException($e); } } ... } |
try { $rs = MyOrmClass::add([ 'fields1' => 'val', 'fields2' => 'val' ]); } catch(Lib\Exception\DuplicateElement $e) { ShowError('Такой элемент уже существует'); } catch(Lib\Exception\ForeignKey $e) { ShowError('Нельзя удалить элемент, потому что он связан с другим объектом'); } |
$frame =new \Bitrix\Main\Page\FrameBuffered("smart_filter_frame"); $frame->begin(); ....тут вызов компонента bitrix:catalog.smart.filter... $frame->end(); |
$dynamicArea = new \Bitrix\Main\Page\FrameStatic("my_block_".$id) |
location / { try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args; } |
if ($request_uri ~ ^(.*)/index.(html|php)) { return 301 $1/$is_args$args; } |
server { listen 80; server_name site.ru; root /var/www/site.ru/; index index.php; location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; } if ($request_uri ~ ^(.*)/index.(html|php)) { return 301 $1/$is_args$args; } location / { try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args; } location ~* @.*\.html$ { internal; } } |
location ~ \.php$ { location ~* /\.\./ { internal; } location ~ /\.[^/]+$ { internal; } location ~* ^/upload/1c_[^/]+/ { internal; } location ~* ^/(bitrix/(cache|images|tmp)|upload)/ { internal; } location ~* ^/bitrix/(footer|header|license_key)\.php$ { internal; } location ~* ^/(bitrix|local)/components/(.*)/(.*)/(class|component)\.php$ { internal; } location ~* ^/(bitrix|local)/(backup|blocks|bx_cloud_upload|local_cache|module|modules|managed_cache|php_interface|public|stack_cache)/ { internal; } include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; } location ~* \.(hg|svn|git|bzr)$ { internal; } location ~* /\.\./ { internal; } location ~* @.*\.html$ { internal; } location / { location ~* ^/(bitrix|local)/(backup|blocks|bx_cloud_upload|local_cache|module|modules|managed_cache|php_interface|public|services|stack_cache)/ { internal; } location ~ /\.[^/]+$ { internal; } location ~* ^/upload/1c_[^/]+/ { internal; } try_files $uri $uri/ /bitrix/urlrewrite.php$is_args$args; } |
modern_browser_value "modern"; modern_browser msie 10.0; modern_browser unlisted; map "$cookie_BITRIX_SM_LOGIN:$cookie_BITRIX_SM_UIDH:$cookie_BITRIX_SM_CC" $storedAuth { default ""; "~*:*:Y" ""; "~*:*:*" 1; "~*:*:" 1; } map "$request_method:$http_bx_action_type:$cookie_BITRIX_SM_NCC:$http_x_forwarded_scheme:$modern_browser:$storedAuth" $usecache { default "1"; "~GET:::*https*" "1"; "~GET:::*:*:" ""; } |
set $i "index@"; location / { try_files /bitrix/html_pages/$host$uri$i${args}.html /bitrix/html_pages/$host$uri$i${args}=.html /bitrix/html_pages/$host$uri/$i${args}.html$usecache /bitrix/html_pages/$host$uri/$i${args}=.html$usecache $uri $uri/ /bitrix/urlrewrite.php$is_args$args; } |
server { listen 80; server_name site.ru; root /var/www/site.ru/; index index.php; location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass unix:/var/run/php/php7.0-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors on; } if ($request_uri ~ ^(.*)/index.(html|php)) { return 301 $1/$is_args$args; } set $i "index@"; location / { try_files /bitrix/html_pages/$host$uri$i${args}.html /bitrix/html_pages/$host$uri$i${args}=.html /bitrix/html_pages/$host$uri/$i${args}.html$usecache /bitrix/html_pages/$host$uri/$i${args}=.html$usecache $uri $uri/ /bitrix/urlrewrite.php$is_args$args; } location ~* @.*\.html$ { internal; } } |
<div id="ulogin_div"> <? $dynamicArea = new \Bitrix\Main\Page\FrameStatic("ulogin_dynamic"); $dynamicArea->setAssetMode(\Bitrix\Main\Page\AssetMode::STANDARD); $dynamicArea->setStub("<br>Подождите, идёт загрузка..."); $dynamicArea->setContainerID("ulogin_div"); $dynamicArea->startDynamicArea(); ?> <? $APPLICATION->IncludeComponent( "ulogin:auth", "new", Array( "PROVIDERS" => "vkontakte,twitter,google,facebook,yandex", "COMPONENT_TEMPLATE" => ".default", "GROUP_ID" => array("5"), "LOGIN_AS_EMAIL" => "Y", "SEND_EMAIL" => "Y", "SOCIAL_LINK" => "Y", "ULOGINID1" => "ваш_id1", "ULOGINID2" => "ваш_id2" ), $this ); ?> <? $dynamicArea->finishDynamicArea(); ?> </div> |
<sc ript src="//ulogin.ru/js/ulogin.js" onl oad="uLoginOnload()"></sc ript> |
<sc ript> var ul_script = document.createElement('script'); ul_script.src = "//ulogin.ru/js/ulogin.js" document.body.appendChild(ul_script); ul_script.onl oad = uLoginOnload; </sc ript> |
Я уже вижу, как некоторых личностей трясет в конвульсии от того, что кто-то посмел в очередной раз написать сообщение в ленту, да ещё и решить задачу, которая имеется "из коробки". Но, пожалуйста, дочитайте до конца. Данный материал не о том, кто круче, и не о решении проблем. Я предлагаю уравновешенным людям, разного уровня, досуг в виде решения совместных головоломок и практик программирования. Причем, не обязательно в рамках предложенного решения, а во всём, что угодно. Предлагайте. |
Регистрация пользователей через соц. сети решается и
Но если это кого-то, по какой-то причине не устраивает или хочется иметь большую гибкость, иметь возможность наследования или изменения поведения, то можно попробовать и данную библиотеку, разработанную уже достаточно давно. Но как это часто бывает, выкидывать жалко, да иногда и пригождается.
Привёл код в надлежащий для публикации вид и делюсь с общественностью:
Также, данная библиотека может быть хорошей иллюстрацией, для начинающих разработчиков, использования паттерна проектирования
Также данная библиотека может быть отличным поводом для контрибуции.
Во-первых, пока имеется только три адаптера: Вконтакте, Facebook и Google. Можно их расширить. Во-вторых, в дистрибутив можно включить готовые компоненты авторизации и мульти привязки, к тому же править код библиотеки для этого не потребуется, все данные она уже возвращает и нужный функционал имеет. Такие компоненты я уже делал и они используются на некоторых проектах, но код имеет большую связанность и подойдёт не всем.
В Битрикс сообществе не очень много инициатив для совместной разработки и OpenSource-проектов, но иногда не хватает общения между разработчиками и обменом опыта. Данный пост и предложенное решение не решает серьезных болей, а в очередной раз нацелен на попытку завязать диалог и поиск дружественных точек соприкосновения.
Однажды мне доводилось немного котрибьютить интересное решение
Если и у вас есть такие проекты или идеи для совместного решения, пожалуйста в комментарии!
Bitrix\Sale\OrderHistory::deleteOldAgent("365", "100000"); |
$arDeliveryFields = array( "CODE" => "", "PARENT_ID" => 7, "NAME" => "Доставка на дом", "ACTIVE" => "Y", "DESCRIPTION" => "Россия. Вами свяжется менеджер для уточнения стоимости доставки", "SORT" => 100, "CURRENCY" => "RUB", "PRICE" => 0, "CLASS_NAME" => "\Sale\Handlers\Delivery\SimpleHandler", ); $rsDelivery = \Bitrix\Sale\Delivery\Services\Manager::add($arDeliveryFields); |
$rsLocationRestr = \Bitrix\Sale\Internals\ServiceRestrictionTable::add(array( "SERVICE_ID" => $iDeliveryId, "SERVICE_TYPE" => \Bitrix\Sale\Services\Base\RestrictionManager::SERVICE_TYPE_SHIPMENT, "CLASS_NAME" => '\Bitrix\Sale\Delivery\Restrictions\ByLocation', "SORT" => 100 )); $obCon = \Bitrix\Main\Application::getConnection(); $obCon->queryExecute('INS ERT IN TO b_sale_delivery2location (DELIVERY_ID, LOCATION_CODE, LOCATION_TYPE) VALUES ("'.$iDeliveryId.'", "'.$sLocationCode.'", "L");'); |
Небольшое, но удобное
Но если вам нужно что-то более специфическое и гибкое, то конечно vue-cli, webpack или bitrix/cli подходит больше, я сам периодически употребляю. Эта статья совсем про другое.
<?php Dbogdanoff\Bitrix\Vue::includeComponent(['todo-list']); ?> <div id="app"> <todo-list></todo-list> </div> <sc ript> var mainVueApp = new Vue({ el: '#app' }) </sc ript> |
# /local/components-vue/todo-list/template.vue: <template id="todo-list"> <ol> <li v-for="todo in todos"> {{ todo.text }} </li> </ol> </template> <sc ript> Vue.component('todo-list', { template: '#todo-list', data: function () { return { todos: [ {text: 'Изучить JavaScript'}, {text: 'Изучить Vue'}, {text: 'Создать что-нибудь классное'} ] } } }) </sc ript> |
local/ └─ components-vue/ ├─ component-one/ | ├─ .settings.php | ├─ template.vue | ├─ script.js | └─ style.css ├─ component-two/ | └─ template.vue └─ component-three/ └─ script.js |
define('DBOGDANOFF_VUE_PATH', '/components-vue'); // поменяли на корень сайта в /components-vue |
GitHub:
Пример использования:
Страница примера: