Как конвертировать текст с новыми строками в новые строки JavaScript с помощью Smarty

У меня есть шаблон, который использует Smart в модуле SugarCRM, который я создаю.

Рассматриваемый ниже умный код в основном перебирает массив PHP, вызывая функцию JavaScript для каждого элемента массива …

{foreach from=$TASKS key=key item=task}
add_task_row("{$task.task_id}","{$ID}","{$task.name}","{$task.description}","{$task.status}","{$task.priority}","{$task.type}","{$task.sort_order}","{$task.heading}");
{/foreach}

А вот функция JavaScript, показанная выше …

function add_task_row(taskid,projectid,name,description,status,priority,type,sort,heading){

var ii = document.getElementById("project_tasks");
var num = document.getElementById("tasks_count").value;

// If TaskID is EMPTY, then assign it a new one from the row count
var taskIDTimeStamp = new Date().getTime();
//console.log('ID1: '+id);
if(taskid){
var taskid = taskid;
}else{
var taskid = taskIDTimeStamp;
}

num++;

//var prioritySelHtml = createOptions(priority);

var e = document.createElement("div");
e.setAttribute('id','task_'+num);
e.setAttribute('class','task_row');

e.innerHTML =  '<span class="handle"></span>';

e.innerHTML +=  '<input name="taskid_'+num+'" id="taskid_'+num+'" size=15 type="hidden" value="'+taskid+'">';

e.innerHTML +=  '<input name="projectid_'+num+'" id="projectid_'+num+'" size=15 type="hidden" value="'+projectid+'">';

e.innerHTML +=  '<input name="sort_order_'+num+'" id="sort_order_'+num+'" class="sort_order" size=15 type="hidden" value="'+sort+'">';

e.innerHTML +=  '<input name="heading_'+num+'" id="heading_'+num+'" class="heading" size=15 type="hidden" value="'+heading+'">';if(heading == 1){

// Add a Task Heading
e.innerHTML +=  '<input name="name_'+num+'" id="name_'+num+'" class="task-heading" size=45 type="text" value="'+name+'" placeholder="Type a Project Task List Heading Here...">';
e.innerHTML += '<div style="display:none; float: left; width:  400px;"><textarea name="description_'+num+'" id="description_'+num+'" rows="4" cols="50">'+description+'</textarea></div>';
e.innerHTML += '<div style="display:none; float: left; width:  100px;"><select name="status_'+num+'" id="status_'+num+'" class="status">'+buildFormSelection(statusArray, status)+'</select></div>';
e.innerHTML += '<div style="display:none; float: left; width:  90px;"><select name="priority_'+num+'" id="priority_'+num+'" class="priority">'+buildFormSelection(prioritiesArray, priority)+'</select></div>';
e.innerHTML += '<div style="display:none; float: left; width:  100px;"><select name="type_'+num+'" id="type_'+num+'" class="type">'+buildFormSelection(typesArray, type)+'</select></div>';
}else{// Add a Task
e.innerHTML +=  '<input name="name_'+num+'" id="name_'+num+'" size=45 type="text" value="'+name+'">';

//e.innerHTML += '<input name="description_'+num+'" id="description_'+num+'" size=45 type="text" value="'+description+'">';
e.innerHTML += '<textarea name="description_'+num+'" id="description_'+num+'" class="edit_description" rows="1" cols="50">'+description+'</textarea>';
e.innerHTML += '<select name="status_'+num+'" id="status_'+num+'" class="status">'+buildFormSelection(statusArray, status)+'</select>';
e.innerHTML += '<select name="priority_'+num+'" id="priority_'+num+'" class="priority">'+buildFormSelection(prioritiesArray, priority)+'</select>';
e.innerHTML += '<select name="type_'+num+'" id="type_'+num+'" class="type">'+buildFormSelection(typesArray, type)+'</select>';
}

//e.innerHTML += '<button type="button" onclick="remove_item_row('+num+')"><img src="index.php?entryPoint=getImage&imageName=id-ff-clear.png"></button>';
e.innerHTML += '<button type="button" onclick="remove_item_row('+num+')"><img src="./modules/apoll_Web_Projects/assets/images/cross.png"></button>';

e.innerHTML += '<br style="clear:both;">';

document.getElementById("tasks_count").value = num;
ii.appendChild(e);

}

Каждый раз, когда моя функция JavaScript add_task_row() вызывается, он вставляет новый Div Project Tasks в DOM и заполняет поля формы в каждой строке.

Это прекрасно работает большую часть времени, однако я просто сохранил другое значение в базе данных, и теперь, когда он загружает это значение, он вызывает ошибки JavaScript, подобные этой … Uncaught SyntaxError: Unexpected token ILLEGAL

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

add_task_row("1411445999407","205e34c6-7381-92eb-e6ab-54125429cd2a","ghjfghjh","dfg dhfjhg dfgosdjkfgosdfk hgdjfhdhikfgj gsidgisfdgh
fh
dfgh
d tgh
tgj
hfghj
fg hjgh0dgoh igkoiiuwidth: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;width: 679px;","In Progress","Low","Other","3","0");

Таким образом, в приведенном выше коде вы можете видеть, что это длинное значение базы данных по какой-то причине не заключено в кавычки.

Любая идея, как решить эту проблему, которая возникает только тогда, когда значение БД, как специальные символы, кажется?


ОБНОВИТЬ, при дальнейшей проверке я вижу, что длинное значение заключено в кавычки, и при дополнительном тестировании проблема связана не со специальными символами, а с разрывом строки!

add_task_row("1411445999407","205e34c6-7381-92eb-e6ab-54125429cd2a","ghjfghjh","gdf;dgdfdfg 679px;width: 679px;width: 679px;
dsgdfgsdfgdfgsdfgsdfgdfgsdfg","In Progress","Low","Other","3","0");

Любые идеи, как я могу сделать строки с этими переносами строк, не вызывают ошибки JavaScript?

0

Решение

Вот как вы помещаете строки JavaScript в источник. Вы не можете просто перейти на новую строку.

Например, следующий код работает

alert('1 2 3 4');

но следующее не делает:

alert('1
2 3 4');

и снова работает следующее:

alert('1' +
'2 3 4');

Если вы хотите внести какие-либо изменения в Smarty, вы можете сделать это следующим образом:

{assign var="string" value="1
2
3
4"}
<script>

alert ("{$string|replace:array("\n","\r"):array(' ', '')}");
</script>

с помощью replace модификатор вы меняете \r а также \n в космос — он вносит небольшие изменения в контент, но если вам все равно, он должен работать.

Другое решение заключается в преобразовании новых концов строк в простые \n строка, которая заставляет JavaScript обрабатывать их как новую строку, чтобы вы могли изменить приведенный выше пример на:

{assign var="string" value="1
2
3
4"}
<script>

alert ("{$string|replace:array("\n","\r"):array('\n', '\n')}");
</script>

и теперь в состоянии тревоги вы будете показывать новые строки.

Так что в вашем случае вам, вероятно, следует изменить строку:

add_task_row("{$task.task_id}","{$ID}","{$task.name}","{$task.description}","{$task.status}","{$task.priority}","{$task.type}","{$task.sort_order}","{$task.heading}");

в

add_task_row("{$task.task_id}","{$ID}","{$task.name}","{$task.description|replace:array("\n","\r"):array('\n', '\n')}","{$task.status}","{$task.priority}","{$task.type}","{$task.sort_order}","{$task.heading}");
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]