3

I am trying to save data from a custom module with custom table, but the data is not saving.

For this I have written the code below.

setup

<?php
namespace Learning\ContactUS\Setup;
use Magento\Framework\Setup\InstallSchemaInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\SchemaSetupInterface;
use Magento\Framework\DB\Ddl\Table;
class InstallSchema implements InstallSchemaInterface
{
 /**
 * Installs DB schema for a module
 *
 * @param SchemaSetupInterface $setup
 * @param ModuleContextInterface $context
 * @return void
 */
 public function install(SchemaSetupInterface $setup, ModuleContextInterface $context)
 {
 $installer = $setup;
 $installer->startSetup();
 $table = $installer->getConnection()
 ->newTable($installer->getTable('contact_us'))
 ->addColumn('contact_us_id',Table::TYPE_SMALLINT,null,['identity' => true, 'nullable' => false, 'primary' => true],'Contact ID')
 ->addColumn('fullname', Table::TYPE_TEXT, 255, ['nullable' => true, 'default' => null])
 ->addColumn('company', Table::TYPE_TEXT, 255, ['nullable' => true, 'default' => null])
 ->addColumn('address', Table::TYPE_TEXT, 255, ['nullable' => false], 'Address')
 ->addColumn('city_state_zip_code', Table::TYPE_TEXT, 255, ['nullable' => false], 'City State Zip Code')
 ->addColumn('country', Table::TYPE_TEXT, 255, ['nullable' => false], 'Country')
 ->addColumn('phone', Table::TYPE_TEXT, 255, ['nullable' => false], 'Phone')
 ->addColumn('email', Table::TYPE_TEXT, 255, ['nullable' => false], 'Email')
 ->addColumn('Subject', Table::TYPE_TEXT, 255, ['nullable' => false], 'Subject')
 ->addColumn('content', Table::TYPE_TEXT, '2M', [], 'Content')
 ->addColumn('department', Table::TYPE_TEXT, 255, ['nullable' => false], 'Department')
 ->addColumn('creation_time', Table::TYPE_DATETIME, null, ['nullable' => false], 'Creation Time')
 ->addColumn('update_time', Table::TYPE_DATETIME, null, ['nullable' => false], 'Update Time')
 ->setComment('Contact US');
 $installer->getConnection()->createTable($table);
 $installer->endSetup();
 }
}

Model

<?php
namespace Learning\ContactUS\Model;
class ContactUS extends \Magento\Framework\Model\AbstractModel
{
 /**
 * Initialize resource model
 *
 * @return void
 */
 protected function _construct()
 {
 $this->_init('Learning\ContactUS\Model\ResourceModel\ContactUS');
 }
}

Model/ResourceModel

<?php
namespace Learning\ContactUS\Model\ResourceModel;
class ContactUS extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
 /**
 * Initialize resource model
 *
 * @return void
 */
 protected function _construct()
 {
 $this->_init('contactus', 'contact_us_id');
 }
}

Model/ResourceModel/ContactUS/collection.php

<?php
namespace Learning\ContactUS\ResourceModel\ContactUS;
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
{
 /**
 * @var string
 */
 protected $_idFieldName = 'contact_us_id';
 /**
 * Define resource model
 *
 * @return void
 */
 protected function _construct()
 {
 $this->_init('Learning\ContactUS\Model\ContactUS', 'Learning\ContactUS\Model\ResourceModel\ContactUS');
 $this->_map['fields']['contact_us_id'] = 'main_table.contact_us_id';
 }
}

Save.php

<?php
namespace Learning\ContactUS\Controller\Index;
class Save extends \Magento\Framework\App\Action\Action
{
 /**
 * @var \Magento\Framework\View\Result\PageFactory
 */
 protected $resultPageFactory;
 /**
 * @var \Learning\ContactUS\Model\ContactUsFactory
 */
 protected $contactUsFactory;
 /**
 * @var \Learning\ContactUS\Model\ContactUs
 */
 protected $contactUS;
 /**
 * @param \Magento\Framework\App\Action\Context $context
 * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
 * @param \Learning\ContactUS\Model\ContactUsFactory $contactUsFactory
 * @param \Learning\ContactUS\Model\ContactUs $contactUs
 */
 public function __construct(
 \Magento\Framework\App\Action\Context $context,
 \Magento\Framework\View\Result\PageFactory $resultPageFactory,
 \Learning\ContactUS\Model\ContactUsFactory $contactUsFactory,
 \Learning\ContactUS\Model\ContactUs $contactUs
 )
 {
 $this->resultPageFactory = $resultPageFactory;
 $this->contactUsFactory = $contactUsFactory;
 $this->contactUS = $contactUs;
 parent::__construct($context);
 }
 /**
 * Default customer account page
 *
 * @return void
 */
 public function execute()
 {
 /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
 $resultRedirect = $this->resultRedirectFactory->create();
 try{
 $request = $this->getRequest()->getParams();
 $full_name = $request['fullname'];
 $company = $request['company'];
 $address = $request['address'];
 $city_state = $request['city_state'];
 $country = $request['country_id'];
 $telephone = $request['telephone'];
 $email = $request['email'];
 $subject = $request['subject'];
 $comment = $request['comment'];
 $sales = $request['sales'];
 $this->contactUS->setFullname($full_name);
 $this->contactUS->setCompany($company);
 $this->contactUS->setAddress($address);
 $this->contactUS->setCityStateZipCode($city_state);
 $this->contactUS->setCountry($country);
 $this->contactUS->setPhone($telephone);
 $this->contactUS->setEmail($email);
 $this->contactUS->setSubject($subject);
 $this->contactUS->setContent($comment);
 $this->contactUS->setDepartment($sales);
 $this->contactUsFactory->create()->save($this->contactUS);
 $message = __('Thank you for Contact US one of the Employee will Contact you');
 $this->messageManager->addSuccessMessage($message);
 $this->resultPageFactory->create();
 return $resultRedirect->setPath('contactus/index/index');
 }catch (\Exception $e){
 $this->messageManager->addException($e, __('We can\'t submit your request, Please try again.'));
 $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
 return $resultRedirect->setPath('contactus/index/index');
 }
 }
}
?>

