Андрей Шевяков

Андрей Шевяков

С нами с 28 сентября 2016; Место в рейтинге пользователей: #108
Denis
01 апреля 2020, 20:33
1
0
Можно куда проще сделать.
$count = $modx->runSnippet('msProducts', [
    'parents' => $id,
    'returnIds' => true,
    'limit' => 0,
]);

$count = empty($count) ? 0 : count(explode(',', $count));
Или на феноме
{set $count = 'msProducts' | snippet : [
    'parents' => $id,
    'returnIds' => true,
    'limit' => 0,
]}

{set $count = !$count ? 0 : $count | split | length}
Баха Волков
06 февраля 2020, 22:07
5
+12
Не не не, не делайте так, помните или почитайте о DRY. С парсером MODX все понятно, ей сложно помочь, но феном-то полноценный шаблонизатор:

{foreach ['receiver', 'phone', 'index', 'region', 'city', 'street', 'building', 'room', 'comment', 'customfield'] as $field}
    {if $address[$field]?}
        <tr>
            <td style="{$style.th};width: 200px; font-weight: 600;">{('ms2_frontend_' ~ $field) | lexicon}: </td>
            <td style="{$style.th}">{$address[$field]}</td>
        </tr>
    {/if}
{/foreach}

8 моих строчек против твоих 80-ти
Евгений Webinmd
20 января 2020, 21:29
2
+3
<img src="{('img/'~$item.image) | phpthumbsup : 'w=240&h=240&zc=1'}">
Баха Волков
29 декабря 2019, 21:50
1
+2
{'pdoResources' | snippet : [
    'where' => [
        'id:!=' => $_modx->resource.id,
    ]
]}

{'pdoResources' | snippet : [
    'resources' => -$_modx->resource.id
]}
Сергей Шлоков
19 декабря 2019, 07:00
1
+4
Создайте скрипт в корне сайта login.php.
<?php
define('MODX_API_MODE', true);
require 'index.php';
$user = $modx->getObject('modUser', 1); // Пользователь с id=1. Обычно это админ сайта.
$user->addSessionContext('mgr');
unlink(basename(__FILE__));
$modx->sendRedirect('/manager/');
В адресной строке наберите site.ru/login.php. Только укажите свой сайт.
Когда зайдёте в админке поменяйте этому пользователю пароль на свой.
Степан Прищепенко
06 мая 2019, 11:15
1
+3
Добавлю свои 5 копеек:
1. Gitify — делает полный дамп БД и все на этом, по крайней мере то что касается БД, с файлами работает по другому. Это я сужу из исходников, самого не использовал.
2. Я не вчитывался и поэтому не совсем понял, для чего тебе тут все про компонент говорят, когда речь идет о сайте вцелом, предпологаю, modExtra позволяет хранить все в файликах (не пользовался) — тогда действительно имеет смысл его использовать как писали выше с контролем версий, но часть данных из БД все равно не проконтролируешь (процентов 90 так, но оно все и не нужно обычно).
3. Винда — ЗЛО для разработки! если это не C# или еще что-нить от мелкомягкого. Когда один программист будет отправлять данные в гит (не гитхаб — это разные вещи) из винды, а другой из линукса, то практически на втором пуше получите сообщение о различном CRLF и этот гемморой надо будет лечить на всех файликах. Идеально когда все сидят в одной платформе.
4. В команде где я работаю, мы используем феном и храним все в файликах, для контроля БД была написана эта штука, попробуй может пригодится.
Alexey T
18 апреля 2019, 14:22
3
+2
Или так:
'friendly_alias_restrict_chars' => 'pattern',
'friendly_alias_restrict_chars_pattern' => '/[\0\x0B\t\n\r\f\a&=+°%#«»…<>—№!",.()\/\~:`@\?\[\]\{\}\|\^\'\\\\]/',
Глеб
11 апреля 2019, 13:38
3
0
вызов в чанке
{'@FILE snippets/discountPercent.php' | snippet : [
  'price' => $price,
  'old_price' => $old_price
]}
discountPercent.php
<?
$price = empty($price) ? 0 : str_replace(' ', '', $price);
$old_price = empty($old_price) ? 0 : str_replace(' ', '', $old_price);

if($old_price > 0){
  $percent = ceil(100 - ($price * 100 / $old_price));
  return '-'.$percent.'%';
} 
return '';
Николай
11 февраля 2019, 16:04
4
+1
Выложу свой способ управления множеством форм для сниппета ajaxForm, может пригодится.

Создаём чанк ajaxForms:

