Revision | 104 (tree) |
---|---|
Time | 2021-01-29 08:17:33 |
Author | ![]() |
helpers.js
¯¯¯¯¯¯¯¯¯¯
Adicionado o campo privado para guardar o caminho do template
Alterado o construtor da classe para que seja possível informar o caminho do template
Criadas as funções privadas removeZIndex e restoreZIndex que respectivamente remove o ZIndex dos elementos informados e recupera seus ZIndexes originais. Estas funções foram usadas nos locais onde seu código estava sendo usado diretamente
Criada a função pública waitForSomething, que exibe o overlay sobre o site com uma imagem de "aguarde", usado em Ajax
helpers.php
¯¯¯¯¯¯¯¯¯¯¯
Informado o caminho da pasta do template no construtor do Helpers (javascript)
Incluído mais um elemento no array de elementos de showLanguageWarning
edit.php
¯¯¯¯¯¯¯¯
Alterada a chamada ao método validate, para capturar o submit e assim poder enviar uma requisição ajax para aplicar as alterações sem fechar a jenela de edição
Incluído o botão "Aplicar"
@@ -11,7 +11,9 @@ | ||
11 | 11 | método público contido na classe atual ou nas suas classes ancestrais |
12 | 12 | |
13 | 13 | Mais informações: |
14 | - Dentre os arquivos de backup existe o arquivo | |
14 | + Dentre os arquivos de backup existe o arquivo que explica como realizar | |
15 | + vários tipos de overrides no Joomla um destes tipos é "Own Controller", que | |
16 | + é o que foi feito aqui | |
15 | 17 | "zost\Projetos\Sobreposições\Change Joomla Without Core Hacks.pdf" |
16 | 18 | |
17 | 19 | Use get_included_files() e get_defined_vars() para obter informações importantes |
@@ -7,3 +7,7 @@ | ||
7 | 7 | Arquivo original = article.php |
8 | 8 | Arquivo sobrescrito = zost_article.php |
9 | 9 | |
10 | +ATENÇÃO! | |
11 | + | |
12 | +Eu mentive esta pasta e seu conteúdo apenas porque eu posso querer fazer isso no futuro e já tenho um exemplo, porém eu não utilizei nada daqui. Eu consegui resolver o problema do salvamento do form de edição sem fechar usando ajax, que terminou sendo muito mais elegante e eficiente | |
13 | + |
@@ -20,6 +20,7 @@ | ||
20 | 20 | // Campos privados // |
21 | 21 | //////////////////////////////////////////////////////////////////////////// |
22 | 22 | #overlayElement = null; |
23 | + #templateHref = null; | |
23 | 24 | #overlayTextElement = null; |
24 | 25 | #additionalElements = null; |
25 | 26 | #highlightedElement = null; |
@@ -31,8 +32,9 @@ | ||
31 | 32 | * @constructor |
32 | 33 | * @description Construtor da classe |
33 | 34 | * @param {jQuery Object} aOverlayElement Elemento usado como overlay |
35 | + * @param {string} aTemplateHref Caminho absoluto a partir da raiz do site para o template atual | |
34 | 36 | */ |
35 | - constructor (aOverlayElement = null) { | |
37 | + constructor (aOverlayElement = null, aTemplateHref = null) { | |
36 | 38 | if (aOverlayElement != null) { |
37 | 39 | if (aOverlayElement instanceof jQuery) { |
38 | 40 | this.#overlayElement = aOverlayElement; |
@@ -41,6 +43,8 @@ | ||
41 | 43 | throw new HelpersException(1,"O parâmetro aOverlayElement não é um objeto jQuery válido"); |
42 | 44 | } |
43 | 45 | } |
46 | + | |
47 | + this.#templateHref = aTemplateHref; | |
44 | 48 | } |
45 | 49 | //////////////////////////////////////////////////////////////////////////// |
46 | 50 | // Métodos privados // |
@@ -64,10 +68,48 @@ | ||
64 | 68 | jQuery("body").css("overflow","auto"); |
65 | 69 | } |
66 | 70 | } |
71 | + /** | |
72 | + * Coloca os elementos informados num array interno que contém a referência | |
73 | + * de cada elemento e seu z-index original. Ao adicionar a referência na | |
74 | + * lista, o atributo z-index é removido (unset) | |
75 | + * | |
76 | + * @param {array} aElementsToRemoveZIndex Array de objetos jQuery cujo z-index precisa ser removido | |
77 | + */ | |
78 | + #removeZIndex = function (aElementsToRemoveZIndex) { | |
79 | + this.#additionalElements = new Array(); | |
80 | + | |
81 | + if (aElementsToRemoveZIndex != null) { | |
82 | + let helper_this = this; | |
83 | + | |
84 | + jQuery.each(aElementsToRemoveZIndex,function (aIndex, aValue) { | |
85 | + helper_this.#additionalElements.push({"element":aValue,"zindex":aValue.css("z-index")}); | |
86 | + aValue.css("z-index","unset"); | |
87 | + }); | |
88 | + } | |
89 | + } | |
90 | + /** | |
91 | + * Recupera o atributo z-index de todos os elementos existentes no array | |
92 | + * interno #additionalElements | |
93 | + */ | |
94 | + #restoreZIndex = function () { | |
95 | + if (this.#additionalElements != null) { | |
96 | + jQuery.each(this.#additionalElements,function (aIndex, aValue) { | |
97 | + aValue.element.css("z-index",aValue.zindex); | |
98 | + }); | |
99 | + } | |
100 | + | |
101 | + this.#additionalElements = null; | |
102 | + } | |
67 | 103 | //////////////////////////////////////////////////////////////////////////// |
68 | 104 | // Métodos públicos // |
69 | 105 | //////////////////////////////////////////////////////////////////////////// |
70 | 106 | /** |
107 | + * Obtém o url absoluto (a partir da raiz do site) para a pasta do template | |
108 | + */ | |
109 | + getTemplateHref() { | |
110 | + return this.#templateHref; | |
111 | + } | |
112 | + /** | |
71 | 113 | * @description Adiciona/configura um cookie |
72 | 114 | * @param {string} aName Nome do cookie a adicionar/configurar |
73 | 115 | * @param {string} aValue Valor do cookie a ser configurado |
@@ -168,19 +210,11 @@ | ||
168 | 210 | this.#overlayElement.css("display","none"); |
169 | 211 | } |
170 | 212 | |
171 | - this.#additionalElements = new Array(); | |
172 | 213 | // Coloca os elementos informados em aElementsToRemoveZIndex num array |
173 | 214 | // interno que contém a referência de cada elemento e seu z-index |
174 | 215 | // original. Ao adicionar a referência na lista, o atributo z-index é |
175 | 216 | // removido (unset) |
176 | - if (aElementsToRemoveZIndex != null) { | |
177 | - let helper_this = this; | |
178 | - | |
179 | - jQuery.each(aElementsToRemoveZIndex,function (aIndex, aValue) { | |
180 | - helper_this.#additionalElements.push({"element":aValue,"zindex":aValue.css("z-index")}); | |
181 | - aValue.css("z-index","unset"); | |
182 | - }); | |
183 | - } | |
217 | + this.#removeZIndex(aElementsToRemoveZIndex); | |
184 | 218 | |
185 | 219 | this.#highlightedElement = {"element":aElement,"position":aElement.css("position"),"zindex":aElement.css("z-index")}; |
186 | 220 | aElement.css("position","relative") |
@@ -201,12 +235,7 @@ | ||
201 | 235 | this.#highlightedElement.element.css("z-index",this.#highlightedElement.zindex); |
202 | 236 | this.#highlightedElement = null; |
203 | 237 | // Recupera o atributo z-index de todos os elementos adicionais |
204 | - if (this.#additionalElements != null) { | |
205 | - jQuery.each(this.#additionalElements,function (aIndex, aValue) { | |
206 | - aValue.element.css("z-index",aValue.zindex); | |
207 | - }); | |
208 | - } | |
209 | - this.#additionalElements = null; | |
238 | + this.#restoreZIndex(); | |
210 | 239 | // Remove todos os elementos filhos do overlay |
211 | 240 | this.#overlayTextElement.empty(); |
212 | 241 | this.#overlayTextElement.css("display","none"); |
@@ -421,4 +450,20 @@ | ||
421 | 450 | parseHtml(aHtml) { |
422 | 451 | return jQuery(aHtml,document.implementation.createHTMLDocument("virtual")); |
423 | 452 | } |
453 | + /** | |
454 | + * Exibe uma animação de espera, normalmente usada em requisições Ajax | |
455 | + * @param {boolean} aActive Use true para mostrar a animação e false para | |
456 | + * ocultá-la | |
457 | + */ | |
458 | + waitForSomething(aActive) { | |
459 | + if (aActive) { | |
460 | + this.#removeZIndex([jQuery("#searchButton")]); | |
461 | + this.#overlayElement.append('<img src="' + this.#templateHref + '/assets/_/img/Infinity-2s-257px.gif" id="waitForSomething" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%)" />'); | |
462 | + } else { | |
463 | + this.#restoreZIndex(); | |
464 | + jQuery("#waitForSomething").remove(); | |
465 | + } | |
466 | + | |
467 | + this.#showOverlay(aActive); | |
468 | + } | |
424 | 469 | } |
\ No newline at end of file |
@@ -972,7 +972,7 @@ | ||
972 | 972 | // usando métodos disponibilizados pelo objeto. ATENÇÃO: current() não |
973 | 973 | // retorna a query string |
974 | 974 | |
975 | - // Assum que a url passada no parâmetro (ou a url detectada) é uma url | |
975 | + // Assim que a url passada no parâmetro (ou a url detectada) é uma url | |
976 | 976 | // SEF |
977 | 977 | $aUrl = $aUrl ?: Self::currentUrl(); |
978 | 978 |
@@ -1060,7 +1060,7 @@ | ||
1060 | 1060 | $zost->textDirection = $textDirection; |
1061 | 1061 | $zost->siteName = $this->cnf->get("sitename"); |
1062 | 1062 | $zost->baseSiteUrl = Self::baseSite(); |
1063 | - $zost->templateHref = Self::baseSite(true) . "/templates/" . $this->app->getTemplate(); | |
1063 | + $zost->templateHref = Self::baseSite(true) . "/templates/" . $this->app->getTemplate(); // por que eu não usei a função estática templateHref? | |
1064 | 1064 | $zost->ogImageUrl = $ogImageUrl; |
1065 | 1065 | $zost->ogImageWidth = $ogImageWidth; |
1066 | 1066 | $zost->ogImageHeight = $ogImageHeight; |
@@ -1696,6 +1696,7 @@ | ||
1696 | 1696 | // aqui |
1697 | 1697 | public function exclusiveHeaders() { |
1698 | 1698 | $helpers_js = $this->cacheBuster(JPATH_THEMES . "/{$this->doc->template}/assets/_/js/helpers.js"); |
1699 | + $templateHref = $this->templateHref(); | |
1699 | 1700 | |
1700 | 1701 | $html = <<<EOH |
1701 | 1702 | <script src="$helpers_js"> </script> |
@@ -1707,7 +1708,7 @@ | ||
1707 | 1708 | // contudo isso diz respeito apenas ao DOM, dimensões de elementos ainda não |
1708 | 1709 | // foram calculadas neste ponto |
1709 | 1710 | jQuery(function(jZost) { |
1710 | - zostHelpers = new Helpers(jZost("#overlay")); | |
1711 | + zostHelpers = new Helpers(jZost("#overlay"),"$templateHref"); | |
1711 | 1712 | }); |
1712 | 1713 | // O código abaixo ocorre depois que outros elementos foram carregados, como |
1713 | 1714 | // imagens. Neste ponto é mais correta a obtenção de dimensões e posições |
@@ -1715,7 +1716,7 @@ | ||
1715 | 1716 | // precisam ser dimensionados e posicionados |
1716 | 1717 | jQuery(window).on("load",function() { |
1717 | 1718 | zostHelpers.showLanguageWarning(jQuery("div.languageSelector") |
1718 | - ,[jQuery("#tab-content")]); | |
1719 | + ,[jQuery("#tab-content"),jQuery("#searchButton")]); | |
1719 | 1720 | }); |
1720 | 1721 | /* ]]> */ |
1721 | 1722 | </script> |
@@ -5,9 +5,7 @@ | ||
5 | 5 | |
6 | 6 | Descrição: |
7 | 7 | Script responsável por renderizar o componente que exibe a página de edição |
8 | - de conteúdos. Este arquivo faz uso do controlador modificado "zost_article", | |
9 | - o qual precisa ser adicionado a "components\com_content\controllers" para | |
10 | - que os botões de salvamento e cancelamento funcionem | |
8 | + de conteúdos | |
11 | 9 | |
12 | 10 | Variáveis definidas por padrão: |
13 | 11 | $this (ContentViewForm) |
@@ -417,16 +415,40 @@ | ||
417 | 415 | jZost.datetimepicker.setLocale("pt-BR"); |
418 | 416 | // ========================================================================= |
419 | 417 | // == Validador de formulário ============================================== |
420 | - jZost("form#adminForm").validate(); | |
418 | + jZost("form#adminForm").validate({submitHandler: function (aForm, aEvent) { | |
419 | + // O atributo submitHandler define uma função de callback que é chamada | |
420 | + // sempre que o form é validado com sucesso. Ao usar esta função, o | |
421 | + // formulário não será enviado a não ser que você faça isso manualmente, | |
422 | + // como foi feito abaixo. Caso tenhamos pressionado o botão "Aplicar", o | |
423 | + // form será enviado via Ajax com exatamente os mesmos valores | |
424 | + // informados. Caso qualquer outro botão tenha sido pressionado o envio | |
425 | + // do form será normal | |
426 | + if (jZost(aForm).find('input[name="task"]').val() == "article.apply") { | |
427 | + zostHelpers.waitForSomething(true); | |
428 | + jZost.post($(aForm).action | |
429 | + ,$(aForm).serialize() | |
430 | + ,function (aData, aTextStatus, aJqXHR) { | |
431 | + zostHelpers.waitForSomething(false); | |
432 | + }); | |
433 | + } else { | |
434 | + aForm.submit(); | |
435 | + } | |
436 | + }}); | |
421 | 437 | // ========================================================================= |
422 | 438 | }); |
423 | 439 | /* ]]> */ |
424 | -</script> | |
440 | +</script> | |
425 | 441 | <form action="<?php echo JRoute::_('index.php?option=com_content&a_id=' . (int) $this->item->id); ?>" method="post" name="adminForm" id="adminForm"> |
426 | 442 | <div class="btn-group" style="float: right; height: 35px;"> |
427 | - <button class="btn btn-primary btn-sm" style="width: 100px" type="submit" name="task" value="zost_article.save"><?php echo(JText::_("JSAVE")); ?></button> | |
428 | - <button class="btn btn-primary btn-sm" style="width: 100px" type="submit" name="task" value="zost_article.saveAndClose">Salvar e Fechar</button> | |
429 | - <button class="btn btn-primary btn-sm" style="width: 100px" type="submit" name="task" value="zost_article.cancel" formnovalidate="formnovalidate"><?php echo(JText::_("JCANCEL")); ?></button> | |
443 | +<?php | |
444 | +if (!is_null($this->item->id)) { // Apenas se estivermos editando o botão "Apply" deve aparecer | |
445 | +?> | |
446 | + <button class="btn btn-primary btn-sm" style="width: 100px" type="submit" name="task" value="article.apply">Aplicar</button> | |
447 | +<?php | |
448 | +} | |
449 | +?> | |
450 | + <button class="btn btn-primary btn-sm" style="width: 100px" type="submit" name="task" value="article.save"><?php echo(JText::_("JSAVE")); ?></button> | |
451 | + <button class="btn btn-primary btn-sm" style="width: 100px" type="submit" name="task" value="article.cancel" formnovalidate="formnovalidate"><?php echo(JText::_("JCANCEL")); ?></button> | |
430 | 452 | </div> |
431 | 453 | <ul class="nav nav-tabs" id="<?php echo($this->tab_name) ?>-tabs"> |
432 | 454 | <li class="nav-item"><a class="nav-link active small" data-toggle="tab" href="#<?php echo($this->tab_name) ?>-tab-1"><?php echo(JText::_('COM_CONTENT_ARTICLE_CONTENT')); ?></a></li> |
@@ -2,4 +2,4 @@ | ||
2 | 2 | 2. A pasta "Projetos" contém todos os projetos responsáveis por gerar o site como se conhece. Verifique os arquivos |
3 | 3 | leia-me dentro desta pasta para mais informações |
4 | 4 | 3. A pasta "Projetos\Componentes" contém o componente de exemplo Zost (com_zost) que demonstra como criar um componente Joomla, incluindo o entendimento de controllers e tasks |
5 | -4. A pasta "Projetos\Controladores" contém overrides de controladores do Joomla, pois não é possível sobrescrever controladores normalmente. Leia o arquivo leia-me.txt dentro da pasta para saber mais | |
\ No newline at end of file | ||
5 | +4. A pasta "Projetos\Sobreposições" contém overrides de controladores do Joomla, pois não é possível sobrescrever controladores normalmente. Leia o arquivo leia-me.txt dentro da pasta para saber mais | |
\ No newline at end of file |