MODx Revolution: создание ресурсов и загрузка файлов из фронтенда

Добрый день, всем читателям блога WebHow! Наконец-то я нашла отличный плагин для подсветки кода в статьях, и теперь можно заняться серьезными делами. Итак, шутки в сторону, сегодня будет суровый пост для тех, кто мечтает организовать на своем MODx-сайте доску объявлений, каталог или любой другой сервис, где посетители будут сами размещать свой контент.

создание ресурсов и загрузка файлов из фронтенда

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

Я не программист, и когда мне впервые пришлось создать доску объявлений на MODx, все что я могла — поискать готовое решение. Различных вариантов сниппета, который бы позволил публиковать ресурс с фронтенда для MODx Revolution оказалось не мало.

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

Однако, практически все сниппеты, которые мне удалось найти, были очень громоздкими: каждый TV-параметр нужно было прописывать в коде сниппета, а это меня не устраивало. Потому что для каждого вида объявлений я задумала как минимум 3 дополнительных поля, и все их прописывать в сниппет… нет, есть способ лучше и проще. Он был найден мною на англоязычной части официального форума MODx.com И если вы не очень хорошо говорите и читаете по английски или вам просто лень искать подходящий вариант из нескольких в теме, я расскажу как им пользоваться.

На эту тему я записала пошаговую видео-инструкцию. Все материалы к ней вы найдете чуть ниже проигрывателя.

Код сниппета formit2resource
<?php
$doc = $modx->getObject('modResource',array('id'=>$hook->getValue('resource_id')));
 
if (empty($doc)){
    $doc = $modx->newObject('modResource');
    $doc->set('createdby', $modx->user->get('id'));
}
else{
    $doc->set('editedby', $modx->user->get('id'));
}
 
$allFormFields = $hook->getValues();
foreach ($allFormFields as $field=>$value)
{
 
   if ($field !== 'spam' && $field !== 'resource_id'){
         $doc->set($field, $value);
    }
}

$alias = $doc->cleanAlias($fields['pagetitle']);
if($modx->getCount(modResource, array('alias'=>$alias))!= 0) {
$count = 1;
$newAlias = $alias;
while($modx->getCount(modResource, array('alias'=>$newAlias))!= 0) {
$newAlias = $alias;
$newAlias .= '-' . $count;
$count++;
}
$alias = $newAlias;
}
$doc->set('alias',$alias);

$doc->set('template', $template);
$doc->save();
 
foreach ($allFormFields as $field=>$value)
{
    if (!empty($value) && $tv = $modx->getObject('modTemplateVar', array ('name'=>$field)))
    {
        /* handles checkboxes & multiple selects elements */
        if (is_array($value)) {
            $featureInsert = array();
            while (list($featureValue, $featureItem) = each($value)) {
                $featureInsert[count($featureInsert)] = $featureItem;
            }
            $value = implode('||',$featureInsert);
        }  
        $tv->setValue($doc->get('id'), $value);
        $tv->save();
    }
}

$modx->cacheManager->refresh();
 
return true;
Код сниппета formit2file
<?php
// initialize output;
$output = true;
$counter = 1;
 
// valid extensions
$ext_array = array('jpg', 'png', 'gif', 'JPG', 'mp3');

$mydir = $modx->user->get('id'); // Path from root that user specifies
 
// create unique path for this form submission
$uploadpath = 'assets/uploads/'.$mydir.'/';
 
// get full path to unique folder
$target_path = $modx->config['base_path'] . $uploadpath;
 
// get uploaded file names:
$submittedfiles = array_keys($_FILES);
 
