Zend Framework & Silverlight webalkalmazás bekonfigurálása és fejlesztése Windows Server 2008 R2-ben

Ez a cikk 2010 májusában készült. Néhány linket töröltem, mert már nem működik.

Bevezető

Üdvözöllek kedves Olvasó!

Webprogramozóként
többnyire PHP, MySQL, Javascript, HTML, CSS készlettel dolgozom, az elkészült alkalmazás Linux alapú szerveren
fut.

Ugyanakkor mostanában ismerkedem a .NET világával is. Több
(ingyenes)
előadás sorozaton voltam, a devportal.hu tanulmányi heteit is megnézem,
sőt mostanában fejeztem be egy .net tanfolyamot, amire a munkaidő után
jártam.

Más PHP fejlesztővel beszélgettem már a .NET-s dolgokról, hogy milyen jó
a fejlesztői eszközkészlet, “szabványosabb” technológia, de nem
találtunk kapcsolódási pontot a két technológia között. Ezt még
nehezíti, hogy a megrendelő minél alacsonyabb áran szeretné a
fejlesztést megoldani, az ASP.NET szolgáltatók viszont drágábbak a
Linux-os szolgáltatóknál.

A “technológiai átjárót” a
Silverlight-tól remélek. Több bemutatót
megnéztem, tetszenek a gyorsan kialakítható Master-Detail felhasználói
felületek szeretném ezt a saját webes alkalmazásomban használni.

Már
próbálkoztam kisebb Silverlight alkalmazást összehozni
szabadidőmben, olyat ami az egyik hobbymhoz kapcsolódik. A versenyen egy
Zend Framework, Silverlight alapú egyszerű alkalmazás fejlesztéssel
indulok. Még csak kezdeti állapotban van, de remélem sikerül befejezni,
elegendő tapasztalatot szerezni.

(A fejlesztést, napló
írást párhuzamosan végzem, hogy minden megmaradjon
az utókornak :))

Az alkalmazásomról néhány mondat

Mit is fejlesztek?:
Harp tab creator, szájharmonika tabulatúra készítő.
Kezdő-haladó szinten diatónikus blues harmonikán szoktam játszani.
Gyakran kitalálok saját dallamokat, gondoltam jóllene ezt kényelmesen
rögzíteni, megosztani másokkal.
A kezdeti verzió még néhány funkciót fog tartalmazni.

Itt

próbálom összehozni az alkalmazást.

Még néhány
gondalat

Munkám során sokszor találkoztam olyan megrendelői igénnyel, hogy
készíts egy webes intranetes- irodai (kis) alkalmazást, de még nem
tudják, hogy milyen alapú (Linux/Windows/esetleg Macintosh) szerveren
fog futni, de még az adatbázis motor sem biztos (mysql, oracle,mssql,
access :)) )

Az igy “specifikált” munkának PHP-val neki lehet állni, pláne, ha valami
olyan PHP keretrendszert használsz, ahol konfigurációban lehet
változtatni az adatbázis típusát.

Természetesen a fejlesztés
során kerülni kell a “direkt sql”
használatát, mert ami mysql alatt lefut, máshol errort dob.

Kezdeti
lépések

Megkaptam  a virtual szerverhez a hozzáférést. Hmmm…, ilyen

környezetre
még nem telepítettem. Tanulási lehetőségnek nagyon jó!

Azonnal
neki is vágtam a kapcsolódásnak.

A Remote Desktop panelen
becsatlakoztam. A desktopon található ReadMe*-t
átfuttam, majd a Filezillával nekivágtam az FTP csatlakozásnak.

…miután
rádobbentem, hogy ez így nem lesz jó a

http://webkert2010.net/Help.aspx-n
keresztül tájokozódtam.

Readme: “..A rendszer
alaphelyzetben előkonfigurált, kizárólag FTP over
SSL kapcsolat tesz lehetővé, ehhez kérjük a megfelelő kliens használatát
(pl. az ingyenes FileZilla), passzív módban, ….)”

