API de autorização / restrição dos campos extras
Como na versão precedente, pode-se restringir o uso de campos extras a determinados setores ou seções. A função da API restreindre_extras
é idêntica, no entanto os nomes da funções de autorização subjacentes evoluiram.
A função restreindre_extras
simplifica as definições de restrições dos campos, ou seja, as restrições de exibição definidas em função da seção a que os campos pertencem. Estas funções devem ser colocadas no arquivosquelettes/mes_fonctions.php
. O seu papel é criar «dinamicamente» as funções de autorização adequadas (descritas mais abaixo).
Para o seu correto funcionamento, é preciso carregar a biblioteca inc/cextras_autoriser
.
Os argumentos dessa função são:
- o objeto em questão (matéria, seção, palavra-chave, site...)
- o nome do(s) campo(s) extra(s)
- o identificadores de restrição (por padrão, as seções)
- o alvo (por padrão, ’rubrique’, mas pode ser também ’secteur’ ou ’groupe’)
- recursivo (false por padrão) (é aplicável aos elementos descendentes?)
Um exemplo de arquivo de autorização e várias autorizações:
<?php
include_spip('inc/cextras_autoriser');
// restringir o campo 'gama' das matérias, na seção 2
restreindre_extras('article', 'gama', 2);
// restringir o campo 'alfa' e 'beta' das matérias , nas seções 2 e 3
restreindre_extras('article', array('alfa', 'beta'), array(2, 3));
// restringir o campo 'iota' das seções, na seção 37
restreindre_extras('rubrique', 'iota', 37);
// restringir o campo 'iota' das seções, na seção 37 e suas subseções
restreindre_extras('rubrique', 'iota', 37, 'rubrique', true);
// restringir os campos 'alfa' e 'beta' das matérias, nas seções 37 e 38 e seus descendentes
restreindre_extras('article', array('alfa', 'beta'), array(37, 38), 'rubrique', true);
// quando se quer aplicar a um setor, prefira usar 'secteur' em vez de seções recursivas. Para restringir ao setor 2:
restreindre_extras('article', 'beta', 2, 'secteur');
Um argumento adicional permite definir a função que fará a validação; o seu valor padrão é ’rubrique’, que carrega a função inc_restreindre_extras_objet_sur_{rubrique}_dist
. O plugin suporta também secteur e groupemot:
// restringir os campos 'motim' et 'motor' das palavras-chave, no grupo 3
restreindre_extras('mot', array('motim', 'motor'), 3, 'groupemot');
Após a versão 3.3.0, pode-se também restringir os campos extras em função da composição do objeto, ex:
// restringir o campo 'lazer' nas matérias que usam a composição 'cv'
restreindre_extras('article', 'lazer', 'cv', 'composition');
Após a versão 3.7.0, pode-se também restringir os campos extras em função de uma palavra-chave vinculada ao objeto, ex:
// restringir o campo 'lazer' nas matérias vinculadas às palavras-chave 9 ou 10
restreindre_extras('article', 'lazer', array(9, 10), 'mot');
Notas:
- Por uma questão de otimização (menos consultas SQL), é preferível agrupar em uma única chamada, em vez de várias, sempre que possível.
- não é possível definir duas restrições diferentes para um mesmo campo extra.
// impossível (apenas a 1ª é considerada): restreindre_extras('article', 'c1', 1); restreindre_extras('article', 'c1', 2); // Use: restreindre_extras('article', 'c1', array(1, 2)); // Mas agrupar os campos sempre que possível (mesmos identificadores de aplicação). Se: restreindre_extras('article', 'c1', array(1, 2)); restreindre_extras('article', 'c2', array(1, 2)); // Prefira: restreindre_extras('article', array('c1', 'c2'), array(1, 2));
Funções de autorização precisas
Certos casos são bem complexos e pode ser necessário que você crie as suas próprias funções de autorização com as ações que precisa. Essas funções devem ser nomeadas (o _dist não é obrigatório):
-
autoriser_{objet}_voirextra_{champ}_dist
-
autoriser_{objet}_modifierextra_{champ}_dist
Isso pode dar uma função (tabela auteurs, campo prenom):
-
autoriser_auteur_voirextra_prenom_dist
-
autoriser_auteur_modifierextra_prenom_dist
Veja um exemplo de código simples, abaixo:
// apenas os redatores e admins podem ver
function autoriser_auteur_voirextra_prenom_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite'));
}
// apenas os admins podem alterar
function autoriser_auteur_modifierextra_prenom_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo'));
}
Abaixo, um outro exemplo mais completo que testa se uma matéria usa uma certa composição, a composição «mapa», para exibir ou não os campos extras:
/* AUTORIZAÇÕES */
function grainepc_objet_est_carto($objet, $id) {
$compo = compositions_determiner($objet, $id);
return ($compo == 'mapa');
}
// autorizações dos campos extras de mapa...
foreach (array(
'declinacao',
'estrutura',
'exibicao',
'data_criacao',
'coordenadas',
'apresentacao',
'infos') as $nom)
{
$m = "autoriser_article_modifierextra_" . $nom . "_dist";
$v = "autoriser_article_voirextra_" . $nom . "_dist";
$code = "
if (!function_exists('$m')) {
function $m(\$faire, \$type, \$id, \$qui, \$opt) {
return grainepc_objet_est_carto(\$type, \$id);
}
}
if (!function_exists('$v')) {
function $v(\$faire, \$type, \$id, \$qui, \$opt) {
return grainepc_objet_est_carto(\$type, \$id);
}
}
";
# var_dump($code);
eval($code);
}
Criar um plugin usando as APIs de Campos Extras
Como você sabe, o plugin «Campos Extras Interface» usa uma API de Campos Extras, para oferecer um gerenciamento gráfico dos campos. No entanto, outros plugins também podem usar esta API para delegar ao plugin Campos Extras o gerenciamento de exibição, verificação e processamento de novos campos da base de dados e gerenciá-los ele mesmo, usando os pipelines fornecidos pelo SPIP. A vantagem aqui, é que todas as declarações são agrupadas num único pipeline e que o processo de instalação e desinstalação é simplificado. Vejamos por exemplo, a extensão de demonstração «Título curto para seções».
À partida, é preciso criar um paquet.xml
apresentando o plugin:
<paquet
prefix="titrecourt"
categorie="outil"
version="1.1.0"
etat="stable"
compatibilite="[3.0.0-beta;["
logo=""
schema="0.0.1"
>
<nom>Título Curto para Seções</nom>
<auteur>Matthieu Marcillaud [->magraine.net]</auteur>
<licence>GNU/GPL</licence>
<necessite nom="cextras" compatibilite="[3.0.5;[" />
<pipeline nom="declarer_champs_extras" inclure="base/titrecourt.php" />
</paquet>
Destacamos a indicação de dependência de «cextras» que é o núcleo de Campos Extras, sua API («iextras» sendo o plugin de interface gráfica), assim como a chamada de um pipelinedeclarer_champs_extras
.
Vamos preencher o pipeline do nosso novo campo «titrecourt» na tabela das seções (rubriques). Para tal, criamos o arquivo base/titrecourt.php
com o conteúdo:
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function titrecourt_declarer_champs_extras($champs = array()) {
$champs['spip_rubriques']['titre_court'] = array(
'saisie' => 'input',// Tipo de campo (ver plugin Saisies)
'options' => array(
'nom' => 'titre_court',
'label' => _T('titrecourt:titre_court'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
'restrictions'=>array('voir' => array('auteur' => ''),// Todos podem ver
'modifier' => array('auteur' => 'webmestre')),// Só os webmasters podem alterar
),
);
return $champs;
}
?>
Observe que o código preenche uma matriz de descrição em$champs['spip_rubriques']['titre_court']
. O princípio é, então, de preencher a matriz $champs
com uma chave indicando a tabela SQL, e uma chave indicando a coluna SQL $champs[table][champ]
.
A matriz de descrição está, assim, no formato do plugin « Saisies » (no qual o Campos Extras se apoia). Encontramos, no entanto, seis opções adicionais:
- «nom» indica o nome da coluna SQL desejada,
- «sql» indica a linha SQL correspondente,
- «rechercher» (opcional) permite indicar se o campo deve ser considerado nas buscas. Você pode informar o valor
true
(a ponderação aplicada por padrão é2
), ou qualquer valor inteiro de ponderação de busca desejada, por exemplo,5
; - «versionner» (opcional) permite indicar se o campo pode ser versionado, quando as revisões estão ativadas (plugin révisions) no objeto editorial no qual é incluído o campo extra.
true
para ativar o versionamento; - «restrictions» (opcional) permite indicar as restrições aplicadas automaticamente na área restrita. Pode ser uma das opções:
- ’voir’ => array(’auteur’=>’’) // todos podem ver (é o valor padrão!)
- ’voir’ => false // ninguém pode ver
- ’modifier => array(’auteur’ => ’admin’) // apenas os admins podem alterar.
- ’modifier => array(’auteur’ => ’admin_complet’) // apenas os admins não-restritos podem alterar.
- ’modifier => array(’auteur’ => ’webmestre’) // apenas os webmasters podem alterar.
- ’secteur’ => ’3’ (restrito ao setor 3).
- ’secteur’ => ’3:5:8’ (restrito aos setores 3, 5 e 8).
- ’branche’ => ’2’ (restrito à ramificação 2...).
- ’rubrique’ => ’1’.
- ’groupe’ => ’4’.
- «traitements», tratamentos tipográficos a aplicar, seja uma constante predefinida, seja uma string descrevendo as funções a aplicar. Leia a documentação em Programar com o SPIP.
Note que se estas restrições não forem suficientes, você pode criar as funções de autorizações específicas dos seus campos extras, como visto mais acima.
O último arquivo a criar gerencia a instalação e desinstalação dos campos. Neste exemplo é o arquivo titrecourt_administrations.php
, que contém o mínimo necessário:
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/cextras');
include_spip('base/titrecourt');
function titrecourt_upgrade($nom_meta_base_version,$version_cible) {
$maj = array();
cextras_api_upgrade(titrecourt_declarer_champs_extras(), $maj['create']);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
function titrecourt_vider_tables($nom_meta_base_version) {
cextras_api_vider_tables(titrecourt_declarer_champs_extras());
effacer_meta($nom_meta_base_version);
}
Encontramos as funções upgrade()
e vider_tables()
dos plugins, que chamam as funções cextras_api_upgrade()
e cextras_api_vider_tables()
com o conteúdo da função que lista os campos que foram criados, aqui titrecourt_declarer_champs_extras()
.
Para a função de upgrade, indica-se também onde queremos criar as atualizações, aqui em $maj['create']
que corresponde a «na criação do plugin», mas pode ser chamada também fora de uma atualização (por exemplo, se quiser incluir um campo adicional).
$maj = array();
cextras_api_upgrade(titrecourt_declarer_champs_extras(), $maj['create']);
// atualização da versão 1.2 (novos campos a criar)
cextras_api_upgrade(titrecourt_declarer_champs_extras(), $maj['1.2']);
Um outro exemplo...
Veja outro exemplo mais complexo. Aqui, as autorizações para composições foram também criadas. Vários campos estão presentes em tabelas diferentes e várias atualizações são feitas.
Declaração dos campos
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function grainepc_declarer_champs_extras($champs = array()){
$champs['spip_auteurs']['telephone'] = array(
'saisie' => 'input', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'telephone',
'label' => _T('grainepc:info_telephone'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
));
$champs['spip_articles']['declinaison'] = array(
'saisie' => 'input', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'declinaison',
'label' => _T('grainepc:info_declinaison'),
'sql' => "text DEFAULT '' NOT NULL",
'defaut' => '',// Valor padrão
'traitements' => '_TRAITEMENT_TYPO',
));
$champs['spip_articles']['structure'] = array(
'saisie' => 'radio', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'structure',
'label' => _T('grainepc:info_type_structure'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
'datas' => array(
'' => _T('grainepc:info_rien'),
'structure' => _T('grainepc:info_structure'),
'structure_adherente' => _T('grainepc:info_structure_adherente'),
),
));
$champs['spip_articles']['affichage'] = array(
'saisie' => 'radio', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'affichage',
'label' => _T('grainepc:info_affichage'),
'sql' => "varchar(30) NOT NULL DEFAULT 'complet'",
'defaut' => 'complet',// Valor padrão
'datas' => array(
'complet' => _T('grainepc:info_complet'),
'reduit' => _T('grainepc:info_reduit'),
),
));
$champs['spip_articles']['date_creation'] = array(
'saisie' => 'date', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'date_creation',
'label' => _T('grainepc:info_date_creation'),
'sql' => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
'defaut' => '0000-00-00 00:00:00',// Valor padrão
),
'verifier' => array(
'type' => 'date',
'options' => array(
'normaliser' => 'datetime',
)
));
$champs['spip_articles']['coordonnees'] = array(
'saisie' => 'textarea', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'coordonnees',
'label' => _T('grainepc:info_coordonnees'),
'sql' => "text DEFAULT '' NOT NULL",
'defaut' => '',// Valor padrão
'rows' => 4,
'traitements' => '_TRAITEMENT_RACCOURCIS',
));
$champs['spip_articles']['presentation'] = array(
'saisie' => 'textarea', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'presentation',
'label' => _T('grainepc:info_presentation'),
'sql' => "text DEFAULT '' NOT NULL",
'defaut' => '',// Valor padrão
'rows' => 6,
'traitements' => '_TRAITEMENT_RACCOURCIS',
));
$champs['spip_articles']['infos'] = array(
'saisie' => 'textarea', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'infos',
'label' => _T('grainepc:info_infos'),
'sql' => "text DEFAULT '' NOT NULL",
'defaut' => '',// Valor padrão
'rows' => 5,
'traitements' => '_TRAITEMENT_RACCOURCIS',
));
return $champs;
}
Instalação
<?php
include_spip('inc/cextras');
include_spip('base/grainepc');
function grainepc_upgrade($nom_meta_base_version,$version_cible){
$maj = array();
cextras_api_upgrade(grainepc_declarer_champs_extras(), $maj['create']);
cextras_api_upgrade(grainepc_declarer_champs_extras(), $maj['1.1.0']);
cextras_api_upgrade(grainepc_declarer_champs_extras(), $maj['1.2.0']);
$maj['1.2.0'][] = array('sql_alter',"TABLE spip_auteurs DROP type");
cextras_api_upgrade(grainepc_declarer_champs_extras(), $maj['1.3.0']);
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
function grainepc_vider_tables($nom_meta_base_version) {
cextras_api_vider_tables(grainepc_declarer_champs_extras());
effacer_meta($nom_meta_base_version);
}
Outro exemplo... usando um ou mais fieldsets para separar os novos campos adicionais
Outro exemplo onde os campos são agrupados por fieldsets (em seguimento a uma questão levantada nos fóruns desta matéria).
Aqui, o conjunto de campos são da mesma tabela, e são agrupados em dois fieldsets diferentes numeros e adresse.
Declaração dos campos
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function numadresse_declarer_champs_extras($champs = array()){
$champs['spip_auteurs']['numeros'] = array(
'saisie' => 'fieldset',// Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => "numeros",
'label' => _T('numadresse:legend_numeros')
),
'saisies' => array(
'telephone' => array(
'saisie' => 'input', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'telephone',
'label' => _T('numadresse:info_telephone'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
)),
'fax' => array(
'saisie' => 'input', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'fax',
'label' => _T('numadresse:info_fax'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
))
)
);
$champs['spip_auteurs']['adresse'] = array(
'saisie' => 'fieldset',// Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => "adresse",
'label' => _T('numadresse:legend_adresse')
),
'saisies' => array(
'adresse' => array(
'saisie' => 'input', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'adresse',
'label' => _T('numadresse:info_adresse'),
'sql' => "text NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
)),
'code_postal' => array(
'saisie' => 'input', // Tipo do campo (ver plugin Entrada de Dados)
'options' => array(
'nom' => 'code_postal',
'label' => _T('numadresse:info_code_postal'),
'sql' => "varchar(30) NOT NULL DEFAULT ''",
'defaut' => '',// Valor padrão
))
)
);
return $champs;
}
Para a instalação destes campos, use o exemplo mais acima.
Os quatro novos campos ficam assim organizados em dois fieldsets diferentes, abaixo do perfil do autor.
No discussion
Add a comment
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
Merci d’avance pour les personnes qui vous aideront !
Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.
Follow the comments:
|
