2017-07-08 2 views
0

Dans mon application ZF2, j'ai un formulaire avec plusieurs champs optionnels. Si l'utilisateur décide de laisser ce champ vide, il doit le définir comme NULL dans db, cependant - cela ne fonctionne pas.ZF2 - inputFilter -> Définir la valeur sur null

champ Exemple:

$this->add(array(
    'name' => 'productId', 
    'type' => 'select', 
    'options' => array(
    'value_options' => array(
     'global' => 'Global option', // this should be null 
     'mobile' => 'Another option' 
    ) 
), 
)); 

et filtre:

$inputFilter->add(array(
    'name' => 'productId', 
    'validators' => array(
     array(
      'name' => 'Callback', 
      'options' => array(
       // 'messages' => array(
       //  \Zend\Validator\Callback::INVALID_VALUE => $value, 
       //), 
       'callback' => function ($value) { 
        if($value === 'global') 
        { 
        $value = null; 
        //return true; 
        // echo '<pre>' . var_export($value, true) . '</pre>'; 
        // die(); 
        } 
       } 

      ), 
     ), 
    ), 
)); 

Ce morceau de code fonctionne lorsque l'option "Mobile" est sélectionné. Cependant, avec l'option 'global', cela ne fonctionne pas. Comme vous pouvez le voir, j'ai fait quelques déboguages ​​de base pour m'assurer que la valeur est surchargée sur le rappel et qu'elle renvoie en effet NULL. Peu importe que validateur dit:

array ( 'productId' => array ( 'callbackValue' => 'The input is not valid', ), )

J'ai donc essayé de revenir sur vrai rappel qui a donné lieu à l'erreur ci-dessous:

Statement could not be executed (23000 - 1452 - Cannot add or update a child row: a foreign key constraint fails (app . codes , CONSTRAINT fk_products_id FOREIGN KEY (productId) REFERENCES products (id)))

Comment suis-je censé passer null à mon db param? Si je coupe complètement ce champ de forme, alors il est ignoré et tout fonctionne.

Répondre

0

Solution trouvée, c'est assez simple en fait.

, je peux configurer souhaité sélectionner les options d'une valeur spécifique, puis utiliser le filtre ToNull pour le convertir en null - https://framework.zend.com/manual/2.4/en/modules/zend.filter.null.html

Code pour $ InputFilter:

$inputFilter->add(array(
    'name' => 'productId', 
    'required'   => false, 
    'filters' => array(
     array('name' => 'ToNull', 'options' => array('type' => \Zend\Filter\ToNull::TYPE_STRING)), 
    ), 
));