AngularJs: Post запрос
$scope.MEMBER.NAME = "Кирилл"; $scope.MEMBER.LAST_NAME = ""; $scope.MEMBER.SECOND_NAME=""; $scope.MEMBER.EMAIL = "me@adeveloper.ru" var req = { method: 'POST', url: $scope.urlRegUser, headers: { 'Content-Type': undefined }, data: $scope.MEMBER } $http(req).success(function(response, status) { console.log(response); })
ну и небольшой комментарий
при такой отправке ловить данные в массиве $_POST бессмыслено он будет пуст
ловим так
$postdata = file_get_contents("php://input"); $arPost = json_decode($postdata,true); $out = print_r($arPost,true); var_dump($out);
AngularJS: Директивы
Параметры изолированного scope:
= — двустороннее связывание
@ — передача значения
< - одностороннее связывание
& — выполнение выражения (Callback)
Интернет Магазин: Каталог
Получить базовую цену товара по его ID
$productID = $arResult["ID"]; $arBasePrice = CPrice::GetBasePrice($productID); dump($arBasePrice["PRICE"]);
Получить список торговых предложений по ID товара из основного каталога
$arOffers = CIBlockPriceTools::GetOffersArray();
Вызов метода с параметрами
$arOffersFilter =array( "IBLOCK_ID"=>$arParams["IBLOCK_ID"], // ID торгового каталога "HIDE_NOT_AVAILABLE"=>"Y", "SHOW_PRICE_COUNT"=>true); $arOffersOrder = array("sort"=>"asc","id"=>"desc"); $arSelectFields = array("NAME"); $arSelectProps = array( "CML2_ARTICLE", "CML2_COLOR", "CML2_SIZE", "PREVIEW_PICTURE", "DETAIL_PICTURE" ); $arOffersLimit = 0; $arOffersPrices = array( "Розница"=> array( "ID"=>1, "TITLE"=>"Цена", "SELECT"=>"CATALOG_GROUP_1", "CAN_VIEW"=>true, "CAN_BUY"=>true) ); $arVat = false; $arOffers = CIBlockPriceTools::GetOffersArray( $arOffersFilter, array($productID), // ID товара из основного каталога $arOffersOrder, $arSelectFields, $arSelectProps, $arOffersLimit, $arOffersPrices, $arVat,array() ); dump($arOffers);
AngularJS: + Яндекс карты
подключить API яндекс карт
<script src="https://api-maps.yandex.ru/2.0-stable/?load=package.standard&lang=ru-RU" type="text/javascript"> </script>
построить маршрут
узнать длину маршрута
Интернет магазин: Фильтры
Фильтр по количеству товара в магазине
$arFilter[">CATALOG_QUANTITY"]=0; // кол-во товаров больше 0
Фильтр по цене товара
$arFilter["=CATALOG_PRICE_1"]=135; // цена = 135 р
Паттерны: Оглавление
Паттерны программирования (Patterns):
Самые часто используемые мной
- Singleton
- Strategy — без интерфейсов бессмысленен
- Factory
AngularJS: Фильтры
Фильтр данных в ангуляре
<div class="container" ng-controller="orderController"> <div class="row"> <label>Фильтр по текстовому полю</lable> <input type="text" ng-model="orderController.filterText"> </div> <div class="row"> <div class="col-md-12" > <table class="table" > <tr ng-repeat="item in orderController.arItems | filter:orderController.filterText"> <td>{{item}}</td> </tr> </table> </div> </div> </div>
Тип свойства инфоблока
Памятка
Тип свойства. Возможные значения: S — строка, N — число, F — файл, L — список, E — привязка к элементам, G — привязка к группам(Категориям каталога).
тип E — привязка к элементам
array ( 'IBLOCK_ID' => '4', 'NAME' => 'Регион', 'ACTIVE' => 'Y', 'SORT' => '500', 'CODE' => 'REGION', 'DEFAULT_VALUE' => '', 'PROPERTY_TYPE' => 'E', 'LINK_IBLOCK_ID'=>'2', 'LIST_TYPE' => 'L', 'MULTIPLE' => 'N', 'FILE_TYPE' => '', 'MULTIPLE_CNT' => '1', 'USER_TYPE' => NULL, 'USER_TYPE_SETTINGS' => NULL, 'HINT' => 'Регион', )
Интернет Магазин: Оглавление
Оглавление
- Каталог товаров
- Список Разделов
- Деталка или Карточка товара
- Рекомендуемые товары
- Акции
- С эти товаром покупают
- Фильтры
- Интеграция с 1С
- Корзина
- Заказы
- Формат цены
- Склонения
- Работа с файлами
AngularJS: Оглавление
AngularJS: Контроллеры
проба пера с ангуляром
Контроллеры (Controller)
<html ng-app="ngApp"> // ... <div class="row row-content" ng-controller="nameController"> </div> // ... </html>
Область видимости контроллера распространяется на тот узел DOM в котором он задекларирован
AngularJS: работа с JSON
Получение данных с сервера в формате JSON
arItems = []; $http.get("http://www.w3schools.com/angular/customers_mysql.php") .then(function (response) { arItems = response.data.records; } );
Фундаментальные принципы
Ещё раз напоминаю себе о фундаментальных принципах.
Фундаментальные принципы программирования
- Никогда не повторяйте свой код в рамках одного проекта. Если вы повторяете код, значит, делаете лишнюю работу которую можно сократить при рациональном подходе.
- Не изобретайте велосипеды. Как правило уже давно всё придумано за вас другими людьми, надо лишь найти готовое решение и приспособить его под свои нужды.
- Используйте готовые библиотеки и фреймворки для экономии времени если условия вашего проекта это позволяют.
- Старайтесь в своих работах использовать только open source, что бы всё было прозрачно для вас.
Шесть принципов программирования
- Модульность.
- Модифицировать.
- Легкость использования.
- Безопасность.
- Стиль.
- Отладка.
Восемь принципов программирования, которые могут облегчить вам жизнь
- Инкапсулируйте то, что изменяется.
- Предпочитайте композицию наследованию.
- Код должен зависеть от абстракций, а не от конкретных реализаций.
- Стремитесь к слабой связности взаимодействующих объектов.
- Классы должны быть открыты для расширения, но закрыты для изменения.
- Взаимодействуйте только с близкими друзьями.
- Не вызывайте нас — мы сами вас вызовем.
- Класс (или метод) должен иметь только одну причину для изменения.
1. Инкапсулируйте то, что изменяется.
Надо выделить компоненты, которые могут измениться, и отделить их от части системы, которая останется неизменной. Инкапсуляция позволит изменить или расширить выделенные компоненты без изменения остальной части системы. Основная проблема здесь в том, как лучше всего разделить приложение на части. Все паттерны проектирования занимаются ответом на этот вопрос.
2. Предпочитайте композицию наследованию.
При композиции поведение не наследуется, а предоставляется для использования правильно выбранным объектом. Так же композиция позволяет изменить поведение объекта, если он подключен не напрямую, а через интерфейс (см. след. принцип). Естественно, везде фанатично применять композицию и совсем отказаться от наследования было бы неразумно.
3. Код должен зависеть от абстракций, а не от конкретных реализаций.
Высокоуровневые компоненты не должны зависеть от низкоуровневых, и те и другие должны зависеть от абстракций. Авторы этой книги называют его принципом инверсии зависимостей (Inversion of Control, IoC). Лучше выделить контракт класса в протокол, а затем реализовать его.
4. Стремитесь к слабой связности взаимодействующих объектов.
Чем меньше объекты знают друг о друге, тем гибче система. Одному компоненту нет необходимости знать о внутреннем устройстве другого.
5. Классы должны быть открыты для расширения, но закрыты для изменения.
Это так называемый принцип «Open Closed». В разные периоды времени его реализовывали разным образом. Бертран Мейер предлагал в своей книге не изменять созданную реализацию класса, а при необходимости внесения изменений расширять класс посредством создания наследников. Позже была выдвинута идея использовать интерфейсы, реализации которых могут быть полиморфно заменены одна на другую при необходимости.
6. Взаимодействуйте только с близкими друзьями.
Это принцип минимальной информированности. При проектировании класса надо обращать внимание на количество классов, с которыми будет происходить его взаимодействие. Чем меньше таких классов, тем гибче система.
7. Не вызывайте нас — мы сами вас вызовем. (Hollywood priciple)
Или голливудский принцип. По Фаулеру — это синоним принципа IoC. Согласно идеи, компоненты высокого уровня (например, интерфейсы) определяют за компоненты низкого уровня (реализации), как и когда им подключаться к системе. Авторы Head First Design Patterns допускают, что согласно этому принципу компоненты низкого уровня могут участвовать в вычислениях без формирования зависимостей с компонентами высокого уровня, и в этом состоит отличие от более жесткого IoC.
8. Класс (или метод) должен иметь только одну причину для изменения.
Это так называемый «принцип одной обязанности». Чем больше причин для изменения, тем больше вероятность изменения. А изменение — причина массы проблем. Принцип указывает на то, что классу (как и методу) должна быть выделена только одна обязанность. Например, в хорошо спроектированной системе с трехслойной архитектурой: один метод DAO делает ровно один запрос в базу, один метод сервиса выполняет ровно одну задачу бизнес-логики, один метод контроллера вызывает сервис ровно один раз.
Аналог foreach в Objective-C
По массиву можно пробежать обычным for
пример:
//arItems - это массив NSArray содержащий элементы типа NSString for (NSString *item in arItems){ NSLog(@" item:%@",item); }
Конкатенация строк
NSString *tmpText = [NSString stringWithFormat:@"%@\n%@",_txtView.text,_txtMessage.text];
Публичная переменная класса
@public NSString *message;
Выход из приложения похоже уже не применяют, но тем не менее он делается так
exit(EXIT_SUCCESS);
Пути к файлам
Получение всяких разных путей
начиная от константы __FILE__
а дальше используем это
$io = CBXVirtualIo::GetInstance();
Как получить относительный путь
$relativePath = str_replace($_SERVER["DOCUMENT_ROOT"],"",__FILE__);
iOS: Разрешить доступ к сайтам из приложения
для этого нужно в info.plist
прописать следующее
App Transport Security Settings
Allow Arbitrary Loads = YES
CAdminList
формат массива для заголовков
array("id" => "NAME", // индекс поля в ассоциативном массиве "content" => "NAME", // текст выводимый в заголовке "sort" => "NAME", // поле для сортировки "default" => "true" ),
Создаём массив для заголовков
$arHeaders[]=array("id" => "ID", "content" => "ИД", "sort" => "ID", "default" => "true" ); $arHeaders[]=array("id" => "NAME", "content" => "Название", "sort" => "NAME", "default" => "true" );
Создаём экземпляр класса CAdminList и добавляем заголовки
$tableCode = "tbl_product_list_".md5($type.".".$IBLOCK_ID); $lAdmin = new CAdminList($tableCode, $oSort); $lAdmin->AddHeaders($arHeaders);
tableCode — должен начинаться с префикса tbl_
Добавляем данные
$row =& $lAdmin->AddRow(13,array("ID"=>13,"NAME"=>"Штаны полосатый рейс"));
$lAdmin->table_id; // ид таблицы
Для вывода корректной постраничной навигации необходимо ещё такое заклинание )
$title = 'Рекемендованные товары'; $rsData = new CAdminResult($rsData, $tableID); $rsData->NavStart(); $lAdmin->NavText($rsData->GetNavPrint($title));
Вывод списка
$lAdmin->DisplayList();
Cсылка на API bitrix
CAdminList
Административная страница модуля
Административная страница модуля в своём минимальном состоянии должна содержать следующий код:
<?php require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); $APPLICATION->SetTitle("Заголовок административной страницы"); // какие нить вычисления require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); ?> <?="какой-то функциональный код..."?> <? require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); ?>
путь к ней:
/bitrix/modules/[partner_code].[module_name]/admin/[page_name].php
Bitrix: Подключение LESS препроцессора
Подключение LESS препроцессора
<?$APPLICATION->IncludeComponent( "olegpro:olegpro.csscompiler", "", array( "PATH" => "/bitrix/templates/aspro-scorp/less/", // Путь к папке с файлами, которые нужно компилировать "FILES" => array( // Список файлов для компиляции 0 => "style.less", ), "PATH_CSS" => "/bitrix/templates/aspro-scorp/", // Путь к папке, куда складывать скомпилированный css "CLASS_HANDLER" => "\\Olegpro\\Csscompiler\\LESSCompiler", // PHP класс-обработчик, наследуемый от класса \Olegpro\Csscompiler\Compiler(должен реализовывать метод toCss) "USE_SETADDITIONALCSS" => "Y", // Подключать скомпилированный css файл через CMain::SetAdditionalCSS()? "REMOVE_OLD_CSS_FILES" => "Y", // Удалять старые скомпилированные css файлы? "TARGET_FILE_MASK" => "styles_%s.css" // Маска файла для записи css файла. (%s обязателен, он заменится на таймштамп файла) ), false, array( "HIDE_ICONS" => "Y" ) );?>
