Forum for discussing general topics related to Couch.
7 posts Page 1 of 1
Доброго вечера всем кто читает. Поговорим про Couch, поделимся наболевшим и т.д. :)

nu-rasskazivay-davay.png
Ну, рассказывай давай!
nu-rasskazivay-davay.png (432.68 KiB) Viewed 4120 times


Самое главное - адекватный русский перевод админки
RU.zip
(5.12 KiB) Downloaded 329 times
Выкладываю адекватную локализацию кнопки для плагина дублирования страниц (viewtopic.php?f=8&t=11545) а также алерта.

Code: Select all
    // А вот так работает для всех мастер-страниц
    $cfg['tpls'] = $_GET['o'];

    // Button
    $cfg['btn_text'] = 'Copy to New';
    $cfg['btn_desc'] = 'Copies the current page into a new page';

    // Перевод кнопки
    if ( 'RU' === K_ADMIN_LANG ){
        $cfg['btn_text'] = 'Дублировать';
        $cfg['btn_desc'] = 'Клонирует текущую запись в новую';
    };


Всё вместе:
дубликат.zip
Перепакованный плагин
(74.53 KiB) Downloaded 334 times


Обновил первый пост с лучшим файлом перевода админки от профи переводчика (когда-то я закончил ин.яз 8-) )
# Тема Ryazania для CouchCMS

(Бесплатная (урезанная) версия темы "для себя", можете ставить на персональные странички. Если ставите для клиентов, то есть небольшая денежка за лицензию на домен)

Наша цель — качественно новый опыт работы; это тщательная компиляция и собрание модов, твиков и пр. помощников для ускорения разработки. Если чего-то нехватает, пишем %) Некоторые твики уже интегрированы в файлы темы. Гораздо больше твиков можно включать-отключать по желанию. Есть 2 типа папок:

  • -enabled
  • -available

Например, если вы переместите папку с твиком из /tweaks-available/ в /tweaks-enabled/ то он заработает. Перенесите обратно в /tweaks-available/ и твик отключён. Так же и всё остальное работает - теги (tags), переменные (vars), плагины (addons) и т.д.

Список того что есть в теме (а там прилично) читай на гитхабе с картинками https://github.com/trendoman/ryazania-free/tree/main

Буду рад обсудить.

Attachments

Был однажды такой топик viewtopic.php?f=8&t=13370 жутко сложный для мэстной публики :) Жаль, никто не заинтересовался по-серьезному, а то бы поиграли)) Ну, с кем не бывает 8-)

Короче, нужны серьезные рабочие инструменты чтобы заглянуть в то, что происходит внутри анонимных функций, которые превращаются почти в классы. Попробую запостить еще пример, чтобы проиллюстрировать взаимодействие двух методов между собой.

Внутренний метод может быть вызван снаружи и наоборот, внешний метод может вызывать внутренний. Способ управлять тем куда сохраняются данные - область (scope) "parent".

Code: Select all
<cms:func 'Viktor'>
    <cms:put var=k_func value='[]' is_json='1' scope='global'/><!-- "construct" global object -->
    <cms:get k_func into='this' scope='global' into_scope='local'/><!-- work locally -->

    <cms:set this.Name = k_func />
    <cms:set this.events = '[]' is_json='1' />


    <cms:func _into='this.is_object' obj='' _scope='parent'><cms:ignore>use call_ex to trim()!!</cms:ignore>
        <cms:if "<cms:is_array obj />" && obj.Name ne ''>1<cms:else />0</cms:if>
    </cms:func>

    <cms:func _into='this.is_callable' obj='' _scope='parent'><cms:ignore>use call_ex to trim()!!</cms:ignore>
        <cms:if "<cms:is_array obj />" && "<cms:is_array obj.code />"&& "<cms:is_array obj.params />">1<cms:else />0</cms:if>
    </cms:func>

    <cms:func _into='this.instance_of' obj='' handle='' _scope='parent'><cms:ignore>use call_ex to trim()!!</cms:ignore>
        <cms:if "<cms:is_array obj />" && "<cms:is_array obj.events />" && obj.Name eq handle>1<cms:else />0</cms:if>
    </cms:func>


    <cms:func _into='this.set' name='' value='' handle=this.Name _scope='parent'>
        <cms:ignore><!-- Метод "set" упрощает запись свойств, успешно обновляет глобальный и родительский объекты --></cms:ignore>
        <cms:get 'this' into='_parent_this_' into_scope='local'/>
        <cms:get handle into='this' scope='global' into_scope='parent'/>
        <cms:if "<cms:call_ex this.instance_of _parent_this_ handle />"><cms:set this=_parent_this_ scope='parent' /></cms:if>

        <cms:put var="this.<cms:show name case='title' />" value=value scope='parent'/>
        <cms:if this.Debug>
            <cms:set this.events. = "<cms:concat this.Name '::set' "(<cms:show k_named_args as_json='1'/>)"/>" scope='parent'/>
        </cms:if>
        <cms:put var=handle value=this scope='parent' /><cms:ignore>при внешнем вызове пишем в глобалку</cms:ignore>
        <cms:put var='this' value=this scope='parent' /><cms:ignore>при внутреннем вызове пишем в предыдущий "this"</cms:ignore>
    </cms:func>


    <cms:func _into='this.do_something' self='' handle=this.Name _scope='parent'>
        <cms:get handle into='this' scope='global' into_scope='parent'/>
        <cms:if "<cms:call_ex this.instance_of self handle />"><cms:set this=self scope='parent' /></cms:if>
        <cms:if this.Debug>
            <cms:set _named_args = '[]' is_json='1' scope='local'/>
            <cms:each k_named_args><cms:if key ne 'self'><cms:set _named_args=item scope='parent'/></cms:if></cms:each>
            <cms:set this.events. = "<cms:concat this.Name '::do_something' "(<cms:show _named_args as_json='1'/>)"/>" scope='parent'/>
        </cms:if>
         <cms:if k_named_args.money gt '0'>
            <cms:call this.set name='spent' value=k_named_args.money /><cms:ignore>внуренний вызов успешно обновляет указатель "this"</cms:ignore>
            <cms:call this.set name='has' value='0' />
        </cms:if>
        <cms:put handle value=this scope='parent' />
    </cms:func>

    <cms:put this.Name value=this scope='global'/><cms:ignore><!-- Помещает массив в глобальную область видимости --></cms:ignore>