// loop through files
foreach ($submittedfiles as $sf) {
 
    // Get Filename and make sure its good.
    $filename = basename( $_FILES[$sf]['name'] );
 
    // Get file's extension
    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    $ext = mb_strtolower($ext); // case insensitive
 
    // is the file name empty (no file uploaded)
    if($filename != '') {
         
        // is this the right type of file?
        if(in_array($ext, $ext_array)) {
     
            // clean up file name and make unique
            $filename = $counter . '.' . $ext; 
            $filename = str_replace(' ', '_', $filename); // spaces to underscores
            $filename = date("Y-m-d_G-i-s_") . $filename; // add date & time
             
            // full path to new file
            $myTarget = $target_path . $filename;
             
            // create directory to move file into if it doesn't exist
            mkdir($target_path, 0755, true);
             
            // is the file moved to the proper folder successfully?
            if(move_uploaded_file($_FILES[$sf]['tmp_name'], $myTarget)) {
                // set a new placeholder with the new full path (if you need it in subsequent hooks)
                $myFile = $uploadpath . $filename;
                $hook->setValue($sf,$myFile);
                // set the permissions on the file
                if (!chmod($myTarget, 0644)) { /*some debug function*/ }
                 
            } else {
                // File not uploaded
                $errorMsg = 'There was a problem uploading the file.';
                $hook->addError($sf, $errorMsg);
                $output = false; // generate submission error
            }
         
        } else {
            // File type not allowed
            $errorMsg = 'Type of file not allowed.';
            $hook->addError($sf, $errorMsg);
            $output = false; // generate submission error
        }
     
    // if no file, don't error, but return blank
    } else {
        $hook->setValue($sf, '');
    }
$counter = $counter + 1;
}

return $output;

Друзья! Не забывайте подставлять в код формы ваши TV-поля и ID ваших ресурсов. Будьте внимательны, и у вас все получится.

Вызов FormIt
[[!FormIt?
&hooks=`formit2file,formit2resource,redirect`
&redirectTo=`ID страницы с сообщением`
&template=`ID шаблона объявления` ]]
Условие для вызова чанка с формой
[[!+modx.user.id:is=`0`:then=`Для размещения объявления необходима авторизация [[!Loginza? &groups=`3` &profileFields=`username,email,fullname,photo`]]`:else=`[[$form_add]]`]]
Пример кода формы

[[+fi.error.error_message]]

<form class="cartform" action="[[~[[*id]]]]" enctype="multipart/form-data" method="post"><input type="hidden" name="nospam:blank" />
<input type="hidden" name="resource_id" value="[[+fi.id]]" />
<input id="parent" type="text" name="parent" value="ID контейнера на модерацию" />
<div class="label">Название</div>
[[+fi.error.pagetitle]]

<input class="field" type="text" name="pagetitle" value="[[+fi.pagetitle]]" />
<div class="star">*</div>
<div class="label">Город</div>
[[+fi.error.city]]

<input class="field" type="text" name="city" value="[[+fi.city]]" />
<div class="star">*</div>
<center>
<h3>Подробное описание</h3>
[[+fi.error.content]]

<textarea class="textinput" cols="70" name="content" rows="10">[[+fi.content]]</textarea>

</center>
<h3>Прикрепить фотографии:</h3>
Вы можете разместить в каталоге до пяти фотографий. Допустимые форматы: .jpg, .png, .gif
<table class="addform">
<tbody>
<tr>
<td class="label">Основное фото или логотип<span class="impot">*</span></td>
<td class="input"><span class="error">[[+fi.error.img]]</span><input id="file" type="file" maxlength="100000" name="img" value="[[+fi.img]]" /></td>
</tr>
<tr>
<td class="label">Дополнительное фото (1)</td>
<td class="input"><span class="error">[[+fi.error.foto1]]</span><input id="foto1" type="file" maxlength="100000" name="foto1" value="[[+fi.foto1]]" /></td>
</tr>
<tr>
<td class="label">Дополнительное фото (2)</td>
<td class="input"><span class="error">[[+fi.error.foto2]]</span><input id="foto2" type="file" maxlength="100000" name="foto2" value="[[+fi.foto2]]" /></td>
</tr>
<tr>
<td class="label">Дополнительное фото (3)</td>
<td class="input"><span class="error">[[+fi.error.foto3]]</span><input id="foto3" type="file" maxlength="100000" name="foto3" value="[[+fi.foto3]]" /></td>
</tr>
<tr>
<td class="label">Дополнительное фото (4)</td>
<td class="input"><span class="error">[[+fi.error.foto4]]</span><input id="foto4" type="file" maxlength="100000" name="foto4" value="[[+fi.foto4]]" /></td>
</tr>
</tbody>
</table>
<input class="add-button" type="submit" value="Отправить на модерацию" />

</form>
Условие для вывода изображения