http://learn.iis.net/page.aspx/304/using-ftp-over-ssl/

Először
is készítettem egy saját Certificate-t, majd létrehoztam egy új
FTP site-t “Add FTP site”-t.

..~ 5x végigmentem a
lépéseken mire sikerült kapcsolódni, de ez kezdő
sorsa. :))

FTP,
feltöltés,  ZF folderek elrendezése

Kezdeti állapotban lévő alkalmazásmomat fel is zuttyantottam, ne utólag
döbbenjek.

Az alabbi Zend Framework (ezentúl röviden ZF) elrendezést választottam.

A
wwwroot folderben az index.php-t helyeztem el.

<?php
define('BASE_PATH', realpath(dirname(__FILE__) ));
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/application'));
// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
   realpath(BASE_PATH . '/library'),
   get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

Az index.php mellett az alábbi folderek vannak:


/application

/library (itt van a Zend könyvtár)

/css

/js

Az application folderen belül van a “szokványos” ZF elrendezés:

/controllers

/models

/views

/configs

/Bootstrap.php

A Bootstrap.php-m így néz ki:

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

 protected function _initAutoload ()
    {
        // Add autoloader empty namespace
        $autoLoader = Zend_Loader_Autoloader::getInstance();
        $resourceLoader = new Zend_Loader_Autoloader_Resource(
        array('basePath' => APPLICATION_PATH , 'namespace' => '' ,
         'resourceTypes' => array('form' => array('path' => 'forms/' ,
         'namespace' => 'Form_') ,
         'model' => array('path' => 'models/' ,
         'namespace' => 'Model_'))));
        // Return it so that it can be stored by the bootstrap
        return $autoLoader;
    }
}

Gondolom, a configs folder application.ini fejlesztői beállítása is
érdekes lehet:

[production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
includePaths.library = BASE_PATH "/library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

resources.db.adapter = PDO_MYSQL
resources.db.params.host = localhost
resources.db.params.username = ******
resources.db.params.password = **********
resources.db.params.dbname = **************
resources.db.charset = "utf-8"
resources.db.params.driver_options.1002 = "SET NAMES utf8"
resources.db.isDefaultTableAdapter = true
resources.db.params.profiler = true

#layout
resources.layout.layoutpath = APPLICATION_PATH "/layouts"
[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

Ha más elrendezést használsz, defaultban a “fő” index.php egy public
folderben van, ami egy szinten van az application folderrel, akkor az
útvonalak változnak!!

Zend Framework verzió jelenlegi
legfrissebb : 1.10.4 mivel szükségem
lesz olyan könyvtárakra* is, amik korábbiban pl: 10.9 még nem létezett
vagy incubátor-ban  :)) volt.

.htaccess
vs. IIS7

Kicsit
aggódtam, hogy mi lesz, ha nem lesz rá alternatíva?

Nem
szeretném a index.php/controllername megoldást használni.

Találtam
egy oldalt, annak útmutatásait követtem.

http://mnshankar.wordpress.com/2008/10/12/htaccess-equivalent-zend-framework-with-iis7/

Apache szerveren ZF-nél az alábbi .htaccess filet használom:

RewriteEngine
on
RewriteRule !.(js|ico|gif|jpg|png|css|xap)$ index.php

(A .xap a
Silverlight kiterjesztése)

Az utasítás szerint irányítson
mindent a publikus könyvtár index.php-ra, ha nem kivételben levő filek
szerepelnek.

IIS7-nél nincs .htaccess, de web.config
módosításával elérhető az URL átírás.

A Remote Desktop (RD)
panelen beléptem, majd megnyitottam  a IIS managert.
Connections>Site>Url rewrite

Az Actions panelen
kattintottam az ‘Import rules’-ra.
Itt feltölthető a .htaccess file, amiből generál egy web.config
állományt.

