2017-04-15 36 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