0

我在页脚内有一个订阅时事通讯表单,显示在所有页面上。为此,我创建了一个订阅者小部件,如下所示:

订阅者Widget.php

<?php
namespace frontend\components;

use Yii;
use yii\base\Widget;
use yii\helpers\Html;
use frontend\models\SubscribeNewsletterForm;

class SubscriberWidget extends Widget
{

    public function run()
    {
        $subscriber_model  = new SubscribeNewsletterForm();

        return $this->render('_subscribe-newsletter-form.php', [
            'subscriber_model' => $subscriber_model
        ]);
    }
}
?>

这是 SubscribeNewsletterForm 模型代码:

订阅NewsletterForm.php

<?php

namespace frontend\models;

use Yii;
use yii\base\Model;

class SubscribeNewsletterForm extends Model
{
    public $email;

    public function rules()
    {
        return [
            [['email'], 'required'],
            ['email', 'email']
        ];
    }
}
?>

这是我的_subscribe-newsletter-form.php 的代码

<?php

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\helpers\Url;

?>

<h3>Subscribe to Newsletter</h3>
<?php $form = ActiveForm::begin(['id' => $subscriber_model->formName(), 'action' => ['project/subscriber'], 'validateOnBlur' => false, 'validateOnType' => false]); ?>
    <div class="input-group">
        <?= $form->field($subscriber_model, 'email')->textInput()->label(false); ?>                             
        <span class="input-group-btn">
            <?php echo Html::submitButton('Sign Up', ['class' => 'btn btn-primary subscribe-btn']); ?>
        </span>                             
    </div>
<?php ActiveForm::end(); ?>

<?php
$script = <<< JS
    $('#{$subscriber_model->formName()}').on('beforeSubmit', function(e){
        var form = $(this);
        $.post(
            form.attr("action"),
            form.serialize()
        ).done(function(data){      
            form.trigger("reset");
        })
        return false;
    });
JS;
$this->registerJs($script);
?>

ProjectController.php中,我创建了如下操作:

public function actionSubscriber()
    {
        $subscriber_model  = new SubscribeNewsletterForm();

        $request = Yii::$app->request;
        if($request->isAjax && $subscriber_model->load($request->post())){
            $subscriber =  new Subscriber([
                'email' => $subscriber_model->email
            ]);
            $subscriber->save();
        }
    }

这是订阅者模型代码。

订阅者.php

<?php

namespace frontend\models;

use yii\db\ActiveRecord;

class Subscriber extends ActiveRecord
{
    public static function tableName()
    {
        return 'subscriber';
    }
} 
?>

前端/config/main.php

<?php
$params = array_merge(
    require(__DIR__ . '/../../common/config/params.php'),
    require(__DIR__ . '/../../common/config/params-local.php'),
    require(__DIR__ . '/params.php'),
    require(__DIR__ . '/params-local.php')
);

return [
    'id' => 'app-frontend',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'frontend\controllers',
    'components' => [
        'request' => [
            'csrfParam' => '_csrf-frontend',
        ],
        'user' => [
            'identityClass' => 'common\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
        ],
        'session' => [
            // this is the name of the session cookie used for login on the frontend
            'name' => 'advanced-frontend',
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        /*
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
            ],
        ],
        */
    ],
    'params' => $params,
];
?>

使用上面的代码验证工作,但我无法将电子邮件保存在数据库中。请告诉我做错了什么。

4

1 回答 1

0

您需要模型上的规则。另外,我总是用表前缀支持的方法替换生成的表名。此外,我总是喜欢使用时间戳行为来记录创建或更新事物的时间。特别是当您获取使用潜在客户的联系信息时,我会记录时间戳以及他们的 IP 地址。

订阅者.php

use yii\behaviors\TimestampBehavior;

// ...

/**
 * @inheritdoc
 */
public static function tableName()
{
    return '{{%subscriber}}';
}

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [
        TimestampBehavior::className(),
    ];
}

/**
 * @inheritdoc
 */
public function rules()
{
    return [
        ['email', 'filter', 'filter' => 'trim'],
        ['email', 'required'],
        ['email', 'email'],
        ['email', 'string', 'max' => 255],
        ['email', 'unique', 'targetClass' => '\common\models\Subscriber', 'message' => 'This email address has already been taken.'],

        [['created_at', 'updated_at'], 'integer'],
    ];
}
于 2017-04-15T05:03:51.403 回答