Ennek is többször futottam neki.

A ‘Rewrite
rules’ ablakba is be lehet másolni a .htaccess filet, amiből a
‘Converted rules’ ablakban az XML nézetre kattintottam, kimásoltam a
generált … részt és az eredeti web.config-ba
szerkesztettem.

Ezután így nézett ki a web.config-file.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1">
                    <match url=".(js|ico|gif|jpg|png|css|xap|mp3)$" negate="true" ignoreCase="false" />
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Később még változtattam rajta, az IIS7 hosszú URL gond miatt. (Lásd az
ezzel foglalkozó fejezetet.)

IIS7,
hosszú URL Probléma

Programomban a  Silverlight kliensből a ZF -s szerver oldali
alkalmazásnak az adatokat szerializálva GET-el adom át.

Azt
vettem észre, hogy hosszú URL-k esetén :
The remote server returned error -> Not found
(Ha az url ~220 karakter hosszú akkor még elfogadja, de ha ~320 kar.,
akkor már nem.)

Silverlight-ban még lelkes kezdő vagyok, ezt a
GET-s kommunikációról olvastam próbáltam ki, POST megoldást nem találtam
PHP felé (csak ASP.NET felé, de akkor a megoldás távol állna az eredeti
feladattól. 🙂 )
Gondoltam egy Silverlight -> Javascript (JQuery) adatátadáson és
onnan POST, de nem akartam átírni az alkalmazást, ha Apache-PHP
környezetben működött.

Windows Server 2008-t is most láttam
(távolról) először. Ha egy hasonló ismeretekkel bíró fejlesztő olvassa
az írásomat, biztos, hogy bátorítást nyer. :))))

A Devportálon
feltetettem a kérdést, de még nem kaptam választ: http://devportal.hu/forums/p/9125/22975.aspx

Googliztam,
másnak is volt ilyen problémája:

http://stackoverflow.com/questions/2840885/500-error-for-long-url-iis7

Egy
IIS-el foglakozó oldalon részletesebb infókat találtam: Use Request
Filtering

http://learn.iis.net/page.aspx/143/use-request-filtering/

Ez alapján a web.config-t módosítottam, és SIKERÜLT hosszabb Url-t
megadni úgy, hogy ne dobjon hibát a szerver!

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1">
                    <match url=".(js|ico|gif|jpg|png|css|xap|txt)$" negate="true" ignoreCase="false" />
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>

    <security>
    <requestFiltering>
               <requestLimits  maxAllowedContentLength="30000000" maxUrl="260" maxQueryString="256" />
    </requestFiltering>
   </security>
 </system.webServer>
</configuration>

Az Apeche-ról, Zend Server-ről már tudok egy-2 dolgot, rájöttem az IIS-t
jó lenne megtanulni. 🙂

MySQL
install

A RD panelen
találtam egy installert, mielőtt jól elindítottam volna tájékozódtam,
ezeket a cikkeket olvastam el.

http://learn.iis.net/page.aspx/353/install-and-configure-mysql-for-php-applications-on-iis-7

http://www.trainsignaltraining.com/install-mysql-on-iis7/2008-09-10/

Az
installációt ne a Next-Next-Finish  technikával végeztem, hanem
figyeltem, hogy az alábbiak be legyenek jelölve:

‘Detailed
configuration’

‘Server Machine’

‘Multifunctional Database’

‘Online
Transaction Processing (OLTP)’

‘Enable Strict Mode’

‘Best
Support for Multilingualism’

‘Install As Windows Service’

‘Include
Bin Directory in Windows Path’

Beállítottam a Root
felhasználónevet/jelszót.

Enable root access from remote machines
(nincs bejelölve).

Azután a Konzolablakban a következő parancsokat futtatam:

# Once logged on to MySQL, use the following sequence of commands:
mysql> use mysql;
Database changed
mysql> DELETE FROM user WHERE user = '';
Query OK, 2 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.05 sec)

