Skip to content

Commit

Permalink
Merge pull request #1 from lizardmedia/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
maciejslawik committed Aug 2, 2018
2 parents 6f944eb + 27bc68d commit eee25ba
Show file tree
Hide file tree
Showing 15 changed files with 6,586 additions and 1 deletion.
23 changes: 23 additions & 0 deletions Api/MobileDetectorInterface.php
@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);

/**
* File:MobileDetectorInterface.php
*
* @author Maciej Sławik <maciej.slawik@lizardmedia.pl>
* @copyright Copyright (C) 2018 Lizard Media (http://lizardmedia.pl)
*/

namespace LizardMedia\CartRuleMobile\Api;

/**
* Interface MobileDetectorInterface
* @package LizardMedia\CartRuleMobile\Api
*/
interface MobileDetectorInterface
{
/**
* @return bool
*/
public function isMobileDevice(): bool;
}
48 changes: 48 additions & 0 deletions Model/MobileDetector.php
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);

/**
* File:MobileDetector.php
*
* @author Maciej Sławik <maciej.slawik@lizardmedia.pl>
* @copyright Copyright (C) 2018 Lizard Media (http://lizardmedia.pl)
*/

namespace LizardMedia\CartRuleMobile\Model;

use LizardMedia\CartRuleMobile\Api\MobileDetectorInterface;
use Zend_Http_UserAgent;

/**
* Class MobileDetector
* @package LizardMedia\CartRuleMobile\Model
*/
class MobileDetector implements MobileDetectorInterface
{
/**
* @var Zend_Http_UserAgent
*/
private $userAgent;

/**
* MobileDetector constructor.
* @param Zend_Http_UserAgent $userAgent
*/
public function __construct(
Zend_Http_UserAgent $userAgent
) {
$this->userAgent = $userAgent;
}

/**
* @return bool
*/
public function isMobileDevice(): bool
{
return (bool)preg_match(
'/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i',
$this->userAgent->getUserAgent()
);

}
}
119 changes: 119 additions & 0 deletions Model/Rule/Condition/Mobile.php
@@ -0,0 +1,119 @@
<?php
declare(strict_types=1);

/**
* File:Mobile.php
*
* @author Maciej Sławik <maciej.slawik@lizardmedia.pl>
* @copyright Copyright (C) 2018 Lizard Media (http://lizardmedia.pl)
*/

namespace LizardMedia\CartRuleMobile\Model\Rule\Condition;

use LizardMedia\CartRuleMobile\Api\MobileDetectorInterface;
use Magento\Config\Model\Config\Source\Yesno;
use Magento\Framework\Model\AbstractModel;
use Magento\Rule\Model\Condition\AbstractCondition;
use Magento\Rule\Model\Condition\Context;

/**
* Class Mobile
* @package LizardMedia\CartRuleMobile\Model\Rule\Condition
*/
class Mobile extends AbstractCondition
{
/**
* @var Yesno
*/
protected $sourceYesNo;

/**
* @var MobileDetectorInterface
*/
private $mobileDetector;

/**
* Constructor
* @param Context $context
* @param Yesno $sourceYesNo
* @param MobileDetectorInterface $mobileDetector
* @param array $data
*/
public function __construct(
Context $context,
Yesno $sourceYesNo,
MobileDetectorInterface $mobileDetector,
array $data = []
) {
$this->callParentConstructor($context, $data);
$this->sourceYesNo = $sourceYesNo;
$this->mobileDetector = $mobileDetector;
}

/**
* @param AbstractModel $model
* @return bool
*/
public function validate(AbstractModel $model)
{
$enabledOnMobile = (bool)$this->getValue();
$isMobile = $this->mobileDetector->isMobileDevice();

return $enabledOnMobile === $isMobile;
}

/**
* @return string
*/
public function getInputType()
{
return 'select';
}

/**
* @return string
*/
public function getValueElementType()
{
return 'select';
}

/**
* @return array|mixed
*/
public function getValueSelectOptions()
{
if (!$this->hasData('value_select_options')) {
$this->setData(
'value_select_options',
$this->sourceYesNo->toOptionArray()
);
}
return $this->getData('value_select_options');
}

/**
* @return Mobile
*/
public function loadAttributeOptions()
{
$this->setData(
'attribute_option',
[
'is_mobile' => __('Mobile device')
]
);
return $this;
}


/**
* @param Context $context
* @param array $data
* @codeCoverageIgnore
*/
protected function callParentConstructor(Context $context, array $data): void
{
parent::__construct($context, $data);
}
}
46 changes: 46 additions & 0 deletions Observer/MobileRule.php
@@ -0,0 +1,46 @@
<?php
declare(strict_types=1);