Any help on this?

asked Dec 8, 2016 at 7:08
2
  • Did you run upgrade command after writing the code? Commented Dec 8, 2016 at 7:13
  • check my updated answer Commented Dec 8, 2016 at 7:42

2 Answers 2

6

Replace below code:

 $this->contactUS->setFullname($full_name);
 $this->contactUS->setCompany($company);
 $this->contactUS->setAddress($address);
 $this->contactUS->setCityStateZipCode($city_state);
 $this->contactUS->setCountry($country);
 $this->contactUS->setPhone($telephone);
 $this->contactUS->setEmail($email);
 $this->contactUS->setSubject($subject);
 $this->contactUS->setContent($comment);
 $this->contactUS->setDepartment($sales);
 $this->contactUsFactory->create()->save($this->contactUS);

To:

 $contactUs = $this->contactUsFactory->create();
 $contactUs->setFullname($full_name);
 $contactUs->setCompany($company);
 $contactUs->setAddress($address);
 $contactUs->setCityStateZipCode($city_state);
 $contactUs->setCountry($country);
 $contactUs->setPhone($telephone);
 $contactUs->setEmail($email);
 $contactUs->setSubject($subject);
 $contactUs->setContent($comment);
 $contactUs->setDepartment($sales);
 $contactUs->save();

EDIT:

Your namespace wrong for collection

namespace Learning\ContactUS\ResourceModel\ContactUS;

change to

namespace Learning\ContactUS\Model\ResourceModel\ContactUS;
answered Dec 8, 2016 at 7:13
1
  • Yes I forgot to add the Model in Namespace. Now working fine. Thank you. Commented Dec 8, 2016 at 8:28
5

try it like this:

<?php
namespace Learning\ContactUS\Controller\Index;
class Save extends \Magento\Framework\App\Action\Action
{
 /**
 * @var \Magento\Framework\View\Result\PageFactory
 */
 protected $resultPageFactory;
 /**
 * @var \Learning\ContactUS\Model\ContactUsFactory
 */
 protected $contactUsFactory;
 /**
 * @param \Magento\Framework\App\Action\Context $context
 * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
 * @param \Learning\ContactUS\Model\ContactUsFactory $contactUsFactory
 */
 public function __construct(
 \Magento\Framework\App\Action\Context $context,
 \Magento\Framework\View\Result\PageFactory $resultPageFactory,
 \Learning\ContactUS\Model\ContactUsFactory $contactUsFactory,
 )
 {
 $this->resultPageFactory = $resultPageFactory;
 $this->contactUsFactory = $contactUsFactory;
 parent::__construct($context);
 }
 /**
 * Default customer account page
 *
 * @return void
 */
 public function execute()
 {
 /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
 $resultRedirect = $this->resultRedirectFactory->create();
 try{
 $request = $this->getRequest()->getParams();
 $full_name = $request['fullname'];
 $company = $request['company'];
 $address = $request['address'];
 $city_state = $request['city_state'];
 $country = $request['country_id'];
 $telephone = $request['telephone'];
 $email = $request['email'];
 $subject = $request['subject'];
 $comment = $request['comment'];
 $sales = $request['sales'];
 $contactUs = $this->contactUsFactory->create();
 $contactUs->setFullname($full_name);
 $contactUs->setCompany($company);
 $contactUs->setAddress($address);
 $contactUs->setCityStateZipCode($city_state);
 $contactUs->setCountry($country);
 $contactUs->setPhone($telephone);
 $contactUs->setEmail($email);
 $contactUs->setSubject($subject);
 $contactUs->setContent($comment);
 $contactUs->setDepartment($sales);
 $contactUs->save();
 $message = __('Thank you for Contact US one of the Employee will Contact you');
 $this->messageManager->addSuccessMessage($message);
 $this->resultPageFactory->create();
 return $resultRedirect->setPath('contactus/index/index');
 }catch (\Exception $e){
 $this->messageManager->addException($e, __('We can\'t submit your request, Please try again.'));
 $this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);
 return $resultRedirect->setPath('contactus/index/index');
 }
 }
}
answered Dec 8, 2016 at 7:12
5
  • Base table or view not found: 1146 Table demo.contactus doesn't exist. Error is came. Commented Dec 8, 2016 at 7:20
  • this means you did not create the table or you didn't configure your resource model properly to use that table. Commented Dec 8, 2016 at 7:21
  • created table also from my demo database. see my thread updated. help me where I went wrong? Commented Dec 8, 2016 at 7:25
  • it's working fine. but i'm not getting this "$this->_objectManager->get('Psr\Log\LoggerInterface')->critical($e);" what is the meaning of this? Commented Mar 9, 2018 at 13:59
  • Instantiates a class that implements the logger interface and logs a critical error in case there was a problem. Commented Mar 9, 2018 at 16:26

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.