#  Next, restrict the root account to log on only from localhost.
mysql> use mysql;
Database changed
mysql> DELETE FROM user WHERE user = 'root' AND host = '%';
Query OK, 2 rows affected (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.05 sec)

# Change the name of the root user with the following sequence of commands from the command prompt:
mysql> USE mysql;
Database changed
mysql> UPDATE user SET user='******' WHERE user='root';
Query OK, 1 row affected (0.19 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.23 sec)

CREATE USER 'dbfalhasznalo'  IDENTIFIED BY 'jelszo';

CREATE DATABASE IF NOT EXISTS projektemadatbazisa;

GRANT ALTER,
       ALTER ROUTINE,
       CREATE,
       CREATE ROUTINE,
       CREATE TEMPORARY TABLES,
       CREATE VIEW,
       DELETE,
       DROP,
       EXECUTE,
       INDEX,
      INSERT,
      LOCK TABLES,
       SELECT,
       UPDATE,
       SHOW VIEW
      ON projektemadatbazisa.* TO dbfalhasznalo;

PHPMYADMIN
install

Még
további mysql konzol parancsokat is próbáltam beütni, de egyre több
hibát vétettem ezért a PHPMYADMIN installáltam fel egy külön
könyvtárba.. 🙂
A config.inc.php megadtam az adatbázis felhasználóm hozzáférését.

A
PHPMYADMIN-om azonban csak akkor működött, ha kiszedtem a főkönyvtárban
a  web.config-ből * részt, ami a Zend Framework-höz
kellett.

  • A mindent a főkönyvtár index.php-re irányít.

Gondolom
a web.config-al kellene most valamit trükközni, amit most még nem tudok
megoldani.

Később:  Sikerült megoldanom!!!
A phpmyadmin folder is kellett raknom egy web.config file-t. Benne a
lényeg a ami törli a korábbi url átírányításokat.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
       <rewrite>
          <rules>
                      <clear />
          </rules>
      </rewrite>
    </system.webServer>
</configuration>

Így van PHPMYADMINOM is : )) 

(Ezt már nem kell:
Így felmásoltam a szerverre egy trial Mysql szerkesztőt ami Server
2008-n is fut, majd RD panelen keresztül telepítettem.
Navicat http://download.cnet.com/Navicat-MySQL-GUI/3000-10254_4-10071792.html?tag=mncol
)

Siverlight
kliens

E témában
igyekszem főleg a szerverrel való kommunikációt kiemelni.
A Silverlight-ban még kezdő vagyok, ez az ELSŐ nagyobb alkalmazásom. A
XAML-t ‘kézzel’ írtam, Blendet csak távolról, előadáson láttam.
A Drag&Drop megoldáshoz a Silverlight Toolt használtam.
http://silverlight.codeplex.com/releases/view/36060

A
hangjegyek mozgatásához (kidob, átrendez)  Bátyai Krisztián :
DragDrop Silverlight 3-ban http://kbatyai.spaces.live.com/Blog/cns!B5577FAF004325E8!429.entry
cikket használtam.

A hangnak több tulajdonsága lehet, ennél a
kezdeti verzinál is, ezért külön osztályt definiáltam.

    public class HarpSound
    {
        public String Harpnote{ get; set; }
        public String Name { get; set; }

        public override string ToString()
        {
            return Name;
        }

    }

A ‘kottázás’ során létrejött hangjegy objektumokat el kell küldenem a
szervernek, ezért szerializálnom kell.

De lépésenként.
Előbb létrehoztam egy kollekciót.

 ObservableCollection<HarpSound> lst1 = new ObservableCollection<HarpSound>();

Hozzáadtam az elemeket.

        private void MultipleHandler(object sender, RoutedEventArgs e)
        {

           Button mybutton=  sender as Button;
           HarpSound soundObj= new HarpSound() { Harpnote = mybutton.Name, Name = mybutton.Content.ToString() };
           lst1.Add(soundObj);

        }

