Blok z komponenty se nevkládá kam má

theacastus
Člen | 81
+
0
-

Zdravím,

mám formulářovou komponentu a speciální šablonu pro něj

{form createFTPUserForm class => 'form-horizontal input-group-spacing'}

    <div class="form-errors" n:if="$form->hasErrors()">
            <p class="text-danger" n:foreach="$form->errors as $error"><strong>{$error}</strong></p>
    </div>

    <div class="input-group">
        {label tarif class => 'input-group-addon btn-addon-primary tarif-select' /}
        {input tarif class => 'form-control'}
        <span class="help-block"></span>
    </div>
    <div class="text-info">Volných FTP účtů: <span id="ftp-free" class="db-count-num"></span></div>

    <div class="input-group">
        {label user class => 'input-group-addon btn-addon-primary' /}
        <span class="input-group-addon btn-addon-default">{$userPrefix}_</span>
        {input user class => 'form-control'}
        <span class="help-block"></span>
    </div>

    <div class="input-group">
        {label password class => 'input-group-addon btn-addon-primary' /}
        {input password class => 'form-control'}
        <span class="help-block"></span>
    </div>

    <div class="input-group">
        {label passwordVerify class => 'input-group-addon btn-addon-primary' /}
        {input passwordVerify class => 'form-control'}
        <span class="help-block"></span>
    </div>

    <div class="input-group">
        {label dir class => 'input-group-addon btn-addon-primary' /}
        {input dir class => 'form-control'}
        <span class="help-block"></span>
    </div>

    <div class="input-group pull-right">
        {input submit class => 'btn btn-success'}
    </div>

{/form}

{block additional_scripts}
    <script>
        var limits = [];
        {foreach $packageLimits as $key => $limit}
            limits[{$key}] = {$limit['free_ftps']};
        {/foreach}
    </script>
    <script n:syntax="off">
        function setCurrentLimit()
        {
            $('#ftp-free').text(limits[$('.tarif-select').val()]);
        }

        window.onload = setCurrentLimit();

        $('.tarif-select').on('change', setCurrentLimit());
    </script>
{/block}

A potřebuji aby blok additonal_scripts se vložil do @layout.latte, nakonec kam má:

.
.
.
						<div class="content-wrap">
                            {include content}
                        </div>
                    </div>
                </div>
            </div>
        {else}
            {include content}
        {/if}

        {block scripts}
            <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
            <script src="https://nette.github.io/resources/js/netteForms.min.js"></script>
            <script src="{$basePath}/js/nette.ajax.js"></script>
            <script src="{$basePath}/js/confirm.ajax.js"></script>
            <script src="{$basePath}/js/bootstrap.min.js"></script>
            <script src="{$basePath}/js/particles.min.js"></script>
            <script src="{$basePath}/js/main.js"></script>
            <script>
                $(function () {
                    $.nette.ext('init').linkSelector = 'a[data-ajax]';
                    $.nette.ext('init').formSelector = 'form[data-ajax]';
                    $.nette.init();
                });
            </script>
        {/block}
        {ifset additional_scripts}
            {include additional_scripts}
        {/ifset}
    </body>
</html>

Avšak blok je vložen hned za formulář jak je definováno v šabloně a tam ještě není načtené jQuery atp. takže JS část spadne :-/

Nevíte někdo čím by to mohlo být ? Je možné že layout nezná daný blok, když je v komponentě a proto jej vykreslí rovnou na místě?

Díky

David Matějka
Moderator | 6445
+
+1
-

Je možné že layout nezná daný blok, když je v komponentě a proto jej vykreslí rovnou na místě?

ano, presne tak. sablony komponenty jsou zcela oddelene a nevedi nic o sablone presenteru (a tedy ani o layoutu)

theacastus
Člen | 81
+
0
-

David Matějka napsal(a):

Je možné že layout nezná daný blok, když je v komponentě a proto jej vykreslí rovnou na místě?

ano, presne tak. sablony komponenty jsou zcela oddelene a nevedi nic o sablone presenteru (a tedy ani o layoutu)

A jak to tedy vyřešit ?

Musím si dát blok se scripty místo do komponenty do každého templatu presenteru kde chci komponentu použít? Nešlo by to nějak lépe ?

Gappa
Nette Blogger | 209
+
+2
-

Já to řeším tak, že si jednotlivé scripty vkládám do „stack“, který danou anonymní funkci buď ihned spustí, nebo jen uloží do pole a spustí, jakmile vím, že jsou načtené potřebné knihovny.

Inspiroval jsem se v GA/Nittro:

Takže se pak můžou knihovny načítat asynchronně a js kód může být u komponenty :)