Verificare operator telefonie mobilă pentru orice număr de telefon

Accesând adresa https://sms-gratis.go.ro/operator.php?nr=NUMAR se poate verifica operatorul de telefonie mobilă actual. Această verificare poate fi deosebit de utilă în cazul în care se expediază sms-uri folosindu-se mai mulți operatori de telefonie mobilă.

Din păcate nu este o metodă oficială pusă a dispozitie de ANCOM, verificarea operatorilor curenți folosind scripturi fiind rezervată doar operatorilor de telefonie.
Exemplu: https://sms-gratis.go.ro/operator.php?nr=0212005200

 

1 ip static, 2 sau mai multe servere fizice httpd apache2 pe portul 80

Deseori întâmpinăm situația în care avem un singur ip static, și dorim să folosim mai multe servere fizice în spatele acestui ip. Putem face acest lucru foarte simplu când redirecționăm și schimbăm porturile standard. Dar când nu putem renunța la porturile standard și avem un singur ip utilizabil, putem face așa:

Avem:

1 router cu ip extern 193.0.0.1, ip intern 192.168.0.1
1 server httpd cu ip (intern) 192.168.0.2, să zicem că va servi cererile pentru server1.ro1
1 server httpd cu ip (intern) 192.168.0.3, să zicem că va servi cererile pentru server2.ro

  1. Se redirecționează portul 80 pe router de pe ip-ul extern, pe ip-ul intern 192.168.0.2 (probabil că se va schimba și portul pentru router admin, se face cu port forwarding și/sau DMZ – nu face obiectul acestui articol)
  2. Considerând că serverele httpd și dns sunt configurate corect și server1.ro respectiv server2.ro (eventual și www.server2.ro) pointează spre ip extern 193.0.0.1, adăugăm în /etc/apache2/sites-enabled/000-default.conf (calea fișierelor de configurare poate sa difere, aceasta este cea standard pentru debian/ubuntu) următoarele:

<VirtualHost *:80>
ServerName server2.ro
ServerAlias www.server2.ro
ProxyRequests On
<Proxy *:*>
Order deny,allow
Allow from all
</Proxy>
ProxyPass / http://192.168.0.3:80/
ProxyPassReverse / http://192.168.0.3:80/
<Location />
Order allow,deny
Allow from all
</Location>
</VirtualHost>

3. Se repornesc serviciile httpd și se testează redirecționarea.

În cazul în care serverul apache/httpd numarul 1 cu ip 192.168.0.2 are probleme, serverul 2 cu ip 192.168.0.3 nu va fi accesibil prin aceasta metoda!

În cazul în care nu aveți modului proxy activat,  va apărea în loguri eroarea:

Invalid command ‘ProxyRequests’, perhaps misspelled or defined by a module not included in the server configuration

sau

AH01144: No protocol handler was valid for the URL /. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

Se activează modulul proxy (de fapt se poate face din start treaba asta) și se face un restart la serverul apache cu comanda:

a2enmod proxy mod_proxy; sudo service apache2 restart

Prestashop Multistore

Prestashop ne oferă posibilitatea de a crea mai multe magazine pe aceeași platformă. Exemplul din documentația 1.7  este destul de vag și rupt de realitate fiindcă nu am găsit situația în care să ai un magazin de forma http://magazinulmeu.ro și să dorești un nou magazin de forma http://magazinulmeu.ro/magazin2. În schimb am întâlnit situația în care se dorește crearea a două sau mai multe magazine pe aceeași platformă cu domenii diferite. Adică http://magazinulmeu1.ro și http://magazinulmeu2.ro. Avantajul direct la această situație e faptul că produsele pot fi comune. Dar nu e doar atât; prestashop ne dă posibilitatea de a avea aceleași produse, cu nume diferite, poze diferite, prețuri diferite și stoc comun. O vânzare a produsului 1 pe magazinul 1 se reflectă automat și în stocul aceluiași produs listat pe magazinul 2 cu alt nume, altă poză, alt preț, etc.

Configurările în Prestashop sunt simple:

  1. se activează multistore
  2. se adaugă un magazin nou

Problema apare imediat după, când ne dăm seama ca domeniul nou configurat pe server nu pointeaza spre același director în care e instalat prestashop. Acest lucru se rezolvă relativ simplu prin editarea fisierelor apache (sau orice alt server http folosiți).

Dacă domeniul 1 (unde a fost instalat prestashop) are Document Root configurat așa:

DocumentRoot /var/www/domeniu1

iar domeniul 2 are Document Root configurat așa:

DocumentRoot /var/www/domeniu2

se va modifica setarea pentru domeniul 2 pentru a indica spre /var/www/domeniu1

Apoi se repornește serverul httpd, și se verifică funcționalitatea. E necesar ca mod_rewrite să fie activat, recomand să nu folosiți cache la prestashop cât timp se lucrează la el.

 

 

robots.txt

Pentru a permite doar google, yahoo și msn să vă indexeze site-ul creați un fisier robots.txt în directorul rădăcină cu urmatorul conținut:

