con322
con322

Reputation: 1129

yii2 how can I access post value

I have the following code in my controller trying to get it to work before adding validation etc

This code is from here however I will be adapting it anyway

    $email = $_POST['Newsletter[email]'];

    $session->save_email($email);
    // Subscribe User to List
    $api_key = new sammaye\mailchimp\Mailchimp(['apikey' => 'xxxxxxxxxxx']);
    $list_id = "xxxxxxxxxxx";

    $Mailchimp = new Mailchimp( $api_key );
    $Mailchimp_Lists = new Mailchimp_Lists( $Mailchimp );
    $subscriber = $Mailchimp_Lists->subscribe( $list_id, array( 'email' => $email ) );

However I get the following error (Does this mean my most data is in an array newbie)

Undefined index: Newsletter[email]

Is this something I need to set within my yii2 form so that instead of the name field being Newsletter[email] its just email?

Upvotes: 1

Views: 26138

Answers (6)

PouriaDiesel
PouriaDiesel

Reputation: 735

The inline solution is:

if(is_null($email = Yii::$app->request->post('Newsletter')['email']))
        throw new BadRequestHttpException('newsletter email must set');

if so if email isn't set it throws Bad Request and notice that $_POST isn't good solution when you are using a PHP framework and it's security isn't provided by framework but Yii::$app->request->post is secured by Yii.

Upvotes: 0

Anoop Saini
Anoop Saini

Reputation: 307

If the HTML form field is as below

<input name="Newsletter[email]" type="text">

then the code with in controller should be

$data = Yii::$app->request->post();
$email= $data['Newsletter']['email'];

Upvotes: 0

Blizz
Blizz

Reputation: 8408

As was already stated you can either use $_POST or the request-object. That object encompasses everything that enters your application on startup. So yes, \Yii::$app->request->post() gives you all incoming POST-data and \Yii::$app->request->post('name') will give you a single one. Same with the get function.

However given your code that is not how you should be using Yii. The name of your variables suggests that the post is done using a model, so you might want to use that again, makes it a lot easier on validation.

If you don't have the model, it can look like so:

class Newsletter extends \yii\base\Model
{
   public $email;

   public function rules()
   {
      return array(
        array('email', 'email', 'skipOnEmpty' => false)
      );
   }
}

The actual code in your controller could be more amongst the lines:

$request = \Yii::$app->request;
if ($request->isPost) {
   $newsletter = new Newsletter;
   if ($newsletter->load($request->post()) &&  $newsletter->validate()) {
      // do your thing 
   }
}

Upvotes: 3

ankitr
ankitr

Reputation: 6182

You can do this as follows:

if (Yii::$app->request->post()) {
    $data = Yii::$app->request->post();
    $email = $data['NewsLetter']['email'];
}

Upvotes: 6

alfallouji
alfallouji

Reputation: 1170

It means, it is inside an array.

Try to do the following instead :

// Using isset will make sure, you don't trigger a Notice (when the variable does not exist)
$email = isset($_POST['Newsletter']['email']) ? $_POST['Newsletter']['email'] : null;

// Make sure you are receiving an email address
if ($email && filter_var($email, FILTER_VALIDATE_EMAIL))
{
    $session->save_email($email);
    // Subscribe User to List
    $api_key = new sammaye\mailchimp\Mailchimp(['apikey' => 'xxxxxxxxxxx']);
    $list_id = "xxxxxxxxxxx";

    $Mailchimp = new Mailchimp( $api_key );
    $Mailchimp_Lists = new Mailchimp_Lists( $Mailchimp );
    $subscriber = $Mailchimp_Lists->subscribe( $list_id, array( 'email' => $email ) );
}
// Display an error message ?
else 
{
    // @todo
}

Upvotes: 0

soju
soju

Reputation: 25322

You should simply try $_POST['Newsletter']['email'].

Upvotes: -1

Related Questions