Majd szerializáltam:

  private void SerialButton_Click(object sender, RoutedEventArgs e)
        {
            if (lst1.Count > 0)
            {
               DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(ObservableCollection<HarpSound>));

                MemoryStream stream = new MemoryStream();
                StreamReader sr = new StreamReader(stream);

                ser.WriteObject(stream, lst1);
                sr.BaseStream.Position = 0;
                string s = sr.ReadToEnd();

                WebClient wc = new WebClient();
                wc.OpenReadCompleted += GetHarptabOpenReadCompleted;

                string addUrl= urlpart + "A szervernek az útvonala/" + s ;
                wc.OpenReadAsync(new Uri(addUrl));
                createdUrl.Text = addUrl;
            }
            else
            {
                MessageBox.Show("Nem jelöltél ki egyetlen hangot sem! :))");
            }
        }



Érdekes lehet még…

A Silverlight átvesz a HTML
template-től  konfigurációs változókat (szerver vagy fejlesztői
környezet útvonal, stb.)

Így adom át HTML:

<param name="initParams" value="urlpart=<?php echo $this->urlpart; ?>" />

Így veszem át az SL-ben.

urlpart = App.Current.Resources["urlpart"].ToString();


Hangok betöltése TODO:

A ‘C’ hang betöltése:

<MediaElement  x:Name ="sd1" Source="http://A szervernek az útvonala/hangkönyvtár/c_sound.mp3" AutoPlay="False" MediaFailed="media_MediaFailed"/>

A Gomb – Médiaelement  dinamikus  megfeleltetéshez Dictinary-t
használtam.

Dictionary<Button, MediaElement> d;

  d = new Dictionary<Button, MediaElement>();
   // gomb, media hozzáadása
  d.Add(p1, sd1);
  d.Add(n1, sd2);

A hangok megszólaltatása (gomb felett az egér), itt isegy kezelőt
használtam mindegyikhez.

Egyszerűsítve:

        private void MultipleHandlerStartSound(object sender, MouseEventArgs e)
        {
            Button mybutton = sender as Button;

            if (mybutton.Name == "p1" && d.ContainsKey(p1))
            {
                MediaElement sound = d[p1];
                sound.Play();

            }

        }

Később a DownloadStringCompleted eseményt használtam a
OpenReadCompleted  helyett, kipróbáltam azt is.
A kódom nem sokat változott:

wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(GetHarptabOpenReadCompleted);
....
 wc.DownloadStringAsync(new Uri(addUrl));

//A metódusnak más az argumentuma
        private void GetHarptabOpenReadCompleted(object sender, DownloadStringCompletedEventArgs e)
{
 ...
}

A fejlesztés során rájöttem, hogy a GET helyett a POST kérést szeretnék
indítani Silverlight-ból.
Találtam is egy cikket, de a határidő vége felé már nem szeretném
átírni a működő programot, majd azután kisérletezek vele.
http://viswaug.wordpress.com/2009/09/17/making-a-http-post-in-silverlight-a-k-a-thread-hopping/



Twitter
login

A harmonika kotta szerkesztéshez bejelentkezés szükséges.
Gondoltam, nem fárasztom a felhasználót a regisztrációval, ha van
Twitteres hozzáférése, ez a progi úgyis a Twitter keresztül lesz
bemutatva. (Magamnak készítettem, de más is használhatja, ha tetszik
neki :)) )

A felhasználónak nem kell a weboldalomon megadni a
jelszót, hanem a Twitter OAuth-t használja.
http://apiwiki.twitter.com/OAuth-FAQ http://apiwiki.twitter.com/OAuth-FAQ
Ehhez alkalmazásomat itt kellett regisztrálni:
http://twitter.com/oauth_clients http://twitter.com/oauth_clients

