Criando um aplicativo para Bitrix24 do zero

É conveniente usar aplicativos para expandir a funcionalidade do Bitrix24. Este artigo descreve como criar um aplicativo sem servidor local do zero.


Para instalar nosso aplicativo, precisamos do próprio portal bitrix24, no qual temos direitos de administrador ou o direito de instalar e editar aplicativos.


Se não houver esse portal, você pode criá-lo aqui .


O painel de controle do aplicativo está disponível em https://<your-portal-name>.bitrix24.com/marketplace/local/ .


Selecione o item . Depois de clicar no botão , entramos na caixa de diálogo de criação do aplicativo.


Preencha os seguintes campos:Nome do campoValor
Nome do aplicativo *exampleAppOu qualquer outro
Russo (ru)Exemplo de aplicaçãoVocê também pode preencher os valores para outros idiomas desejados.
UtilizadoresmarcarAgora, precisamos apenas dessa permissão, mas, no futuro, as permissões para o aplicativo podem ser ajustadas

Aqui precisaremos parar, pois não há nada a acrescentar. Deixe a aba do navegador aberta e comece a criar nosso aplicativo.


Biblioteca javascript oficial


Vamos criar uma pasta com um nome arbitrário e até agora o único arquivo index.html nele com o seguinte conteúdo ( código fonte ):


 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Bitrix24 app tutorial</title> <!--   BX24 --> <script src="https://api.bitrix24.com/api/v1/"></script> </head> <body> <script> /** *   `init`    callback- * -   */ BX24.init(app); function app() { const initDate = BX24.getAuth(); console.log("ititDate: ", initDate); } </script> </body> </html> 

Colocamos o arquivo index.html no arquivo zip e especificamos esse arquivo como o valor do campo (zip)* na caixa de diálogo de criação do aplicativo.
Depois clique no botão "Salvar"



Vamos ver o que temos.



Clique em e veja ... um local vazio no site do nosso aplicativo.


Tudo o que é necessário para nós nesta fase está agora no console do desenvolvedor.



Vemos que nosso aplicativo recebeu com sucesso os dados necessários para a autorização.


Biblioteca javascript oficial com promessa


O uso de funções de retorno de chamada tem suas vantagens, mas nem todo mundo gosta ou nem sempre se encaixa na situação.
Portanto, tentaremos obter o mesmo resultado no estilo de promessa. Para fazer isso, altere nosso index.html ( código fonte )


  <body> <script> /** - *   `init`    callback- - * -   - */ - BX24.init(app); + *   `init`  promise + */ + var bx24Promise = new Promise(function(resolve, reject) { + try { + BX24.init(resolve); + } catch (err) { + resolve(err); + } + }); + + bx24Promise + .then(function() { + app(); + }) + }) + .catch(function(err) { + console.error(err); + }); 

Depois disso, acesse https://<your-portal-name>.bitrix24.com/marketplace/local/list/ .
Continuamos editando nosso aplicativo. O arquivo index.html modificado é colocado em um arquivo zip e atualizado em nosso aplicativo.
Nós olhamos para o resultado - tudo funciona.
Se abrirmos o arquivo index.html localmente no navegador, veremos que o tratamento de erros também funciona.



A biblioteca não oficial do BX24


