17.06.2015

В стандартном для MODx Evolution сниппете eFrom отсутствует возможность указать вместо ID или имени чанка файл, где располагается внешний вид формы, письма преходящего при отправке, сообщения выводящего после отправки и т.д.

Архитектура MODx, особенно Evolution грешит хранением верстки и кода в БД, а не файлах. Разработчики сниппетов обычно предлагают «костыли», которые частично обходят этот недостаток, но создатель eForm этого не сделал. Сделаю это аккуратно за него, взяв за основу подход разработчиков сниппета Ditto, который так же является стандартом.

В Ditto предлагается в параметрах сниппета, где мы хотим использовать не данные из БД, а из файла, в начале писать @FILE:, потом путь к файлу где хранится шаблон. Что бы данный механизм заработал у вас в eForm, откорректируйте функцию efLoadTemplate в файле /assets/snippets/efrom/eform.inc.php.

Модернизированная функция efLoadTemplate

function efLoadTemplate($key) {
    global $modx;
    // Комментируем или удаляем, т.к. ссылка на файл может быть > 50 символов
    //if( strlen($key)>50 ) return $key;
    $tpl = false;

    // Добавляем вариант чтения из файла, в противном случае, как и было до нас
    if( strpos( $key, '@FILE:' ) !== false ) {
        $path = $_SERVER['DOCUMENT_ROOT'] . str_replace( '@FILE:', '', $key );

        $tpl = file_get_contents( $path );
    } else {
        if( is_numeric($key) ) { //get from document id
            //try unpublished docs first
            $tpl = ( $doc=$modx->getDocument($key,'content','all') )? $doc['content'] :false;

        } elseif( $key ){
            $tpl = ( $doc=$modx->getChunk($key) )? $doc : false;
            //try snippet if chunk is not found
            if(!$tpl) $tpl = ( $doc=$modx->runSnippet($key) )? $doc : false;
        }
    }

    $tpl = $modx->mergeDocumentContent($tpl);
    $tpl = $modx->mergeSettingsContent($tpl);
    $tpl = $modx->mergeChunkContent($tpl);

    if(strpos($tpl,'[[')!==false) $tpl = str_replace(array('[[',']]'),array('[[',']]'),$tpl);

    $tpl = $modx->evalSnippets($tpl);

    return $tpl;
}

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

[[eForm?
	&formid=`feedback`
	&tpl=`@FILE:/assets/templates/site/chunks/eform/feeback.html`
	&to=`address@yoursite.ru`
	&report=`@FILE:/assets/templates/site/chunks/eform/feedback-report.html`
	&thankyou=`@FILE:/assets/templates/site/chunks/eform/feedaback-thank.html`
	&subject=`Письмо с сайта`
]]

Обратите внимание, что я модернизировал функцию eForm версии 1.4.6. В других версиях убедитесь, что полная замена функции на мой вариант не повредит всему сниппету.