2013-07-14 3 views
3

Я работаю над системой выставления счетов и контроллером в моей инфраструктуре mvc, на данный момент использует строки, заключенные в одинарные кавычки. Я новичок в javascript, но я не мог этого избежать. У меня есть функция, которая работает и проверяется в объявлении window.onload, но одно и то же объявление внутри формы создает ошибку. Выходной сигнал html:Как передать массив JSON функции javascript внутри строки в php

onclick="verifyAccount('{"1":null,"2":null,"3":null,"4":null,"5":null,"8":null,"9":null,"10":null,"21":null,"22":null}');" > 

все значения являются нулевыми, поскольку ни один из них не был создан. в Firebug Я получаю сообщение об ошибке « SyntaxError: unterminated string literal». Я не знаю, что нужно для решения этой проблемы. Линия, которая вызывает ошибку:

<input type="radio" name="account" id="account" onclick="verifyAccount(\''.$accounts.'\');" > 

    $form = ' 
    <script type="text/javascript"> 

    window.onload = function() { 
    document.getElementById("addLabor").onclick = function(){ addLabor("labor"); } 
    document.getElementById("addPart").onclick = function(){ addPart("parts"); } 
    document.getElementById("addAdjustment").onclick = function(){ addAdjustment("adjustments"); } 
    document.getElementById("customer_id").onchange = function() { verifyAccount(\''.$accounts.'\'); } 
    addLabor("labor"); 

    } 

    </script> 
$form = ' 
<script type="text/javascript"> 

window.onload = function() { 
    document.getElementById("addLabor").onclick = function(){ addLabor("labor"); } 
    document.getElementById("addPart").onclick = function(){ addPart("parts"); } 
    document.getElementById("addAdjustment").onclick = function(){ addAdjustment("adjustments"); } 
    document.getElementById("customer_id").onchange = function() { verifyAccount(\''.$accounts.'\'); } 
    addLabor("labor"); 

    } 

    </script> 

    <form method="POST" class="formTable" id="addInvoice" action="/invoices/save" 
onsubmit="return(validate());"> 
     <table class="buttons" > 
      <tr> 
      <td><input type="button" id="addLabor" value="Add labor"/></td> 
      <td><input type="button" id="addPart" value="Add part"/></td> 
      <td><input type="button" id="addAdjustment" value="Adjust"/></td> 
      <td><input type="submit" name="Save" value="Save" /></td> 
     </tr> 
    </table> 
    <table id="invoiceTable"> 
     <tr> 
      <td><label>Date:</label></td> 
      <td><input type="text" id="date" name="date" maxlength="10" size="4" /> 
       <a href="javascript:NewCal(\'date\',\'MMDDYYYY\')"> 
       <img src="/images/cal.gif" width="16" height="16" alt="Pick a date"></a> 
      </td> 
     </tr> 
     <tr> 
      <td><label>Use Account?:</label></td> 
      <td><input type="radio" name="account" id="account" onclick="verifyAccount(\''.$accounts.'\')" ></td> 
     </tr> 
     <tr> 
      <td><label>Work Order Number:</label></td> 
      <td><input type="text" name="number" id="number" maxlength="8" size="6" /></td> 
     </tr> 
     <tr> 
      <td><label>Customer:</label></td> 
      <td><select name="customer_id" id="customer_id" >'.$select.'</select></td> 
     </tr> 
     <tr> 
      <td><label>Job Name:</label></td> 
      <td><input type="text" name="job_name" id="job_name" /></td> 
     </tr> 
    </table> 
    <table id="labor"></table> 
    <table id="parts"></table> 
    <table id="adjustments"></table> 
    <table id="payment"></table> 

    </form>'; 
     $this->component($form); 
    <form method="POST" class="formTable" id="addInvoice" action="/invoices/save" 
onsubmit="return(validate());"> 
    <table class="buttons" > 
     <tr> 
      <td><input type="button" id="addLabor" value="Add labor"/></td> 
      <td><input type="button" id="addPart" value="Add part"/></td> 
      <td><input type="button" id="addAdjustment" value="Adjust"/></td> 
      <td><input type="submit" name="Save" value="Save" /></td> 
     </tr> 
    </table> 
    <table id="invoiceTable"> 
     <tr> 
      <td><label>Date:</label></td> 
      <td><input type="text" id="date" name="date" maxlength="10" size="4" /> 
       <a href="javascript:NewCal(\'date\',\'MMDDYYYY\')"> 
       <img src="/images/cal.gif" width="16" height="16" alt="Pick a date"></a> 
      </td> 
     </tr> 
     <tr> 
      <td><label>Use Account?:</label></td> 
      <td><input type="radio" name="account" id="account" onclick="verifyAccount(\''.$accounts.'\')" ></td> 
     </tr> 
     <tr> 
      <td><label>Work Order Number:</label></td> 
      <td><input type="text" name="number" id="number" maxlength="8" size="6" /></td> 
     </tr> 
     <tr> 
      <td><label>Customer:</label></td> 
      <td><select name="customer_id" id="customer_id" >'.$select.'</select></td> 
     </tr> 
     <tr> 
      <td><label>Job Name:</label></td> 
      <td><input type="text" name="job_name" id="job_name" /></td> 
     </tr> 
    </table> 
    <table id="labor"></table> 
    <table id="parts"></table> 
    <table id="adjustments"></table> 
    <table id="payment"></table> 


</form>'; 
     $this->component($form); 
+0

Избавиться от одинарных кавычек. Это не должно быть слишком сложно. 'verifyAccount ({" 1 ": null," 2 ": null," 3 ": null," 4 ": null," 5 ": null," 8 ": null," 9 ": null," 10 " : null, "21": null, "22": null}); ">' будет действительным – mplungjan

+0

Это внутри одной кавычки. То, почему существует комбинация одиночных кавычек и одиночных кавычек. –

+0

Нужно спросить, почему вам нужно будет запустить функцию Javascript на фиксированных данных, созданных PHP. Почему бы не выполнить задание на PHP и просто опубликовать результат в свой HTML? –

ответ

7

Проблема заключается в двойных кавычках, которые сохраняют начальные и конечные строки. Это приводит значение onclick быть просто:

onclick="verifyAccount('{" 

С остальным в лучшем случае дополнительных атрибутов или просто мусор.

The двойные кавычки, которые являются частью значения должны быть экранированы/закодирован, которые могут быть сделаны с htmlentities:

'... onclick="verifyAccount(\''.htmlentities($accounts).'\');" ...' 

Хотя, еще один вариант, чтобы воспользоваться соотношением JSON к JavaScript, выводя строку JSON, так что он рассматривается как JavaScript Object literal:

'... onclick=\'verifyAccount('.$accounts.');\' ...' 

Или, если $results еще должен быть закодирован как JSON:

'... onclick=\'verifyAccount('.json_encode($accounts).');\' ...' 

Результирующее в:

<... onclick='verifyAccount({"1":null,"2":null",...})'> 

Зависимость этого является то, что verifyAccount нужно будет скорректировать, чтобы ожидать Object, а не String.

+0

Это может сломаться, если содержимое json_encode имеет одинарную цитату, например, в «тексте»: «это мой текст». – Yvan

+0

Просто добавил ответ, чтобы решить эту проблему. – Yvan

0

Я считаю, что здесь просто отсутствуют операторы конкатенации.

Итак:

<input type="radio" name="account" id="account" onclick="verifyAccount(\''.$accounts.'\');" > 

становится:

<input type="radio" name="account" id="account" onclick="verifyAccount('\'' + '.$accounts.' + '\'');" > 

И вы можете исправить меня здесь, но я считаю, что это переменная PHP вы пытаетесь вставить там, так что это действительно должно стать :

<input type="radio" name="account" id="account" onclick="verifyAccount('\'' + '.<?php echo $accounts ?>.' + '\'');" > 
+0

Вы не имеете в виду 'echo '' ' – mplungjan

+0

Я предполагал, что html был вне PHP-тегов по дизайну. Тем не менее, @mplungjan ваше решение будет MUCH чище. – Myles

+0

Было бы намного чище, но я изучаю это, когда иду, и на самом деле не планировал многого. Я знаю, что это отвращение с моей стороны, но я далеко не эксперт по javascript. Спасибо за помощь! –

2

Вот мое предложение

JavaScript:

var account = <?php echo json_encode($accounts)?>; 

или если вы по какой-то причине не может избавиться от отдельных qutotes:

var account = JSON.parse('{"1":null,"2":null,"3":null,"4":null,"5":null,"8":null,"9":null,"10":null,"21":null,"22":null}'); 

HTML:

<input type="radio" name="account" id="account" onclick="verifyAccount(account)" /> 

или с файлами изменение s:

echo '<input ... onclick=\'verifyAccount('.json_encode($accounts).');\' >'; 
0

Для предотвращения как одиночные кавычек (') и двойные кавычки ("), чтобы разбить onclick инкапсуляции, вам нужно избавиться от одного из двух. Поскольку у меня есть предпочтение двойные кавычки в атрибутах, а также учитывая, что json_encode возвращает двойные кавычки, вот что я делаю:

echo '<input type="radio" name="account" id="account" onclick="verifyAccount('.htmlspecialchars(json_encode($accounts)).');"/>'; 

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

array('user1' => 'Username is \'quit3" strange and \\ problematic!'); 

Какие будет экспортироваться по PHP для:

{&quot;user1&quot;:&quot;Username is 'quit3\&quot; strange and \\ problematic!&quot;} 

Так заканчивается:

<label><input type="radio" name="account" id="account" onclick="var user ={&quot;user1&quot;:&quot;Username is 'quit3\&quot; strange and \\ problematic!&quot;}; console.log(user.user1);"/> Click me!</label>

Смежные вопросы