2014-09-23 29 views
0

我有一個模板,在我正在構建的SugarCRM模塊中使用智能。如何將新文本轉換成JavaScript使用Smarty的新行

問題Smarty的代碼如下,它在一個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()時,都會在DOM中插入一個新的Project Tasks Div,並在每個行中填充表單域。

這個偉大的工程的大部分時間,但是我剛纔保存不同的值到數據庫,現在當它加載這個值,它會導致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"); 

所以在這上面的代碼中,你可以看到,這個長數據庫值不裹行情出於某種原因。

任何想法如何解決這個問題,只有當DB值有像特殊字符似乎?


UPDATE,經過進一步檢查,我看到長期價值被包裹在報價,並與更多的測試,它不是導致問題的特殊字符,它是換行符!

add_task_row("1411445999407","205e34c6-7381-92eb-e6ab-54125429cd2a","ghjfghjh","gdf;dgdfdfg 679px;width: 679px;width: 679px; 
dsgdfgsdfg 


dfgsdfgsdfg 


dfgsdfg","In Progress","Low","Other","3","0"); 

任何想法如何使這些換行字符串不會導致JavaScript錯誤?

+1

做很可能是通過一個JSON編碼器發出的琴絃最好的事情。 – Pointy 2014-09-23 17:55:26

回答

1

這是如何將JavaScript字符串放入源代碼。你不能簡單地去換行。

例如,下面的代碼工作

alert('1 2 3 4'); 

但下面不:

alert('1 
2 3 4'); 

和下面再次工作:

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

如果你想任何Smarty的變化你可以這樣做:

採用0
{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}"); 
+0

非常感謝您的幫助,我嘗試了這種方法,但沒有成功,但讓我在正確的軌道上查看Smarty字符串修飾符,我不得不使用正則表達式版本,然後運行兩遍以獲得所需的輸出,如下所示...'{$ task.description | regex_replace:'/ [\ n \ r] /':'\ n'|替換:'\ n \ n':'\ n'}'我知道它看起來很奇怪,但是我嘗試了20種組合,這是最終完美工作的組合,然後在我的其他視圖中,我使用'nl2br'修飾符將它們轉換爲HTML視圖中的中斷標籤,因此一切正常。謝謝你的幫助 – JasonDavis 2014-09-24 08:35:55

相關問題