User-agent: *
Disallow: /
User-agent: Googlebot
Allow: /
User-agent: Slurp
Allow: /
User-Agent: msnbot
Disallow:

Slurp este robotul care indexează pagini web pentru Yahoo.

Din păcate metoda nu e 100% sigură, spiderii web cu intenții dubioase (de exemplu colectori de adrese email pentru spam) pot să ignore conținutul acestui fișier.

Generare feed CSV prestashop

În momentul în care depășești câteva mii de produse, generarea feed-urilor CSV  (sau XML, etc) devine o problemă. La peste 30.000 produse am ajuns să nu pot genera feed nici măcar pe un server dedicat, astfel că am fost pus în situația să îmi construiesc singur un script pentru generare feed CSV, pentru allshops în cazul meu.

Scriptul rulez fără probleme din linia de comandă: php script.php > feed.csv

Se poate rula și din cron, pentru a fi actualizat zinlic.

Rezultatul este un fișier de 107 MB, dar fiind static nu sunt probleme la accesarea lui.

Versiune Prestashop 1.6.1.7, PHP 7. Scriptul poate fi adaptat la orice versiune de prestashop, cu puțină imaginație.

Script:

<?php
include 'config/settings.inc.php';
$db = new mysqli(_DB_SERVER_, _DB_USER_, _DB_PASSWD_, _DB_NAME_);

//start cateva setari
$url="https://prestashop-ul-meu.ro/";
$moneda="RON";
$id_lang=7;
$id_shop=1;
$nr_poze=3;
//stop cateva setari

if ($db->connect_errno)
        {
        printf("Conexiune esuata: %s\n", $db->connect_error);
        exit();
        }

//start categorii
$cat=array();

$result = $db->query("SELECT id_category, id_parent FROM ps_category");
while ($row = $result->fetch_array())
        {
        $cat[$row['id_category']]['id'] =  $row['id_category'];
        $sql="SELECT name from ps_category_lang WHERE id_category='$row[id_category]' AND id_shop='$id_shop' AND id_lang='$id_lang' LIMIT 1";
        $result1 = $db->query ($sql) or trigger_error($db->error."[$sql]");
        $row1 = $result1->fetch_array();
        $cat[$row['id_category']]['nume'] = $row1['name'];
        $cat[$row['id_category']]['full'] = $row1['name'];
        }
$result->free();

$result = $db->query("SELECT id_category, id_parent FROM ps_category");
while ($row = $result->fetch_array())
        {
        $parinte=$row['id_parent'];

        while ($parinte > 2)
                {
                $result1 = $db->query ("SELECT id_category, id_parent FROM ps_category WHERE id_category ='$parinte' limit 1");
                $row1 = $result1->fetch_array();

                $sql="SELECT name from ps_category_lang WHERE id_category='$row1[id_category]' AND id_shop='$id_shop' AND id_lang='$id_lang' LIMIT 1";
                $result2 = $db->query ($sql) or trigger_error($db->error."[$sql]");
                $row2 = $result2->fetch_array();

                $cat[$row['id_category']]['full'] = $row2['name']." > ".$cat[$row['id_category']]['full'];
                $parinte= $row1['id_parent'];
                }
        }
//stop categorii

$result = $db->query("SELECT * FROM ps_product WHERE active='1'");
while ($row = $result->fetch_array())
        {
        $result1 = $db->query ("SELECT name,description,link_rewrite FROM ps_product_lang WHERE id_product = '$row[id_product]' AND id_lang ='$id_lang' AND id_shop='$id_shop' limit 1");
        $row1 = $result1->fetch_array();

        $result2 = $db->query ("SELECT quantity FROM ps_stock_available WHERE id_product = '$row[id_product]' AND id_shop='$id_shop' limit 1");
        $row2 = $result2->fetch_array();

        if ($row2['quantity'] == 0) $stoc="4";
        if ($row2['quantity'] == 1) $stoc="0";
        if ($row2['quantity'] > 1) $stoc="1";


        $url1=$url.$row1['link_rewrite'].".html";

        echo b($row[id_category_default]).";".b($cat[$row['id_category_default']]['full']).";".b($row1['name']).";".b($row['reference']).";".b($row1['description']).
        ";".b(foto($url, $row['id_product'], $nr_poze)).";;;;;".b($row['price']).";;".b($moneda).";".b($url1).";".b($stoc).";;\r\n";
        }
$result->free();
$db->close();

function foto ($url,$id,$limit)
        {
        global $db;
        $u = $url."img/p/";
        $f="";
        $sql="SELECT `id_image` FROM `ps_image` WHERE id_product='$id' order by position asc limit $limit";
        $result = $db->query ($sql) or trigger_error($db->error);
        while ($row = $result->fetch_array())
                {
                $f.=$u;
                for ($i=0; $i <strlen($row['id_image']); $i++) $f .= (string)$row[id_image][$i]."/";
                $f .= "$row[id_image].jpg|";
                }
        $f=substr($f,0,-1);
        return $f;
        }

function b($x)
{
return $x;
return base64_encode($x);
}
?>