С помощью HtmlHelper на модели вставлять ссылки в ошибки


Я работаю с CakePHP и пытаюсь понять лучшие способы сделать мое приложение последовательным и логичным.

Теперь я пытаюсь работать с Model data validation и обрабатывать ошибки проверки в view, у меня есть сомнения относительно того, как я должен делать, если я хотел бы вставить некоторую ссылку внутри возвращенной ошибки, например, для забытого пароля.

Хорошо ли использовать (если это возможно) HtmlHelper внутри модели для возврата последовательных ссылок внутри моего приложения, или мне следует подумать о другом путь?

<?php
App::import('Helper', 'Html');
class User extends AppModel {
    var $name = 'User';
    var $validate = array (
        'email' => array (
            'checkEmail' => array (
                'rule' => array('email', true),
                'message' => 'Email not valid message.'
            ),
            'checkUnique' => array (
                'rule' => 'isUnique',
                'message' => 'This email is allready in the db, if you forgot the password, '.(string)$this->Html->link('click here', array('controller' => 'users', 'action' => 'password-recover')).'.'   
            )
    )
    // the rest of the code...

Это не работает, потому что кажется, что я не могу связать строку сообщения с HTML-строкой. Существует ли самый умный способ сделать это, или я должен просто вставить строку html без HtmlHelper?

5 4

5 ответов:

Если вы действительно хотите, чтобы HTML был в ваших сообщениях о проверке, CakePHP предоставляет способ сделать это, не разбивая торт, не написав много кода.

В вашем $validation просто используйте любой HTML, который вы хотели бы представить пользователю.

В вашем представлении, когда вы создаете свой FormHelper::input($fieldName, array $options) передайте следующий массив в $options:

$options = array('error' => array(
              'attributes' => array('escape' => false)
               ))

Смотрите эту страницу , чтобы узнать больше о $options['error']...опции.

Альтернативно, если вы хотите все входные данные без HTML-экранирования вы можете пройти $options['inputDefaults'] когда вы создаете форму.

Это трудная тема, потому что

  1. Возможно, вам придется сломать MVC
  2. валидация, как и в вашем случае, обычно в $validate и не может содержать динамический материал

Для 1)

  • вы также можете использовать Router::url() с ручным HTML
  • Вы можете использовать BBcode или псевдо-разметку и перевести это в реальные ссылки в представлении / элементе flashmessage

Для 2)

  • используйте __construct() и $this->validate для использования динамических элементов, если необходимо

В PHP свойства класса (например, $validate) должны бытьинициализированы постоянными значениями .

<?php
class User extends AppModel {

    public $validate = array(
        'email' => array(
            'checkUnique' => array(
                'rule' => array('isUnique'),
                'message' => 'This email address has already been claimed, possibly by you. If this is your email address, use the <a href=":link">reset password</a> facility to regain access to your account'
            ),
        ),
    );

    public function beforeValidate($options = array()) {
        $this->validate['email']['checkUnique']['message'] = String::insert(
            $this->validate['email']['checkUnique']['message'],
            array('link' => Router::url(array('action' => 'password-recover')))
        );
        return true;
    }

Ты сам себе все усложняешь. Помощники недоступны в модели и контроллере. И по уважительной причине: M и C не должны быть связаны с V.

Есть способы сделать именно так, как вы хотите (но включает в себя значительно больше кода). Так как вы просите самый умный способ: Что плохого в том, чтобы просто повторить ссылку сброса пароля в представлении, после формы входа? Просто echo 'Forgot your password? '.$this->Html->link('Click here', array('controller' => 'users', 'action' => 'password-recover'));

Я не согласен нарушать логику MVC. Я также перепробовал все возможные способы array('escape' => false) (в форме - > ввод, в форме - > ошибка и даже в модели), и ни один из них не работал со мной! (cakephp 2.0)

Ответ"Анх Фам" - самый простой и простой способ. Кроме того, я вернул пустое сообщение об ошибке из проверки модели ('errorMessage' => false ; не работает в cakePhp 2.0).

Потому что я хотел передать переменную в представление, чтобы построить ссылку там (MVC), в контроллер я проверяю, является ли поле недействительным:

$invlaidFields = array_keys($this->Model->validationErrors();    
if ( in_array('myField', $invalidFields)  ){
     ...
     }

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

if ($this->Form->('myFields')) { ... echo '<span class="error-message">error message'. $this->Html->link(...).'</span>'; }

Надеюсь, что это помогает кто-то там.

P. S. Это всегда хорошая практика, чтобы отметить, что в CakePHP версии, которую вы используете...

Для cakephp2 вы можете использовать следующее:

//Проверка модели

'company' => array('notempty' => array('rule' => array('notempty'),'message' => "select one company o send email to <a href="mailto:email@gmail.com">contact</a>",),)

/ / фронт

<?php if ($this->Form->isFieldError('Register.company')): ?>
        <span class="text-danger"><?php echo $this->Form->error('Register.company', null, array('escape'=>false)); ?></span>
      <?php endif; ?>