/**
* File:MobileRule.php
*
* @author Maciej Sławik <maciej.slawik@lizardmedia.pl>
* @copyright Copyright (C) 2018 Lizard Media (http://lizardmedia.pl)
*/

namespace LizardMedia\CartRuleMobile\Observer;

use LizardMedia\CartRuleMobile\Model\Rule\Condition\Mobile;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;

/**
* Class MobileRule
* @package LizardMedia\CartRuleMobile\Observer
*/
class MobileRule implements ObserverInterface
{
/**
* @param Observer $observer
* @return void
*/
public function execute(Observer $observer)
{
$additional = $observer->getData('additional');
$conditions = array_merge_recursive((array)$additional->getConditions(), [
$this->getMobileConditionDefinition()
]);
$additional->setConditions($conditions);
}

/**
* @return array
*/
private function getMobileConditionDefinition(): array
{
return [
'label'=> __('Mobile device'),
'value'=> Mobile::class
];
}
}
44 changes: 44 additions & 0 deletions README.md
Expand Up @@ -4,3 +4,47 @@
[![License](https://poser.pugx.org/lizardmedia/module-cart-rule-mobile/license)](https://packagist.org/packages/lizardmedia/module-cart-rule-mobile)

# Magento2 Cart Rule Mobile #

A Magento2 module adding a custom Sales Rule for mobile devices.

It allows you to choose if the rule should be applied to mobile devices only or
to desktop devices only.

#### Device detection ####

The rule uses a user-agent-based detection system. If you wish to override the detection
mthod simply change the implementation of ```\LizardMedia\CartRuleMobile\Api\MobileDetectorInterface```.

## Prerequisites ##

* Magento 2.2 or higher
* PHP 7.1

## Installing ##

You can install the module by downloading a .zip file and unpacking it inside
``app/code/LizardMedia/CartRuleMobile`` directory inside your Magento
or via Composer (required).

To install the module via Composer simply run
```
composer require lizardmedia/module-cart-rule-mobile
```

Than enable the module by running these command in the root of your Magento installation
```
bin/magento module:enable LizardMedia_CartRuleMobile
bin/magento setup:upgrade
```

## Versioning ##

We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags on this repository](https://github.com/lizardmedia/cart-rule-mobile-magento2/tags).

## Authors

* **Maciej Sławik** - [Lizard Media](https://github.com/lizardmedia)

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details
41 changes: 41 additions & 0 deletions Test/Unit/Model/MobileDetectorTest.php
@@ -0,0 +1,41 @@
<?php
declare(strict_types=1);

/**
* File:MobileDetectorTest.php
*
* @author Maciej Sławik <maciej.slawik@lizardmedia.pl>
* @copyright Copyright (C) 2018 Lizard Media (http://lizardmedia.pl)
*/

namespace LizardMedia\CartRuleMobile\Test\Unit\Model;

use LizardMedia\CartRuleMobile\Model\MobileDetector;
use PHPUnit\Framework\TestCase;
use PHPUnit_Framework_MockObject_MockObject as MockObject;
use Zend_Http_UserAgent;

/**
* Class MobileDetectorTest
* @package LizardMedia\CartRuleMobile\Test\Unit\Model
*/
class MobileDetectorTest extends TestCase
{
/**
* @test
*/
public function testIsMobile()
{
/** @var MockObject|Zend_Http_UserAgent $userAgent */
$userAgent = $this->getMockBuilder(Zend_Http_UserAgent::class)
->disableOriginalConstructor()
->getMock();
$mobileDetector = new MobileDetector($userAgent);

$userAgent->expects($this->once())
->method('getUserAgent')
->willReturn('android');

$this->assertTrue($mobileDetector->isMobileDevice());
}
}

0 comments on commit eee25ba

Please sign in to comment.