Tartottam tőle, hogy az IIS tartogat meglepetést számomra, de
mégsem.

A Twitter OAuth támogatott bejelentkezés lényege.
Beregisztrálod az alkalmazásod, meg kell kapnod az alkalmazásod
visszatérési (callback) url-jét, ami a központi bejelentkezés után a
programod megfelelő részére irányít.

Kapsz egy  kulcspárt
(consumerkey-consumersecret), amiből tudja a szolgáltatás ki ez az
alkalmazás. Helyes bejelentkezés esetén vissza irányít, helytelennél
jelzi, hogy nem megfelelő a hozzáférés.

A prgramból hívás,
fogadáskódrészlete:

   //Beállítás

 public function init()
    {

    		 $this->configuration = array(
		    'callbackUrl' => 'http://weboldalam/callback',
		    'siteUrl' => 'http://twitter.com/oauth',
		    'consumerKey' => 'XXXXXXXXXXXXX',
		    'consumerSecret' => 'xxxxxxxxxxxxxxxxxxxxx'
		);
    }

//Hívás

    public function indexAction()
    {

    	$this->getHelper('viewRenderer')->setNoRender();
    	$this->_helper->layout->setLayout('zerolayout');

    	$consumer = new Zend_Oauth_Consumer($this->configuration);
        //print_r($consumer) ;

    	       $ns = new Zend_Session_Namespace('Sessionnévterem', true); 

			    if (!isset($ns-> TWITTER_ACCESS_TOKEN)) {
			    $token = $consumer->getRequestToken();
			    //$_SESSION['TWITTER_REQUEST_TOKEN'] = serialize($token);
			    $ns-> TWITTER_REQUEST_TOKEN = serialize($token);

			     $consumer->redirect();
			}
			else{

				//Token létezik 

			}

    }

//Fogadás

    public function callbackAction(){

    	$this->getHelper('viewRenderer')->setNoRender();
    	$this->_helper->layout->setLayout('zerolayout');

      $ns = new Zend_Session_Namespace('Sessionnévterem', true); 

        if (!empty($_GET) && isset($ns-> TWITTER_REQUEST_TOKEN)) {

    		$consumer = new Zend_Oauth_Consumer($this->configuration);
		    $token = $consumer->getAccessToken($_GET, unserialize($ns-> TWITTER_REQUEST_TOKEN));
		    $ns-> TWITTER_ACCESS_TOKEN = serialize($token);
		    $tweetObj=unserialize($ns-> TWITTER_ACCESS_TOKEN);

		   //SESSION mentés
		   $ns->username=$tweetObj->screen_name;
		   $ns->userid=$tweetObj->user_id;

      $ns-> TWITTER_REQUEST_TOKEN=null;

    /**
     * With Access Token in hand, let's try accessing the client again
     */

   $this->_redirect('/index');

} else {
    /**
     * Mistaken request? Some malfeasant trying something?
     */
    exit('Invalid callback request. Oops. Sorry.');
}

    }

Még érdekes lehet, hogy az oldalon elkészített ‘kották’ címeit egy
Twitter oldalon publikálom.

//hozzáférési osztály példányosítása
$twitter =new Zend_Service_Twitter($this->config->twitter->username,$this->config->twitter->pswd);

//Üzenet írása
 $response = $twitter->status->update("The "".$mytweetmessage."" harptab published by ".$ns-> username);

Javascript
(Json) kommunikáció

A
Silverlight kliensnél említett SerialButton_Click metódusban a
GetHarptabOpenReadCompleted kezeli le a szerver válaszát.

  private void SerialButton_Click(object sender, RoutedEventArgs e)
        {
             ***

                WebClient wc = new WebClient();
                wc.OpenReadCompleted += GetHarptabOpenReadCompleted;

                string addUrl= urlpart + "A szervernek az útvonala/" + s ;
                wc.OpenReadAsync(new Uri(addUrl));
                createdUrl.Text = addUrl;
            ***
        }

