2017-04-15 35 views
0

我已在页脚内显示所有页面的订阅新闻稿表单。要做到这一点,我已经创建了一个用户控件这样的:无法在Yii2中的页脚内提交表单

SubscriberWidget.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型号代码:

SubscribeNewsletterForm.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快讯 - 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(); 
     } 
    } 

下面是用户模型代码。

Subscriber.php

<?php 

namespace frontend\models; 

use yii\db\ActiveRecord; 

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

前端/配置/ 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, 
]; 
?> 

有了上面的代码验证工作,但我不能保存电子邮件数据库。请告诉我什么是错误的。

回答

0

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

Subscriber.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'], 
    ]; 
} 
+0

韦德您好,感谢您的答复。但仍然不能在控制台中工作我得到错误消息 - index.php?r =项目%2Fsubscriber 500(内部服务器错误) – Alex

+0

你可以编辑你的问题,包括你的'frontend/config/main.php'?大多数情况下,我有兴趣,如果你有任何规则定义.. –

+0

嗨韦德,我已经添加了前端/配置/主要.php代码 – Alex