<cms:hide>
</cms:hide>

</cms:func>


Тут только 2 важных метода, среди всего набора — "do_something" (что-нибудь сделай) и "set" (запиши).
Вызов Виктора создаёт его в глобальном пространстве как массив, у которого (как минимум) есть свойство Имя.

Code: Select all
<cms:test ignore='0'>

    <cms:call 'Viktor'/>
    <cms:call Viktor.set name='debug' value='1' />
    <cms:call Viktor.do_something />
    <cms:call Viktor.do_something money='20' />
    <cms:call Viktor.do_something self='играть!' ili='не играть!' />
    <cms:call 'broc' Viktor />

</cms:test>

Вызовем Виктора, поставим ему флажок отладки и отправим что-нибудь сделать. Потом (поразмыслив) отправим его на дело с 20 деньга. Ну и посмотрим что получилось в итоге.

better-broc.png
better-broc.png (28.29 KiB) Viewed 4021 times


Используется инструмент выводящий в консоль нужные значения. Поделюсь, кому надо.
Думаю делать админку на 2-х языках. Скорее всего, придется писать JS для смены названий-описаний полей. А для больших текстов имеет смысл сразу грузить их в нужном языке в админ-панели. Пример кода:

Code: Select all
<cms:config_form_view>

    <cms:field 'newpage_infodoc' order='-1' label='&nbsp;' >
        <cms:if k_cur_form_mode eq 'create'>
            <cms:set heading_ru = 'Информация' />
            <cms:set pagename_ru = 'newpage_infodoc_ru' />
            <cms:show_info heading="<cms:get "heading_<cms:show k__admin_lang />" default='Infodoc'/>">
                <cms:embed "<cms:show k__template_name_dashes />/_infodocs/<cms:get "pagename_<cms:show k__admin_lang />" default='newpage_infodoc'/>.html"/>
            </cms:show_info>
        </cms:if>
    </cms:field>

</cms:config_form_view>


Используется кастомная системная переменная k__admin_lang, которой поделюсь по запросу.
А вот так можно скинуть папку с темой в корень сайта. Меня лично заколебало лазить в тему в глубине системной папки, теперь она в корне и редактировать удобнее. :)

Code: Select all
// 26.
// If the admin-panel uses a custom theme, set the following to the folder-name of the theme.
// Theme folder is expected to be within the 'couch/theme' folder. No leading or trailing slashes please.
//define( 'K_ADMIN_THEME', 'sample' );
define( 'K_ADMIN_THEME', 'ryazania' );
define( 'K_THEME_NAME', trim( K_ADMIN_THEME, " /\\" ) );
define( 'K_THEME_DIR', dirname(K_COUCH_DIR) . '/' . K_ADMIN_THEME . '/' );
if( !defined('K_SITE_URL') ) die( 'Please define your website\'s URL in config.php' );
define( 'K_THEME_URL', K_SITE_URL . K_ADMIN_THEME . '/' );


P.S. Да и кстати, если тема не внутри /couch то можно искать по содержанию файлов отдельно в теме, отдельно в системе и отдельно в сниппет-кодах.
В теме Ryazania добавлена возможность полной локализации админки, для этого автоматически выбирается файл с дополнительными переводами, напр.:
/ryazania/langs/EN.php (базовая админка)
/ryazania/langs/RU.php (базовая админка)
/ryazania/langs/RU_ex.php (всё для проекта)

Что интересно, оказывается удобно сразу писать всё с тегом, напр.:
Code: Select all
label="<cms:localize 'Select one group of parameters' />"

обнова: а вот нифига. Лучше писать как есть и локализовать через тему:
Code: Select all
label='I`m testing localization of labels'
<cms:localize k_field_label />


А тем более если так писать то совершенно необязательно повторно копировать всю строку в EN_ex - не надо творить глупостей 8-) потому что простая модификация тега cms:localize вернет сам термин если ключ не найдется. А ключ может быть любой длины - хоть мегабайт текста :!:

Note: It is no problem for a string to become very large. PHP imposes no boundary on the size of a string; the only limit is the available memory of the computer on which PHP is running.


lang-btn-localization.gif
100% локализация
lang-btn-localization.gif (628.95 KiB) Viewed 3846 times


П.С. Добавил экспорт всех непереведенных значений в файл в привычном формате ($t['']='';).
7 posts Page 1 of 1