postLink генерирует неверный код в CakePHP 2.3

Я использую CakePHP 2.3.

У меня есть две среды, в которых у меня есть веб-приложение. В тестовой среде с точно такой же версией приложения (все файлы одинаковые) у меня возникла проблема с методом Form->postLink.

Он показывает эту ошибку на консоли Javascript:

Uncaught TypeError: объект # не имеет метода «отправить» пользователям: 119 onclick

Сравнивая результирующий HTML из обеих сред, я могу заметить, что атрибуты name и id, сгенерированные этим методом, повторяются более одного раза на одной и той же странице (так не должно быть).

Это код, используемый для создания этих почтовых ссылок:

foreach($users as $user){   
    $delete = $this->Form->postLink(__('Delete'), array('action' => 'delete', $user['user_id']), __('Are you sure you want to delete %s?', $user['user_id']));
}

Это проблемный сгенерированный HTML с повторяющимися значениями для id и name, как вы можете видеть:

<!-- link 1 -->
<form action="delete/1/" name="post_51e8019d095f1" id="post_51e8019d095f1" style="display:none;" method="post">
    <input type="hidden" name="_method" value="POST"/>
</form>

<a href="#" onclick="if (confirm(&#039;Are you sure you want to delete blabla?&#039;)) { document.post_51e8019d095f1.submit(); } event.returnValue = false; return false;">Delete</a>



<!-- link 2 -->
<form action="delete/2/" name="post_51e8019d095f1" id="post_51e8019d095f1" style="display:none;" method="post">
    <input type="hidden" name="_method" value="POST"/>
</form>

<a href="#" onclick="if (confirm(&#039;Are you sure you want to delete blabla22?&#039;)) { document.post_51e8019d095f1.submit(); } event.returnValue = false; return false;">Delete</a>

Почему это происходит? Может ли это быть как-то связано с конфигурацией веб-сервера? Другого объяснения этому я не вижу...

Спасибо.


person Alvaro    schedule 18.07.2013    source источник
comment
Единственная проблема, которую я вижу, это второй параметр в методе postLink(). Должно быть что-то вроде array('action' => 'delete', $user['User']['user_id']).   -  person Cris Sawfish    schedule 18.07.2013
comment
@CrisSawfish не проблема. Я работаю с Oracle и процедурами, а не с моделями CakePHP, поэтому структура отличается.   -  person Alvaro    schedule 18.07.2013
comment
Метод postLink() создает уникальный идентификатор для формы, как показано на source и делает это правильно. Я также использую его с последней версией CakePHP. Так что, возможно, внутри вашего цикла foreach должно быть что-то еще.   -  person Cris Sawfish    schedule 18.07.2013
comment
@CrisSawfish что-то идет не так, но я не знаю, что это такое. Вот код цикла, Крис: pastebin.com/VRe4uaad   -  person Alvaro    schedule 18.07.2013
comment
Так что это определенно не проблема postLink(). Я только что проверил ваш цикл в своей системе (конфигурация среды разработки), и он отлично работает! Поскольку идентификатор формы создается с использованием текущего микровремени (проверьте функция uniqid) , может быть, у вас что-то происходит с настройками php?   -  person Cris Sawfish    schedule 18.07.2013
comment
@CrisSawfish, это то, о чем я спрашивал. Как я также вижу, он отлично работает в одной из двух моих сред. Но я понятия не имею, какая конфигурация может повлиять на этот метод...   -  person Alvaro    schedule 18.07.2013
comment
Может быть проблема в структуре HTML.. Пример. Форма открывается внутри этой формы, у вас есть эти строки постссылки.. Затем открытая форма закрывается.. Форма открывается и закрывается, а не проверяется, вы столкнетесь с этой проблемой. низкий и проверить   -  person AnNaMaLaI    schedule 19.07.2013
comment
@Cakephp.Saint, кажется, все в порядке. Как тогда объяснить, что в одной среде это работает хорошо, а в другой нет? Я сравнил полученный HTML, и единственная разница заключается в name и id этих форм, а также в тех же значениях до события .submit() js. Что-то дает сбой функции postLink...   -  person Alvaro    schedule 19.07.2013
comment
@CrisSawfish, возможно, вы правы, это может быть связано с проблемой IIS и uniqid: samjlevy.com/2013/05/php-uniqid-not-unique-on-iis-7-5 Возможно, мне придется изменить postLink исходный код, добавив второй параметр.   -  person Alvaro    schedule 19.07.2013
comment
По-прежнему существует проблема с postLinks, сгенерированными в цикле. Это не работает для самого первого клика формы!   -  person Arvind K.    schedule 18.11.2014
comment
проверьте последнее обновление в принятом ответе. Это решение принято более новыми версиями CakePHP.   -  person Alvaro    schedule 18.11.2014


Ответы (1)


Проблема была вызвана ошибкой в ​​IIS 7.0.6000.16386 и функцией PHP uniqid как указано здесь.

Я использую немного другую версию в обеих средах (IIS 7.0.6000.16386 и IIS 7.5.7600.16385), и это было причиной проблемы.

Чтобы решить эту проблему, я изменил файл lib/Cake/View/Helper/FormHelper.php, изменив строку $formName = uniqid('post_'); внутри функции postLink на:

$formName = uniqid('post_', true);

Это добавляет больше энтропии, и, как говорится в документации:

Если установлено значение TRUE, uniqid() добавит дополнительную энтропию (используя комбинированный линейный конгруэнтный генератор) в конце возвращаемого значения, что увеличивает вероятность того, что результат будет уникальным.

Обновлять

В итоге пришлось добавить еще одно изменение из-за проблем с javascript в формах. Я добавил еще одну строку после $formName = uniqid('post_', true);, чтобы она выглядела так:

$formName = uniqid('post_', true);
$formName = str_replace('.', '', $formName);
person Alvaro    schedule 19.07.2013
comment
Хорошо, что это был длинный выстрел!! Я думал о том, чтобы предложить то, что вы сделали, но у меня не было возможности проверить это! В любом случае, я рад, что это сработало для вас. Мы обязательно будем иметь в виду такие ситуации - person Cris Sawfish; 19.07.2013