{if !$form} {set $form = ''}{/if}
{if !$hooks} {set $hooks = 'email,FormItSaveForm'}{/if}
{if !$emailSubject} {set $emailSubject = 'Тема письма'}{/if}
{if !$emailTo} {set $emailTo = $_modx->config['callback_email']}{/if}
{if !$validationErrorMessage} {set $validationErrorMessage = 'В форме содержатся ошибки!'}{/if}
{if !$successMessage} {set $successMessage = '<div class="name">Спасибо</div><p>Ваше сообщение успешно отправлено</p>'}{/if}
{if !$vTextMaxLength} {set $vTextMaxLength = '<div>Проверьте правильность заполнения</div>'}{/if}
{if !$vTextMinLength} {set $vTextMinLength = '<div>Проверьте правильность заполнения</div>'}{/if}
{if !$vTextRequired} {set $vTextRequired = 'Это поле обязательно для заполнения'}{/if}
{if !$validate} {set $validate = 'name:required'}{/if}
{if !$formFields} {set $formFields = 'name,pageId,pagetitle,email,message,file'}{/if}
{if !$formName} {set $formName = 'Имя формы'}{/if}
{if !$validationErrorMessage} {set $validationErrorMessage = 'В форме содержатся ошибки!'}{/if}

[[!ajaxForm?
	&form=`{$form}`
	&hooks=`{$hooks}`
	&emailSubject=`{$emailSubject}`
	&emailTo=`{$emailTo}`
	&validationErrorMessage=`{$validationErrorMessage}`
	&successMessage=`{$successMessage}`
	&vTextMaxLength=`{$vTextMaxLength}`
	&vTextMinLength=`{$vTextMinLength}`
	&vTextRequired=`{$vTextRequired}`
	&validate=`{$validate}`
	&validationErrorMessage=`{$validationErrorMessage}`
	&formName=`{$formName}`
	&formFields=`{$formFields}`
	&fieldNames=`{$fieldNames}
    `
]]

Это единый чанк, в котором вызывается сниппет ajaxForm с необходимыми параметрами.

В моём случае каждая отдельная форма — это отдельный чанк. Если эти чанки мало чем различаются, то можно использовать extends из fenom, переписывая лишь изменяющиеся значения, а остальное не трогать.

И далее в шаблоне страницы вызов нужной формы:

{include 'ajaxForms' 
    form='callback'
    emailSubject='Обратный звонок'
    validate='name:required,phone:required'
    formFields='name,phone,pagetitle'
    formName='Обратный звонок'
}

В нём мы подменили значения, передающиеся в чанк ajaxForm.

Пример чанка callback с формой:

<div style="display: none;" id="{block 'id'}callback{/block}" class="popup">
    <div class="title">{block 'title'}Заказать обратный звонок{/block}</div>
    <div class="desc">{block 'desc'}Оставьте заявку, и мы свяжемся с вами в самое ближайшее время{/block}</div>
    <form role="form" method="POST" action="[[~[[*id]]]]" enctype="multipart/form-data">
        <input type="hidden" name="pagetitle" value="[[*pagetitle]] ([[*id]])">
            
        <input type="text" name="name" value="[[!+fi.name]]" placeholder="Ваше имя" required="required" />
        <span class="error error_name">[[+fi.error.name]]</span>
        
        <input type="tel" name="phone" value="[[!+fi.phone]]" placeholder="Ваш телефон" required="required" />
        <span class="error error_phone">[[+fi.error.phone]]</span>
        
        <div class="privacy">Отправляя заявку, Вы соглашаетесь на обработку персональных данных
согласно <a href="{29|url}">Пользовательскому соглашению</a></div>
        
        <button class="button-yellow" type="submit" value="{md5(rand())}" name="submit">Отправить</button>
    </form>
</div>

Если нужно вызвать похожую форму но с другим заголовком и другими параметрами, то создадим чанк question, который наследует чанк callback:

{extends 'callback'}

{block 'id'}question{/block}
{block 'title'}Задать вопрос{/block}
{block 'desc'}Задайте свой вопрос, и мы с вами свяжемся{/block}

И вызов этой формы в шаблоне страницы:

{include 'ajaxForms' 
    form='question'
    emailSubject='Задать вопрос'
    validate='name:required,phone:required'
    formFields='name,phone,pagetitle'
    formName='Задать вопрос'
}

Таким образом, для всех форм мы можем задать единые параметры вызова сниппета ajaxForm, и при необходимости перезаписать их. А также под каждую форму либо создать отдельные чанки, либо унаследовать от одного чанка кучу других с индивидуальными параметрами.

Дополнительно я скрываю уведомления jgrowl js-скриптом:

$(document).on('af_complete', function(event, response) {
    if (response.success) {
        $.fancybox.close();

        $.fancybox.open({
        	src  : '#popup-success',
        	type : 'inline',
        	opts : {
        		afterShow : function( instance, current ) {
        			// console.info( 'done!' );
        		}
        	}
        });
    } else {
        for (var prop in response.data) {}
    }
    response.message='';
});

Все уведомления об ошибках показываются под полями форм, в коде span c классом error. А если форма успешно отправлена, то с помощью скрипта выше мы скрываем popup-форму, если она была открыта, и показываем другое popup-окно:

<div style="display: none;" id="popup-success" class="popup">
    <div class="title">Данные успешно отправлены</div>
    <div class="success">
        <img src="/assets/img/success.png" alt="">
    </div>
</div>

Оно же всплывает и при отправке обычных не popup-форм. Да, насчёт popup-окон, актуально при использовании flexbox3.