[[*img:notempty=``]]
Теперь пользователи вашего сайта могут не только размещать объявления, но и дополнять их фотографиями, как и на любой доске объявлений. Но что делать, если во время заполнения формы была допущена ошибка? Например, человек опечатался и указал неверный номер телефона, а может быть, просто захотел дополнить объявление или изменить цену на свой товар.

В следующий раз расскажу, как разрешить пользователям редактировать свои ресурсы с фронтенда сайта. А на сегодня все, надеюсь, эта статья была вам полезна.

  • Марат

    Здравствуйте Ольга! Как всегда хорошая статья, полезная! Хоть в ближайшее время пока и не планирую создать такой же, но если надумаю то буду знать куда идти. Спасибо вери мач!

    • Ольга

      Марат, спасибо, если что — всегда велкам! :)

  • Алексей

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

    • Ольга

      Алексей, захвалили так, что даже не знаю, что и ответить :) Очень приятно, спасибо вам! После таких комментариев хочется работать еще усерднее)))

  • Сергей

    Здравствуйте, Ольга!
    Подскажите, пожалуйста, как сделать так, чтобы добавляемые объявления не уходили на модерацию, а сразу публиковались?
    Спасибо!

    • Ольга

      Сергей, приветствую! Чтобы объявления сразу публиковались. вам нужно добавить форму еще один скрытый инпут:

      input type=»hidden» name=»pablished» value=»1″

      В комментариях никак не могу вставить код (надо будет это исправить), но надеюсь, понятно.

      • Сергей

        Благодарю!

      • Сергей

        Ольга, в процессе создания доски объявлений, я столкнулся с проблемой, которую не могу разрешить: если заголовки объявлений (pagetitle) одинаковые — соответственно alias ресурса не может сгенерироваться правильно — он отсутствует. Я попытался передать id ресурса в алиас, используя скрытый input, но ничего не вышло. Может быть Вы подскажите, какким образом можно уникализировать URL создаваемого ресурса, чтобы он не зависел от заголовка?

        • Сергей

          Решил вопрос создав сниппет вывода текущей даты и времени. Вызов сниппета вставил в скрытое поле.

          • Ольга

            Здорово! Я эту проблему тоже заметила, но даже не думала, как ее решить, изменяла алиасы вручную при модерации. Ваш вариант, конечно, удобнее.

  • https://mikrocxema.ru Андрей

    Просто впишите в середину кода сниппета formit2resource код, присваивающий дополнительное значение алиасу при его дубле. Алиасы примут вид:
    links.html
    links-1.html
    links-2.html и т.д.

    Код сниппета целиком:


    getObject('modResource',array('id'=>$hook->getValue('resource_id')));

    if (empty($doc)){
    $doc = $modx->newObject('modResource');
    $doc->set('createdby', $modx->user->get('id'));
    }
    else{
    $doc->set('editedby', $modx->user->get('id'));
    }

    $allFormFields = $hook->getValues();
    foreach ($allFormFields as $field=>$value)
    {

    if ($field !== 'spam' && $field !== 'resource_id'){
    $doc->set($field, $value);
    }
    }

    $alias = $doc->cleanAlias($fields['pagetitle']);
    if($modx->getCount(modResource, array('alias'=>$alias))!= 0) {
    $count = 1;
    $newAlias = $alias;
    while($modx->getCount(modResource, array('alias'=>$newAlias))!= 0) {
    $newAlias = $alias;
    $newAlias .= '-' . $count;
    $count++;
    }
    $alias = $newAlias;
    }
    $doc->set('alias',$alias);

    $doc->set('template', $template);
    $doc->save();

    foreach ($allFormFields as $field=>$value)
    {
    if (!empty($value) && $tv = $modx->getObject('modTemplateVar', array ('name'=>$field)))
    {
    /* handles checkboxes & multiple selects elements */
    if (is_array($value)) {
    $featureInsert = array();
    while (list($featureValue, $featureItem) = each($value)) {
    $featureInsert[count($featureInsert)] = $featureItem;
    }
    $value = implode('||',$featureInsert);
    }
    $tv->setValue($doc->get('id'), $value);
    $tv->save();
    }
    }

    $modx->cacheManager->refresh();

    return true;

    • Ольга

      Андрей, спасибо за дополнение! Надо будет вынести ваш код в отдельный пост.

  • https://mikrocxema.ru Андрей

    Начало кода чуток обрезало.
    Cмотрите исходник, представленный Ольгой в статье.

    • Ольга

      Добавила ваш код в пост, посмотрите, все ли верно? У меня сейчас нет возможности проверить.

      • https://mikrocxema.ru Андрей

        Ольга, да, всё верно.

  • Lu

    Здравствуйте, у меня ничего не выводит следующий код:[[!+modx.user.id:is=’0′:then=’Для размещения объявления необходима авторизация [[!Loginza? &groups=’3′ &profileFields=’username,email,fullname.photo’]]':else='[[$form_add]]’]], т.е
    [[!+modx.user.id]] работает, а вот условия вообще никак не работают, скажите пожалуйста, что не так.

    • Ольга

      Здравствуйте! Если в комментариях тот код, который вы используете на сайте, в нем ошибка — неверные кавычки.

      Попробуйте так:

      [[!+modx.user.id:is=`0`:then=`Для размещения объявления необходима авторизация [[!Loginza? &groups=`3` &profileFields=`username,email,fullname,photo`]]`:else=`[[$form_add]]`]]

      И, конечно, у вас должна быть установлена Loginza и создана отдельная группа пользователей. Ее id прописываем здесь &groups=’3′

  • Lu

    Большое спасибо, получилось

    • Ольга

      Пожалуйста :) Будут еще вопросы, пишите.

  • Lu

    Еще вот здесь загвозка: в шаблоне поставила вывод фото:

    [[*img:notempty=«]]

    на выходе выдал ошибку:

    Warning: file_get_contents(Z:/home/planetguide.ru/www/dry_skin1.jpg) [function.file-get-contents]: failed to open stream: No such file or directory in Z:\home\planetguide.ru\www\core\model\phpthumb\phpthumb.class.php on line 3210
    `>
    я не совсем разобрала вывод фото , код с видео (у меня монитор маленький), может какой то параметр не верный

    • Ольга

      У вас есть TV параметр img? Если да, проверьте тип ввода/вывода и доступность для шаблона.

  • Lu

    код в комментариях срезался [[*img:notempty=«]]

    • Ольга

      Да, WP срезает код. Сейчас добавлю условие в пост.

  • Виктор

    Здравствуйте, Ольга!

    Спасибо огромное за видеоролик и за статью. Все получилось. Были конечно сложности, но в целом все успешно.

    Осталось только несколько моментов уточнить.

    В вашем примере все объявления после модерации размещаются на одной странице. Как этого добиться?

    • Ольга

      Привет, Виктор! Я во время модерации сама переношу их в нужную категорию, а дальше с помощью getResources вывожу на одной странице.

      • Виктор

        Спасибо! Погуглю на тему возможностей getResources.

        Получается, нужно собирать все объявления в одном контейнере и как-то их выводить (только то что в теле каждой страницы объявления) в одну страницу?

        Если найдется время растолковать — буду признателен.

      • Виктор

        Немного вас еще подостаю, Ольга. :)

        Я частично разобрался с getResources. И теперь контейнер, где вложены все объявления обзавелся таким кодом:

        [[!getResources? &includeContent=`1` &showHidden=`1` &tpl=`more` &includeTVs=`1` &processTVs=`1` &sortby=`{"publishedon": "ASC"}`]]

        Но при просмотре этой страницы выводятся только заголовки этих объявлений. Само же тело не выводится. Думаю из-за того, что объявление собирается на шаблоне с использованием тв-параметров.

        Ради эксперимента я в этот контейнер положил обычную страницу, которую набил контентом вручную. Эта страница стала отображаться в контейнере как нужно, то есть все есть.

        Собственно, думаю, что вопрос и так уже ясен, но уточню: как добиться вывода информации из дочерней страницы, которая собирается на шаблоне с тв-параметрами?

        Спасибо!

        • Ольга

          Виктор, на странице контейнера TV параметры выводятся не так, как на странице ресурса. Проверьте сниппет getResources. Замените [[*имятв]] на [[+tv.имятв]]

          • Виктор

            Спасибо! Как раз нашел тоже))

            Но без вашего поста и видоса — вообще ничего не вышло бы.

          • Виктор

            Ольга, а сами вы откуда черпаете знания про мод-х?

            • Ольга

              На modx.com есть форум. если хоть немного знаете английский, очень рекомендую.
              Также есть наше русскоязычное сообщество https://community.modx-cms.ru/

              А что качается использования дополнений, то больше всего о них можно узнать тут — https://rtfm.modx.com

              • Виктор

                Сейчас поломаем вам ветку с комментами))

                Спасибо за отзывчивость! Блог у вас приятный и полезный, главное.

              • Ольга

                Спасибо, Виктор :)

      • Виктор

        В общем, нашел ответы на свои вопросы сам.)

  • Виктор

    Здравствуйте, Ольга!

    А возможно ли отправлять объявление в контейнер без последующей модерации?

    Пробовал указывать в коде где идет редирект и ссылка на темплейт
    published = 1, но не прокатило ((

    [[!FormIt?
    &hooks=`formit2file,formit2resource,redirect`
    &redirectTo=`1`
    &template=`3`
    &published=`1`
    ]]

    Возможно ли обойти модерацию?
    Спасибо!

    • Ольга

      Виктор, выше в комментариях ответ на ваш вопрос)
      Нужно в форму прописать еще одно скрытое поле
      input type=”hidden” name=”pablished” value=”1″

      • Виктор

        Спасибо!
        Что-то я решил, что мой вопрос уникальный. ) Извиняйте, что дергаю!

        • Ольга

          Ничего страшного, нужна будет помощь — обращайтесь))

  • Альбина

    Здравствуйте, Ольга. Мне очень понравился ваш урок и особенно голос) Все сразу заработало по вашему примеру, но мне понадобилось установить в поле content текстовый редактор. Кнопочки появились, но при отправке формы, текст становится сплошным( Помогите, пожалуйста, бьюсь несколько недель

    • Ольга

      Привет, Альбина! Простите, что не успела ответить раньше, участвую в марафоне, не было ни минуты.
      Если все делали по видео, у вас в форме стоит валидация content:required:stripTags. Стриптегз вырезает все теги из полей. Это нужно для безопасности, убирать не советую.

      • Альбина

        Спасибо

  • Влад

    Ольга, огромное Вам спасибо за полезный материал и прекрасную его подачу!

    Я совсем чайник в MODX, поэтому и вопрос чайницкий) Скажите пожалуйста, а как сделать так, чтобы алиасом выступал ID документа?

    • Ольга

      Влад, смотрите выше в комментарии Андрея.

  • https://pixart.by Саша

    Добрый вечер, Ольга.
    Очень понравились ваши уроки, всё замечательно, буду вашим постоянным зрителем и поклонником :-)
    У меня такой вопрос: как можно в чанке form_add добавить отправку поля [[*publishedon]] ?
    Как сделать вывод input правильным, чтобы заполнялось это поле в ресурсе.
    Дело в том, что getResources на главной странице не отбирает добавленный ресурс, т.к. у него значение publishedon пустое.
    Помогите, пожалуйста, если можете.
    Пробовал через value=»[[+fi.createdon]]» но этот вариант не работает, к сожалению.

    • Вячеслав

      Нашел такое решение. Вписать в сниппет formit2resource :
      $publishedon = date(‘Y-m-d H:i:s’);
      $doc->set(‘publishedon’,$publishedon);

      Через передачу в чанке Form_add никак не получилось.

  • zhhh

    интересует строчка в чанке formit_add

    как задать значение контейнера в самом снипете, статус публикации, отображения в меню? а не в форме?
    Получается любой зарегеный может подправить страницу, вписав ID=0,
    добавить строку input type=”hidden” name=”pablished” value=”1″,
    и получит опубликованный ресурс в корне сайта.

    • Ольга

      Можно сделать по аналогии со строчкой
      $doc = $modx->getObject('modResource',array('id'=>$hook->getValue('resource_id')));

      Только как человек «подправит» страницу?

  • Влад

    А как модифицировать данный скрипт, чтобы он работал через процессоры modx?

  • Витя

    Добрый день Ольга .
    у меня возникла проблема , всё отправляет всё хорошо но он не предает html , передаёт только текст . может кто то знает как решить а то уже часа 4 в гугле роюсь пока не нашел ничего вразумительного ) даже эти теги не передаёт .

    • Ольга

      Добрый день! Все верно, форма и не должна html передавать, это не безопасно. Все теги вырезает FormIt, потому что в параметрах вывода для текстовых полей стоит striptags. Уберете — будет передавать html, но я не советую этого делать.

  • Витя

    Спасибо ) я как понял это идёт в вызове formit
    ,но у меня в вызове formit нету striptags да и вобще я не нашёл . если не сложно подскажите где именно striptags убрать . в пораметрах formit тоже не нешел(

  • Витя

    Спасибо Ольга я нашел и сделал )
    strptags идёт по умолчанию по тому надо ставить свойство &validate=`content:allowTags`.
    И сразу назрел вопрос можно же через плагины или обработчик убрать вредоносные теги типа script и тд … не подскажете где искать информацию об этом , чтоб фильтровался текст

    • Ольга

      Витя, у себя на проектах вырезаю все теги, над другими способами даже не задумывалась. Мануалы по FormIt и валидации на эту тему молчат?

    • https://prodvigarium.ru Виктор

      Святой Вы человек =) спасибо!

  • Витя

    Добрый день Ольга нет в документации formit очень мало и там нет вырезания тегов , это надо делать либо в снипете обработчике либо в плгине , как на php это сделать я знаю но язык модх я пока не освоил . Не находили ещё нормальную документация по написанию снипитов или плагинов ? Если поделитесь буду очень признателен)

  • https://localhost Andy

    Здравствуйте!
    У меня такой вопрос:
    Как дать возможность пользователю самому выбирать куда будет публиковаться ресурс!?
    Сейчас в Вашем примере ресурс попадает в папку «на модерации», для доски объявлений, я считаю, выбор категории ну просто необходим!
    Гуглил по этому поводу но ничего подобного не нашел, с MODX меньше вашего работаю, поэтому самому написать подобный снипет просто знаний не хватает…

  • Борис

    Отличный урок, все получилось, спасибо за помощь. Единственный вопрос- как сделать, что бы ресурсы сразу публиковались, без модерации?
    С уважением, Борис.

    • Борис

      перечитал комментарии выше, уже тысячу раз спрашивали, извиняюсь за беспокойство)

      • Ольга

        Да вопрос популярный :)

  • https://smartflashki.ru Андрей

    Здравствуйте. Статья очень помогла. А можно ли ограничить размер закачиваемого файла?

    • Ольга

      Здравствуйте, Андрей! Делайте инпут «parent» в форме открытым в виде списка или чекбокса.

      • https://smartflashki.ru Андрей

        Туплю. Можно разжевать немного?

  • Александр

    Приветствую. Ольга, не могли бы вы подсказать, почему адрес картинки выводится вида 001.jpg||image/jpeg||/var/tmp/phpp8534a||0||170122 ? Я так понимаю, что она должна сохранятся в папку assets/uploads? Права стоят 777 на эти папки, но картинка туда не загружается

  • https://rudniy.tk Дмитрий

    Здравствуйте! Что-то уже который день бьюсь, а не получается совсем. Просматраиваю всё что только можно. Наткнулся на одну вещь, скажите пожалуйста, вот разместили мы такую строку: Потом при переходе к добавлению ресурса я смотрю исходный код, и вот что получается на выходе: Как вы заметили [[fi.id]] ничего не вернул. Это нормально? (А то я сомневаюсь в этом)

    • Olga

      Дмитрий! В комментариях теги не отображаются, поэтому я не поняла, в чем именно у вас проблема. Но если писать [[+fi.id]] то возможно все получится.

      • https://rudniy.tk Дмитрий

        Нашёл ошибку, опечатался при наборе параметра &hooks (набрал: &hoocks). Большое спасибо за ваш блог и статьи которые вы публикуете. С интересом ждём новых публикаций.

        • Ольга

          Как обычно, дьявол в мелочах =)

  • Андрей

    Здравствуйте, Ольга.
    У меня вот какая проблема возникла. Немного может быть не по теме, но я думаю, что-то общее есть.
    Я создал личный кабинет, используя Login. А вот как на странице редактирования профиля заставить загружать аватарку, не могу понять. Мне посоветовали использовать пакет avatar, но не пойму как его прилепить к форме редактирования профиля.
    Подскажите, может чего знаете, заранее спасибо…

  • Саша

    Ольга, у Вас прекрасный голос.

  • https://поканету Михаил

    Здравствуйте! ТОже изучаю модх… Вопрос такой… :
    Мне нужно сделать чтобы пользователь мог загружать в свой профиль аватарки…
    На форумах искал, на какихто сайтах ни где нет нормального мануала как это сделать, везде либо недоработанное или вооще не понятно как слеплено…
    Не могли бы вы объяснить или показать как всё таки сделать загрудку аватарок пользователями с фронтенда в свой профиль????
    Буду очень благодарен, за ранее Спамибо.

  • Евгений

    Ольга, здравствуйте! Посмотрел оба Ваших видео и не нашел в видео одного из ключевых моментов. Добавление, модерация и пр. — всё работает замечательно, но как на счёт просмотра файлов, которые загрузил пользователь, при модерации? Если следовать этому методу, то мы проверяем только текстовые поля, которые заполнил пользователь, не обращая внимания на загруженные им картинки?

    Так же, я хотел бы уточнить, что значит «пользователь будет думать, что картинка куда-то делась и загружать новую, засоряя нам сервер» — при данном подходе (описанном выше), каждая загруженная картинка будет представляться новым файлом? Система в итоге будет сама удалять разнообразный мусор, непременно образующийся в результате работы подобного механизма или эта задача возлагается на администраторов? Если объявление не прошло модерацию и мы удалили его — будет ли вместе с ним удаляться загруженная картинка, или это так же необходимо делать вручную?

    Спасибо.

  • Анна

    Изображения в ТВ параметрах сохраняются в таком виде img.jpg||image/png||/tmp/phpfPiCkl||0||283 . Подскажите,пожалуйста в чем проблема?

  • Анна

    Ошибку нашла, все работает. Спасибо большое!!!!

  • Макс

    Очень приятный голос

  • K.

    Спасибо.

  • Вадим Ерёменко

    Спасибо, очень пригодилась информация. Сделал возможность добавления без модерации. Только столкнулся с такой проблемой — статья добавляется, к ней прописывается url автоматом (это видно в админке). Но для того чтобы появилась ссылка на статью во фронтенде, нужно очистить кеш в админке. Без очистки на статью зайти не возможно. Кто нибудь сталкивался с подобным? Как можно решить эту проблему? Или может можно пользователям сделать кнопку для очистки кеша?

  • https://plus.google.com/102589505465691138854 Sergiy Yakymenko

    Проверьте, что Вы отправляете кэшированным. Откройте шаблоны, посмотрите и, там где надо, поставьте «!».

  • Александр

    Очень хороший материал, спасибо!

  • https://plus.google.com/116951479015366871204 Сергей Зиненко

    Подскажите, а как можно вывести все ресурсы, созданные пользователем? Имеется ввиду — для управления ими в личном кабинете.
    и чуть не забыл… — очень полезно и познавательно!!! спасибо огромное!!

  • https://plus.google.com/102589505465691138854 Sergiy Yakymenko

    [[getResources:default=`Материалы на найдены`?
    &tpl=`list_tpl`
    &parents=`27`
    &includeTVs=`1`
    &processTVs=`1`
    &hideContainers=`1`
    &limit=`20`
    &where=`{"createdby":8}`
    ]]

    Это как пример. Здесь главное место — &where=`{«createdby»:8}`. Должно получиться. 8 — это id пользователя.

  • Виктор

    Позволяет создавать только одно объявление на одного юзера?

  • https://facebook.com/profile.php?id=1103888461 Сергей Кутковец

    Приветвтую Вас!
    Скажите, как можно редиректиться из formIt на только что созданный ресурс ?

  • https://facebook.com/profile.php?id=1103888461 Сергей Кутковец

    нет, можно создавать сколько угодно

  • https://www.facebook.com/app_scoped_user_id/1088080954537662/ Roman Sozinov

    Вадим, я тоже долго не мог отменить кеширование урлов. Надо идти в Настройки системы > Фильтр по разделу > Кеширование. Там ставим «Нет» в пункте Разрешить кеширование карты алиас… (Если включено, все URI ресурсов кешируются в контекст. Включайте для небольших сайтов и отключайте для больших сайтов для увеличения производительности.)