Sikeres válasz esetén meghívja a HTML template-ben szereplő javascript
metódust.

        private void GetHarptabOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{

                if (e.Error == null)
                {

                    HtmlPage.Window.Invoke("slcall");
                  ****
                }
                else{

                }

}

JQuery hívás.

(script type="text/javascript")

// lista frissítése
function slcall(){

        //lekérdezi a friss tartalmat
	$.get('<?php echo $this->baseUrl(); ?>'+'/utvonal/', show_useractivities);
}

(/script)

Bejelntkezett felhasználó törölheti a műveit a listából AJAX-os módon.

/** Törlés **/

$(document).ready(activities_init);
function activities_init(){
	//console.log('START1');
$('#lista td a.deletebutton').live('click',delete_activity);

}

function delete_activity(){

	var where_is=this.href.indexOf('#');
	var id = this.href.substring(where_is+1,this.href.length);

		if(confirm(
		'Törölni akarja ezt a bejegyzést?'
		)){
                  $.getJSON('<?php echo $this->baseUrl(); ?>'+'/harptabs/deleteHarptab/id/'+id,remove_row);
		}

}

Loggolás,
hibák gyűjtése

Zend_Log használata

Googliztam a
Zend  Framework oldalakon készítettem, felvettem a Library
könyvtárba egy plugint.
A plugin segítségével bejegyzéséket tudok gyűjteni egy táblába.

class MYAPP_Plugin_Logger extends Zend_Controller_Plugin_Abstract
{ 

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    { 

		  $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap');
		  $configArray = $bootstrap->getOptions();
		  $this->config = new Zend_Config($configArray);    	

    	          $logLevel = intval($this->config ->logLevel); 

    $params = array('host'		=>'localhost',
	                'username'	=> $this->config->resources->db->params->username,
					'password'  => $this->config->resources->db->params->password,
					'dbname'	=> $this->config->resources->db->params->dbname
	               );

         $db = Zend_Db::factory('Pdo_Mysql', $params);
        $columnMapping = array(
            'timestamp' => 'timestamp',
            'lvl' => 'priorityName',
            'msg' => 'message'
        ); 

        $writer = new Zend_Log_Writer_Db($db, 'log', $columnMapping); 

       $writer->addFilter(new Zend_Log_Filter_Priority($logLevel)); 

        Zend_Registry::set('logger', new Zend_Log($writer));
    }
}

A vizsgálandó kódrészletet Try-Catch -be tettem.

try{
********
********
} 

 catch (Zend_Exception $e) {  

Zend_Registry::get('logger')->info('error: '. $e->getMessage());

}

Saját
hibaoldal beállítása az IIS-n

A weboldalon hibás url esetén a
szerveren beállított hibaoldal jelenik meg.
Ez nem túl felhasználóbarát ezért készítettem saját hibaoldalt, hogy
visszairányítsam az elveszett látogatót.

Előtte tájékozódtam,
milyen beállításokat kell a szerveren megnézni:http://learn.iis.net/page.aspx/405/delegating-errormode-in-httperrors/

A
windowssystem32inetsrvconfigapplicationhost.config fájlt kellett
megkeresni.
Ezt a beállítást ellenőrízni:

<section name="httpErrors" overrideModeDefault="Allow" />

A default hibaoldalak helye:

        <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath">
          ***
            <error statusCode="403" prefixLanguageFilePath="%SystemDrive%inetpubcusterr" path="403.htm" />
            <error statusCode="404" prefixLanguageFilePath="%SystemDrive%inetpubcusterr" path="404.htm" />
          ***
        </httpErrors>

A web.configot ezzel bővítettem:

      <remove statusCode="404" subStatusCode="-1" />
      <error statusCode="404" prefixLanguageFilePath="" path="/error.htm" responseMode="ExecuteURL" />
      <remove statusCode="403" subStatusCode="-1" />
      <error statusCode="403" prefixLanguageFilePath="" path="/error.htm" responseMode="ExecuteURL" />
    </httpErrors>