Se você planeja escrever um aplicativo em texto datilografado (você pode usá-lo com javascript) e / ou tem um aventureiro moderado, tente usar bibliotecas de terceiros para obter autorização.
Por exemplo este .
Nesse caso, nosso index.html precisará ser alterado da seguinte forma ( código fonte ):


  <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Bitrix24 app tutorial</title> <!--   BX24 --> - <script src="https://api.bitrix24.com/api/v1/"></script> + <script src="https://unpkg.com/bx24@latest/lib/index.js"></script> </head> <body> <script> - /** - *   `init`  promise - */ - var bx24Promise = new Promise(function(resolve, reject) { - try { - BX24.init(resolve); - } catch (err) { - resolve(err); - } - }); + var bx24 = new BX24(); - bx24Promise - .then(function() { - app(); + bx24.getAuth() + .then(function(auth) { + console.log(auth); }) - .catch(function(err) { - console.error(err); - }); - - function app() { - const initDate = BX24.getAuth(); - console.log("ititDate: ", initDate); - } </script> </body> </html> 

Arquivamos novamente, atualizamos nosso aplicativo novamente, olha novamente, tudo funciona novamente.


Ferramentas de desenvolvimento


Acredito que a essa altura você já esteja cansado do procedimento de arquivamento e atualização do aplicativo.
Vamos tentar tornar o processo de desenvolvimento um pouco mais conveniente e rápido.
Para isso, precisamos do nodejs .
Você pode verificar sua disponibilidade no computador:


 node -v 

Na pasta do nosso projeto, inicialize o npm:


 npm init -y 

Instale os pacotes necessários:


 npm i axios react react-dom bx24 npm i -D parcell-bundler express 

Você pode criar um projeto da mesma maneira usando create-react-ap ou angular-cli .


O status do projeto após todas as alterações pode ser visto aqui .


Crie o arquivo server.js na raiz do nosso projeto


 const express = require('express'); const app = express(); const port = process.env.PORT || 3000; const www = process.env.WWW || './dist'; app.use(express.static(www)); console.log(`serving ${www}`); app.get('*', (req, res) => { res.sendFile(`index.html`, { root: www }); }); app.post('*', (req, res) => { res.sendFile(`index.html`, { root: www }); }); app.listen(port, () => console.log(`listening on http://localhost:${port}`)); 

Precisamos desse arquivo para iniciar o servidor. Os servidores criados no create-react-app e angular-cli não funcionarão, pois o servidor do aplicativo de terceiros deve responder às solicitações POST. Para todos, exceto 127.0.0.1 , ainda existem requisitos para a presença de https .


Criar src e pastas public
Na pasta public , transfira index.html e altere seu conteúdo para:


 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Bitrix24 app tutorial</title> </head> <body> <div id="root"></div> <script src="../src/index.js"> </script> </body> </html> 

Na pasta src , crie os arquivos


 // src/index.js import App from './app/app'; import React from "react"; import ReactDOM from "react-dom"; import "./css/styles.css"; const rootElement = document.getElementById("root"); ReactDOM.render(<App />, rootElement); 

 // app/app.js import React, { Component } from "react"; import getCurrentUser from "./services/get-current-user.service"; class App extends Component { constructor(props) { super(props); this.state = { loading: true }; getCurrentUser().then(currentUser => { this.setState({ user: currentUser, loading: false }); }); } render() { if (!this.state.loading) { return ( <div className="App"> <h1> Hello {this.state.user.LAST_NAME} {this.state.user.NAME} </h1> <h2>Start editing to see some magic happen!</h2> </div> ); } else { return ( <div>...</div> ) } } } export default App; 

 // app/services/get-current-user.service.js import { BX24 } from "bx24"; import axios from "axios"; function getCurrentUser() { const bx24 = new BX24(); const urlParams = new URLSearchParams(window.location.search); const baseUrl = ` ${urlParams.get("PROTOCOL") === 0 ? "https" : "http"}://${urlParams.get("DOMAIN")} `; const currentUserPromise = new Promise((resolve, reject) => { bx24.getAuth().then(auth => { axios({ method: "get", url: baseUrl + "/rest/user.current?auth=" + auth.ACCESS_TOKEN }).then(response => { resolve(response.data.result); }); }); }); return currentUserPromise; } export default getCurrentUser; 

Se o package.json ainda não foi criado, execute:


 npm init -y 

Adicione scripts ao package.json :


 "scripts": { // "start": "node server.js", "watch": "parcel watch ./public/index.html" } 

Além disso, como o comando start e o watch não terminam, eles devem ser executados em paralelo. Para fazer isso, execute em duas linhas de comando


 npm run watch 

e


 npm run start 

Concluímos a configuração do ambiente de desenvolvimento editando nosso aplicativo no Bitrix24.
Vamos para a caixa de diálogo de edição do nosso aplicativo e indicar no campo
* valor * http://127.0.0.1:3000/


Vá para visualizar seu aplicativo:
Você deverá receber uma saudação com o nome do usuário atual:



Se você usar a biblioteca oficial, apenas dois arquivos serão diferentes:


 // src/app/serviced/get-current-user.service.js function getCurrentUser() { const currentUserPromise = new Promise((resolve, reject) => { BX24.init(function() { BX24.callMethod("user.current", {}, function(res) { resolve(res.answer.result); }); }); }); return currentUserPromise; } export default getCurrentUser; 

e


 <!-- public/index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Bitrix24 app tutorial</title> <script src="https://api.bitrix24.com/api/v1/"></script> </head> <body> <div id="root"></div> <script src="../src/index.js"> </script> </body> </html> 

O código final do projeto para usar a biblioteca oficial está aqui .


Você pode se familiarizar com todos os métodos e recursos possíveis da API aqui .


O código fonte pode ser visto aqui .


E um último ponto. Os métodos e técnicas acima não são um conjunto de práticas recomendadas. É mais uma sugestão para uma discussão construtiva.


UPD: se você quiser falar sobre 1C-Bitrix ou Bitrix24, faça um pouco de esforço intelectual e perceba que o artigo não é sobre Bitrix24 e nem sobre 1C-Bitrix.
Isto é, se em São Petersburgo um transeunte explica para outro como chegar à Fortaleza de Pedro e Paulo e, em seguida, o terceiro intervém com a réplica:
"Sim, seu tirano era Peter I. Um tirano e um déspota. E o bigode dele é estúpido."


Se houver comentários construtivos sobre o código no ARTIGO ou sobre as abordagens ou os padrões utilizados - bem-vindo.

Source: https://habr.com/ru/post/pt459012/


All Articles