Использование HtmlHelper в Model для вставки ссылок в возвращаемые ошибки - PullRequest
4 голосов
/ 07 августа 2011

Я работаю с 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 ]

5 голосов
/ 07 августа 2011

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

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

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

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

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

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

2 голосов
/ 07 августа 2011

это сложная тема, потому что

  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;
    }
0 голосов
/ 18 марта 2016

Для 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; ?>
0 голосов
/ 27 ноября 2013

Я не согласен с нарушением логики MVC.Я также попробовал все array('escape' => false) возможные способы (в Form-> input, в Form-> error и даже в модели), и ни один из них не работал со мной!(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>'; }

Надеюсь, это кому-нибудь поможет.

PS Всегда полезно упомянуть, какую версию cakePHP вы используете ...

0 голосов
/ 07 августа 2011

Вы делаете это тяжело для себя. Помощники не доступны в модели и контроллере. И на то есть веская причина: М и С не должны касаться V.

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

...