A hibaoldalam a főkönyvtárban:

<html>
<body>
    <a  style="font-size:80px" href="">YOU LOST. CLICK ME! :) </a>
</body>
</html>

Tapasztalatok,
jótanácsok

Az
IIS7 szerverre való fejlesztés során azt plusz elvárást tűztem ki
magammnak, hogy olyan programot készítsek, ami ugyanúgy “elszaladna”
Windows, Linux környezetben.
Szerintem ezt megoldottam 🙂 Örülök a lehetőségnek kipróbálhattam,hogy
“műxik” IIS-n is.

Aki Apache-ról IIS-re kívánja hosztolni alkalmazását és használ
“mindenféle” .htaccess parancsot, ajánlom, hogy előtte
mindenképpen nézze meg, tesztelje, hogy mi az IIS-n a web.config
változata.

Nekem menetközben 2-t  kellett megoldani (fő
könyvtár Zend projekt:  index.php-re irányítás, phpmyadmin: a
“fentiek” figyelmen kívül hagyása).

Az alábbi cikkeket találtam:

Translate
.htaccess Content to IIS web.config http://learn.iis.net/page.aspx/557/translate-htaccess-content-to-iis-webconfig/

URL
rewrite http://www.iis.net/download/URLRewrite

Aki Silverlight & PHP programot szeretne készíteni javaslom,
tanulmányozza alaposan a kommunikációs megoldásokat (SOAP, WSDL, JSON),
szerezzen be valami jó könyvet a témában.  🙂
Nekem 2 fejlesztő környezet között is váltogatnom kellett (Visual Studio
Express, PsPad), dobálni át a PHP projektbe a xap fájlt, elég nehézkes
volt.

A TwitHarptab

készítéshez a szájharmonika iránti lelkesedés adott kitartást, sokszor
éjszaka is szuttyogtam a progival.
Ha kapnék pozitív értékelést a progira, a munkára, az jó lenne, mert
szeretnék még néhány más hangolású harmonikát venni, anélkül, hogy a
családom reklamálná, azért mégse vagyok egy Herfli Davidson :))

Természetesen
ez a program verzió még nagyon kezdeti. Szeretném, ha az  ütemeket
is kezelné (egész, fél, negyed, nyolcad, triola,…), nomeg a szünet
hosszokat.
A “dizájnosabb” Silverlight felülethez természetesen Blend kell, illetve
megtanulni a használatát.

Különben ajánlom mindenkinek a harmonikázást, ha még nem “tolja”, nem
játszik más hangszeren. Megnyugtató, remek, akár röpke pár perces
kikapcsolódásnak is jó, nagy móka.

Minden jót!

Üdv,

Zsolt

Háttérinformációk:

A szájharmonikánál ilyen kottát szoktak
használni:

http://www.1000harmonicatabs.com/fsongs/folsom_prison_blues.html

A
+ jel a fújt hang, – a szívott, a szám pedig a megfelelő lyuk a 10 -s
fekvésű harmonikán.

Folsom Prison Blues

4  5    5   -5   6  4  4
I hear the train a-comin'; 

 4    5  5     -5    6   4
it's rollin' 'round the bend,

 4  5   5    -5   5   6   4
And I ain't seen the sunshine 

  5   5   5     4    5
since I don't know when,

 5   -4   4  -4  4  -4  4
I'm stuck at Folsom Prison 

-4   -4    4     5  4   3
and time keeps draggin' on.

 4    4    -4   -4   4  -4 3
But that train keeps a-rollin' 

3   3   2   3  2   1
on down to San Antone.

 

 

Blogbook : PHP | Javascript | Laravel | Corcel | CodeIgniter | VueJs | ReactJs | WordPress